Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / management / commands / network-create.py @ b5e0d5c9

History | View | Annotate | Download (6.9 kB)

1 6dd70a5c Christos Stavrakakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 6dd70a5c Christos Stavrakakis
#
3 6dd70a5c Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 6dd70a5c Christos Stavrakakis
# without modification, are permitted provided that the following
5 6dd70a5c Christos Stavrakakis
# conditions are met:
6 6dd70a5c Christos Stavrakakis
#
7 6dd70a5c Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 6dd70a5c Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 6dd70a5c Christos Stavrakakis
#      disclaimer.
10 6dd70a5c Christos Stavrakakis
#
11 6dd70a5c Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 6dd70a5c Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 6dd70a5c Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 6dd70a5c Christos Stavrakakis
#      provided with the distribution.
15 6dd70a5c Christos Stavrakakis
#
16 6dd70a5c Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 6dd70a5c Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 6dd70a5c Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 6dd70a5c Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 6dd70a5c Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 6dd70a5c Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 6dd70a5c Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 6dd70a5c Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 6dd70a5c Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 6dd70a5c Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 6dd70a5c Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 6dd70a5c Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 6dd70a5c Christos Stavrakakis
#
29 6dd70a5c Christos Stavrakakis
# The views and conclusions contained in the software and
30 6dd70a5c Christos Stavrakakis
# documentation are those of the authors and should not be
31 6dd70a5c Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 6dd70a5c Christos Stavrakakis
# or implied, of GRNET S.A.
33 6dd70a5c Christos Stavrakakis
34 6dd70a5c Christos Stavrakakis
from optparse import make_option
35 6dd70a5c Christos Stavrakakis
36 6dd70a5c Christos Stavrakakis
from django.core.management.base import BaseCommand, CommandError
37 7b5263e4 Christos Stavrakakis
from synnefo.management.common import convert_api_faults
38 d758784b Christos Stavrakakis
from snf_django.management.utils import parse_bool
39 6dd70a5c Christos Stavrakakis
40 7b5263e4 Christos Stavrakakis
from synnefo.db.models import Network
41 3785b737 Dionysis Grigoropoulos
from synnefo.logic import networks, subnets
42 d5a4a8d1 Christos Stavrakakis
from synnefo.management import pprint
43 b84ed662 Christos Stavrakakis
44 b7d38981 Dimitris Aragiorgis
NETWORK_FLAVORS = Network.FLAVORS.keys()
45 6dd70a5c Christos Stavrakakis
46 6dd70a5c Christos Stavrakakis
47 6dd70a5c Christos Stavrakakis
class Command(BaseCommand):
48 b14725eb Christos Stavrakakis
    can_import_settings = True
49 b7e74f05 Christos Stavrakakis
    output_transaction = True
50 b14725eb Christos Stavrakakis
51 6dd70a5c Christos Stavrakakis
    help = "Create a new network"
52 6dd70a5c Christos Stavrakakis
53 6dd70a5c Christos Stavrakakis
    option_list = BaseCommand.option_list + (
54 9621c777 Christos Stavrakakis
        make_option(
55 9621c777 Christos Stavrakakis
            '--name',
56 6dd70a5c Christos Stavrakakis
            dest='name',
57 3785b737 Dionysis Grigoropoulos
            help="Name of the network"),
58 3785b737 Dionysis Grigoropoulos
        make_option(
59 9621c777 Christos Stavrakakis
            '--owner',
60 6dd70a5c Christos Stavrakakis
            dest='owner',
61 6dd70a5c Christos Stavrakakis
            help="The owner of the network"),
62 9621c777 Christos Stavrakakis
        make_option(
63 9621c777 Christos Stavrakakis
            '--subnet',
64 6dd70a5c Christos Stavrakakis
            dest='subnet',
65 6dd70a5c Christos Stavrakakis
            default=None,
66 6dd70a5c Christos Stavrakakis
            # required=True,
67 3785b737 Dionysis Grigoropoulos
            help='IPv4 subnet of the network'),
68 9621c777 Christos Stavrakakis
        make_option(
69 9621c777 Christos Stavrakakis
            '--gateway',
70 6dd70a5c Christos Stavrakakis
            dest='gateway',
71 6dd70a5c Christos Stavrakakis
            default=None,
72 3785b737 Dionysis Grigoropoulos
            help='IPv4 gateway of the network'),
73 9621c777 Christos Stavrakakis
        make_option(
74 9621c777 Christos Stavrakakis
            '--subnet6',
75 b7d38981 Dimitris Aragiorgis
            dest='subnet6',
76 b7d38981 Dimitris Aragiorgis
            default=None,
77 b7d38981 Dimitris Aragiorgis
            help='IPv6 subnet of the network'),
78 9621c777 Christos Stavrakakis
        make_option(
79 9621c777 Christos Stavrakakis
            '--gateway6',
80 b7d38981 Dimitris Aragiorgis
            dest='gateway6',
81 b7d38981 Dimitris Aragiorgis
            default=None,
82 b7d38981 Dimitris Aragiorgis
            help='IPv6 gateway of the network'),
83 9621c777 Christos Stavrakakis
        make_option(
84 9621c777 Christos Stavrakakis
            '--dhcp',
85 6dd70a5c Christos Stavrakakis
            dest='dhcp',
86 b5e0d5c9 Christos Stavrakakis
            default="True",
87 c75ab92e Christos Stavrakakis
            choices=["True", "False"],
88 c75ab92e Christos Stavrakakis
            metavar="True|False",
89 6dd70a5c Christos Stavrakakis
            help='Automatically assign IPs'),
90 9621c777 Christos Stavrakakis
        make_option(
91 9621c777 Christos Stavrakakis
            '--public',
92 6dd70a5c Christos Stavrakakis
            dest='public',
93 6dd70a5c Christos Stavrakakis
            action='store_true',
94 6dd70a5c Christos Stavrakakis
            default=False,
95 6dd70a5c Christos Stavrakakis
            help='Network is public'),
96 9621c777 Christos Stavrakakis
        make_option(
97 9621c777 Christos Stavrakakis
            '--flavor',
98 b7d38981 Dimitris Aragiorgis
            dest='flavor',
99 6dd70a5c Christos Stavrakakis
            default=None,
100 b7d38981 Dimitris Aragiorgis
            choices=NETWORK_FLAVORS,
101 b7d38981 Dimitris Aragiorgis
            help='Network flavor. Choices: ' + ', '.join(NETWORK_FLAVORS)),
102 9621c777 Christos Stavrakakis
        make_option(
103 9621c777 Christos Stavrakakis
            '--mode',
104 b7d38981 Dimitris Aragiorgis
            dest='mode',
105 7fede91e Christos Stavrakakis
            default=None,
106 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity mode."),
107 9621c777 Christos Stavrakakis
        make_option(
108 9621c777 Christos Stavrakakis
            '--link',
109 71ec054d Christos Stavrakakis
            dest='link',
110 71ec054d Christos Stavrakakis
            default=None,
111 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity link."),
112 9621c777 Christos Stavrakakis
        make_option(
113 9621c777 Christos Stavrakakis
            '--mac-prefix',
114 71ec054d Christos Stavrakakis
            dest='mac_prefix',
115 71ec054d Christos Stavrakakis
            default=None,
116 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity MAC prefix"),
117 9621c777 Christos Stavrakakis
        make_option(
118 9621c777 Christos Stavrakakis
            '--tags',
119 b7d38981 Dimitris Aragiorgis
            dest='tags',
120 b7d38981 Dimitris Aragiorgis
            default=None,
121 b7d38981 Dimitris Aragiorgis
            help='The tags of the Network (comma separated strings)'),
122 9621c777 Christos Stavrakakis
        make_option(
123 64cdd31b Christos Stavrakakis
            '--floating-ip-pool',
124 64cdd31b Christos Stavrakakis
            dest='floating_ip_pool',
125 64cdd31b Christos Stavrakakis
            default="False",
126 64cdd31b Christos Stavrakakis
            choices=["True", "False"],
127 64cdd31b Christos Stavrakakis
            metavar="True|False",
128 7b5263e4 Christos Stavrakakis
            help="Use the network as a Floating IP pool."),
129 9621c777 Christos Stavrakakis
    )
130 6dd70a5c Christos Stavrakakis
131 c75ab92e Christos Stavrakakis
    @convert_api_faults
132 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
133 6dd70a5c Christos Stavrakakis
        if args:
134 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
135 6dd70a5c Christos Stavrakakis
136 6dd70a5c Christos Stavrakakis
        name = options['name']
137 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
138 5aeb4e93 Christos Stavrakakis
        gateway = options['gateway']
139 5aeb4e93 Christos Stavrakakis
        subnet6 = options['subnet6']
140 5aeb4e93 Christos Stavrakakis
        gateway6 = options['gateway6']
141 7fede91e Christos Stavrakakis
        public = options['public']
142 b7d38981 Dimitris Aragiorgis
        flavor = options['flavor']
143 b7d38981 Dimitris Aragiorgis
        mode = options['mode']
144 71ec054d Christos Stavrakakis
        link = options['link']
145 71ec054d Christos Stavrakakis
        mac_prefix = options['mac_prefix']
146 b7d38981 Dimitris Aragiorgis
        tags = options['tags']
147 eefb7355 Christos Stavrakakis
        userid = options["owner"]
148 64cdd31b Christos Stavrakakis
        floating_ip_pool = parse_bool(options["floating_ip_pool"])
149 c75ab92e Christos Stavrakakis
        dhcp = parse_bool(options["dhcp"])
150 6dd70a5c Christos Stavrakakis
151 be7c5377 Christos Stavrakakis
        if name is None:
152 be7c5377 Christos Stavrakakis
            name = ""
153 be7c5377 Christos Stavrakakis
        if flavor is None:
154 5aeb4e93 Christos Stavrakakis
            raise CommandError("flavor is required")
155 5aeb4e93 Christos Stavrakakis
156 be7c5377 Christos Stavrakakis
        if (subnet is None) and (subnet6 is None):
157 be7c5377 Christos Stavrakakis
            raise CommandError("subnet or subnet6 is required")
158 7b5263e4 Christos Stavrakakis
159 5aeb4e93 Christos Stavrakakis
        if subnet is None and gateway is not None:
160 8d5795b4 Christos Stavrakakis
            raise CommandError("Cannot use gateway without subnet")
161 5aeb4e93 Christos Stavrakakis
        if subnet6 is None and gateway6 is not None:
162 8d5795b4 Christos Stavrakakis
            raise CommandError("Cannot use gateway6 without subnet6")
163 7fede91e Christos Stavrakakis
164 7b5263e4 Christos Stavrakakis
        if not (userid or public):
165 7b5263e4 Christos Stavrakakis
            raise CommandError("'owner' is required for private networks")
166 6dd70a5c Christos Stavrakakis
167 e08afd0b Christos Stavrakakis
        network = networks.create(userid=userid, name=name, flavor=flavor,
168 3785b737 Dionysis Grigoropoulos
                                  public=public, mode=mode,
169 c75ab92e Christos Stavrakakis
                                  link=link, mac_prefix=mac_prefix, tags=tags,
170 7b5263e4 Christos Stavrakakis
                                  floating_ip_pool=floating_ip_pool)
171 b47f167a Christos Stavrakakis
172 7b5263e4 Christos Stavrakakis
        if subnet is not None:
173 7b5263e4 Christos Stavrakakis
            name = "IPv4 Subnet of Network %s" % network.id
174 7b5263e4 Christos Stavrakakis
            subnets.create_subnet(network.id, cidr=subnet, name=name,
175 7b5263e4 Christos Stavrakakis
                                  ipversion=4, gateway=gateway, dhcp=dhcp,
176 7b5263e4 Christos Stavrakakis
                                  user_id=userid)
177 3785b737 Dionysis Grigoropoulos
178 7b5263e4 Christos Stavrakakis
        if subnet6 is not None:
179 7b5263e4 Christos Stavrakakis
            name = "IPv6 Subnet of Network %s" % network.id
180 7b5263e4 Christos Stavrakakis
            subnets.create_subnet(network.id, cidr=subnet6, name=name,
181 7b5263e4 Christos Stavrakakis
                                  ipversion=6, gateway=gateway6,
182 7b5263e4 Christos Stavrakakis
                                  dhcp=dhcp, user_id=userid)
183 3785b737 Dionysis Grigoropoulos
184 d5a4a8d1 Christos Stavrakakis
        self.stdout.write("Created network '%s' in DB:\n" % network)
185 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_network(network, stdout=self.stdout)
186 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_network_subnets(network, stdout=self.stdout)
187 7b5263e4 Christos Stavrakakis
188 7b5263e4 Christos Stavrakakis
        networks.create_network_in_backends(network)
189 7b5263e4 Christos Stavrakakis
        # TODO: Add --wait option to track job progress and report successful
190 7b5263e4 Christos Stavrakakis
        # creation in each backend.
191 7b5263e4 Christos Stavrakakis
        self.stdout.write("\nSuccessfully issued job to create network in"
192 7b5263e4 Christos Stavrakakis
                          " in backends\n")