Statistics
| Branch: | Tag: | Revision:

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

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