Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.9 kB)

1 449c2d82 Christos Stavrakakis
# Copyright 2012-2013 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 2a2f9ffa Christos Stavrakakis
from synnefo.db.models import (Backend, BackendNetwork, pooled_rapi_client)
39 a4658bbe Christos Stavrakakis
from synnefo.management.common import (get_network, get_backend)
40 d758784b Christos Stavrakakis
from snf_django.management.utils import parse_bool
41 2a2f9ffa Christos Stavrakakis
from synnefo.logic import networks, backend as backend_mod
42 2a2f9ffa Christos Stavrakakis
from django.db import transaction
43 8fad925a Giorgos Verigakis
44 8fad925a Giorgos Verigakis
45 8fad925a Giorgos Verigakis
class Command(BaseCommand):
46 8fad925a Giorgos Verigakis
    args = "<network id>"
47 2a2f9ffa Christos Stavrakakis
    help = "Modify a network."
48 8fad925a Giorgos Verigakis
49 8fad925a Giorgos Verigakis
    option_list = BaseCommand.option_list + (
50 9621c777 Christos Stavrakakis
        make_option(
51 9621c777 Christos Stavrakakis
            '--name',
52 8fad925a Giorgos Verigakis
            dest='name',
53 8fad925a Giorgos Verigakis
            metavar='NAME',
54 2a2f9ffa Christos Stavrakakis
            help="Rename a network"),
55 9621c777 Christos Stavrakakis
        make_option(
56 9621c777 Christos Stavrakakis
            '--userid',
57 53b9ba10 Christos Stavrakakis
            dest='userid',
58 2a2f9ffa Christos Stavrakakis
            help="Change the owner of the network."),
59 9621c777 Christos Stavrakakis
        make_option(
60 2a2f9ffa Christos Stavrakakis
            "--drained",
61 2a2f9ffa Christos Stavrakakis
            dest="drained",
62 052ef3b9 Christos Stavrakakis
            metavar="True|False",
63 052ef3b9 Christos Stavrakakis
            choices=["True", "False"],
64 2a2f9ffa Christos Stavrakakis
            help="Set as drained to exclude for IP allocation."
65 2a2f9ffa Christos Stavrakakis
                 " Only used for public networks."),
66 9621c777 Christos Stavrakakis
        make_option(
67 2a2f9ffa Christos Stavrakakis
            "--floating-ip-pool",
68 2a2f9ffa Christos Stavrakakis
            dest="floating_ip_pool",
69 2a2f9ffa Christos Stavrakakis
            metavar="True|False",
70 2a2f9ffa Christos Stavrakakis
            choices=["True", "False"],
71 2a2f9ffa Christos Stavrakakis
            help="Convert network to a floating IP pool. During this"
72 2a2f9ffa Christos Stavrakakis
                 " conversation the network will be created to all"
73 2a2f9ffa Christos Stavrakakis
                 " available Ganeti backends."),
74 9621c777 Christos Stavrakakis
        make_option(
75 5ec446aa Christos Stavrakakis
            "--add-to-backend",
76 5ec446aa Christos Stavrakakis
            dest="add_to_backend",
77 2a2f9ffa Christos Stavrakakis
            metavar="BACKEND_ID",
78 2a2f9ffa Christos Stavrakakis
            help="Create a network to a Ganeti backend."),
79 5ec446aa Christos Stavrakakis
        make_option(
80 5ec446aa Christos Stavrakakis
            "--remove-from-backend",
81 5ec446aa Christos Stavrakakis
            dest="remove_from_backend",
82 2a2f9ffa Christos Stavrakakis
            metavar="BACKEND_ID",
83 2a2f9ffa Christos Stavrakakis
            help="Remove a network from a Ganeti backend."),
84 8fad925a Giorgos Verigakis
    )
85 8fad925a Giorgos Verigakis
86 2a2f9ffa Christos Stavrakakis
    @transaction.commit_on_success
87 8fad925a Giorgos Verigakis
    def handle(self, *args, **options):
88 8fad925a Giorgos Verigakis
        if len(args) != 1:
89 c2d969cb Christos Stavrakakis
            raise CommandError("Please provide a network ID")
90 8fad925a Giorgos Verigakis
91 b84ed662 Christos Stavrakakis
        network = get_network(args[0])
92 8fad925a Giorgos Verigakis
93 2a2f9ffa Christos Stavrakakis
        new_name = options.get("name")
94 2a2f9ffa Christos Stavrakakis
        if new_name is not None:
95 2a2f9ffa Christos Stavrakakis
            old_name = network.name
96 2a2f9ffa Christos Stavrakakis
            network = networks.rename(network, new_name)
97 2a2f9ffa Christos Stavrakakis
            self.stdout.write("Renamed network '%s' from '%s' to '%s'.\n" %
98 2a2f9ffa Christos Stavrakakis
                              (network, old_name, new_name))
99 bf1d3a70 Christos Stavrakakis
100 2a2f9ffa Christos Stavrakakis
        drained = options.get("drained")
101 2a2f9ffa Christos Stavrakakis
        if drained is not None:
102 2a2f9ffa Christos Stavrakakis
            drained = parse_bool(drained)
103 2a2f9ffa Christos Stavrakakis
            network.drained = drained
104 2a2f9ffa Christos Stavrakakis
            network.save()
105 2a2f9ffa Christos Stavrakakis
            self.stdout.write("Set network '%s' as drained=%s.\n" %
106 2a2f9ffa Christos Stavrakakis
                              (network, drained))
107 2a2f9ffa Christos Stavrakakis
108 2a2f9ffa Christos Stavrakakis
        new_owner = options.get("userid")
109 2a2f9ffa Christos Stavrakakis
        if new_owner is not None:
110 2a2f9ffa Christos Stavrakakis
            if "@" in new_owner:
111 2a2f9ffa Christos Stavrakakis
                raise CommandError("Invalid owner UUID.")
112 2a2f9ffa Christos Stavrakakis
            old_owner = network.userid
113 2a2f9ffa Christos Stavrakakis
            network.userid = new_owner
114 2a2f9ffa Christos Stavrakakis
            network.save()
115 2a2f9ffa Christos Stavrakakis
            msg = "Changed the owner of network '%s' from '%s' to '%s'.\n"
116 2a2f9ffa Christos Stavrakakis
            self.stdout.write(msg % (network, old_owner, new_owner))
117 53b9ba10 Christos Stavrakakis
118 5e5b2476 Christos Stavrakakis
        floating_ip_pool = options["floating_ip_pool"]
119 b47f167a Christos Stavrakakis
        if floating_ip_pool is not None:
120 b47f167a Christos Stavrakakis
            floating_ip_pool = parse_bool(floating_ip_pool)
121 2a2f9ffa Christos Stavrakakis
            if floating_ip_pool is False and network.floating_ip_pool is True:
122 2a2f9ffa Christos Stavrakakis
                if network.floating_ips.filter(deleted=False).exists():
123 2a2f9ffa Christos Stavrakakis
                    msg = ("Can not make network a non floating IP pool."
124 2a2f9ffa Christos Stavrakakis
                           " There are still reserved floating IPs.")
125 2a2f9ffa Christos Stavrakakis
                    raise CommandError(msg)
126 2a2f9ffa Christos Stavrakakis
            network.floating_ip_pool = floating_ip_pool
127 2a2f9ffa Christos Stavrakakis
            network.save()
128 2a2f9ffa Christos Stavrakakis
            self.stdout.write("Set network '%s' as floating-ip-pool=%s.\n" %
129 2a2f9ffa Christos Stavrakakis
                              (network, floating_ip_pool))
130 2a2f9ffa Christos Stavrakakis
            if floating_ip_pool is True:
131 2a2f9ffa Christos Stavrakakis
                for backend in Backend.objects.filter(offline=False):
132 2a2f9ffa Christos Stavrakakis
                    try:
133 2a2f9ffa Christos Stavrakakis
                        bnet = network.backend_networks.get(backend=backend)
134 2a2f9ffa Christos Stavrakakis
                    except BackendNetwork.DoesNotExist:
135 2a2f9ffa Christos Stavrakakis
                        bnet = network.create_backend_network(backend=backend)
136 2a2f9ffa Christos Stavrakakis
                    if bnet.operstate != "ACTIVE":
137 2a2f9ffa Christos Stavrakakis
                        backend_mod.create_network(network, backend,
138 2a2f9ffa Christos Stavrakakis
                                                   connect=True)
139 2a2f9ffa Christos Stavrakakis
                        msg = ("Sent job to create network '%s' in backend"
140 2a2f9ffa Christos Stavrakakis
                               " '%s'\n" % (network, backend))
141 2a2f9ffa Christos Stavrakakis
                        self.stdout.write(msg)
142 449c2d82 Christos Stavrakakis
143 5ec446aa Christos Stavrakakis
        add_to_backend = options["add_to_backend"]
144 5ec446aa Christos Stavrakakis
        if add_to_backend is not None:
145 5ec446aa Christos Stavrakakis
            backend = get_backend(add_to_backend)
146 5ec446aa Christos Stavrakakis
            network.create_backend_network(backend=backend)
147 2a2f9ffa Christos Stavrakakis
            backend_mod.create_network(network, backend, connect=True)
148 5ec446aa Christos Stavrakakis
            msg = "Sent job to create network '%s' in backend '%s'\n"
149 5ec446aa Christos Stavrakakis
            self.stdout.write(msg % (network, backend))
150 5ec446aa Christos Stavrakakis
151 5ec446aa Christos Stavrakakis
        remove_from_backend = options["remove_from_backend"]
152 5ec446aa Christos Stavrakakis
        if remove_from_backend is not None:
153 5ec446aa Christos Stavrakakis
            backend = get_backend(remove_from_backend)
154 5ec446aa Christos Stavrakakis
            if network.nics.filter(machine__backend=backend,
155 5ec446aa Christos Stavrakakis
                                   machine__deleted=False).exists():
156 5ec446aa Christos Stavrakakis
                msg = "Can not remove. There are still connected VMs to this"\
157 5ec446aa Christos Stavrakakis
                      " network"
158 5ec446aa Christos Stavrakakis
                raise CommandError(msg)
159 5ec446aa Christos Stavrakakis
            network.action = "DESTROY"
160 5ec446aa Christos Stavrakakis
            network.save()
161 2a2f9ffa Christos Stavrakakis
            backend_mod.delete_network(network, backend, disconnect=True)
162 5ec446aa Christos Stavrakakis
            msg = "Sent job to delete network '%s' from backend '%s'\n"
163 5ec446aa Christos Stavrakakis
            self.stdout.write(msg % (network, backend))