Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / management / common.py @ 9d1e6480

History | View | Annotate | Download (7.1 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 53b9ba10 Christos Stavrakakis
from django.core.management import CommandError
35 9d1e6480 Marios Kogias
from synnefo.db.models import (Backend, VirtualMachine, Network,
36 9d1e6480 Marios Kogias
                               Flavor, IPAddress)
37 c75ab92e Christos Stavrakakis
from functools import wraps
38 bad9404c Christos Stavrakakis
39 bd40abfa Christos Stavrakakis
from snf_django.lib.api import faults
40 bcd80cd9 Christos Stavrakakis
from synnefo.api import util
41 35f2fc07 Christos Stavrakakis
from synnefo.logic import backend as backend_mod
42 2333a2c4 Christos Stavrakakis
from synnefo.logic.rapi import GanetiApiError, GanetiRapiClient
43 0252fb8b Christos Stavrakakis
from synnefo.logic.utils import (id_from_instance_name,
44 0252fb8b Christos Stavrakakis
                                 id_from_network_name)
45 11300d7b Giorgos Verigakis
46 8814e07c Christos Stavrakakis
import logging
47 8814e07c Christos Stavrakakis
log = logging.getLogger(__name__)
48 8814e07c Christos Stavrakakis
49 11300d7b Giorgos Verigakis
50 f66d8b04 Christos Stavrakakis
def format_vm_state(vm):
51 f66d8b04 Christos Stavrakakis
    if vm.operstate == "BUILD":
52 f66d8b04 Christos Stavrakakis
        return "BUILD(" + str(vm.buildpercentage) + "%)"
53 f66d8b04 Christos Stavrakakis
    else:
54 f66d8b04 Christos Stavrakakis
        return vm.operstate
55 53b9ba10 Christos Stavrakakis
56 53b9ba10 Christos Stavrakakis
57 b84ed662 Christos Stavrakakis
def get_backend(backend_id):
58 b84ed662 Christos Stavrakakis
    try:
59 b84ed662 Christos Stavrakakis
        backend_id = int(backend_id)
60 b84ed662 Christos Stavrakakis
        return Backend.objects.get(id=backend_id)
61 b84ed662 Christos Stavrakakis
    except ValueError:
62 b84ed662 Christos Stavrakakis
        raise CommandError("Invalid Backend ID: %s" % backend_id)
63 b84ed662 Christos Stavrakakis
    except Backend.DoesNotExist:
64 b84ed662 Christos Stavrakakis
        raise CommandError("Backend with ID %s not found in DB. "
65 b84ed662 Christos Stavrakakis
                           " Use snf-manage backend-list to find"
66 b84ed662 Christos Stavrakakis
                           " out available backend IDs." % backend_id)
67 b84ed662 Christos Stavrakakis
68 b84ed662 Christos Stavrakakis
69 b84ed662 Christos Stavrakakis
def get_image(image_id, user_id):
70 b84ed662 Christos Stavrakakis
    if image_id:
71 b84ed662 Christos Stavrakakis
        try:
72 bcd80cd9 Christos Stavrakakis
            return util.get_image_dict(image_id, user_id)
73 bd40abfa Christos Stavrakakis
        except faults.ItemNotFound:
74 b84ed662 Christos Stavrakakis
            raise CommandError("Image with ID %s not found."
75 b84ed662 Christos Stavrakakis
                               " Use snf-manage image-list to find"
76 b84ed662 Christos Stavrakakis
                               " out available image IDs." % image_id)
77 b84ed662 Christos Stavrakakis
    else:
78 b84ed662 Christos Stavrakakis
        raise CommandError("image-id is mandatory")
79 b84ed662 Christos Stavrakakis
80 b84ed662 Christos Stavrakakis
81 b84ed662 Christos Stavrakakis
def get_vm(server_id):
82 0252fb8b Christos Stavrakakis
    """Get a VirtualMachine object by its ID.
83 0252fb8b Christos Stavrakakis

84 0252fb8b Christos Stavrakakis
    @type server_id: int or string
85 0252fb8b Christos Stavrakakis
    @param server_id: The server's DB id or the Ganeti name
86 0252fb8b Christos Stavrakakis

87 0252fb8b Christos Stavrakakis
    """
88 b84ed662 Christos Stavrakakis
    try:
89 b84ed662 Christos Stavrakakis
        server_id = int(server_id)
90 0252fb8b Christos Stavrakakis
    except (ValueError, TypeError):
91 0252fb8b Christos Stavrakakis
        try:
92 0252fb8b Christos Stavrakakis
            server_id = id_from_instance_name(server_id)
93 0252fb8b Christos Stavrakakis
        except VirtualMachine.InvalidBackendIdError:
94 0252fb8b Christos Stavrakakis
            raise CommandError("Invalid server ID: %s" % server_id)
95 0252fb8b Christos Stavrakakis
96 0252fb8b Christos Stavrakakis
    try:
97 b84ed662 Christos Stavrakakis
        return VirtualMachine.objects.get(id=server_id)
98 b84ed662 Christos Stavrakakis
    except VirtualMachine.DoesNotExist:
99 b84ed662 Christos Stavrakakis
        raise CommandError("Server with ID %s not found in DB."
100 b84ed662 Christos Stavrakakis
                           " Use snf-manage server-list to find out"
101 b84ed662 Christos Stavrakakis
                           " available server IDs." % server_id)
102 b84ed662 Christos Stavrakakis
103 b84ed662 Christos Stavrakakis
104 e57893cd Christos Stavrakakis
def get_network(network_id, for_update=True):
105 0252fb8b Christos Stavrakakis
    """Get a Network object by its ID.
106 0252fb8b Christos Stavrakakis

107 0252fb8b Christos Stavrakakis
    @type network_id: int or string
108 0252fb8b Christos Stavrakakis
    @param network_id: The networks DB id or the Ganeti name
109 0252fb8b Christos Stavrakakis

110 0252fb8b Christos Stavrakakis
    """
111 0252fb8b Christos Stavrakakis
112 b84ed662 Christos Stavrakakis
    try:
113 b84ed662 Christos Stavrakakis
        network_id = int(network_id)
114 0252fb8b Christos Stavrakakis
    except (ValueError, TypeError):
115 0252fb8b Christos Stavrakakis
        try:
116 0252fb8b Christos Stavrakakis
            network_id = id_from_network_name(network_id)
117 0252fb8b Christos Stavrakakis
        except Network.InvalidBackendIdError:
118 0252fb8b Christos Stavrakakis
            raise CommandError("Invalid network ID: %s" % network_id)
119 0252fb8b Christos Stavrakakis
120 e57893cd Christos Stavrakakis
    networks = Network.objects
121 e57893cd Christos Stavrakakis
    if for_update:
122 e57893cd Christos Stavrakakis
        networks = networks.select_for_update()
123 0252fb8b Christos Stavrakakis
    try:
124 e57893cd Christos Stavrakakis
        return networks.get(id=network_id)
125 b84ed662 Christos Stavrakakis
    except Network.DoesNotExist:
126 b84ed662 Christos Stavrakakis
        raise CommandError("Network with ID %s not found in DB."
127 b84ed662 Christos Stavrakakis
                           " Use snf-manage network-list to find out"
128 b84ed662 Christos Stavrakakis
                           " available network IDs." % network_id)
129 b84ed662 Christos Stavrakakis
130 b84ed662 Christos Stavrakakis
131 a17ce1de Dionysis Grigoropoulos
def get_subnet(subnet_id, for_update=True):
132 a17ce1de Dionysis Grigoropoulos
    """Get a Subnet object by its ID."""
133 a17ce1de Dionysis Grigoropoulos
    try:
134 a17ce1de Dionysis Grigoropoulos
        return Subnet.objects.get(id=subnet_id)
135 a17ce1de Dionysis Grigoropoulos
    except Subnet.DoesNotExist:
136 a17ce1de Dionysis Grigoropoulos
        raise CommandError("Subnet with ID %s not found in DB."
137 a17ce1de Dionysis Grigoropoulos
                           " Use snf-manage subnet-list to find out"
138 a17ce1de Dionysis Grigoropoulos
                           " available subnet IDs" % subnet_id)
139 a17ce1de Dionysis Grigoropoulos
140 a17ce1de Dionysis Grigoropoulos
141 b84ed662 Christos Stavrakakis
def get_flavor(flavor_id):
142 b84ed662 Christos Stavrakakis
    try:
143 b84ed662 Christos Stavrakakis
        flavor_id = int(flavor_id)
144 b84ed662 Christos Stavrakakis
        return Flavor.objects.get(id=flavor_id)
145 b84ed662 Christos Stavrakakis
    except ValueError:
146 b84ed662 Christos Stavrakakis
        raise CommandError("Invalid flavor ID: %s", flavor_id)
147 b84ed662 Christos Stavrakakis
    except Flavor.DoesNotExist:
148 b84ed662 Christos Stavrakakis
        raise CommandError("Flavor with ID %s not found in DB."
149 b84ed662 Christos Stavrakakis
                           " Use snf-manage flavor-list to find out"
150 b84ed662 Christos Stavrakakis
                           " available flavor IDs." % flavor_id)
151 bad9404c Christos Stavrakakis
152 bad9404c Christos Stavrakakis
153 9d1e6480 Marios Kogias
def get_floating_ip_by_address(address, for_update=False):
154 9d1e6480 Marios Kogias
    try:
155 9d1e6480 Marios Kogias
        objects = IPAddress.objects
156 9d1e6480 Marios Kogias
        if for_update:
157 9d1e6480 Marios Kogias
            objects = objects.select_for_update()
158 9d1e6480 Marios Kogias
        return objects.get(floating_ip=True, address=address, deleted=False)
159 9d1e6480 Marios Kogias
    except IPAddress.DoesNotExist:
160 9d1e6480 Marios Kogias
        raise CommandError("Floating IP does not exist.")
161 9d1e6480 Marios Kogias
162 9d1e6480 Marios Kogias
163 2333a2c4 Christos Stavrakakis
def check_backend_credentials(clustername, port, username, password):
164 2333a2c4 Christos Stavrakakis
    try:
165 2333a2c4 Christos Stavrakakis
        client = GanetiRapiClient(clustername, port, username, password)
166 2333a2c4 Christos Stavrakakis
        # This command will raise an exception if there is no
167 2333a2c4 Christos Stavrakakis
        # write-access
168 2333a2c4 Christos Stavrakakis
        client.ModifyCluster()
169 2333a2c4 Christos Stavrakakis
    except GanetiApiError as e:
170 2333a2c4 Christos Stavrakakis
        raise CommandError(e)
171 2333a2c4 Christos Stavrakakis
172 2333a2c4 Christos Stavrakakis
    info = client.GetInfo()
173 2333a2c4 Christos Stavrakakis
    info_name = info['name']
174 2333a2c4 Christos Stavrakakis
    if info_name != clustername:
175 2333a2c4 Christos Stavrakakis
        raise CommandError("Invalid clustername value. Please use the"
176 2333a2c4 Christos Stavrakakis
                           " Ganeti Cluster name: %s" % info_name)
177 7a0aa449 Christos Stavrakakis
178 7a0aa449 Christos Stavrakakis
179 c75ab92e Christos Stavrakakis
def convert_api_faults(func):
180 c75ab92e Christos Stavrakakis
    @wraps(func)
181 c75ab92e Christos Stavrakakis
    def wrapper(*args, **kwargs):
182 c75ab92e Christos Stavrakakis
        try:
183 c75ab92e Christos Stavrakakis
            return func(*args, **kwargs)
184 c75ab92e Christos Stavrakakis
        except faults.Fault as e:
185 c75ab92e Christos Stavrakakis
            raise CommandError(e.message)
186 c75ab92e Christos Stavrakakis
    return wrapper
187 c75ab92e Christos Stavrakakis
188 c75ab92e Christos Stavrakakis
189 4500650c Stratos Psomadakis
class Omit(object):
190 4500650c Stratos Psomadakis
    pass
191 35f2fc07 Christos Stavrakakis
192 35f2fc07 Christos Stavrakakis
193 35f2fc07 Christos Stavrakakis
def wait_server_task(server, wait, stdout):
194 35f2fc07 Christos Stavrakakis
    jobID = server.task_job_id
195 35f2fc07 Christos Stavrakakis
    if wait:
196 35f2fc07 Christos Stavrakakis
        msg = "Issued job '%s'. Waiting to complete...\n"
197 35f2fc07 Christos Stavrakakis
        stdout.write(msg % jobID)
198 35f2fc07 Christos Stavrakakis
        client = server.get_client()
199 35f2fc07 Christos Stavrakakis
        wait_ganeti_job(client, jobID, stdout)
200 35f2fc07 Christos Stavrakakis
    else:
201 35f2fc07 Christos Stavrakakis
        msg = "Issued job '%s'.\n"
202 35f2fc07 Christos Stavrakakis
        stdout.write(msg % jobID)
203 35f2fc07 Christos Stavrakakis
204 35f2fc07 Christos Stavrakakis
205 35f2fc07 Christos Stavrakakis
def wait_ganeti_job(client, jobID, stdout):
206 35f2fc07 Christos Stavrakakis
    status, error = backend_mod.wait_for_job(client, jobID)
207 35f2fc07 Christos Stavrakakis
    if status == "success":
208 35f2fc07 Christos Stavrakakis
        stdout.write("Job finished successfully.\n")
209 35f2fc07 Christos Stavrakakis
    else:
210 35f2fc07 Christos Stavrakakis
        raise CommandError("Job failed! Error: %s\n" % error)