Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / management / commands / server-modify.py @ 9835a70d

History | View | Annotate | Download (5.5 kB)

1 35f2fc07 Christos Stavrakakis
# Copyright 2013 GRNET S.A. All rights reserved.
2 11300d7b Giorgos Verigakis
#
3 11300d7b Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 11300d7b Giorgos Verigakis
# without modification, are permitted provided that the following
5 11300d7b Giorgos Verigakis
# conditions are met:
6 11300d7b Giorgos Verigakis
#
7 11300d7b Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 11300d7b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 11300d7b Giorgos Verigakis
#      disclaimer.
10 11300d7b Giorgos Verigakis
#
11 11300d7b Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 11300d7b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 11300d7b Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 11300d7b Giorgos Verigakis
#      provided with the distribution.
15 11300d7b Giorgos Verigakis
#
16 11300d7b Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 11300d7b Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 11300d7b Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 11300d7b Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 11300d7b Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 11300d7b Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 11300d7b Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 11300d7b Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 11300d7b Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 11300d7b Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 11300d7b Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 11300d7b Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 11300d7b Giorgos Verigakis
#
29 11300d7b Giorgos Verigakis
# The views and conclusions contained in the software and
30 11300d7b Giorgos Verigakis
# documentation are those of the authors and should not be
31 11300d7b Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 11300d7b Giorgos Verigakis
# or implied, of GRNET S.A.
33 11300d7b Giorgos Verigakis
34 11300d7b Giorgos Verigakis
from optparse import make_option
35 11300d7b Giorgos Verigakis
36 91f7a08c Christos Stavrakakis
from django.db import transaction
37 11300d7b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
38 35f2fc07 Christos Stavrakakis
from synnefo.management.common import (get_vm, get_flavor, convert_api_faults,
39 35f2fc07 Christos Stavrakakis
                                       wait_server_task)
40 91f7a08c Christos Stavrakakis
from synnefo.webproject.management.utils import parse_bool
41 35f2fc07 Christos Stavrakakis
from synnefo.logic import servers
42 35f2fc07 Christos Stavrakakis
43 35f2fc07 Christos Stavrakakis
44 35f2fc07 Christos Stavrakakis
ACTIONS = ["start", "stop", "reboot_hard", "reboot_soft"]
45 11300d7b Giorgos Verigakis
46 11300d7b Giorgos Verigakis
47 11300d7b Giorgos Verigakis
class Command(BaseCommand):
48 11300d7b Giorgos Verigakis
    args = "<server ID>"
49 91f7a08c Christos Stavrakakis
    help = "Modify a server."
50 39a6388d Christos Stavrakakis
51 11300d7b Giorgos Verigakis
    option_list = BaseCommand.option_list + (
52 9621c777 Christos Stavrakakis
        make_option(
53 9621c777 Christos Stavrakakis
            '--name',
54 11300d7b Giorgos Verigakis
            dest='name',
55 11300d7b Giorgos Verigakis
            metavar='NAME',
56 35f2fc07 Christos Stavrakakis
            help="Rename server."),
57 9621c777 Christos Stavrakakis
        make_option(
58 9621c777 Christos Stavrakakis
            '--owner',
59 11300d7b Giorgos Verigakis
            dest='owner',
60 91f7a08c Christos Stavrakakis
            metavar='USER_UUID',
61 91f7a08c Christos Stavrakakis
            help="Change ownership of server. Value must be a user UUID"),
62 9621c777 Christos Stavrakakis
        make_option(
63 91f7a08c Christos Stavrakakis
            "--suspended",
64 91f7a08c Christos Stavrakakis
            dest="suspended",
65 91f7a08c Christos Stavrakakis
            default=None,
66 91f7a08c Christos Stavrakakis
            choices=["True", "False"],
67 91f7a08c Christos Stavrakakis
            metavar="True|False",
68 91f7a08c Christos Stavrakakis
            help="Mark a server as suspended/non-suspended."),
69 60a71437 Christos Stavrakakis
        make_option(
70 60a71437 Christos Stavrakakis
            "--flavor",
71 60a71437 Christos Stavrakakis
            dest="flavor",
72 60a71437 Christos Stavrakakis
            metavar="FLAVOR_ID",
73 60a71437 Christos Stavrakakis
            help="Resize a server by modifying its flavor. The new flavor"
74 60a71437 Christos Stavrakakis
                 " must have the same disk size and disk template."),
75 35f2fc07 Christos Stavrakakis
        make_option(
76 35f2fc07 Christos Stavrakakis
            "--action",
77 35f2fc07 Christos Stavrakakis
            dest="action",
78 35f2fc07 Christos Stavrakakis
            choices=ACTIONS,
79 35f2fc07 Christos Stavrakakis
            metavar="|".join(ACTIONS),
80 35f2fc07 Christos Stavrakakis
            help="Perform one of the allowed actions."),
81 35f2fc07 Christos Stavrakakis
        make_option(
82 35f2fc07 Christos Stavrakakis
            "--wait",
83 35f2fc07 Christos Stavrakakis
            dest="wait",
84 35f2fc07 Christos Stavrakakis
            default="True",
85 35f2fc07 Christos Stavrakakis
            choices=["True", "False"],
86 35f2fc07 Christos Stavrakakis
            metavar="True|False",
87 35f2fc07 Christos Stavrakakis
            help="Wait for Ganeti jobs to complete."),
88 9621c777 Christos Stavrakakis
    )
89 39a6388d Christos Stavrakakis
90 91f7a08c Christos Stavrakakis
    @transaction.commit_on_success
91 60a71437 Christos Stavrakakis
    @convert_api_faults
92 11300d7b Giorgos Verigakis
    def handle(self, *args, **options):
93 11300d7b Giorgos Verigakis
        if len(args) != 1:
94 11300d7b Giorgos Verigakis
            raise CommandError("Please provide a server ID")
95 39a6388d Christos Stavrakakis
96 b84ed662 Christos Stavrakakis
        server = get_vm(args[0])
97 39a6388d Christos Stavrakakis
98 91f7a08c Christos Stavrakakis
        new_name = options.get("name", None)
99 91f7a08c Christos Stavrakakis
        if new_name is not None:
100 91f7a08c Christos Stavrakakis
            old_name = server.name
101 91f7a08c Christos Stavrakakis
            server = servers.rename(server, new_name)
102 91f7a08c Christos Stavrakakis
            self.stdout.write("Renamed server '%s' from '%s' to '%s'\n" %
103 91f7a08c Christos Stavrakakis
                              (server, old_name, new_name))
104 39a6388d Christos Stavrakakis
105 91f7a08c Christos Stavrakakis
        suspended = options.get("suspended", None)
106 91f7a08c Christos Stavrakakis
        if suspended is not None:
107 91f7a08c Christos Stavrakakis
            suspended = parse_bool(suspended)
108 91f7a08c Christos Stavrakakis
            server.suspended = suspended
109 91f7a08c Christos Stavrakakis
            server.save()
110 91f7a08c Christos Stavrakakis
            self.stdout.write("Set server '%s' as suspended=%s\n" %
111 91f7a08c Christos Stavrakakis
                              (server, suspended))
112 39a6388d Christos Stavrakakis
113 91f7a08c Christos Stavrakakis
        new_owner = options.get('owner')
114 91f7a08c Christos Stavrakakis
        if new_owner is not None:
115 91f7a08c Christos Stavrakakis
            if "@" in new_owner:
116 91f7a08c Christos Stavrakakis
                raise CommandError("Invalid owner UUID.")
117 91f7a08c Christos Stavrakakis
            old_owner = server.userid
118 91f7a08c Christos Stavrakakis
            server.userid = new_owner
119 91f7a08c Christos Stavrakakis
            server.save()
120 91f7a08c Christos Stavrakakis
            msg = "Changed the owner of server '%s' from '%s' to '%s'.\n"
121 91f7a08c Christos Stavrakakis
            self.stdout.write(msg % (server, old_owner, new_owner))
122 60a71437 Christos Stavrakakis
123 35f2fc07 Christos Stavrakakis
        wait = parse_bool(options["wait"])
124 60a71437 Christos Stavrakakis
        new_flavor_id = options.get("flavor")
125 60a71437 Christos Stavrakakis
        if new_flavor_id is not None:
126 60a71437 Christos Stavrakakis
            new_flavor = get_flavor(new_flavor_id)
127 60a71437 Christos Stavrakakis
            old_flavor = server.flavor
128 60a71437 Christos Stavrakakis
            msg = "Resizing server '%s' from flavor '%s' to '%s'.\n"
129 60a71437 Christos Stavrakakis
            self.stdout.write(msg % (server, old_flavor, new_flavor))
130 60a71437 Christos Stavrakakis
            server = servers.resize(server, new_flavor)
131 35f2fc07 Christos Stavrakakis
            wait_server_task(server, wait, stdout=self.stdout)
132 35f2fc07 Christos Stavrakakis
133 35f2fc07 Christos Stavrakakis
        action = options.get("action")
134 35f2fc07 Christos Stavrakakis
        if action is not None:
135 35f2fc07 Christos Stavrakakis
            if action == "start":
136 35f2fc07 Christos Stavrakakis
                server = servers.start(server)
137 35f2fc07 Christos Stavrakakis
            elif action == "stop":
138 35f2fc07 Christos Stavrakakis
                server = servers.stop(server)
139 35f2fc07 Christos Stavrakakis
            elif action == "reboot_hard":
140 35f2fc07 Christos Stavrakakis
                server = servers.reboot(server, reboot_type="HARD")
141 35f2fc07 Christos Stavrakakis
            elif action == "reboot_stof":
142 35f2fc07 Christos Stavrakakis
                server = servers.reboot(server, reboot_type="SOFT")
143 60a71437 Christos Stavrakakis
            else:
144 35f2fc07 Christos Stavrakakis
                raise CommandError("Unknown action.")
145 35f2fc07 Christos Stavrakakis
            wait_server_task(server, wait, stdout=self.stdout)