Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6 kB)

1 8fad925a Giorgos Verigakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 8fad925a Giorgos Verigakis
#
3 8fad925a Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 8fad925a Giorgos Verigakis
# without modification, are permitted provided that the following
5 8fad925a Giorgos Verigakis
# conditions are met:
6 8fad925a Giorgos Verigakis
#
7 8fad925a Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 8fad925a Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 8fad925a Giorgos Verigakis
#      disclaimer.
10 8fad925a Giorgos Verigakis
#
11 8fad925a Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 8fad925a Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 8fad925a Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 8fad925a Giorgos Verigakis
#      provided with the distribution.
15 8fad925a Giorgos Verigakis
#
16 8fad925a Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 8fad925a Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 8fad925a Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 8fad925a Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 8fad925a Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 8fad925a Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 8fad925a Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 8fad925a Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 8fad925a Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 8fad925a Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 8fad925a Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 8fad925a Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 8fad925a Giorgos Verigakis
#
29 8fad925a Giorgos Verigakis
# The views and conclusions contained in the software and
30 8fad925a Giorgos Verigakis
# documentation are those of the authors and should not be
31 8fad925a Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 8fad925a Giorgos Verigakis
# or implied, of GRNET S.A.
33 8fad925a Giorgos Verigakis
34 8fad925a Giorgos Verigakis
from optparse import make_option
35 8fad925a Giorgos Verigakis
36 8fad925a Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
37 8fad925a Giorgos Verigakis
38 53b9ba10 Christos Stavrakakis
from synnefo.db.models import Network, pooled_rapi_client
39 b84ed662 Christos Stavrakakis
from synnefo.management.common import validate_network_info, get_network
40 052ef3b9 Christos Stavrakakis
from synnefo.webproject.management.utils import parse_bool
41 53b9ba10 Christos Stavrakakis
42 9621c777 Christos Stavrakakis
HELP_MSG = """Modify a network.
43 53b9ba10 Christos Stavrakakis

44 53b9ba10 Christos Stavrakakis
This management command will only modify the state of the network in Cyclades
45 53b9ba10 Christos Stavrakakis
DB. The state of the network in the Ganeti backends will remain unchanged. You
46 53b9ba10 Christos Stavrakakis
should manually modify the network in all the backends, to synchronize the
47 53b9ba10 Christos Stavrakakis
state of DB and Ganeti.
48 53b9ba10 Christos Stavrakakis

49 53b9ba10 Christos Stavrakakis
The only exception is add_reserved_ips and remove_reserved_ips options, which
50 53b9ba10 Christos Stavrakakis
modify the IP pool in the Ganeti backends.
51 53b9ba10 Christos Stavrakakis
"""
52 8fad925a Giorgos Verigakis
53 8fad925a Giorgos Verigakis
54 8fad925a Giorgos Verigakis
class Command(BaseCommand):
55 8fad925a Giorgos Verigakis
    args = "<network id>"
56 53b9ba10 Christos Stavrakakis
    help = HELP_MSG
57 53b9ba10 Christos Stavrakakis
    output_transaction = True
58 8fad925a Giorgos Verigakis
59 8fad925a Giorgos Verigakis
    option_list = BaseCommand.option_list + (
60 9621c777 Christos Stavrakakis
        make_option(
61 9621c777 Christos Stavrakakis
            '--name',
62 8fad925a Giorgos Verigakis
            dest='name',
63 8fad925a Giorgos Verigakis
            metavar='NAME',
64 8fad925a Giorgos Verigakis
            help="Set network's name"),
65 9621c777 Christos Stavrakakis
        make_option(
66 9621c777 Christos Stavrakakis
            '--userid',
67 53b9ba10 Christos Stavrakakis
            dest='userid',
68 53b9ba10 Christos Stavrakakis
            help="Set the userid of the network owner"),
69 9621c777 Christos Stavrakakis
        make_option(
70 9621c777 Christos Stavrakakis
            '--subnet',
71 bf1d3a70 Christos Stavrakakis
            dest='subnet',
72 bf1d3a70 Christos Stavrakakis
            help="Set network's subnet"),
73 9621c777 Christos Stavrakakis
        make_option(
74 9621c777 Christos Stavrakakis
            '--gateway',
75 bf1d3a70 Christos Stavrakakis
            dest='gateway',
76 bf1d3a70 Christos Stavrakakis
            help="Set network's gateway"),
77 9621c777 Christos Stavrakakis
        make_option(
78 9621c777 Christos Stavrakakis
            '--subnet6',
79 cc3f266e Christos Stavrakakis
            dest='subnet6',
80 cc3f266e Christos Stavrakakis
            help="Set network's IPv6 subnet"),
81 9621c777 Christos Stavrakakis
        make_option(
82 9621c777 Christos Stavrakakis
            '--gateway6',
83 cc3f266e Christos Stavrakakis
            dest='gateway6',
84 cc3f266e Christos Stavrakakis
            help="Set network's IPv6 gateway"),
85 9621c777 Christos Stavrakakis
        make_option(
86 9621c777 Christos Stavrakakis
            '--dhcp',
87 bf1d3a70 Christos Stavrakakis
            dest='dhcp',
88 052ef3b9 Christos Stavrakakis
            metavar="True|False",
89 052ef3b9 Christos Stavrakakis
            choices=["True", "False"],
90 bf1d3a70 Christos Stavrakakis
            help="Set if network will use nfdhcp"),
91 9621c777 Christos Stavrakakis
        make_option(
92 9621c777 Christos Stavrakakis
            '--state',
93 8fad925a Giorgos Verigakis
            dest='state',
94 8fad925a Giorgos Verigakis
            metavar='STATE',
95 53b9ba10 Christos Stavrakakis
            help="Set network's state"),
96 9621c777 Christos Stavrakakis
        make_option(
97 9621c777 Christos Stavrakakis
            '--link',
98 53b9ba10 Christos Stavrakakis
            dest='link',
99 53b9ba10 Christos Stavrakakis
            help="Set the connectivity link"),
100 9621c777 Christos Stavrakakis
        make_option(
101 9621c777 Christos Stavrakakis
            '--mac-prefix',
102 53b9ba10 Christos Stavrakakis
            dest="mac_prefix",
103 53b9ba10 Christos Stavrakakis
            help="Set the MAC prefix"),
104 9621c777 Christos Stavrakakis
        make_option(
105 9621c777 Christos Stavrakakis
            '--add-reserved-ips',
106 53b9ba10 Christos Stavrakakis
            dest="add_reserved_ips",
107 53b9ba10 Christos Stavrakakis
            help="Comma seperated list of IPs to externally reserve."),
108 9621c777 Christos Stavrakakis
        make_option(
109 9621c777 Christos Stavrakakis
            '--remove-reserved-ips',
110 53b9ba10 Christos Stavrakakis
            dest="remove_reserved_ips",
111 53b9ba10 Christos Stavrakakis
            help="Comma seperated list of IPs to externally release."),
112 6dafedf6 Christos Stavrakakis
        make_option(
113 6dafedf6 Christos Stavrakakis
            "--drained",
114 6dafedf6 Christos Stavrakakis
            dest="drained",
115 6dafedf6 Christos Stavrakakis
            metavar="True|False",
116 6dafedf6 Christos Stavrakakis
            choices=["True", "False"],
117 6dafedf6 Christos Stavrakakis
            help="Set as drained to exclude for IP allocation."
118 6dafedf6 Christos Stavrakakis
                 " Only used for public networks.")
119 8fad925a Giorgos Verigakis
    )
120 8fad925a Giorgos Verigakis
121 8fad925a Giorgos Verigakis
    def handle(self, *args, **options):
122 8fad925a Giorgos Verigakis
        if len(args) != 1:
123 c2d969cb Christos Stavrakakis
            raise CommandError("Please provide a network ID")
124 8fad925a Giorgos Verigakis
125 b84ed662 Christos Stavrakakis
        network = get_network(args[0])
126 8fad925a Giorgos Verigakis
127 53b9ba10 Christos Stavrakakis
        # Validate subnet
128 53b9ba10 Christos Stavrakakis
        if options.get('subnet'):
129 53b9ba10 Christos Stavrakakis
            validate_network_info(options)
130 bf1d3a70 Christos Stavrakakis
131 53b9ba10 Christos Stavrakakis
        # Validate state
132 8fad925a Giorgos Verigakis
        state = options.get('state')
133 53b9ba10 Christos Stavrakakis
        if state:
134 fd33b074 Kostas Papadimitriou
            allowed = [x[0] for x in Network.OPER_STATES]
135 8fad925a Giorgos Verigakis
            if state not in allowed:
136 8fad925a Giorgos Verigakis
                msg = "Invalid state, must be one of %s" % ', '.join(allowed)
137 8fad925a Giorgos Verigakis
                raise CommandError(msg)
138 53b9ba10 Christos Stavrakakis
139 052ef3b9 Christos Stavrakakis
        dhcp = options.get("dhcp")
140 052ef3b9 Christos Stavrakakis
        if dhcp:
141 052ef3b9 Christos Stavrakakis
            options["dhcp"] = parse_bool(dhcp)
142 6dafedf6 Christos Stavrakakis
        drained = options.get("drained")
143 6dafedf6 Christos Stavrakakis
        if drained:
144 6dafedf6 Christos Stavrakakis
            options["drained"] = parse_bool(drained)
145 53b9ba10 Christos Stavrakakis
        fields = ('name', 'userid', 'subnet', 'gateway', 'subnet6', 'gateway6',
146 6dafedf6 Christos Stavrakakis
                  'dhcp', 'state', 'link', 'mac_prefix', 'drained')
147 53b9ba10 Christos Stavrakakis
        for field in fields:
148 53b9ba10 Christos Stavrakakis
            value = options.get(field, None)
149 052ef3b9 Christos Stavrakakis
            if value is not None:
150 53b9ba10 Christos Stavrakakis
                network.__setattr__(field, value)
151 53b9ba10 Christos Stavrakakis
152 53b9ba10 Christos Stavrakakis
        add_reserved_ips = options.get('add_reserved_ips')
153 53b9ba10 Christos Stavrakakis
        remove_reserved_ips = options.get('remove_reserved_ips')
154 53b9ba10 Christos Stavrakakis
        if add_reserved_ips or remove_reserved_ips:
155 53b9ba10 Christos Stavrakakis
            if add_reserved_ips:
156 53b9ba10 Christos Stavrakakis
                add_reserved_ips = add_reserved_ips.split(",")
157 53b9ba10 Christos Stavrakakis
            if remove_reserved_ips:
158 53b9ba10 Christos Stavrakakis
                remove_reserved_ips = remove_reserved_ips.split(",")
159 53b9ba10 Christos Stavrakakis
160 53b9ba10 Christos Stavrakakis
        for bnetwork in network.backend_networks.all():
161 53b9ba10 Christos Stavrakakis
            with pooled_rapi_client(bnetwork.backend) as c:
162 53b9ba10 Christos Stavrakakis
                c.ModifyNetwork(network=network.backend_id,
163 53b9ba10 Christos Stavrakakis
                                add_reserved_ips=add_reserved_ips,
164 53b9ba10 Christos Stavrakakis
                                remove_reserved_ips=remove_reserved_ips)
165 8fad925a Giorgos Verigakis
166 8fad925a Giorgos Verigakis
        network.save()