Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / management / commands / server-modify.py @ 60a71437

History | View | Annotate | Download (4.8 kB)

1 11300d7b Giorgos Verigakis
# Copyright 2012 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 60a71437 Christos Stavrakakis
from synnefo.management.common import get_vm, get_flavor, convert_api_faults
39 91f7a08c Christos Stavrakakis
from synnefo.webproject.management.utils import parse_bool
40 60a71437 Christos Stavrakakis
from synnefo.logic import servers, backend as backend_mod
41 11300d7b Giorgos Verigakis
42 11300d7b Giorgos Verigakis
43 11300d7b Giorgos Verigakis
class Command(BaseCommand):
44 11300d7b Giorgos Verigakis
    args = "<server ID>"
45 91f7a08c Christos Stavrakakis
    help = "Modify a server."
46 39a6388d Christos Stavrakakis
47 11300d7b Giorgos Verigakis
    option_list = BaseCommand.option_list + (
48 9621c777 Christos Stavrakakis
        make_option(
49 9621c777 Christos Stavrakakis
            '--name',
50 11300d7b Giorgos Verigakis
            dest='name',
51 11300d7b Giorgos Verigakis
            metavar='NAME',
52 91f7a08c Christos Stavrakakis
            help="Rename server"),
53 9621c777 Christos Stavrakakis
        make_option(
54 9621c777 Christos Stavrakakis
            '--owner',
55 11300d7b Giorgos Verigakis
            dest='owner',
56 91f7a08c Christos Stavrakakis
            metavar='USER_UUID',
57 91f7a08c Christos Stavrakakis
            help="Change ownership of server. Value must be a user UUID"),
58 9621c777 Christos Stavrakakis
        make_option(
59 91f7a08c Christos Stavrakakis
            "--suspended",
60 91f7a08c Christos Stavrakakis
            dest="suspended",
61 91f7a08c Christos Stavrakakis
            default=None,
62 91f7a08c Christos Stavrakakis
            choices=["True", "False"],
63 91f7a08c Christos Stavrakakis
            metavar="True|False",
64 91f7a08c Christos Stavrakakis
            help="Mark a server as suspended/non-suspended."),
65 60a71437 Christos Stavrakakis
        make_option(
66 60a71437 Christos Stavrakakis
            "--flavor",
67 60a71437 Christos Stavrakakis
            dest="flavor",
68 60a71437 Christos Stavrakakis
            metavar="FLAVOR_ID",
69 60a71437 Christos Stavrakakis
            help="Resize a server by modifying its flavor. The new flavor"
70 60a71437 Christos Stavrakakis
                 " must have the same disk size and disk template."),
71 9621c777 Christos Stavrakakis
    )
72 39a6388d Christos Stavrakakis
73 91f7a08c Christos Stavrakakis
    @transaction.commit_on_success
74 60a71437 Christos Stavrakakis
    @convert_api_faults
75 11300d7b Giorgos Verigakis
    def handle(self, *args, **options):
76 11300d7b Giorgos Verigakis
        if len(args) != 1:
77 11300d7b Giorgos Verigakis
            raise CommandError("Please provide a server ID")
78 39a6388d Christos Stavrakakis
79 b84ed662 Christos Stavrakakis
        server = get_vm(args[0])
80 39a6388d Christos Stavrakakis
81 91f7a08c Christos Stavrakakis
        new_name = options.get("name", None)
82 91f7a08c Christos Stavrakakis
        if new_name is not None:
83 91f7a08c Christos Stavrakakis
            old_name = server.name
84 91f7a08c Christos Stavrakakis
            server = servers.rename(server, new_name)
85 91f7a08c Christos Stavrakakis
            self.stdout.write("Renamed server '%s' from '%s' to '%s'\n" %
86 91f7a08c Christos Stavrakakis
                              (server, old_name, new_name))
87 39a6388d Christos Stavrakakis
88 91f7a08c Christos Stavrakakis
        suspended = options.get("suspended", None)
89 91f7a08c Christos Stavrakakis
        if suspended is not None:
90 91f7a08c Christos Stavrakakis
            suspended = parse_bool(suspended)
91 91f7a08c Christos Stavrakakis
            server.suspended = suspended
92 91f7a08c Christos Stavrakakis
            server.save()
93 91f7a08c Christos Stavrakakis
            self.stdout.write("Set server '%s' as suspended=%s\n" %
94 91f7a08c Christos Stavrakakis
                              (server, suspended))
95 39a6388d Christos Stavrakakis
96 91f7a08c Christos Stavrakakis
        new_owner = options.get('owner')
97 91f7a08c Christos Stavrakakis
        if new_owner is not None:
98 91f7a08c Christos Stavrakakis
            if "@" in new_owner:
99 91f7a08c Christos Stavrakakis
                raise CommandError("Invalid owner UUID.")
100 91f7a08c Christos Stavrakakis
            old_owner = server.userid
101 91f7a08c Christos Stavrakakis
            server.userid = new_owner
102 91f7a08c Christos Stavrakakis
            server.save()
103 91f7a08c Christos Stavrakakis
            msg = "Changed the owner of server '%s' from '%s' to '%s'.\n"
104 91f7a08c Christos Stavrakakis
            self.stdout.write(msg % (server, old_owner, new_owner))
105 60a71437 Christos Stavrakakis
106 60a71437 Christos Stavrakakis
        new_flavor_id = options.get("flavor")
107 60a71437 Christos Stavrakakis
        if new_flavor_id is not None:
108 60a71437 Christos Stavrakakis
            new_flavor = get_flavor(new_flavor_id)
109 60a71437 Christos Stavrakakis
            old_flavor = server.flavor
110 60a71437 Christos Stavrakakis
            msg = "Resizing server '%s' from flavor '%s' to '%s'.\n"
111 60a71437 Christos Stavrakakis
            self.stdout.write(msg % (server, old_flavor, new_flavor))
112 60a71437 Christos Stavrakakis
            server = servers.resize(server, new_flavor)
113 60a71437 Christos Stavrakakis
            jobID = server.task_job_id
114 60a71437 Christos Stavrakakis
            msg = "Issued job '%s'. Waiting to complete...\n"
115 60a71437 Christos Stavrakakis
            self.stdout.write(msg % jobID)
116 60a71437 Christos Stavrakakis
            client = server.get_client()
117 60a71437 Christos Stavrakakis
            status, error = backend_mod.wait_for_job(client, jobID)
118 60a71437 Christos Stavrakakis
            if status == "success":
119 60a71437 Christos Stavrakakis
                self.stdout.write("Job finished successfully.\n")
120 60a71437 Christos Stavrakakis
            else:
121 60a71437 Christos Stavrakakis
                self.stdout.write("Job failed! Error: %s\n" % error)