Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.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 0d1f9117 Dionysis Grigoropoulos
import ipaddr
45 0d1f9117 Dionysis Grigoropoulos
46 b7d38981 Dimitris Aragiorgis
NETWORK_FLAVORS = Network.FLAVORS.keys()
47 6dd70a5c Christos Stavrakakis
48 6dd70a5c Christos Stavrakakis
49 6dd70a5c Christos Stavrakakis
class Command(BaseCommand):
50 b14725eb Christos Stavrakakis
    can_import_settings = True
51 b7e74f05 Christos Stavrakakis
    output_transaction = True
52 b14725eb Christos Stavrakakis
53 6dd70a5c Christos Stavrakakis
    help = "Create a new network"
54 6dd70a5c Christos Stavrakakis
55 6dd70a5c Christos Stavrakakis
    option_list = BaseCommand.option_list + (
56 9621c777 Christos Stavrakakis
        make_option(
57 9621c777 Christos Stavrakakis
            '--name',
58 6dd70a5c Christos Stavrakakis
            dest='name',
59 3785b737 Dionysis Grigoropoulos
            help="Name of the network"),
60 3785b737 Dionysis Grigoropoulos
        make_option(
61 9621c777 Christos Stavrakakis
            '--owner',
62 6dd70a5c Christos Stavrakakis
            dest='owner',
63 6dd70a5c Christos Stavrakakis
            help="The owner of the network"),
64 9621c777 Christos Stavrakakis
        make_option(
65 9621c777 Christos Stavrakakis
            '--subnet',
66 6dd70a5c Christos Stavrakakis
            dest='subnet',
67 6dd70a5c Christos Stavrakakis
            default=None,
68 6dd70a5c Christos Stavrakakis
            # required=True,
69 3785b737 Dionysis Grigoropoulos
            help='IPv4 subnet of the network'),
70 9621c777 Christos Stavrakakis
        make_option(
71 9621c777 Christos Stavrakakis
            '--gateway',
72 6dd70a5c Christos Stavrakakis
            dest='gateway',
73 6dd70a5c Christos Stavrakakis
            default=None,
74 3785b737 Dionysis Grigoropoulos
            help='IPv4 gateway of the network'),
75 9621c777 Christos Stavrakakis
        make_option(
76 9621c777 Christos Stavrakakis
            '--subnet6',
77 b7d38981 Dimitris Aragiorgis
            dest='subnet6',
78 b7d38981 Dimitris Aragiorgis
            default=None,
79 b7d38981 Dimitris Aragiorgis
            help='IPv6 subnet of the network'),
80 9621c777 Christos Stavrakakis
        make_option(
81 9621c777 Christos Stavrakakis
            '--gateway6',
82 b7d38981 Dimitris Aragiorgis
            dest='gateway6',
83 b7d38981 Dimitris Aragiorgis
            default=None,
84 b7d38981 Dimitris Aragiorgis
            help='IPv6 gateway of the network'),
85 9621c777 Christos Stavrakakis
        make_option(
86 9621c777 Christos Stavrakakis
            '--dhcp',
87 6dd70a5c Christos Stavrakakis
            dest='dhcp',
88 b5e0d5c9 Christos Stavrakakis
            default="True",
89 c75ab92e Christos Stavrakakis
            choices=["True", "False"],
90 c75ab92e Christos Stavrakakis
            metavar="True|False",
91 6dd70a5c Christos Stavrakakis
            help='Automatically assign IPs'),
92 9621c777 Christos Stavrakakis
        make_option(
93 9621c777 Christos Stavrakakis
            '--public',
94 6dd70a5c Christos Stavrakakis
            dest='public',
95 6dd70a5c Christos Stavrakakis
            action='store_true',
96 6dd70a5c Christos Stavrakakis
            default=False,
97 6dd70a5c Christos Stavrakakis
            help='Network is public'),
98 9621c777 Christos Stavrakakis
        make_option(
99 9621c777 Christos Stavrakakis
            '--flavor',
100 b7d38981 Dimitris Aragiorgis
            dest='flavor',
101 6dd70a5c Christos Stavrakakis
            default=None,
102 b7d38981 Dimitris Aragiorgis
            choices=NETWORK_FLAVORS,
103 b7d38981 Dimitris Aragiorgis
            help='Network flavor. Choices: ' + ', '.join(NETWORK_FLAVORS)),
104 9621c777 Christos Stavrakakis
        make_option(
105 9621c777 Christos Stavrakakis
            '--mode',
106 b7d38981 Dimitris Aragiorgis
            dest='mode',
107 7fede91e Christos Stavrakakis
            default=None,
108 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity mode."),
109 9621c777 Christos Stavrakakis
        make_option(
110 9621c777 Christos Stavrakakis
            '--link',
111 71ec054d Christos Stavrakakis
            dest='link',
112 71ec054d Christos Stavrakakis
            default=None,
113 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity link."),
114 9621c777 Christos Stavrakakis
        make_option(
115 9621c777 Christos Stavrakakis
            '--mac-prefix',
116 71ec054d Christos Stavrakakis
            dest='mac_prefix',
117 71ec054d Christos Stavrakakis
            default=None,
118 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity MAC prefix"),
119 9621c777 Christos Stavrakakis
        make_option(
120 9621c777 Christos Stavrakakis
            '--tags',
121 b7d38981 Dimitris Aragiorgis
            dest='tags',
122 b7d38981 Dimitris Aragiorgis
            default=None,
123 b7d38981 Dimitris Aragiorgis
            help='The tags of the Network (comma separated strings)'),
124 9621c777 Christos Stavrakakis
        make_option(
125 64cdd31b Christos Stavrakakis
            '--floating-ip-pool',
126 64cdd31b Christos Stavrakakis
            dest='floating_ip_pool',
127 64cdd31b Christos Stavrakakis
            default="False",
128 64cdd31b Christos Stavrakakis
            choices=["True", "False"],
129 64cdd31b Christos Stavrakakis
            metavar="True|False",
130 7b5263e4 Christos Stavrakakis
            help="Use the network as a Floating IP pool."),
131 0d1f9117 Dionysis Grigoropoulos
        make_option(
132 046c8f11 Christos Stavrakakis
            '--allocation-pool',
133 0d1f9117 Dionysis Grigoropoulos
            dest='allocation_pools',
134 0d1f9117 Dionysis Grigoropoulos
            action='append',
135 0d1f9117 Dionysis Grigoropoulos
            help="IP allocation pools to be used for assigning IPs to"
136 0d1f9117 Dionysis Grigoropoulos
                 " VMs. Can be used multiple times. Syntax: \n"
137 0d1f9117 Dionysis Grigoropoulos
                 "192.168.42.220,192.168.42.240. Starting IP must proceed "
138 44bd008a Dionysis Grigoropoulos
                 "ending IP. If no allocation pools are given, the whole "
139 44bd008a Dionysis Grigoropoulos
                 "subnet range is used, excluding the gateway IP, the "
140 44bd008a Dionysis Grigoropoulos
                 "broadcast address and the network address"),
141 9621c777 Christos Stavrakakis
    )
142 6dd70a5c Christos Stavrakakis
143 c75ab92e Christos Stavrakakis
    @convert_api_faults
144 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
145 6dd70a5c Christos Stavrakakis
        if args:
146 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
147 6dd70a5c Christos Stavrakakis
148 6dd70a5c Christos Stavrakakis
        name = options['name']
149 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
150 5aeb4e93 Christos Stavrakakis
        gateway = options['gateway']
151 5aeb4e93 Christos Stavrakakis
        subnet6 = options['subnet6']
152 5aeb4e93 Christos Stavrakakis
        gateway6 = options['gateway6']
153 7fede91e Christos Stavrakakis
        public = options['public']
154 b7d38981 Dimitris Aragiorgis
        flavor = options['flavor']
155 b7d38981 Dimitris Aragiorgis
        mode = options['mode']
156 71ec054d Christos Stavrakakis
        link = options['link']
157 71ec054d Christos Stavrakakis
        mac_prefix = options['mac_prefix']
158 b7d38981 Dimitris Aragiorgis
        tags = options['tags']
159 eefb7355 Christos Stavrakakis
        userid = options["owner"]
160 0d1f9117 Dionysis Grigoropoulos
        allocation_pools = options["allocation_pools"]
161 64cdd31b Christos Stavrakakis
        floating_ip_pool = parse_bool(options["floating_ip_pool"])
162 c75ab92e Christos Stavrakakis
        dhcp = parse_bool(options["dhcp"])
163 6dd70a5c Christos Stavrakakis
164 be7c5377 Christos Stavrakakis
        if name is None:
165 be7c5377 Christos Stavrakakis
            name = ""
166 be7c5377 Christos Stavrakakis
        if flavor is None:
167 5aeb4e93 Christos Stavrakakis
            raise CommandError("flavor is required")
168 5aeb4e93 Christos Stavrakakis
169 28ac6e86 Dionysis Grigoropoulos
        if ((subnet is None) and (subnet6 is None)) and dhcp is not False:
170 28ac6e86 Dionysis Grigoropoulos
            raise CommandError("Cannot set DHCP without subnet or subnet6")
171 7b5263e4 Christos Stavrakakis
172 5aeb4e93 Christos Stavrakakis
        if subnet is None and gateway is not None:
173 8d5795b4 Christos Stavrakakis
            raise CommandError("Cannot use gateway without subnet")
174 0d1f9117 Dionysis Grigoropoulos
        if subnet is None and allocation_pools is not None:
175 0d1f9117 Dionysis Grigoropoulos
            raise CommandError("Cannot use allocation-pools without subnet")
176 5aeb4e93 Christos Stavrakakis
        if subnet6 is None and gateway6 is not None:
177 8d5795b4 Christos Stavrakakis
            raise CommandError("Cannot use gateway6 without subnet6")
178 7fede91e Christos Stavrakakis
179 7b5263e4 Christos Stavrakakis
        if not (userid or public):
180 7b5263e4 Christos Stavrakakis
            raise CommandError("'owner' is required for private networks")
181 6dd70a5c Christos Stavrakakis
182 e08afd0b Christos Stavrakakis
        network = networks.create(userid=userid, name=name, flavor=flavor,
183 3785b737 Dionysis Grigoropoulos
                                  public=public, mode=mode,
184 c75ab92e Christos Stavrakakis
                                  link=link, mac_prefix=mac_prefix, tags=tags,
185 7b5263e4 Christos Stavrakakis
                                  floating_ip_pool=floating_ip_pool)
186 b47f167a Christos Stavrakakis
187 7b5263e4 Christos Stavrakakis
        if subnet is not None:
188 44bd008a Dionysis Grigoropoulos
            alloc = None
189 44bd008a Dionysis Grigoropoulos
            if allocation_pools is not None:
190 44bd008a Dionysis Grigoropoulos
                alloc = subnets.parse_allocation_pools(allocation_pools)
191 44bd008a Dionysis Grigoropoulos
                alloc.sort()
192 7b5263e4 Christos Stavrakakis
            name = "IPv4 Subnet of Network %s" % network.id
193 7b5263e4 Christos Stavrakakis
            subnets.create_subnet(network.id, cidr=subnet, name=name,
194 7b5263e4 Christos Stavrakakis
                                  ipversion=4, gateway=gateway, dhcp=dhcp,
195 0d1f9117 Dionysis Grigoropoulos
                                  user_id=userid,
196 44bd008a Dionysis Grigoropoulos
                                  allocation_pools=alloc)
197 3785b737 Dionysis Grigoropoulos
198 7b5263e4 Christos Stavrakakis
        if subnet6 is not None:
199 7b5263e4 Christos Stavrakakis
            name = "IPv6 Subnet of Network %s" % network.id
200 7b5263e4 Christos Stavrakakis
            subnets.create_subnet(network.id, cidr=subnet6, name=name,
201 7b5263e4 Christos Stavrakakis
                                  ipversion=6, gateway=gateway6,
202 7b5263e4 Christos Stavrakakis
                                  dhcp=dhcp, user_id=userid)
203 3785b737 Dionysis Grigoropoulos
204 d5a4a8d1 Christos Stavrakakis
        self.stdout.write("Created network '%s' in DB:\n" % network)
205 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_network(network, stdout=self.stdout)
206 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_network_subnets(network, stdout=self.stdout)
207 7b5263e4 Christos Stavrakakis
208 7b5263e4 Christos Stavrakakis
        networks.create_network_in_backends(network)
209 7b5263e4 Christos Stavrakakis
        # TODO: Add --wait option to track job progress and report successful
210 7b5263e4 Christos Stavrakakis
        # creation in each backend.
211 7b5263e4 Christos Stavrakakis
        self.stdout.write("\nSuccessfully issued job to create network in"
212 7b5263e4 Christos Stavrakakis
                          " in backends\n")