Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.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 6dd70a5c Christos Stavrakakis
38 7fede91e Christos Stavrakakis
from synnefo.db.models import Network, Backend
39 3165f027 Christos Stavrakakis
from synnefo.api.util import network_link_from_type
40 6dd70a5c Christos Stavrakakis
from synnefo.logic.backend import create_network
41 6dd70a5c Christos Stavrakakis
42 6dd70a5c Christos Stavrakakis
import ipaddr
43 6dd70a5c Christos Stavrakakis
44 6dd70a5c Christos Stavrakakis
NETWORK_TYPES = ['PUBLIC_ROUTED', 'PRIVATE_MAC_FILTERED',
45 6dd70a5c Christos Stavrakakis
                 'PRIVATE_PHYSICAL_VLAN', 'CUSTOM_ROUTED',
46 6dd70a5c Christos Stavrakakis
                 'CUSTOM_BRIDGED']
47 6dd70a5c Christos Stavrakakis
48 6dd70a5c Christos Stavrakakis
49 6dd70a5c Christos Stavrakakis
class Command(BaseCommand):
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 6dd70a5c Christos Stavrakakis
        make_option('--dhcp',
69 6dd70a5c Christos Stavrakakis
            dest='dhcp',
70 6dd70a5c Christos Stavrakakis
            action='store_true',
71 6dd70a5c Christos Stavrakakis
            default=False,
72 6dd70a5c Christos Stavrakakis
            help='Automatically assign IPs'),
73 6dd70a5c Christos Stavrakakis
        make_option('--public',
74 6dd70a5c Christos Stavrakakis
            dest='public',
75 6dd70a5c Christos Stavrakakis
            action='store_true',
76 6dd70a5c Christos Stavrakakis
            default=False,
77 6dd70a5c Christos Stavrakakis
            help='Network is public'),
78 6dd70a5c Christos Stavrakakis
        make_option('--type',
79 6dd70a5c Christos Stavrakakis
            dest='type',
80 6dd70a5c Christos Stavrakakis
            default='PRIVATE_MAC_FILTERED',
81 6dd70a5c Christos Stavrakakis
            choices=NETWORK_TYPES,
82 6dd70a5c Christos Stavrakakis
            help='Type of network. Choices: ' + ', '.join(NETWORK_TYPES)),
83 6dd70a5c Christos Stavrakakis
        make_option('--subnet6',
84 6dd70a5c Christos Stavrakakis
            dest='subnet6',
85 6dd70a5c Christos Stavrakakis
            default=None,
86 6dd70a5c Christos Stavrakakis
            help='IPv6 subnet of the network'),
87 6dd70a5c Christos Stavrakakis
        make_option('--gateway6',
88 6dd70a5c Christos Stavrakakis
            dest='gateway6',
89 6dd70a5c Christos Stavrakakis
            default=None,
90 6dd70a5c Christos Stavrakakis
            help='IPv6 gateway of the network'),
91 7fede91e Christos Stavrakakis
        make_option('--backend-id',
92 7fede91e Christos Stavrakakis
            dest='backend_id',
93 7fede91e Christos Stavrakakis
            default=None,
94 7fede91e Christos Stavrakakis
            help='ID of the backend that the network will be created. Only for'
95 7fede91e Christos Stavrakakis
                 ' public networks')
96 6dd70a5c Christos Stavrakakis
        )
97 6dd70a5c Christos Stavrakakis
98 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
99 6dd70a5c Christos Stavrakakis
        if args:
100 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
101 6dd70a5c Christos Stavrakakis
102 6dd70a5c Christos Stavrakakis
        name = options['name']
103 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
104 3165f027 Christos Stavrakakis
        typ = options['type']
105 7fede91e Christos Stavrakakis
        backend_id = options['backend_id']
106 7fede91e Christos Stavrakakis
        public = options['public']
107 6dd70a5c Christos Stavrakakis
108 6dd70a5c Christos Stavrakakis
        if not name:
109 6dd70a5c Christos Stavrakakis
            raise CommandError("Name is required")
110 6dd70a5c Christos Stavrakakis
        if not subnet:
111 6dd70a5c Christos Stavrakakis
            raise CommandError("Subnet is required")
112 7fede91e Christos Stavrakakis
        if public and not backend_id:
113 7fede91e Christos Stavrakakis
            raise CommandError("backend-id is required")
114 7fede91e Christos Stavrakakis
        if backend_id and not public:
115 7fede91e Christos Stavrakakis
            raise CommandError("Private networks must be created to"
116 7fede91e Christos Stavrakakis
                               " all backends")
117 7fede91e Christos Stavrakakis
118 7fede91e Christos Stavrakakis
        if backend_id:
119 7fede91e Christos Stavrakakis
            try:
120 7fede91e Christos Stavrakakis
                backend_id = int(backend_id)
121 7fede91e Christos Stavrakakis
                backend = Backend.objects.get(id=backend_id)
122 7fede91e Christos Stavrakakis
            except ValueError:
123 7fede91e Christos Stavrakakis
                raise CommandError("Invalid backend ID")
124 7fede91e Christos Stavrakakis
            except Backend.DoesNotExist:
125 7fede91e Christos Stavrakakis
                raise CommandError("Backend not found in DB")
126 6dd70a5c Christos Stavrakakis
127 3165f027 Christos Stavrakakis
        link = network_link_from_type(typ)
128 6dd70a5c Christos Stavrakakis
129 6dd70a5c Christos Stavrakakis
        subnet, gateway, subnet6, gateway6 = validate_network_info(options)
130 6dd70a5c Christos Stavrakakis
131 6dd70a5c Christos Stavrakakis
        if not link:
132 6dd70a5c Christos Stavrakakis
            raise CommandError("Can not create network. No connectivity link")
133 6dd70a5c Christos Stavrakakis
134 6dd70a5c Christos Stavrakakis
        network = Network.objects.create(
135 6dd70a5c Christos Stavrakakis
                name=name,
136 6dd70a5c Christos Stavrakakis
                userid=options['owner'],
137 6dd70a5c Christos Stavrakakis
                subnet=subnet,
138 6dd70a5c Christos Stavrakakis
                gateway=gateway,
139 6dd70a5c Christos Stavrakakis
                dhcp=options['dhcp'],
140 6dd70a5c Christos Stavrakakis
                type=options['type'],
141 7fede91e Christos Stavrakakis
                public=public,
142 6dd70a5c Christos Stavrakakis
                link=link,
143 6dd70a5c Christos Stavrakakis
                gateway6=gateway6,
144 6dd70a5c Christos Stavrakakis
                subnet6=subnet6,
145 6dd70a5c Christos Stavrakakis
                state='PENDING')
146 6dd70a5c Christos Stavrakakis
147 7fede91e Christos Stavrakakis
        if public:
148 7fede91e Christos Stavrakakis
            # Create BackendNetwork only to the specified Backend
149 7fede91e Christos Stavrakakis
            network.create_backend_network(backend)
150 7fede91e Christos Stavrakakis
            create_network(network, backends=[backend])
151 7fede91e Christos Stavrakakis
        else:
152 7fede91e Christos Stavrakakis
            # Create BackendNetwork entries for all Backends
153 7fede91e Christos Stavrakakis
            network.create_backend_network()
154 7fede91e Christos Stavrakakis
            create_network(network)
155 7cfbbf32 Christos Stavrakakis
156 6dd70a5c Christos Stavrakakis
157 6dd70a5c Christos Stavrakakis
158 6dd70a5c Christos Stavrakakis
def validate_network_info(options):
159 6dd70a5c Christos Stavrakakis
    subnet = options['subnet']
160 6dd70a5c Christos Stavrakakis
    gateway = options['gateway']
161 6dd70a5c Christos Stavrakakis
    subnet6 = options['subnet6']
162 6dd70a5c Christos Stavrakakis
    gateway6 = options['gateway6']
163 6dd70a5c Christos Stavrakakis
164 6dd70a5c Christos Stavrakakis
    try:
165 6dd70a5c Christos Stavrakakis
        ipaddr.IPv4Network(subnet)
166 6dd70a5c Christos Stavrakakis
    except ValueError:
167 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed subnet')
168 6dd70a5c Christos Stavrakakis
    try:
169 6dd70a5c Christos Stavrakakis
        gateway and ipaddr.IPv4Address(gateway) or None
170 6dd70a5c Christos Stavrakakis
    except ValueError:
171 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed gateway')
172 6dd70a5c Christos Stavrakakis
173 6dd70a5c Christos Stavrakakis
    try:
174 6dd70a5c Christos Stavrakakis
        subnet6 and ipaddr.IPv6Network(subnet6) or None
175 6dd70a5c Christos Stavrakakis
    except ValueError:
176 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed subnet6')
177 6dd70a5c Christos Stavrakakis
178 6dd70a5c Christos Stavrakakis
    try:
179 6dd70a5c Christos Stavrakakis
        gateway6 and ipaddr.IPv6Address(gateway6) or None
180 6dd70a5c Christos Stavrakakis
    except ValueError:
181 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed gateway6')
182 6dd70a5c Christos Stavrakakis
183 6dd70a5c Christos Stavrakakis
    return subnet, gateway, subnet6, gateway6