Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.1 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 6dd70a5c Christos Stavrakakis
from synnefo.db.models import Network
39 6dd70a5c Christos Stavrakakis
from synnefo.api.util import network_specs_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 6dd70a5c Christos Stavrakakis
        )
92 6dd70a5c Christos Stavrakakis
93 6dd70a5c Christos Stavrakakis
    def handle(self, *args, **options):
94 6dd70a5c Christos Stavrakakis
        if args:
95 6dd70a5c Christos Stavrakakis
            raise CommandError("Command doesn't accept any arguments")
96 6dd70a5c Christos Stavrakakis
97 6dd70a5c Christos Stavrakakis
        name = options['name']
98 6dd70a5c Christos Stavrakakis
        subnet = options['subnet']
99 6dd70a5c Christos Stavrakakis
100 6dd70a5c Christos Stavrakakis
        if not name:
101 6dd70a5c Christos Stavrakakis
            raise CommandError("Name is required")
102 6dd70a5c Christos Stavrakakis
        if not subnet:
103 6dd70a5c Christos Stavrakakis
            raise CommandError("Subnet is required")
104 6dd70a5c Christos Stavrakakis
105 6dd70a5c Christos Stavrakakis
        link, mac_prefix = network_specs_from_type(options['type'])
106 6dd70a5c Christos Stavrakakis
107 6dd70a5c Christos Stavrakakis
        subnet, gateway, subnet6, gateway6 = validate_network_info(options)
108 6dd70a5c Christos Stavrakakis
109 6dd70a5c Christos Stavrakakis
        if not link:
110 6dd70a5c Christos Stavrakakis
            raise CommandError("Can not create network. No connectivity link")
111 6dd70a5c Christos Stavrakakis
112 6dd70a5c Christos Stavrakakis
        network = Network.objects.create(
113 6dd70a5c Christos Stavrakakis
                name=name,
114 6dd70a5c Christos Stavrakakis
                userid=options['owner'],
115 6dd70a5c Christos Stavrakakis
                subnet=subnet,
116 6dd70a5c Christos Stavrakakis
                gateway=gateway,
117 6dd70a5c Christos Stavrakakis
                dhcp=options['dhcp'],
118 6dd70a5c Christos Stavrakakis
                type=options['type'],
119 6dd70a5c Christos Stavrakakis
                public=options['public'],
120 6dd70a5c Christos Stavrakakis
                link=link,
121 6dd70a5c Christos Stavrakakis
                mac_prefix=mac_prefix,
122 6dd70a5c Christos Stavrakakis
                gateway6=gateway6,
123 6dd70a5c Christos Stavrakakis
                subnet6=subnet6,
124 6dd70a5c Christos Stavrakakis
                state='PENDING')
125 6dd70a5c Christos Stavrakakis
126 6dd70a5c Christos Stavrakakis
        create_network(network)
127 6dd70a5c Christos Stavrakakis
128 6dd70a5c Christos Stavrakakis
129 6dd70a5c Christos Stavrakakis
def validate_network_info(options):
130 6dd70a5c Christos Stavrakakis
    subnet = options['subnet']
131 6dd70a5c Christos Stavrakakis
    gateway = options['gateway']
132 6dd70a5c Christos Stavrakakis
    subnet6 = options['subnet6']
133 6dd70a5c Christos Stavrakakis
    gateway6 = options['gateway6']
134 6dd70a5c Christos Stavrakakis
135 6dd70a5c Christos Stavrakakis
    try:
136 6dd70a5c Christos Stavrakakis
        ipaddr.IPv4Network(subnet)
137 6dd70a5c Christos Stavrakakis
    except ValueError:
138 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed subnet')
139 6dd70a5c Christos Stavrakakis
    try:
140 6dd70a5c Christos Stavrakakis
        gateway and ipaddr.IPv4Address(gateway) or None
141 6dd70a5c Christos Stavrakakis
    except ValueError:
142 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed gateway')
143 6dd70a5c Christos Stavrakakis
144 6dd70a5c Christos Stavrakakis
    try:
145 6dd70a5c Christos Stavrakakis
        subnet6 and ipaddr.IPv6Network(subnet6) or None
146 6dd70a5c Christos Stavrakakis
    except ValueError:
147 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed subnet6')
148 6dd70a5c Christos Stavrakakis
149 6dd70a5c Christos Stavrakakis
    try:
150 6dd70a5c Christos Stavrakakis
        gateway6 and ipaddr.IPv6Address(gateway6) or None
151 6dd70a5c Christos Stavrakakis
    except ValueError:
152 6dd70a5c Christos Stavrakakis
        raise CommandError('Malformed gateway6')
153 6dd70a5c Christos Stavrakakis
154 6dd70a5c Christos Stavrakakis
    return subnet, gateway, subnet6, gateway6