Revision 35f2fc07

b/snf-cyclades-app/synnefo/api/management/commands/server-modify.py
1
# Copyright 2012 GRNET S.A. All rights reserved.
1
# Copyright 2013 GRNET S.A. All rights reserved.
2 2
#
3 3
# Redistribution and use in source and binary forms, with or
4 4
# without modification, are permitted provided that the following
......
35 35

  
36 36
from django.db import transaction
37 37
from django.core.management.base import BaseCommand, CommandError
38
from synnefo.management.common import get_vm, get_flavor, convert_api_faults
38
from synnefo.management.common import (get_vm, get_flavor, convert_api_faults,
39
                                       wait_server_task)
39 40
from synnefo.webproject.management.utils import parse_bool
40
from synnefo.logic import servers, backend as backend_mod
41
from synnefo.logic import servers
42

  
43

  
44
ACTIONS = ["start", "stop", "reboot_hard", "reboot_soft"]
41 45

  
42 46

  
43 47
class Command(BaseCommand):
......
49 53
            '--name',
50 54
            dest='name',
51 55
            metavar='NAME',
52
            help="Rename server"),
56
            help="Rename server."),
53 57
        make_option(
54 58
            '--owner',
55 59
            dest='owner',
......
68 72
            metavar="FLAVOR_ID",
69 73
            help="Resize a server by modifying its flavor. The new flavor"
70 74
                 " must have the same disk size and disk template."),
75
        make_option(
76
            "--action",
77
            dest="action",
78
            choices=ACTIONS,
79
            metavar="|".join(ACTIONS),
80
            help="Perform one of the allowed actions."),
81
        make_option(
82
            "--wait",
83
            dest="wait",
84
            default="True",
85
            choices=["True", "False"],
86
            metavar="True|False",
87
            help="Wait for Ganeti jobs to complete."),
71 88
    )
72 89

  
73 90
    @transaction.commit_on_success
......
103 120
            msg = "Changed the owner of server '%s' from '%s' to '%s'.\n"
104 121
            self.stdout.write(msg % (server, old_owner, new_owner))
105 122

  
123
        wait = parse_bool(options["wait"])
106 124
        new_flavor_id = options.get("flavor")
107 125
        if new_flavor_id is not None:
108 126
            new_flavor = get_flavor(new_flavor_id)
......
110 128
            msg = "Resizing server '%s' from flavor '%s' to '%s'.\n"
111 129
            self.stdout.write(msg % (server, old_flavor, new_flavor))
112 130
            server = servers.resize(server, new_flavor)
113
            jobID = server.task_job_id
114
            msg = "Issued job '%s'. Waiting to complete...\n"
115
            self.stdout.write(msg % jobID)
116
            client = server.get_client()
117
            status, error = backend_mod.wait_for_job(client, jobID)
118
            if status == "success":
119
                self.stdout.write("Job finished successfully.\n")
131
            wait_server_task(server, wait, stdout=self.stdout)
132

  
133
        action = options.get("action")
134
        if action is not None:
135
            if action == "start":
136
                server = servers.start(server)
137
            elif action == "stop":
138
                server = servers.stop(server)
139
            elif action == "reboot_hard":
140
                server = servers.reboot(server, reboot_type="HARD")
141
            elif action == "reboot_stof":
142
                server = servers.reboot(server, reboot_type="SOFT")
120 143
            else:
121
                self.stdout.write("Job failed! Error: %s\n" % error)
144
                raise CommandError("Unknown action.")
145
            wait_server_task(server, wait, stdout=self.stdout)
b/snf-cyclades-app/synnefo/api/management/commands/server-remove.py
34 34
from optparse import make_option
35 35

  
36 36
from django.core.management.base import BaseCommand, CommandError
37
from synnefo.management.common import get_vm, convert_api_faults
38
from synnefo.logic import servers, backend as backend_mod
37
from synnefo.management.common import (get_vm, convert_api_faults,
38
                                       wait_server_task)
39
from synnefo.logic import servers
39 40
from snf_django.management.utils import parse_bool
40 41

  
41 42

  
......
63 64
        self.stdout.write("Trying to remove server '%s' from backend '%s'\n" %
64 65
                          (server.backend_vm_id, server.backend))
65 66

  
66
        servers.destroy(server)
67
        server = servers.destroy(server)
67 68
        jobID = server.task_job_id
68 69

  
69 70
        self.stdout.write("Issued OP_INSTANCE_REMOVE with id: %s\n" % jobID)
70 71

  
71 72
        wait = parse_bool(options["wait"])
72
        if wait:
73
            self.stdout.write("Waiting for job to complete...\n")
74
            client = server.get_client()
75
            status, error = backend_mod.wait_for_job(client, jobID)
76
            if status == "success":
77
                self.stdout.write("Job '%s' completed successfully.\n" % jobID)
78
            else:
79
                self.stdout.write("Job '%s' failed: %s\n" % (jobID, error))
73
        wait_server_task(server, wait, self.stdout)
b/snf-cyclades-app/synnefo/management/common.py
37 37

  
38 38
from snf_django.lib.api import faults
39 39
from synnefo.api import util
40
from synnefo.logic import backend as backend_mod
40 41
from synnefo.logic.rapi import GanetiApiError, GanetiRapiClient
41 42
from synnefo.logic.utils import (id_from_instance_name,
42 43
                                 id_from_network_name)
......
166 167

  
167 168
class Omit(object):
168 169
    pass
170

  
171

  
172
def wait_server_task(server, wait, stdout):
173
    jobID = server.task_job_id
174
    if wait:
175
        msg = "Issued job '%s'. Waiting to complete...\n"
176
        stdout.write(msg % jobID)
177
        client = server.get_client()
178
        wait_ganeti_job(client, jobID, stdout)
179
    else:
180
        msg = "Issued job '%s'.\n"
181
        stdout.write(msg % jobID)
182

  
183

  
184
def wait_ganeti_job(client, jobID, stdout):
185
    status, error = backend_mod.wait_for_job(client, jobID)
186
    if status == "success":
187
        stdout.write("Job finished successfully.\n")
188
    else:
189
        raise CommandError("Job failed! Error: %s\n" % error)

Also available in: Unified diff