Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.4 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 c75ab92e Christos Stavrakakis
from synnefo.management.common import get_backend, convert_api_faults
38 d758784b Christos Stavrakakis
from snf_django.management.utils import parse_bool
39 6dd70a5c Christos Stavrakakis
40 6c77ed37 Christos Stavrakakis
from synnefo.db.models import Network, Backend
41 c75ab92e Christos Stavrakakis
from synnefo.logic import networks
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 6dd70a5c Christos Stavrakakis
            help="Name of network"),
58 9621c777 Christos Stavrakakis
        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 6dd70a5c Christos Stavrakakis
            help='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 6dd70a5c Christos Stavrakakis
            help='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 c75ab92e Christos Stavrakakis
            default="False",
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 64cdd31b Christos Stavrakakis
            help="Use the network as a Floating IP pool. Floating IP pools"
129 64cdd31b Christos Stavrakakis
                 " are created in all available backends."),
130 64cdd31b Christos Stavrakakis
        make_option(
131 671db71c Christos Stavrakakis
            "--backend-ids",
132 671db71c Christos Stavrakakis
            dest="backend_ids",
133 b7d38981 Dimitris Aragiorgis
            default=None,
134 671db71c Christos Stavrakakis
            help="Comma seperated list of Ganeti backends IDs that the network"
135 6c77ed37 Christos Stavrakakis
                 " will be created. Only for public networks. Use 'all' to"
136 6c77ed37 Christos Stavrakakis
                 " create network in all available backends."),
137 9621c777 Christos Stavrakakis
    )
138 6dd70a5c Christos Stavrakakis
139 c75ab92e Christos Stavrakakis
    @convert_api_faults
140 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
141 6dd70a5c Christos Stavrakakis
        if args:
142 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
143 6dd70a5c Christos Stavrakakis
144 6dd70a5c Christos Stavrakakis
        name = options['name']
145 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
146 5aeb4e93 Christos Stavrakakis
        gateway = options['gateway']
147 5aeb4e93 Christos Stavrakakis
        subnet6 = options['subnet6']
148 5aeb4e93 Christos Stavrakakis
        gateway6 = options['gateway6']
149 671db71c Christos Stavrakakis
        backend_ids = options['backend_ids']
150 7fede91e Christos Stavrakakis
        public = options['public']
151 b7d38981 Dimitris Aragiorgis
        flavor = options['flavor']
152 b7d38981 Dimitris Aragiorgis
        mode = options['mode']
153 71ec054d Christos Stavrakakis
        link = options['link']
154 71ec054d Christos Stavrakakis
        mac_prefix = options['mac_prefix']
155 b7d38981 Dimitris Aragiorgis
        tags = options['tags']
156 eefb7355 Christos Stavrakakis
        userid = options["owner"]
157 64cdd31b Christos Stavrakakis
        floating_ip_pool = parse_bool(options["floating_ip_pool"])
158 c75ab92e Christos Stavrakakis
        dhcp = parse_bool(options["dhcp"])
159 6dd70a5c Christos Stavrakakis
160 be7c5377 Christos Stavrakakis
        if name is None:
161 be7c5377 Christos Stavrakakis
            name = ""
162 be7c5377 Christos Stavrakakis
        if flavor is None:
163 5aeb4e93 Christos Stavrakakis
            raise CommandError("flavor is required")
164 5aeb4e93 Christos Stavrakakis
165 be7c5377 Christos Stavrakakis
        if (subnet is None) and (subnet6 is None):
166 be7c5377 Christos Stavrakakis
            raise CommandError("subnet or subnet6 is required")
167 5aeb4e93 Christos Stavrakakis
        if subnet is None and gateway is not None:
168 5aeb4e93 Christos Stavrakakis
            raise CommandError("Can not use gateway without subnet")
169 5aeb4e93 Christos Stavrakakis
        if subnet6 is None and gateway6 is not None:
170 5aeb4e93 Christos Stavrakakis
            raise CommandError("Can not use gateway6 without subnet6")
171 671db71c Christos Stavrakakis
        if public and not (backend_ids or floating_ip_pool):
172 671db71c Christos Stavrakakis
            raise CommandError("backend-ids is required")
173 eefb7355 Christos Stavrakakis
        if not userid and not public:
174 eefb7355 Christos Stavrakakis
            raise CommandError("'owner' is required for private networks")
175 7fede91e Christos Stavrakakis
176 671db71c Christos Stavrakakis
        backends = []
177 671db71c Christos Stavrakakis
        if backend_ids is not None:
178 6c77ed37 Christos Stavrakakis
            if backend_ids == "all":
179 6c77ed37 Christos Stavrakakis
                backends = Backend.objects.filter(offline=False)
180 6c77ed37 Christos Stavrakakis
            else:
181 6c77ed37 Christos Stavrakakis
                for backend_id in backend_ids.split(","):
182 6c77ed37 Christos Stavrakakis
                    try:
183 6c77ed37 Christos Stavrakakis
                        backend_id = int(backend_id)
184 6c77ed37 Christos Stavrakakis
                    except ValueError:
185 6c77ed37 Christos Stavrakakis
                        raise CommandError("Invalid backend-id: %s"
186 6c77ed37 Christos Stavrakakis
                                           % backend_id)
187 6c77ed37 Christos Stavrakakis
                    backend = get_backend(backend_id)
188 6c77ed37 Christos Stavrakakis
                    backends.append(backend)
189 6dd70a5c Christos Stavrakakis
190 e08afd0b Christos Stavrakakis
        network = networks.create(userid=userid, name=name, flavor=flavor,
191 c75ab92e Christos Stavrakakis
                                  subnet=subnet, gateway=gateway,
192 c75ab92e Christos Stavrakakis
                                  subnet6=subnet6, gateway6=gateway6,
193 c75ab92e Christos Stavrakakis
                                  dhcp=dhcp, public=public, mode=mode,
194 c75ab92e Christos Stavrakakis
                                  link=link, mac_prefix=mac_prefix, tags=tags,
195 b47f167a Christos Stavrakakis
                                  floating_ip_pool=floating_ip_pool,
196 671db71c Christos Stavrakakis
                                  backends=backends, lazy_create=False)
197 b47f167a Christos Stavrakakis
198 d5a4a8d1 Christos Stavrakakis
        self.stdout.write("Created network '%s' in DB:\n" % network)
199 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_network(network, stdout=self.stdout)
200 d5a4a8d1 Christos Stavrakakis
        pprint.pprint_network_subnets(network, stdout=self.stdout)