Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.3 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 b84ed662 Christos Stavrakakis
from synnefo.management.common import validate_network_info, get_backend
38 ce6eb935 Christos Stavrakakis
from synnefo.webproject.management.utils import pprint_table
39 6dd70a5c Christos Stavrakakis
40 c34b2908 Christos Stavrakakis
from synnefo import quotas
41 b84ed662 Christos Stavrakakis
from synnefo.db.models import Network
42 99af08a4 Christos Stavrakakis
from synnefo.db.utils import validate_mac, InvalidMacAddress
43 6dd70a5c Christos Stavrakakis
from synnefo.logic.backend import create_network
44 b7d38981 Dimitris Aragiorgis
from synnefo.api.util import values_from_flavor
45 b84ed662 Christos Stavrakakis
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 d09a166e Christos Stavrakakis
            "-n",
58 d09a166e Christos Stavrakakis
            "--dry-run",
59 d09a166e Christos Stavrakakis
            dest="dry_run",
60 d09a166e Christos Stavrakakis
            default=False,
61 d09a166e Christos Stavrakakis
            action="store_true"),
62 d09a166e Christos Stavrakakis
        make_option(
63 9621c777 Christos Stavrakakis
            '--name',
64 6dd70a5c Christos Stavrakakis
            dest='name',
65 6dd70a5c Christos Stavrakakis
            help="Name of network"),
66 9621c777 Christos Stavrakakis
        make_option(
67 9621c777 Christos Stavrakakis
            '--owner',
68 6dd70a5c Christos Stavrakakis
            dest='owner',
69 6dd70a5c Christos Stavrakakis
            help="The owner of the network"),
70 9621c777 Christos Stavrakakis
        make_option(
71 9621c777 Christos Stavrakakis
            '--subnet',
72 6dd70a5c Christos Stavrakakis
            dest='subnet',
73 6dd70a5c Christos Stavrakakis
            default=None,
74 6dd70a5c Christos Stavrakakis
            # required=True,
75 6dd70a5c Christos Stavrakakis
            help='Subnet of the network'),
76 9621c777 Christos Stavrakakis
        make_option(
77 9621c777 Christos Stavrakakis
            '--gateway',
78 6dd70a5c Christos Stavrakakis
            dest='gateway',
79 6dd70a5c Christos Stavrakakis
            default=None,
80 6dd70a5c Christos Stavrakakis
            help='Gateway of the network'),
81 9621c777 Christos Stavrakakis
        make_option(
82 9621c777 Christos Stavrakakis
            '--subnet6',
83 b7d38981 Dimitris Aragiorgis
            dest='subnet6',
84 b7d38981 Dimitris Aragiorgis
            default=None,
85 b7d38981 Dimitris Aragiorgis
            help='IPv6 subnet of the network'),
86 9621c777 Christos Stavrakakis
        make_option(
87 9621c777 Christos Stavrakakis
            '--gateway6',
88 b7d38981 Dimitris Aragiorgis
            dest='gateway6',
89 b7d38981 Dimitris Aragiorgis
            default=None,
90 b7d38981 Dimitris Aragiorgis
            help='IPv6 gateway of the network'),
91 9621c777 Christos Stavrakakis
        make_option(
92 9621c777 Christos Stavrakakis
            '--dhcp',
93 6dd70a5c Christos Stavrakakis
            dest='dhcp',
94 6dd70a5c Christos Stavrakakis
            action='store_true',
95 6dd70a5c Christos Stavrakakis
            default=False,
96 6dd70a5c Christos Stavrakakis
            help='Automatically assign IPs'),
97 9621c777 Christos Stavrakakis
        make_option(
98 9621c777 Christos Stavrakakis
            '--public',
99 6dd70a5c Christos Stavrakakis
            dest='public',
100 6dd70a5c Christos Stavrakakis
            action='store_true',
101 6dd70a5c Christos Stavrakakis
            default=False,
102 6dd70a5c Christos Stavrakakis
            help='Network is public'),
103 9621c777 Christos Stavrakakis
        make_option(
104 9621c777 Christos Stavrakakis
            '--flavor',
105 b7d38981 Dimitris Aragiorgis
            dest='flavor',
106 6dd70a5c Christos Stavrakakis
            default=None,
107 b7d38981 Dimitris Aragiorgis
            choices=NETWORK_FLAVORS,
108 b7d38981 Dimitris Aragiorgis
            help='Network flavor. Choices: ' + ', '.join(NETWORK_FLAVORS)),
109 9621c777 Christos Stavrakakis
        make_option(
110 9621c777 Christos Stavrakakis
            '--mode',
111 b7d38981 Dimitris Aragiorgis
            dest='mode',
112 7fede91e Christos Stavrakakis
            default=None,
113 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity mode."),
114 9621c777 Christos Stavrakakis
        make_option(
115 9621c777 Christos Stavrakakis
            '--link',
116 71ec054d Christos Stavrakakis
            dest='link',
117 71ec054d Christos Stavrakakis
            default=None,
118 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity link."),
119 9621c777 Christos Stavrakakis
        make_option(
120 9621c777 Christos Stavrakakis
            '--mac-prefix',
121 71ec054d Christos Stavrakakis
            dest='mac_prefix',
122 71ec054d Christos Stavrakakis
            default=None,
123 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity MAC prefix"),
124 9621c777 Christos Stavrakakis
        make_option(
125 9621c777 Christos Stavrakakis
            '--tags',
126 b7d38981 Dimitris Aragiorgis
            dest='tags',
127 b7d38981 Dimitris Aragiorgis
            default=None,
128 b7d38981 Dimitris Aragiorgis
            help='The tags of the Network (comma separated strings)'),
129 9621c777 Christos Stavrakakis
        make_option(
130 9621c777 Christos Stavrakakis
            '--backend-id',
131 b7d38981 Dimitris Aragiorgis
            dest='backend_id',
132 b7d38981 Dimitris Aragiorgis
            default=None,
133 b7d38981 Dimitris Aragiorgis
            help='ID of the backend that the network will be created. Only for'
134 b7d38981 Dimitris Aragiorgis
                 ' public networks'),
135 9621c777 Christos Stavrakakis
    )
136 6dd70a5c Christos Stavrakakis
137 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
138 6dd70a5c Christos Stavrakakis
        if args:
139 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
140 6dd70a5c Christos Stavrakakis
141 d09a166e Christos Stavrakakis
        dry_run = options["dry_run"]
142 6dd70a5c Christos Stavrakakis
        name = options['name']
143 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
144 7fede91e Christos Stavrakakis
        backend_id = options['backend_id']
145 7fede91e Christos Stavrakakis
        public = options['public']
146 b7d38981 Dimitris Aragiorgis
        flavor = options['flavor']
147 b7d38981 Dimitris Aragiorgis
        mode = options['mode']
148 71ec054d Christos Stavrakakis
        link = options['link']
149 71ec054d Christos Stavrakakis
        mac_prefix = options['mac_prefix']
150 b7d38981 Dimitris Aragiorgis
        tags = options['tags']
151 eefb7355 Christos Stavrakakis
        userid = options["owner"]
152 6dd70a5c Christos Stavrakakis
153 6dd70a5c Christos Stavrakakis
        if not name:
154 6dd70a5c Christos Stavrakakis
            raise CommandError("Name is required")
155 6dd70a5c Christos Stavrakakis
        if not subnet:
156 6dd70a5c Christos Stavrakakis
            raise CommandError("Subnet is required")
157 b7d38981 Dimitris Aragiorgis
        if not flavor:
158 b7d38981 Dimitris Aragiorgis
            raise CommandError("Flavor is required")
159 7fede91e Christos Stavrakakis
        if public and not backend_id:
160 7fede91e Christos Stavrakakis
            raise CommandError("backend-id is required")
161 eefb7355 Christos Stavrakakis
        if not userid and not public:
162 eefb7355 Christos Stavrakakis
            raise CommandError("'owner' is required for private networks")
163 7fede91e Christos Stavrakakis
164 b7d38981 Dimitris Aragiorgis
        if mac_prefix and flavor == "MAC_FILTERED":
165 71ec054d Christos Stavrakakis
            raise CommandError("Can not override MAC_FILTERED mac-prefix")
166 b7d38981 Dimitris Aragiorgis
        if link and flavor == "PHYSICAL_VLAN":
167 71ec054d Christos Stavrakakis
            raise CommandError("Can not override PHYSICAL_VLAN link")
168 71ec054d Christos Stavrakakis
169 7fede91e Christos Stavrakakis
        if backend_id:
170 b84ed662 Christos Stavrakakis
            backend = get_backend(backend_id)
171 6dd70a5c Christos Stavrakakis
172 b7d38981 Dimitris Aragiorgis
        fmode, flink, fmac_prefix, ftags = values_from_flavor(flavor)
173 b7d38981 Dimitris Aragiorgis
        mode = mode or fmode
174 b7d38981 Dimitris Aragiorgis
        link = link or flink
175 b7d38981 Dimitris Aragiorgis
        mac_prefix = mac_prefix or fmac_prefix
176 b7d38981 Dimitris Aragiorgis
        tags = tags or ftags
177 6dd70a5c Christos Stavrakakis
178 99af08a4 Christos Stavrakakis
        try:
179 99af08a4 Christos Stavrakakis
            validate_mac(mac_prefix + "0:00:00:00")
180 99af08a4 Christos Stavrakakis
        except InvalidMacAddress:
181 99af08a4 Christos Stavrakakis
            raise CommandError("Invalid MAC prefix '%s'" % mac_prefix)
182 6dd70a5c Christos Stavrakakis
        subnet, gateway, subnet6, gateway6 = validate_network_info(options)
183 6dd70a5c Christos Stavrakakis
184 b7d38981 Dimitris Aragiorgis
        if not link or not mode:
185 9621c777 Christos Stavrakakis
            raise CommandError("Can not create network."
186 9621c777 Christos Stavrakakis
                               " No connectivity link or mode")
187 d09a166e Christos Stavrakakis
        netinfo = {
188 d09a166e Christos Stavrakakis
           "name": name,
189 d09a166e Christos Stavrakakis
           "userid": options["owner"],
190 d09a166e Christos Stavrakakis
           "subnet": subnet,
191 d09a166e Christos Stavrakakis
           "gateway": gateway,
192 d09a166e Christos Stavrakakis
           "gateway6": gateway6,
193 d09a166e Christos Stavrakakis
           "subnet6": subnet6,
194 d09a166e Christos Stavrakakis
           "dhcp": options["dhcp"],
195 d09a166e Christos Stavrakakis
           "flavor": flavor,
196 d09a166e Christos Stavrakakis
           "public": public,
197 d09a166e Christos Stavrakakis
           "mode": mode,
198 d09a166e Christos Stavrakakis
           "link": link,
199 d09a166e Christos Stavrakakis
           "mac_prefix": mac_prefix,
200 d09a166e Christos Stavrakakis
           "tags": tags,
201 99af08a4 Christos Stavrakakis
           "state": "ACTIVE"}
202 d09a166e Christos Stavrakakis
203 d09a166e Christos Stavrakakis
        if dry_run:
204 d09a166e Christos Stavrakakis
            self.stdout.write("Creating network:\n")
205 d09a166e Christos Stavrakakis
            pprint_table(self.stdout, tuple(netinfo.items()))
206 d09a166e Christos Stavrakakis
            return
207 d09a166e Christos Stavrakakis
208 d09a166e Christos Stavrakakis
        network = Network.objects.create(**netinfo)
209 c34b2908 Christos Stavrakakis
        if userid:
210 c34b2908 Christos Stavrakakis
            quotas.issue_and_accept_commission(network)
211 6dd70a5c Christos Stavrakakis
212 99af08a4 Christos Stavrakakis
        if backend_id:
213 7fede91e Christos Stavrakakis
            # Create BackendNetwork only to the specified Backend
214 7fede91e Christos Stavrakakis
            network.create_backend_network(backend)
215 99af08a4 Christos Stavrakakis
            create_network(network=network, backend=backend, connect=True)