Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.2 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 53b9ba10 Christos Stavrakakis
41 53b9ba10 Christos Stavrakakis
HELP_MSG = \
42 53b9ba10 Christos Stavrakakis
"""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 8fad925a Giorgos Verigakis
        make_option('--name',
61 8fad925a Giorgos Verigakis
            dest='name',
62 8fad925a Giorgos Verigakis
            metavar='NAME',
63 8fad925a Giorgos Verigakis
            help="Set network's name"),
64 53b9ba10 Christos Stavrakakis
        make_option('--userid',
65 53b9ba10 Christos Stavrakakis
            dest='userid',
66 53b9ba10 Christos Stavrakakis
            help="Set the userid of the network owner"),
67 bf1d3a70 Christos Stavrakakis
        make_option('--subnet',
68 bf1d3a70 Christos Stavrakakis
            dest='subnet',
69 bf1d3a70 Christos Stavrakakis
            help="Set network's subnet"),
70 bf1d3a70 Christos Stavrakakis
        make_option('--gateway',
71 bf1d3a70 Christos Stavrakakis
            dest='gateway',
72 bf1d3a70 Christos Stavrakakis
            help="Set network's gateway"),
73 cc3f266e Christos Stavrakakis
        make_option('--subnet6',
74 cc3f266e Christos Stavrakakis
            dest='subnet6',
75 cc3f266e Christos Stavrakakis
            help="Set network's IPv6 subnet"),
76 cc3f266e Christos Stavrakakis
        make_option('--gateway6',
77 cc3f266e Christos Stavrakakis
            dest='gateway6',
78 cc3f266e Christos Stavrakakis
            help="Set network's IPv6 gateway"),
79 bf1d3a70 Christos Stavrakakis
        make_option('--dhcp',
80 bf1d3a70 Christos Stavrakakis
            dest='dhcp',
81 bf1d3a70 Christos Stavrakakis
            help="Set if network will use nfdhcp"),
82 8fad925a Giorgos Verigakis
        make_option('--state',
83 8fad925a Giorgos Verigakis
            dest='state',
84 8fad925a Giorgos Verigakis
            metavar='STATE',
85 53b9ba10 Christos Stavrakakis
            help="Set network's state"),
86 53b9ba10 Christos Stavrakakis
        make_option('--link',
87 53b9ba10 Christos Stavrakakis
            dest='link',
88 53b9ba10 Christos Stavrakakis
            help="Set the connectivity link"),
89 53b9ba10 Christos Stavrakakis
        make_option('--mac-prefix',
90 53b9ba10 Christos Stavrakakis
            dest="mac_prefix",
91 53b9ba10 Christos Stavrakakis
            help="Set the MAC prefix"),
92 53b9ba10 Christos Stavrakakis
        make_option('--add-reserved-ips',
93 53b9ba10 Christos Stavrakakis
            dest="add_reserved_ips",
94 53b9ba10 Christos Stavrakakis
            help="Comma seperated list of IPs to externally reserve."),
95 53b9ba10 Christos Stavrakakis
        make_option('--remove-reserved-ips',
96 53b9ba10 Christos Stavrakakis
            dest="remove_reserved_ips",
97 53b9ba10 Christos Stavrakakis
            help="Comma seperated list of IPs to externally release."),
98 53b9ba10 Christos Stavrakakis
99 8fad925a Giorgos Verigakis
    )
100 8fad925a Giorgos Verigakis
101 8fad925a Giorgos Verigakis
    def handle(self, *args, **options):
102 8fad925a Giorgos Verigakis
        if len(args) != 1:
103 c2d969cb Christos Stavrakakis
            raise CommandError("Please provide a network ID")
104 8fad925a Giorgos Verigakis
105 b84ed662 Christos Stavrakakis
        network = get_network(args[0])
106 8fad925a Giorgos Verigakis
107 53b9ba10 Christos Stavrakakis
        # Validate subnet
108 53b9ba10 Christos Stavrakakis
        if options.get('subnet'):
109 53b9ba10 Christos Stavrakakis
            validate_network_info(options)
110 bf1d3a70 Christos Stavrakakis
111 53b9ba10 Christos Stavrakakis
        # Validate state
112 8fad925a Giorgos Verigakis
        state = options.get('state')
113 53b9ba10 Christos Stavrakakis
        if state:
114 fd33b074 Kostas Papadimitriou
            allowed = [x[0] for x in Network.OPER_STATES]
115 8fad925a Giorgos Verigakis
            if state not in allowed:
116 8fad925a Giorgos Verigakis
                msg = "Invalid state, must be one of %s" % ', '.join(allowed)
117 8fad925a Giorgos Verigakis
                raise CommandError(msg)
118 53b9ba10 Christos Stavrakakis
119 53b9ba10 Christos Stavrakakis
        fields = ('name', 'userid', 'subnet', 'gateway', 'subnet6', 'gateway6',
120 53b9ba10 Christos Stavrakakis
                  'dhcp', 'state', 'link', 'mac_prefix')
121 53b9ba10 Christos Stavrakakis
        for field in fields:
122 53b9ba10 Christos Stavrakakis
            value = options.get(field, None)
123 53b9ba10 Christos Stavrakakis
            if value:
124 53b9ba10 Christos Stavrakakis
                network.__setattr__(field, value)
125 53b9ba10 Christos Stavrakakis
126 53b9ba10 Christos Stavrakakis
        add_reserved_ips = options.get('add_reserved_ips')
127 53b9ba10 Christos Stavrakakis
        remove_reserved_ips = options.get('remove_reserved_ips')
128 53b9ba10 Christos Stavrakakis
        if add_reserved_ips or remove_reserved_ips:
129 53b9ba10 Christos Stavrakakis
            if add_reserved_ips:
130 53b9ba10 Christos Stavrakakis
                add_reserved_ips = add_reserved_ips.split(",")
131 53b9ba10 Christos Stavrakakis
            if remove_reserved_ips:
132 53b9ba10 Christos Stavrakakis
                remove_reserved_ips = remove_reserved_ips.split(",")
133 53b9ba10 Christos Stavrakakis
134 53b9ba10 Christos Stavrakakis
        for bnetwork in network.backend_networks.all():
135 53b9ba10 Christos Stavrakakis
            with pooled_rapi_client(bnetwork.backend) as c:
136 53b9ba10 Christos Stavrakakis
                c.ModifyNetwork(network=network.backend_id,
137 53b9ba10 Christos Stavrakakis
                                add_reserved_ips=add_reserved_ips,
138 53b9ba10 Christos Stavrakakis
                                remove_reserved_ips=remove_reserved_ips)
139 8fad925a Giorgos Verigakis
140 8fad925a Giorgos Verigakis
        network.save()