root / snf-cyclades-app / synnefo / api / management / commands / server-modify.py @ 9d1e6480
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) |