Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.2 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 b84ed662 Christos Stavrakakis
43 b7d38981 Dimitris Aragiorgis
NETWORK_FLAVORS = Network.FLAVORS.keys()
44 6dd70a5c Christos Stavrakakis
45 6dd70a5c Christos Stavrakakis
46 6dd70a5c Christos Stavrakakis
class Command(BaseCommand):
47 b14725eb Christos Stavrakakis
    can_import_settings = True
48 b7e74f05 Christos Stavrakakis
    output_transaction = True
49 b14725eb Christos Stavrakakis
50 6dd70a5c Christos Stavrakakis
    help = "Create a new network"
51 6dd70a5c Christos Stavrakakis
52 6dd70a5c Christos Stavrakakis
    option_list = BaseCommand.option_list + (
53 9621c777 Christos Stavrakakis
        make_option(
54 9621c777 Christos Stavrakakis
            '--name',
55 6dd70a5c Christos Stavrakakis
            dest='name',
56 6dd70a5c Christos Stavrakakis
            help="Name of network"),
57 9621c777 Christos Stavrakakis
        make_option(
58 9621c777 Christos Stavrakakis
            '--owner',
59 6dd70a5c Christos Stavrakakis
            dest='owner',
60 6dd70a5c Christos Stavrakakis
            help="The owner of the network"),
61 9621c777 Christos Stavrakakis
        make_option(
62 9621c777 Christos Stavrakakis
            '--subnet',
63 6dd70a5c Christos Stavrakakis
            dest='subnet',
64 6dd70a5c Christos Stavrakakis
            default=None,
65 6dd70a5c Christos Stavrakakis
            # required=True,
66 6dd70a5c Christos Stavrakakis
            help='Subnet of the network'),
67 9621c777 Christos Stavrakakis
        make_option(
68 9621c777 Christos Stavrakakis
            '--gateway',
69 6dd70a5c Christos Stavrakakis
            dest='gateway',
70 6dd70a5c Christos Stavrakakis
            default=None,
71 6dd70a5c Christos Stavrakakis
            help='Gateway of the network'),
72 9621c777 Christos Stavrakakis
        make_option(
73 9621c777 Christos Stavrakakis
            '--subnet6',
74 b7d38981 Dimitris Aragiorgis
            dest='subnet6',
75 b7d38981 Dimitris Aragiorgis
            default=None,
76 b7d38981 Dimitris Aragiorgis
            help='IPv6 subnet of the network'),
77 9621c777 Christos Stavrakakis
        make_option(
78 9621c777 Christos Stavrakakis
            '--gateway6',
79 b7d38981 Dimitris Aragiorgis
            dest='gateway6',
80 b7d38981 Dimitris Aragiorgis
            default=None,
81 b7d38981 Dimitris Aragiorgis
            help='IPv6 gateway of the network'),
82 9621c777 Christos Stavrakakis
        make_option(
83 9621c777 Christos Stavrakakis
            '--dhcp',
84 6dd70a5c Christos Stavrakakis
            dest='dhcp',
85 c75ab92e Christos Stavrakakis
            default="False",
86 c75ab92e Christos Stavrakakis
            choices=["True", "False"],
87 c75ab92e Christos Stavrakakis
            metavar="True|False",
88 6dd70a5c Christos Stavrakakis
            help='Automatically assign IPs'),
89 9621c777 Christos Stavrakakis
        make_option(
90 9621c777 Christos Stavrakakis
            '--public',
91 6dd70a5c Christos Stavrakakis
            dest='public',
92 6dd70a5c Christos Stavrakakis
            action='store_true',
93 6dd70a5c Christos Stavrakakis
            default=False,
94 6dd70a5c Christos Stavrakakis
            help='Network is public'),
95 9621c777 Christos Stavrakakis
        make_option(
96 9621c777 Christos Stavrakakis
            '--flavor',
97 b7d38981 Dimitris Aragiorgis
            dest='flavor',
98 6dd70a5c Christos Stavrakakis
            default=None,
99 b7d38981 Dimitris Aragiorgis
            choices=NETWORK_FLAVORS,
100 b7d38981 Dimitris Aragiorgis
            help='Network flavor. Choices: ' + ', '.join(NETWORK_FLAVORS)),
101 9621c777 Christos Stavrakakis
        make_option(
102 9621c777 Christos Stavrakakis
            '--mode',
103 b7d38981 Dimitris Aragiorgis
            dest='mode',
104 7fede91e Christos Stavrakakis
            default=None,
105 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity mode."),
106 9621c777 Christos Stavrakakis
        make_option(
107 9621c777 Christos Stavrakakis
            '--link',
108 71ec054d Christos Stavrakakis
            dest='link',
109 71ec054d Christos Stavrakakis
            default=None,
110 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity link."),
111 9621c777 Christos Stavrakakis
        make_option(
112 9621c777 Christos Stavrakakis
            '--mac-prefix',
113 71ec054d Christos Stavrakakis
            dest='mac_prefix',
114 71ec054d Christos Stavrakakis
            default=None,
115 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity MAC prefix"),
116 9621c777 Christos Stavrakakis
        make_option(
117 9621c777 Christos Stavrakakis
            '--tags',
118 b7d38981 Dimitris Aragiorgis
            dest='tags',
119 b7d38981 Dimitris Aragiorgis
            default=None,
120 b7d38981 Dimitris Aragiorgis
            help='The tags of the Network (comma separated strings)'),
121 9621c777 Christos Stavrakakis
        make_option(
122 64cdd31b Christos Stavrakakis
            '--floating-ip-pool',
123 64cdd31b Christos Stavrakakis
            dest='floating_ip_pool',
124 64cdd31b Christos Stavrakakis
            default="False",
125 64cdd31b Christos Stavrakakis
            choices=["True", "False"],
126 64cdd31b Christos Stavrakakis
            metavar="True|False",
127 64cdd31b Christos Stavrakakis
            help="Use the network as a Floating IP pool. Floating IP pools"
128 64cdd31b Christos Stavrakakis
                 " are created in all available backends."),
129 64cdd31b Christos Stavrakakis
        make_option(
130 671db71c Christos Stavrakakis
            "--backend-ids",
131 671db71c Christos Stavrakakis
            dest="backend_ids",
132 b7d38981 Dimitris Aragiorgis
            default=None,
133 671db71c Christos Stavrakakis
            help="Comma seperated list of Ganeti backends IDs that the network"
134 6c77ed37 Christos Stavrakakis
                 " will be created. Only for public networks. Use 'all' to"
135 6c77ed37 Christos Stavrakakis
                 " create network in all available backends."),
136 9621c777 Christos Stavrakakis
    )
137 6dd70a5c Christos Stavrakakis
138 c75ab92e Christos Stavrakakis
    @convert_api_faults
139 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
140 6dd70a5c Christos Stavrakakis
        if args:
141 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
142 6dd70a5c Christos Stavrakakis
143 6dd70a5c Christos Stavrakakis
        name = options['name']
144 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
145 5aeb4e93 Christos Stavrakakis
        gateway = options['gateway']
146 5aeb4e93 Christos Stavrakakis
        subnet6 = options['subnet6']
147 5aeb4e93 Christos Stavrakakis
        gateway6 = options['gateway6']
148 671db71c Christos Stavrakakis
        backend_ids = options['backend_ids']
149 7fede91e Christos Stavrakakis
        public = options['public']
150 b7d38981 Dimitris Aragiorgis
        flavor = options['flavor']
151 b7d38981 Dimitris Aragiorgis
        mode = options['mode']
152 71ec054d Christos Stavrakakis
        link = options['link']
153 71ec054d Christos Stavrakakis
        mac_prefix = options['mac_prefix']
154 b7d38981 Dimitris Aragiorgis
        tags = options['tags']
155 eefb7355 Christos Stavrakakis
        userid = options["owner"]
156 64cdd31b Christos Stavrakakis
        floating_ip_pool = parse_bool(options["floating_ip_pool"])
157 c75ab92e Christos Stavrakakis
        dhcp = parse_bool(options["dhcp"])
158 6dd70a5c Christos Stavrakakis
159 be7c5377 Christos Stavrakakis
        if name is None:
160 be7c5377 Christos Stavrakakis
            name = ""
161 be7c5377 Christos Stavrakakis
        if flavor is None:
162 5aeb4e93 Christos Stavrakakis
            raise CommandError("flavor is required")
163 5aeb4e93 Christos Stavrakakis
164 be7c5377 Christos Stavrakakis
        if (subnet is None) and (subnet6 is None):
165 be7c5377 Christos Stavrakakis
            raise CommandError("subnet or subnet6 is required")
166 5aeb4e93 Christos Stavrakakis
        if subnet is None and gateway is not None:
167 5aeb4e93 Christos Stavrakakis
            raise CommandError("Can not use gateway without subnet")
168 5aeb4e93 Christos Stavrakakis
        if subnet6 is None and gateway6 is not None:
169 5aeb4e93 Christos Stavrakakis
            raise CommandError("Can not use gateway6 without subnet6")
170 671db71c Christos Stavrakakis
        if public and not (backend_ids or floating_ip_pool):
171 671db71c Christos Stavrakakis
            raise CommandError("backend-ids is required")
172 eefb7355 Christos Stavrakakis
        if not userid and not public:
173 eefb7355 Christos Stavrakakis
            raise CommandError("'owner' is required for private networks")
174 7fede91e Christos Stavrakakis
175 671db71c Christos Stavrakakis
        backends = []
176 671db71c Christos Stavrakakis
        if backend_ids is not None:
177 6c77ed37 Christos Stavrakakis
            if backend_ids == "all":
178 6c77ed37 Christos Stavrakakis
                backends = Backend.objects.filter(offline=False)
179 6c77ed37 Christos Stavrakakis
            else:
180 6c77ed37 Christos Stavrakakis
                for backend_id in backend_ids.split(","):
181 6c77ed37 Christos Stavrakakis
                    try:
182 6c77ed37 Christos Stavrakakis
                        backend_id = int(backend_id)
183 6c77ed37 Christos Stavrakakis
                    except ValueError:
184 6c77ed37 Christos Stavrakakis
                        raise CommandError("Invalid backend-id: %s"
185 6c77ed37 Christos Stavrakakis
                                           % backend_id)
186 6c77ed37 Christos Stavrakakis
                    backend = get_backend(backend_id)
187 6c77ed37 Christos Stavrakakis
                    backends.append(backend)
188 6dd70a5c Christos Stavrakakis
189 e08afd0b Christos Stavrakakis
        network = networks.create(userid=userid, name=name, flavor=flavor,
190 c75ab92e Christos Stavrakakis
                                  subnet=subnet, gateway=gateway,
191 c75ab92e Christos Stavrakakis
                                  subnet6=subnet6, gateway6=gateway6,
192 c75ab92e Christos Stavrakakis
                                  dhcp=dhcp, public=public, mode=mode,
193 c75ab92e Christos Stavrakakis
                                  link=link, mac_prefix=mac_prefix, tags=tags,
194 b47f167a Christos Stavrakakis
                                  floating_ip_pool=floating_ip_pool,
195 671db71c Christos Stavrakakis
                                  backends=backends, lazy_create=False)
196 b47f167a Christos Stavrakakis
197 b47f167a Christos Stavrakakis
        self.stdout.write("Created network '%s' in DB.\n" % network)