Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / management / common.py @ 225cea18

History | View | Annotate | Download (7.2 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 b84ed662 Christos Stavrakakis
from synnefo.api.util import get_image as backend_get_image
37 9ae613af Christos Stavrakakis
from synnefo.api.faults import ItemNotFound, BadRequest, OverLimit
38 bad9404c Christos Stavrakakis
39 9ae613af Christos Stavrakakis
from synnefo.api.util import validate_network_params
40 9ae613af Christos Stavrakakis
from synnefo.settings import (CYCLADES_ASTAKOS_SERVICE_TOKEN as ASTAKOS_TOKEN,
41 f1ffc695 Stratos Psomadakis
                              ASTAKOS_URL)
42 2333a2c4 Christos Stavrakakis
from synnefo.logic.rapi import GanetiApiError, GanetiRapiClient
43 3170076a Stratos Psomadakis
from synnefo.lib import astakos
44 11300d7b Giorgos Verigakis
45 8814e07c Christos Stavrakakis
import logging
46 8814e07c Christos Stavrakakis
log = logging.getLogger(__name__)
47 8814e07c Christos Stavrakakis
48 11300d7b Giorgos Verigakis
49 f66d8b04 Christos Stavrakakis
def format_vm_state(vm):
50 f66d8b04 Christos Stavrakakis
    if vm.operstate == "BUILD":
51 f66d8b04 Christos Stavrakakis
        return "BUILD(" + str(vm.buildpercentage) + "%)"
52 f66d8b04 Christos Stavrakakis
    else:
53 f66d8b04 Christos Stavrakakis
        return vm.operstate
54 53b9ba10 Christos Stavrakakis
55 53b9ba10 Christos Stavrakakis
56 53b9ba10 Christos Stavrakakis
def validate_network_info(options):
57 53b9ba10 Christos Stavrakakis
    subnet = options['subnet']
58 53b9ba10 Christos Stavrakakis
    gateway = options['gateway']
59 53b9ba10 Christos Stavrakakis
    subnet6 = options['subnet6']
60 53b9ba10 Christos Stavrakakis
    gateway6 = options['gateway6']
61 53b9ba10 Christos Stavrakakis
62 53b9ba10 Christos Stavrakakis
    try:
63 9ae613af Christos Stavrakakis
        validate_network_params(subnet, gateway)
64 9ae613af Christos Stavrakakis
    except (BadRequest, OverLimit) as e:
65 9ae613af Christos Stavrakakis
        raise CommandError(e)
66 53b9ba10 Christos Stavrakakis
67 53b9ba10 Christos Stavrakakis
    return subnet, gateway, subnet6, gateway6
68 b84ed662 Christos Stavrakakis
69 b84ed662 Christos Stavrakakis
70 b84ed662 Christos Stavrakakis
def get_backend(backend_id):
71 b84ed662 Christos Stavrakakis
    try:
72 b84ed662 Christos Stavrakakis
        backend_id = int(backend_id)
73 b84ed662 Christos Stavrakakis
        return Backend.objects.get(id=backend_id)
74 b84ed662 Christos Stavrakakis
    except ValueError:
75 b84ed662 Christos Stavrakakis
        raise CommandError("Invalid Backend ID: %s" % backend_id)
76 b84ed662 Christos Stavrakakis
    except Backend.DoesNotExist:
77 b84ed662 Christos Stavrakakis
        raise CommandError("Backend with ID %s not found in DB. "
78 b84ed662 Christos Stavrakakis
                           " Use snf-manage backend-list to find"
79 b84ed662 Christos Stavrakakis
                           " out available backend IDs." % backend_id)
80 b84ed662 Christos Stavrakakis
81 b84ed662 Christos Stavrakakis
82 b84ed662 Christos Stavrakakis
def get_image(image_id, user_id):
83 b84ed662 Christos Stavrakakis
    if image_id:
84 b84ed662 Christos Stavrakakis
        try:
85 b84ed662 Christos Stavrakakis
            return backend_get_image(image_id, user_id)
86 b84ed662 Christos Stavrakakis
        except ItemNotFound:
87 b84ed662 Christos Stavrakakis
            raise CommandError("Image with ID %s not found."
88 b84ed662 Christos Stavrakakis
                               " Use snf-manage image-list to find"
89 b84ed662 Christos Stavrakakis
                               " out available image IDs." % image_id)
90 b84ed662 Christos Stavrakakis
    else:
91 b84ed662 Christos Stavrakakis
        raise CommandError("image-id is mandatory")
92 b84ed662 Christos Stavrakakis
93 b84ed662 Christos Stavrakakis
94 b84ed662 Christos Stavrakakis
def get_vm(server_id):
95 b84ed662 Christos Stavrakakis
    try:
96 b84ed662 Christos Stavrakakis
        server_id = int(server_id)
97 b84ed662 Christos Stavrakakis
        return VirtualMachine.objects.get(id=server_id)
98 b84ed662 Christos Stavrakakis
    except ValueError:
99 b84ed662 Christos Stavrakakis
        raise CommandError("Invalid server ID: %s", server_id)
100 b84ed662 Christos Stavrakakis
    except VirtualMachine.DoesNotExist:
101 b84ed662 Christos Stavrakakis
        raise CommandError("Server with ID %s not found in DB."
102 b84ed662 Christos Stavrakakis
                           " Use snf-manage server-list to find out"
103 b84ed662 Christos Stavrakakis
                           " available server IDs." % server_id)
104 b84ed662 Christos Stavrakakis
105 b84ed662 Christos Stavrakakis
106 b84ed662 Christos Stavrakakis
def get_network(network_id):
107 b84ed662 Christos Stavrakakis
    try:
108 b84ed662 Christos Stavrakakis
        network_id = int(network_id)
109 b84ed662 Christos Stavrakakis
        return Network.objects.get(id=network_id)
110 b84ed662 Christos Stavrakakis
    except ValueError:
111 b84ed662 Christos Stavrakakis
        raise CommandError("Invalid network ID: %s", network_id)
112 b84ed662 Christos Stavrakakis
    except Network.DoesNotExist:
113 b84ed662 Christos Stavrakakis
        raise CommandError("Network with ID %s not found in DB."
114 b84ed662 Christos Stavrakakis
                           " Use snf-manage network-list to find out"
115 b84ed662 Christos Stavrakakis
                           " available network IDs." % network_id)
116 b84ed662 Christos Stavrakakis
117 b84ed662 Christos Stavrakakis
118 b84ed662 Christos Stavrakakis
def get_flavor(flavor_id):
119 b84ed662 Christos Stavrakakis
    try:
120 b84ed662 Christos Stavrakakis
        flavor_id = int(flavor_id)
121 b84ed662 Christos Stavrakakis
        return Flavor.objects.get(id=flavor_id)
122 b84ed662 Christos Stavrakakis
    except ValueError:
123 b84ed662 Christos Stavrakakis
        raise CommandError("Invalid flavor ID: %s", flavor_id)
124 b84ed662 Christos Stavrakakis
    except Flavor.DoesNotExist:
125 b84ed662 Christos Stavrakakis
        raise CommandError("Flavor with ID %s not found in DB."
126 b84ed662 Christos Stavrakakis
                           " Use snf-manage flavor-list to find out"
127 b84ed662 Christos Stavrakakis
                           " available flavor IDs." % flavor_id)
128 bad9404c Christos Stavrakakis
129 bad9404c Christos Stavrakakis
130 2333a2c4 Christos Stavrakakis
def check_backend_credentials(clustername, port, username, password):
131 2333a2c4 Christos Stavrakakis
    try:
132 2333a2c4 Christos Stavrakakis
        client = GanetiRapiClient(clustername, port, username, password)
133 2333a2c4 Christos Stavrakakis
        # This command will raise an exception if there is no
134 2333a2c4 Christos Stavrakakis
        # write-access
135 2333a2c4 Christos Stavrakakis
        client.ModifyCluster()
136 2333a2c4 Christos Stavrakakis
    except GanetiApiError as e:
137 2333a2c4 Christos Stavrakakis
        raise CommandError(e)
138 2333a2c4 Christos Stavrakakis
139 2333a2c4 Christos Stavrakakis
    info = client.GetInfo()
140 2333a2c4 Christos Stavrakakis
    info_name = info['name']
141 2333a2c4 Christos Stavrakakis
    if info_name != clustername:
142 2333a2c4 Christos Stavrakakis
        raise CommandError("Invalid clustername value. Please use the"
143 2333a2c4 Christos Stavrakakis
                           " Ganeti Cluster name: %s" % info_name)
144 7a0aa449 Christos Stavrakakis
145 7a0aa449 Christos Stavrakakis
146 8283d6c1 Stratos Psomadakis
class UserCache(object):
147 8283d6c1 Stratos Psomadakis
    """uuid<->displayname user 'cache'"""
148 3fa01ebd Stratos Psomadakis
149 f1ffc695 Stratos Psomadakis
    user_catalogs_url = ASTAKOS_URL.replace("im/authenticate",
150 f1ffc695 Stratos Psomadakis
                                            "service/api/user_catalogs")
151 f1ffc695 Stratos Psomadakis
152 8283d6c1 Stratos Psomadakis
    def __init__(self, split=100):
153 3170076a Stratos Psomadakis
        self.users = {}
154 3170076a Stratos Psomadakis
155 8283d6c1 Stratos Psomadakis
        self.split = split
156 8283d6c1 Stratos Psomadakis
        assert(self.split > 0), "split must be positive"
157 8283d6c1 Stratos Psomadakis
158 8283d6c1 Stratos Psomadakis
    def fetch_names(self, uuid_list):
159 d443e1dd Stratos Psomadakis
        total = len(uuid_list)
160 d443e1dd Stratos Psomadakis
        split = self.split
161 8283d6c1 Stratos Psomadakis
162 d443e1dd Stratos Psomadakis
        for start in range(0, total, split):
163 d443e1dd Stratos Psomadakis
            end = start + split
164 8283d6c1 Stratos Psomadakis
            try:
165 8283d6c1 Stratos Psomadakis
                names = \
166 8283d6c1 Stratos Psomadakis
                    astakos.get_displaynames(token=ASTAKOS_TOKEN,
167 8283d6c1 Stratos Psomadakis
                                             url=UserCache.user_catalogs_url,
168 8283d6c1 Stratos Psomadakis
                                             uuids=uuid_list[start:end])
169 8283d6c1 Stratos Psomadakis
                self.users.update(names)
170 8283d6c1 Stratos Psomadakis
            except Exception as e:
171 8283d6c1 Stratos Psomadakis
                log.error("Failed to fetch names: %s",  e)
172 8283d6c1 Stratos Psomadakis
173 8283d6c1 Stratos Psomadakis
    def get_uuid(self, name):
174 8283d6c1 Stratos Psomadakis
        if not name in self.users:
175 8283d6c1 Stratos Psomadakis
            try:
176 8283d6c1 Stratos Psomadakis
                self.users[name] = \
177 8283d6c1 Stratos Psomadakis
                    astakos.get_user_uuid(token=ASTAKOS_TOKEN,
178 8283d6c1 Stratos Psomadakis
                                          url=UserCache.user_catalogs_url,
179 8283d6c1 Stratos Psomadakis
                                          displayname=name)
180 8283d6c1 Stratos Psomadakis
            except Exception as e:
181 8283d6c1 Stratos Psomadakis
                log.error("Can not get uuid for name %s: %s", name, e)
182 8283d6c1 Stratos Psomadakis
                self.users[name] = name
183 8283d6c1 Stratos Psomadakis
184 8283d6c1 Stratos Psomadakis
        return self.users[name]
185 8283d6c1 Stratos Psomadakis
186 8283d6c1 Stratos Psomadakis
    def get_name(self, uuid):
187 8814e07c Christos Stavrakakis
        """Do the uuid-to-email resolving"""
188 3fa01ebd Stratos Psomadakis
189 3170076a Stratos Psomadakis
        if not uuid in self.users:
190 3fa01ebd Stratos Psomadakis
            try:
191 f1ffc695 Stratos Psomadakis
                self.users[uuid] = \
192 8814e07c Christos Stavrakakis
                    astakos.get_displayname(token=ASTAKOS_TOKEN,
193 8283d6c1 Stratos Psomadakis
                                            url=UserCache.user_catalogs_url,
194 8814e07c Christos Stavrakakis
                                            uuid=uuid)
195 8814e07c Christos Stavrakakis
            except Exception as e:
196 8814e07c Christos Stavrakakis
                log.error("Can not get display name for uuid %s: %s", uuid, e)
197 4500650c Stratos Psomadakis
                self.users[uuid] = "-"
198 3170076a Stratos Psomadakis
199 3170076a Stratos Psomadakis
        return self.users[uuid]
200 4500650c Stratos Psomadakis
201 4500650c Stratos Psomadakis
202 4500650c Stratos Psomadakis
class Omit(object):
203 4500650c Stratos Psomadakis
    pass