Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / management / common.py @ 449c2d82

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

96 0252fb8b Christos Stavrakakis
    @type server_id: int or string
97 0252fb8b Christos Stavrakakis
    @param server_id: The server's DB id or the Ganeti name
98 0252fb8b Christos Stavrakakis

99 0252fb8b Christos Stavrakakis
    """
100 b84ed662 Christos Stavrakakis
    try:
101 b84ed662 Christos Stavrakakis
        server_id = int(server_id)
102 0252fb8b Christos Stavrakakis
    except (ValueError, TypeError):
103 0252fb8b Christos Stavrakakis
        try:
104 0252fb8b Christos Stavrakakis
            server_id = id_from_instance_name(server_id)
105 0252fb8b Christos Stavrakakis
        except VirtualMachine.InvalidBackendIdError:
106 0252fb8b Christos Stavrakakis
            raise CommandError("Invalid server ID: %s" % server_id)
107 0252fb8b Christos Stavrakakis
108 0252fb8b Christos Stavrakakis
    try:
109 b84ed662 Christos Stavrakakis
        return VirtualMachine.objects.get(id=server_id)
110 b84ed662 Christos Stavrakakis
    except VirtualMachine.DoesNotExist:
111 b84ed662 Christos Stavrakakis
        raise CommandError("Server with ID %s not found in DB."
112 b84ed662 Christos Stavrakakis
                           " Use snf-manage server-list to find out"
113 b84ed662 Christos Stavrakakis
                           " available server IDs." % server_id)
114 b84ed662 Christos Stavrakakis
115 b84ed662 Christos Stavrakakis
116 e57893cd Christos Stavrakakis
def get_network(network_id, for_update=True):
117 0252fb8b Christos Stavrakakis
    """Get a Network object by its ID.
118 0252fb8b Christos Stavrakakis

119 0252fb8b Christos Stavrakakis
    @type network_id: int or string
120 0252fb8b Christos Stavrakakis
    @param network_id: The networks DB id or the Ganeti name
121 0252fb8b Christos Stavrakakis

122 0252fb8b Christos Stavrakakis
    """
123 0252fb8b Christos Stavrakakis
124 b84ed662 Christos Stavrakakis
    try:
125 b84ed662 Christos Stavrakakis
        network_id = int(network_id)
126 0252fb8b Christos Stavrakakis
    except (ValueError, TypeError):
127 0252fb8b Christos Stavrakakis
        try:
128 0252fb8b Christos Stavrakakis
            network_id = id_from_network_name(network_id)
129 0252fb8b Christos Stavrakakis
        except Network.InvalidBackendIdError:
130 0252fb8b Christos Stavrakakis
            raise CommandError("Invalid network ID: %s" % network_id)
131 0252fb8b Christos Stavrakakis
132 e57893cd Christos Stavrakakis
    networks = Network.objects
133 e57893cd Christos Stavrakakis
    if for_update:
134 e57893cd Christos Stavrakakis
        networks = networks.select_for_update()
135 0252fb8b Christos Stavrakakis
    try:
136 e57893cd Christos Stavrakakis
        return networks.get(id=network_id)
137 b84ed662 Christos Stavrakakis
    except Network.DoesNotExist:
138 b84ed662 Christos Stavrakakis
        raise CommandError("Network with ID %s not found in DB."
139 b84ed662 Christos Stavrakakis
                           " Use snf-manage network-list to find out"
140 b84ed662 Christos Stavrakakis
                           " available network IDs." % network_id)
141 b84ed662 Christos Stavrakakis
142 b84ed662 Christos Stavrakakis
143 b84ed662 Christos Stavrakakis
def get_flavor(flavor_id):
144 b84ed662 Christos Stavrakakis
    try:
145 b84ed662 Christos Stavrakakis
        flavor_id = int(flavor_id)
146 b84ed662 Christos Stavrakakis
        return Flavor.objects.get(id=flavor_id)
147 b84ed662 Christos Stavrakakis
    except ValueError:
148 b84ed662 Christos Stavrakakis
        raise CommandError("Invalid flavor ID: %s", flavor_id)
149 b84ed662 Christos Stavrakakis
    except Flavor.DoesNotExist:
150 b84ed662 Christos Stavrakakis
        raise CommandError("Flavor with ID %s not found in DB."
151 b84ed662 Christos Stavrakakis
                           " Use snf-manage flavor-list to find out"
152 b84ed662 Christos Stavrakakis
                           " available flavor IDs." % flavor_id)
153 bad9404c Christos Stavrakakis
154 bad9404c Christos Stavrakakis
155 2333a2c4 Christos Stavrakakis
def check_backend_credentials(clustername, port, username, password):
156 2333a2c4 Christos Stavrakakis
    try:
157 2333a2c4 Christos Stavrakakis
        client = GanetiRapiClient(clustername, port, username, password)
158 2333a2c4 Christos Stavrakakis
        # This command will raise an exception if there is no
159 2333a2c4 Christos Stavrakakis
        # write-access
160 2333a2c4 Christos Stavrakakis
        client.ModifyCluster()
161 2333a2c4 Christos Stavrakakis
    except GanetiApiError as e:
162 2333a2c4 Christos Stavrakakis
        raise CommandError(e)
163 2333a2c4 Christos Stavrakakis
164 2333a2c4 Christos Stavrakakis
    info = client.GetInfo()
165 2333a2c4 Christos Stavrakakis
    info_name = info['name']
166 2333a2c4 Christos Stavrakakis
    if info_name != clustername:
167 2333a2c4 Christos Stavrakakis
        raise CommandError("Invalid clustername value. Please use the"
168 2333a2c4 Christos Stavrakakis
                           " Ganeti Cluster name: %s" % info_name)
169 7a0aa449 Christos Stavrakakis
170 7a0aa449 Christos Stavrakakis
171 c75ab92e Christos Stavrakakis
def convert_api_faults(func):
172 c75ab92e Christos Stavrakakis
    @wraps(func)
173 c75ab92e Christos Stavrakakis
    def wrapper(*args, **kwargs):
174 c75ab92e Christos Stavrakakis
        try:
175 c75ab92e Christos Stavrakakis
            return func(*args, **kwargs)
176 c75ab92e Christos Stavrakakis
        except faults.Fault as e:
177 c75ab92e Christos Stavrakakis
            raise CommandError(e.message)
178 c75ab92e Christos Stavrakakis
    return wrapper
179 c75ab92e Christos Stavrakakis
180 c75ab92e Christos Stavrakakis
181 4500650c Stratos Psomadakis
class Omit(object):
182 4500650c Stratos Psomadakis
    pass