Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.5 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 6dd70a5c Christos Stavrakakis
39 b84ed662 Christos Stavrakakis
from synnefo.db.models import Network
40 6dd70a5c Christos Stavrakakis
from synnefo.logic.backend import create_network
41 b7d38981 Dimitris Aragiorgis
from synnefo.api.util import values_from_flavor
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 6dd70a5c Christos Stavrakakis
        make_option('--name',
54 6dd70a5c Christos Stavrakakis
            dest='name',
55 6dd70a5c Christos Stavrakakis
            help="Name of network"),
56 6dd70a5c Christos Stavrakakis
        make_option('--owner',
57 6dd70a5c Christos Stavrakakis
            dest='owner',
58 6dd70a5c Christos Stavrakakis
            help="The owner of the network"),
59 6dd70a5c Christos Stavrakakis
        make_option('--subnet',
60 6dd70a5c Christos Stavrakakis
            dest='subnet',
61 6dd70a5c Christos Stavrakakis
            default=None,
62 6dd70a5c Christos Stavrakakis
            # required=True,
63 6dd70a5c Christos Stavrakakis
            help='Subnet of the network'),
64 6dd70a5c Christos Stavrakakis
        make_option('--gateway',
65 6dd70a5c Christos Stavrakakis
            dest='gateway',
66 6dd70a5c Christos Stavrakakis
            default=None,
67 6dd70a5c Christos Stavrakakis
            help='Gateway of the network'),
68 b7d38981 Dimitris Aragiorgis
        make_option('--subnet6',
69 b7d38981 Dimitris Aragiorgis
            dest='subnet6',
70 b7d38981 Dimitris Aragiorgis
            default=None,
71 b7d38981 Dimitris Aragiorgis
            help='IPv6 subnet of the network'),
72 b7d38981 Dimitris Aragiorgis
        make_option('--gateway6',
73 b7d38981 Dimitris Aragiorgis
            dest='gateway6',
74 b7d38981 Dimitris Aragiorgis
            default=None,
75 b7d38981 Dimitris Aragiorgis
            help='IPv6 gateway of the network'),
76 6dd70a5c Christos Stavrakakis
        make_option('--dhcp',
77 6dd70a5c Christos Stavrakakis
            dest='dhcp',
78 6dd70a5c Christos Stavrakakis
            action='store_true',
79 6dd70a5c Christos Stavrakakis
            default=False,
80 6dd70a5c Christos Stavrakakis
            help='Automatically assign IPs'),
81 6dd70a5c Christos Stavrakakis
        make_option('--public',
82 6dd70a5c Christos Stavrakakis
            dest='public',
83 6dd70a5c Christos Stavrakakis
            action='store_true',
84 6dd70a5c Christos Stavrakakis
            default=False,
85 6dd70a5c Christos Stavrakakis
            help='Network is public'),
86 b7d38981 Dimitris Aragiorgis
        make_option('--flavor',
87 b7d38981 Dimitris Aragiorgis
            dest='flavor',
88 6dd70a5c Christos Stavrakakis
            default=None,
89 b7d38981 Dimitris Aragiorgis
            choices=NETWORK_FLAVORS,
90 b7d38981 Dimitris Aragiorgis
            help='Network flavor. Choices: ' + ', '.join(NETWORK_FLAVORS)),
91 b7d38981 Dimitris Aragiorgis
        make_option('--mode',
92 b7d38981 Dimitris Aragiorgis
            dest='mode',
93 7fede91e Christos Stavrakakis
            default=None,
94 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity mode."),
95 71ec054d Christos Stavrakakis
        make_option('--link',
96 71ec054d Christos Stavrakakis
            dest='link',
97 71ec054d Christos Stavrakakis
            default=None,
98 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity link."),
99 71ec054d Christos Stavrakakis
        make_option('--mac-prefix',
100 71ec054d Christos Stavrakakis
            dest='mac_prefix',
101 71ec054d Christos Stavrakakis
            default=None,
102 b7d38981 Dimitris Aragiorgis
            help="Overwrite flavor connectivity MAC prefix"),
103 b7d38981 Dimitris Aragiorgis
        make_option('--tags',
104 b7d38981 Dimitris Aragiorgis
            dest='tags',
105 b7d38981 Dimitris Aragiorgis
            default=None,
106 b7d38981 Dimitris Aragiorgis
            help='The tags of the Network (comma separated strings)'),
107 b7d38981 Dimitris Aragiorgis
        make_option('--backend-id',
108 b7d38981 Dimitris Aragiorgis
            dest='backend_id',
109 b7d38981 Dimitris Aragiorgis
            default=None,
110 b7d38981 Dimitris Aragiorgis
            help='ID of the backend that the network will be created. Only for'
111 b7d38981 Dimitris Aragiorgis
                 ' public networks'),
112 6dd70a5c Christos Stavrakakis
        )
113 6dd70a5c Christos Stavrakakis
114 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
115 6dd70a5c Christos Stavrakakis
        if args:
116 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
117 6dd70a5c Christos Stavrakakis
118 6dd70a5c Christos Stavrakakis
        name = options['name']
119 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
120 7fede91e Christos Stavrakakis
        backend_id = options['backend_id']
121 7fede91e Christos Stavrakakis
        public = options['public']
122 b7d38981 Dimitris Aragiorgis
        flavor = options['flavor']
123 b7d38981 Dimitris Aragiorgis
        mode = options['mode']
124 71ec054d Christos Stavrakakis
        link = options['link']
125 71ec054d Christos Stavrakakis
        mac_prefix = options['mac_prefix']
126 b7d38981 Dimitris Aragiorgis
        tags = options['tags']
127 6dd70a5c Christos Stavrakakis
128 6dd70a5c Christos Stavrakakis
        if not name:
129 6dd70a5c Christos Stavrakakis
            raise CommandError("Name is required")
130 6dd70a5c Christos Stavrakakis
        if not subnet:
131 6dd70a5c Christos Stavrakakis
            raise CommandError("Subnet is required")
132 b7d38981 Dimitris Aragiorgis
        if not flavor:
133 b7d38981 Dimitris Aragiorgis
            raise CommandError("Flavor is required")
134 7fede91e Christos Stavrakakis
        if public and not backend_id:
135 7fede91e Christos Stavrakakis
            raise CommandError("backend-id is required")
136 7fede91e Christos Stavrakakis
        if backend_id and not public:
137 7fede91e Christos Stavrakakis
            raise CommandError("Private networks must be created to"
138 7fede91e Christos Stavrakakis
                               " all backends")
139 7fede91e Christos Stavrakakis
140 b7d38981 Dimitris Aragiorgis
        if mac_prefix and flavor == "MAC_FILTERED":
141 71ec054d Christos Stavrakakis
            raise CommandError("Can not override MAC_FILTERED mac-prefix")
142 b7d38981 Dimitris Aragiorgis
        if link and flavor == "PHYSICAL_VLAN":
143 71ec054d Christos Stavrakakis
            raise CommandError("Can not override PHYSICAL_VLAN link")
144 71ec054d Christos Stavrakakis
145 7fede91e Christos Stavrakakis
        if backend_id:
146 b84ed662 Christos Stavrakakis
            backend = get_backend(backend_id)
147 6dd70a5c Christos Stavrakakis
148 b7d38981 Dimitris Aragiorgis
        fmode, flink, fmac_prefix, ftags = values_from_flavor(flavor)
149 b7d38981 Dimitris Aragiorgis
        mode = mode or fmode
150 b7d38981 Dimitris Aragiorgis
        link = link or flink
151 b7d38981 Dimitris Aragiorgis
        mac_prefix = mac_prefix or fmac_prefix
152 b7d38981 Dimitris Aragiorgis
        tags = tags or ftags
153 6dd70a5c Christos Stavrakakis
154 6dd70a5c Christos Stavrakakis
        subnet, gateway, subnet6, gateway6 = validate_network_info(options)
155 6dd70a5c Christos Stavrakakis
156 b7d38981 Dimitris Aragiorgis
        if not link or not mode:
157 b7d38981 Dimitris Aragiorgis
            raise CommandError("Can not create network. No connectivity link or mode")
158 6dd70a5c Christos Stavrakakis
159 6dd70a5c Christos Stavrakakis
        network = Network.objects.create(
160 6dd70a5c Christos Stavrakakis
                name=name,
161 6dd70a5c Christos Stavrakakis
                userid=options['owner'],
162 6dd70a5c Christos Stavrakakis
                subnet=subnet,
163 6dd70a5c Christos Stavrakakis
                gateway=gateway,
164 b7d38981 Dimitris Aragiorgis
                gateway6=gateway6,
165 b7d38981 Dimitris Aragiorgis
                subnet6=subnet6,
166 6dd70a5c Christos Stavrakakis
                dhcp=options['dhcp'],
167 b7d38981 Dimitris Aragiorgis
                flavor=flavor,
168 7fede91e Christos Stavrakakis
                public=public,
169 b7d38981 Dimitris Aragiorgis
                mode=mode,
170 6dd70a5c Christos Stavrakakis
                link=link,
171 af6a3bc5 Christos Stavrakakis
                mac_prefix=mac_prefix,
172 b7d38981 Dimitris Aragiorgis
                tags=tags,
173 6dd70a5c Christos Stavrakakis
                state='PENDING')
174 6dd70a5c Christos Stavrakakis
175 7fede91e Christos Stavrakakis
        if public:
176 7fede91e Christos Stavrakakis
            # Create BackendNetwork only to the specified Backend
177 7fede91e Christos Stavrakakis
            network.create_backend_network(backend)
178 7fede91e Christos Stavrakakis
            create_network(network, backends=[backend])
179 7fede91e Christos Stavrakakis
        else:
180 7fede91e Christos Stavrakakis
            # Create BackendNetwork entries for all Backends
181 7fede91e Christos Stavrakakis
            network.create_backend_network()
182 7fede91e Christos Stavrakakis
            create_network(network)