Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.5 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 5ec446aa Christos Stavrakakis
from synnefo.management.common import (validate_network_info, get_network,
40 5ec446aa Christos Stavrakakis
                                       get_backend)
41 052ef3b9 Christos Stavrakakis
from synnefo.webproject.management.utils import parse_bool
42 5ec446aa Christos Stavrakakis
from synnefo.logic.backend import create_network, delete_network
43 53b9ba10 Christos Stavrakakis
44 9621c777 Christos Stavrakakis
HELP_MSG = """Modify a network.
45 53b9ba10 Christos Stavrakakis

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

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