Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / util.py @ 9835a70d

History | View | Annotate | Download (15.4 kB)

1 6ef51e9f Giorgos Verigakis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 d1387ed7 Christodoulos Psaltis
#
3 adee02b8 Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 adee02b8 Giorgos Verigakis
# without modification, are permitted provided that the following
5 adee02b8 Giorgos Verigakis
# conditions are met:
6 d1387ed7 Christodoulos Psaltis
#
7 adee02b8 Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 adee02b8 Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 adee02b8 Giorgos Verigakis
#      disclaimer.
10 d1387ed7 Christodoulos Psaltis
#
11 adee02b8 Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 adee02b8 Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 adee02b8 Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 adee02b8 Giorgos Verigakis
#      provided with the distribution.
15 d1387ed7 Christodoulos Psaltis
#
16 adee02b8 Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 adee02b8 Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 adee02b8 Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 adee02b8 Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 adee02b8 Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 adee02b8 Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 adee02b8 Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 adee02b8 Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 adee02b8 Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 adee02b8 Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 adee02b8 Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 adee02b8 Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 d1387ed7 Christodoulos Psaltis
#
29 adee02b8 Giorgos Verigakis
# The views and conclusions contained in the software and
30 adee02b8 Giorgos Verigakis
# documentation are those of the authors and should not be
31 adee02b8 Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 adee02b8 Giorgos Verigakis
# or implied, of GRNET S.A.
33 7e2f9d4b Giorgos Verigakis
34 dca7553e Christos Stavrakakis
from base64 import b64encode, b64decode
35 c738c935 Giorgos Verigakis
from hashlib import sha256
36 2035039b Giorgos Verigakis
from logging import getLogger
37 d8e50a39 Giorgos Verigakis
from random import choice
38 dca2a31f Giorgos Verigakis
from string import digits, lowercase, uppercase
39 2035039b Giorgos Verigakis
40 c738c935 Giorgos Verigakis
from Crypto.Cipher import AES
41 529178b1 Giorgos Verigakis
42 d8e50a39 Giorgos Verigakis
from django.conf import settings
43 7e2f9d4b Giorgos Verigakis
from django.http import HttpResponse
44 7e2f9d4b Giorgos Verigakis
from django.template.loader import render_to_string
45 29a59bc1 Giorgos Verigakis
from django.utils import simplejson as json
46 d3406fbc Christos Stavrakakis
from django.db.models import Q
47 7e2f9d4b Giorgos Verigakis
48 bd40abfa Christos Stavrakakis
from snf_django.lib.api import faults
49 6ef51e9f Giorgos Verigakis
from synnefo.db.models import (Flavor, VirtualMachine, VirtualMachineMetadata,
50 a1713485 Marios Kogias
                               Network, NetworkInterface, SecurityGroup,
51 a1713485 Marios Kogias
                               BridgePoolTable, MacPrefixPoolTable, IPAddress,
52 495e2be8 Christos Stavrakakis
                               IPPoolTable)
53 b3fd98ae Christos Stavrakakis
from synnefo.plankton.utils import image_backend
54 9e98ba3c Giorgos Verigakis
55 1b696c26 Christos Stavrakakis
from synnefo.cyclades_settings import cyclades_services, BASE_HOST
56 1b696c26 Christos Stavrakakis
from synnefo.lib.services import get_service_path
57 1b696c26 Christos Stavrakakis
from synnefo.lib import join_urls
58 1b696c26 Christos Stavrakakis
59 1b696c26 Christos Stavrakakis
COMPUTE_URL = \
60 1b696c26 Christos Stavrakakis
    join_urls(BASE_HOST,
61 1b696c26 Christos Stavrakakis
              get_service_path(cyclades_services, "compute", version="v2.0"))
62 1b696c26 Christos Stavrakakis
SERVERS_URL = join_urls(COMPUTE_URL, "servers/")
63 1b696c26 Christos Stavrakakis
FLAVORS_URL = join_urls(COMPUTE_URL, "flavors/")
64 1b696c26 Christos Stavrakakis
IMAGES_URL = join_urls(COMPUTE_URL, "images/")
65 1b696c26 Christos Stavrakakis
PLANKTON_URL = \
66 1b696c26 Christos Stavrakakis
    join_urls(BASE_HOST,
67 1b696c26 Christos Stavrakakis
              get_service_path(cyclades_services, "image", version="v1.0"))
68 1b696c26 Christos Stavrakakis
IMAGES_PLANKTON_URL = join_urls(PLANKTON_URL, "images/")
69 1b696c26 Christos Stavrakakis
70 cdd6fc06 Christos Stavrakakis
NETWORK_URL = \
71 cdd6fc06 Christos Stavrakakis
    join_urls(BASE_HOST,
72 cdd6fc06 Christos Stavrakakis
              get_service_path(cyclades_services, "network", version="v2.0"))
73 cdd6fc06 Christos Stavrakakis
NETWORKS_URL = join_urls(NETWORK_URL, "networks/")
74 cdd6fc06 Christos Stavrakakis
PORTS_URL = join_urls(NETWORK_URL, "ports/")
75 cdd6fc06 Christos Stavrakakis
SUBNETS_URL = join_urls(NETWORK_URL, "subnets/")
76 cdd6fc06 Christos Stavrakakis
FLOATING_IPS_URL = join_urls(NETWORK_URL, "floatingips/")
77 cdd6fc06 Christos Stavrakakis
78 c172f4ab Christos Stavrakakis
PITHOSMAP_PREFIX = "pithosmap://"
79 9e98ba3c Giorgos Verigakis
80 9e98ba3c Giorgos Verigakis
log = getLogger('synnefo.api')
81 9e98ba3c Giorgos Verigakis
82 7e2f9d4b Giorgos Verigakis
83 dca2a31f Giorgos Verigakis
def random_password():
84 dca2a31f Giorgos Verigakis
    """Generates a random password
85 ce55f211 Kostas Papadimitriou

86 62eac5a6 Giorgos Verigakis
    We generate a windows compliant password: it must contain at least
87 dca2a31f Giorgos Verigakis
    one charachter from each of the groups: upper case, lower case, digits.
88 dca2a31f Giorgos Verigakis
    """
89 ce55f211 Kostas Papadimitriou
90 dca2a31f Giorgos Verigakis
    pool = lowercase + uppercase + digits
91 dca2a31f Giorgos Verigakis
    lowerset = set(lowercase)
92 dca2a31f Giorgos Verigakis
    upperset = set(uppercase)
93 dca2a31f Giorgos Verigakis
    digitset = set(digits)
94 dca2a31f Giorgos Verigakis
    length = 10
95 ce55f211 Kostas Papadimitriou
96 62eac5a6 Giorgos Verigakis
    password = ''.join(choice(pool) for i in range(length - 2))
97 ce55f211 Kostas Papadimitriou
98 62eac5a6 Giorgos Verigakis
    # Make sure the password is compliant
99 62eac5a6 Giorgos Verigakis
    chars = set(password)
100 62eac5a6 Giorgos Verigakis
    if not chars & lowerset:
101 62eac5a6 Giorgos Verigakis
        password += choice(lowercase)
102 62eac5a6 Giorgos Verigakis
    if not chars & upperset:
103 62eac5a6 Giorgos Verigakis
        password += choice(uppercase)
104 62eac5a6 Giorgos Verigakis
    if not chars & digitset:
105 62eac5a6 Giorgos Verigakis
        password += choice(digits)
106 ce55f211 Kostas Papadimitriou
107 62eac5a6 Giorgos Verigakis
    # Pad if necessary to reach required length
108 62eac5a6 Giorgos Verigakis
    password += ''.join(choice(pool) for i in range(length - len(password)))
109 ce55f211 Kostas Papadimitriou
110 dca2a31f Giorgos Verigakis
    return password
111 dca2a31f Giorgos Verigakis
112 d8e50a39 Giorgos Verigakis
113 c738c935 Giorgos Verigakis
def zeropad(s):
114 c738c935 Giorgos Verigakis
    """Add zeros at the end of a string in order to make its length
115 c738c935 Giorgos Verigakis
       a multiple of 16."""
116 d1387ed7 Christodoulos Psaltis
117 c738c935 Giorgos Verigakis
    npad = 16 - len(s) % 16
118 c738c935 Giorgos Verigakis
    return s + '\x00' * npad
119 c738c935 Giorgos Verigakis
120 a08e4270 Vangelis Koukis
121 c738c935 Giorgos Verigakis
def encrypt(plaintext):
122 c738c935 Giorgos Verigakis
    # Make sure key is 32 bytes long
123 c738c935 Giorgos Verigakis
    key = sha256(settings.SECRET_KEY).digest()
124 d1387ed7 Christodoulos Psaltis
125 c738c935 Giorgos Verigakis
    aes = AES.new(key)
126 c738c935 Giorgos Verigakis
    enc = aes.encrypt(zeropad(plaintext))
127 c738c935 Giorgos Verigakis
    return b64encode(enc)
128 c738c935 Giorgos Verigakis
129 7e2f9d4b Giorgos Verigakis
130 7f2dbcad Christos Stavrakakis
def get_vm(server_id, user_id, for_update=False, non_deleted=False,
131 b3a43976 Christos Stavrakakis
           non_suspended=False, prefetch_related=None):
132 e221ade2 Christos Stavrakakis
    """Find a VirtualMachine instance based on ID and owner."""
133 aa197ee4 Vangelis Koukis
134 d8e50a39 Giorgos Verigakis
    try:
135 d8e50a39 Giorgos Verigakis
        server_id = int(server_id)
136 7f2dbcad Christos Stavrakakis
        servers = VirtualMachine.objects
137 7f2dbcad Christos Stavrakakis
        if for_update:
138 7f2dbcad Christos Stavrakakis
            servers = servers.select_for_update()
139 b3a43976 Christos Stavrakakis
        if prefetch_related is not None:
140 b3a43976 Christos Stavrakakis
            servers = servers.prefetch_related(prefetch_related)
141 7f2dbcad Christos Stavrakakis
        vm = servers.get(id=server_id, userid=user_id)
142 e221ade2 Christos Stavrakakis
        if non_deleted and vm.deleted:
143 5b0832fc Christos Stavrakakis
            raise faults.BadRequest("Server has been deleted.")
144 e221ade2 Christos Stavrakakis
        if non_suspended and vm.suspended:
145 bd40abfa Christos Stavrakakis
            raise faults.Forbidden("Administratively Suspended VM")
146 3a522cff Christos Stavrakakis
        return vm
147 d8e50a39 Giorgos Verigakis
    except ValueError:
148 bd40abfa Christos Stavrakakis
        raise faults.BadRequest('Invalid server ID.')
149 d8e50a39 Giorgos Verigakis
    except VirtualMachine.DoesNotExist:
150 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Server not found.')
151 d8e50a39 Giorgos Verigakis
152 7f2dbcad Christos Stavrakakis
153 40777cc8 Giorgos Verigakis
def get_vm_meta(vm, key):
154 d8e50a39 Giorgos Verigakis
    """Return a VirtualMachineMetadata instance or raise ItemNotFound."""
155 aa197ee4 Vangelis Koukis
156 d8e50a39 Giorgos Verigakis
    try:
157 40777cc8 Giorgos Verigakis
        return VirtualMachineMetadata.objects.get(meta_key=key, vm=vm)
158 d8e50a39 Giorgos Verigakis
    except VirtualMachineMetadata.DoesNotExist:
159 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Metadata key not found.')
160 d8e50a39 Giorgos Verigakis
161 a08e4270 Vangelis Koukis
162 6ef51e9f Giorgos Verigakis
def get_image(image_id, user_id):
163 d8e50a39 Giorgos Verigakis
    """Return an Image instance or raise ItemNotFound."""
164 aa197ee4 Vangelis Koukis
165 b3fd98ae Christos Stavrakakis
    with image_backend(user_id) as backend:
166 cda71050 Christos Stavrakakis
        return backend.get_image(image_id)
167 3a9b3cde Giorgos Verigakis
168 a08e4270 Vangelis Koukis
169 dca7553e Christos Stavrakakis
def get_image_dict(image_id, user_id):
170 dca7553e Christos Stavrakakis
    image = {}
171 dca7553e Christos Stavrakakis
    img = get_image(image_id, user_id)
172 bcd80cd9 Christos Stavrakakis
    image["id"] = img["id"]
173 bcd80cd9 Christos Stavrakakis
    image["name"] = img["name"]
174 c172f4ab Christos Stavrakakis
    image["format"] = img["disk_format"]
175 c172f4ab Christos Stavrakakis
    image["checksum"] = img["checksum"]
176 c172f4ab Christos Stavrakakis
    image["location"] = img["location"]
177 c172f4ab Christos Stavrakakis
178 c172f4ab Christos Stavrakakis
    checksum = image["checksum"] = img["checksum"]
179 c172f4ab Christos Stavrakakis
    size = image["size"] = img["size"]
180 c172f4ab Christos Stavrakakis
    image["backend_id"] = PITHOSMAP_PREFIX + "/".join([checksum, str(size)])
181 c172f4ab Christos Stavrakakis
182 c172f4ab Christos Stavrakakis
    properties = img.get("properties", {})
183 c172f4ab Christos Stavrakakis
    image["metadata"] = dict((key.upper(), val)
184 dca7553e Christos Stavrakakis
                             for key, val in properties.items())
185 c172f4ab Christos Stavrakakis
186 dca7553e Christos Stavrakakis
    return image
187 dca7553e Christos Stavrakakis
188 dca7553e Christos Stavrakakis
189 aa8230bd Christos Stavrakakis
def get_flavor(flavor_id, include_deleted=False):
190 529178b1 Giorgos Verigakis
    """Return a Flavor instance or raise ItemNotFound."""
191 aa197ee4 Vangelis Koukis
192 529178b1 Giorgos Verigakis
    try:
193 529178b1 Giorgos Verigakis
        flavor_id = int(flavor_id)
194 aa8230bd Christos Stavrakakis
        if include_deleted:
195 aa8230bd Christos Stavrakakis
            return Flavor.objects.get(id=flavor_id)
196 aa8230bd Christos Stavrakakis
        else:
197 aa8230bd Christos Stavrakakis
            return Flavor.objects.get(id=flavor_id, deleted=include_deleted)
198 6ef51e9f Giorgos Verigakis
    except (ValueError, Flavor.DoesNotExist):
199 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Flavor not found.')
200 d8e50a39 Giorgos Verigakis
201 a08e4270 Vangelis Koukis
202 9dcb5b8a Christos Stavrakakis
def get_flavor_provider(flavor):
203 9dcb5b8a Christos Stavrakakis
    """Extract provider from disk template.
204 9dcb5b8a Christos Stavrakakis

205 9dcb5b8a Christos Stavrakakis
    Provider for `ext` disk_template is encoded in the disk template
206 9dcb5b8a Christos Stavrakakis
    name, which is formed `ext_<provider_name>`. Provider is None
207 9dcb5b8a Christos Stavrakakis
    for all other disk templates.
208 9dcb5b8a Christos Stavrakakis

209 9dcb5b8a Christos Stavrakakis
    """
210 9dcb5b8a Christos Stavrakakis
    disk_template = flavor.disk_template
211 9dcb5b8a Christos Stavrakakis
    provider = None
212 9dcb5b8a Christos Stavrakakis
    if disk_template.startswith("ext"):
213 9dcb5b8a Christos Stavrakakis
        disk_template, provider = disk_template.split("_", 1)
214 9dcb5b8a Christos Stavrakakis
    return disk_template, provider
215 9dcb5b8a Christos Stavrakakis
216 95a213d4 Christos Stavrakakis
217 9e8be4fb Christos Stavrakakis
def get_network(network_id, user_id, for_update=False, non_deleted=False):
218 e2ee7808 Giorgos Verigakis
    """Return a Network instance or raise ItemNotFound."""
219 aa197ee4 Vangelis Koukis
220 e2ee7808 Giorgos Verigakis
    try:
221 7fede91e Christos Stavrakakis
        network_id = int(network_id)
222 a96e84cf Christos Stavrakakis
        objects = Network.objects.prefetch_related("subnets")
223 d2e73c0c Christos Stavrakakis
        if for_update:
224 d3406fbc Christos Stavrakakis
            objects = objects.select_for_update()
225 9e8be4fb Christos Stavrakakis
        network = objects.get(Q(userid=user_id) | Q(public=True),
226 9e8be4fb Christos Stavrakakis
                              id=network_id)
227 9e8be4fb Christos Stavrakakis
        if non_deleted and network.deleted:
228 f8675683 Christos Stavrakakis
            raise faults.BadRequest("Network has been deleted.")
229 9e8be4fb Christos Stavrakakis
        return network
230 6ef51e9f Giorgos Verigakis
    except (ValueError, Network.DoesNotExist):
231 710b1c43 Christos Stavrakakis
        raise faults.ItemNotFound('Network %s not found.' % network_id)
232 95a213d4 Christos Stavrakakis
233 95a213d4 Christos Stavrakakis
234 95a213d4 Christos Stavrakakis
def get_port(port_id, user_id, for_update=False):
235 0baa1e3d Buildbot
    """
236 95a213d4 Christos Stavrakakis
    Return a NetworkInteface instance or raise ItemNotFound.
237 0baa1e3d Buildbot
    """
238 0baa1e3d Buildbot
    try:
239 09b76b7e Christos Stavrakakis
        objects = NetworkInterface.objects.filter(userid=user_id)
240 593851e0 Buildbot
        if for_update:
241 593851e0 Buildbot
            objects = objects.select_for_update()
242 fae6e5f0 Christos Stavrakakis
        # if (port.device_owner != "vm") and for_update:
243 8d5795b4 Christos Stavrakakis
        #     raise faults.BadRequest('Cannot update non vm port')
244 09b76b7e Christos Stavrakakis
        return objects.get(id=port_id)
245 95a213d4 Christos Stavrakakis
    except (ValueError, NetworkInterface.DoesNotExist):
246 09b76b7e Christos Stavrakakis
        raise faults.ItemNotFound("Port '%s' not found." % port_id)
247 95a213d4 Christos Stavrakakis
248 0711e5aa Christos Stavrakakis
249 a1713485 Marios Kogias
def get_security_group(sg_id):
250 a1713485 Marios Kogias
    try:
251 a1713485 Marios Kogias
        sg = SecurityGroup.objects.get(id=sg_id)
252 a1713485 Marios Kogias
        return sg
253 a1713485 Marios Kogias
    except (ValueError, SecurityGroup.DoesNotExist):
254 a1713485 Marios Kogias
        raise faults.ItemNotFound("Not valid security group")
255 a08e4270 Vangelis Koukis
256 0711e5aa Christos Stavrakakis
257 710b1c43 Christos Stavrakakis
def get_floating_ip_by_address(userid, address, for_update=False):
258 f8675683 Christos Stavrakakis
    try:
259 326c3ec8 Christos Stavrakakis
        objects = IPAddress.objects
260 f8675683 Christos Stavrakakis
        if for_update:
261 f8675683 Christos Stavrakakis
            objects = objects.select_for_update()
262 710b1c43 Christos Stavrakakis
        return objects.get(userid=userid, floating_ip=True,
263 710b1c43 Christos Stavrakakis
                           address=address, deleted=False)
264 326c3ec8 Christos Stavrakakis
    except IPAddress.DoesNotExist:
265 f8675683 Christos Stavrakakis
        raise faults.ItemNotFound("Floating IP does not exist.")
266 f8675683 Christos Stavrakakis
267 f8675683 Christos Stavrakakis
268 710b1c43 Christos Stavrakakis
def get_floating_ip_by_id(userid, floating_ip_id, for_update=False):
269 710b1c43 Christos Stavrakakis
    try:
270 710b1c43 Christos Stavrakakis
        objects = IPAddress.objects
271 710b1c43 Christos Stavrakakis
        if for_update:
272 710b1c43 Christos Stavrakakis
            objects = objects.select_for_update()
273 d9c36253 Marios Kogias
        return objects.get(id=floating_ip_id, floating_ip=True,
274 0711e5aa Christos Stavrakakis
                           userid=userid, deleted=False)
275 710b1c43 Christos Stavrakakis
    except IPAddress.DoesNotExist:
276 fae6e5f0 Christos Stavrakakis
        raise faults.ItemNotFound("Floating IP with ID %s does not exist." %
277 710b1c43 Christos Stavrakakis
                                  floating_ip_id)
278 dca7553e Christos Stavrakakis
279 dca7553e Christos Stavrakakis
280 710b1c43 Christos Stavrakakis
def backend_has_free_public_ip(backend):
281 710b1c43 Christos Stavrakakis
    """Check if a backend has a free public IPv4 address."""
282 710b1c43 Christos Stavrakakis
    ip_pool_rows = IPPoolTable.objects.select_for_update()\
283 710b1c43 Christos Stavrakakis
        .filter(subnet__network__public=True)\
284 710b1c43 Christos Stavrakakis
        .filter(subnet__network__drained=False)\
285 710b1c43 Christos Stavrakakis
        .filter(subnet__deleted=False)\
286 710b1c43 Christos Stavrakakis
        .filter(subnet__network__backend_networks__backend=backend)
287 710b1c43 Christos Stavrakakis
    for pool_row in ip_pool_rows:
288 710b1c43 Christos Stavrakakis
        pool = pool_row.pool
289 710b1c43 Christos Stavrakakis
        if pool.empty():
290 710b1c43 Christos Stavrakakis
            continue
291 710b1c43 Christos Stavrakakis
        else:
292 710b1c43 Christos Stavrakakis
            return True
293 710b1c43 Christos Stavrakakis
294 710b1c43 Christos Stavrakakis
295 710b1c43 Christos Stavrakakis
def backend_public_networks(backend):
296 710b1c43 Christos Stavrakakis
    return Network.objects.filter(deleted=False, public=True,
297 710b1c43 Christos Stavrakakis
                                  backend_networks__backend=backend)
298 7fede91e Christos Stavrakakis
299 7fede91e Christos Stavrakakis
300 c988fcca Christos Stavrakakis
def get_vm_nic(vm, nic_id):
301 d0545590 Christos Stavrakakis
    """Get a VMs NIC by its ID."""
302 d44c236b Giorgos Verigakis
    try:
303 7c714455 Christos Stavrakakis
        return vm.nics.get(id=nic_id)
304 d44c236b Giorgos Verigakis
    except NetworkInterface.DoesNotExist:
305 d0545590 Christos Stavrakakis
        raise faults.ItemNotFound("NIC '%s' not found" % nic_id)
306 d44c236b Giorgos Verigakis
307 7fede91e Christos Stavrakakis
308 c988fcca Christos Stavrakakis
def get_nic(nic_id):
309 c988fcca Christos Stavrakakis
    try:
310 c988fcca Christos Stavrakakis
        return NetworkInterface.objects.get(id=nic_id)
311 c988fcca Christos Stavrakakis
    except NetworkInterface.DoesNotExist:
312 c988fcca Christos Stavrakakis
        raise faults.ItemNotFound("NIC '%s' not found" % nic_id)
313 c988fcca Christos Stavrakakis
314 c988fcca Christos Stavrakakis
315 432fc8c3 Giorgos Verigakis
def render_metadata(request, metadata, use_values=False, status=200):
316 432fc8c3 Giorgos Verigakis
    if request.serialization == 'xml':
317 432fc8c3 Giorgos Verigakis
        data = render_to_string('metadata.xml', {'metadata': metadata})
318 432fc8c3 Giorgos Verigakis
    else:
319 b36f78fa Giorgos Verigakis
        if use_values:
320 b36f78fa Giorgos Verigakis
            d = {'metadata': {'values': metadata}}
321 b36f78fa Giorgos Verigakis
        else:
322 b36f78fa Giorgos Verigakis
            d = {'metadata': metadata}
323 432fc8c3 Giorgos Verigakis
        data = json.dumps(d)
324 432fc8c3 Giorgos Verigakis
    return HttpResponse(data, status=status)
325 432fc8c3 Giorgos Verigakis
326 a08e4270 Vangelis Koukis
327 432fc8c3 Giorgos Verigakis
def render_meta(request, meta, status=200):
328 432fc8c3 Giorgos Verigakis
    if request.serialization == 'xml':
329 32e4e343 Christos Stavrakakis
        key, val = meta.items()[0]
330 6ef51e9f Giorgos Verigakis
        data = render_to_string('meta.xml', dict(key=key, val=val))
331 432fc8c3 Giorgos Verigakis
    else:
332 6ef51e9f Giorgos Verigakis
        data = json.dumps(dict(meta=meta))
333 432fc8c3 Giorgos Verigakis
    return HttpResponse(data, status=status)
334 432fc8c3 Giorgos Verigakis
335 a08e4270 Vangelis Koukis
336 dca7553e Christos Stavrakakis
def verify_personality(personality):
337 6ec4694f Christos Stavrakakis
    """Verify that a a list of personalities is well formed"""
338 006c6249 Christos Stavrakakis
    if len(personality) > settings.MAX_PERSONALITY:
339 bd40abfa Christos Stavrakakis
        raise faults.OverLimit("Maximum number of personalities"
340 32e4e343 Christos Stavrakakis
                               " exceeded")
341 dca7553e Christos Stavrakakis
    for p in personality:
342 dca7553e Christos Stavrakakis
        # Verify that personalities are well-formed
343 dca7553e Christos Stavrakakis
        try:
344 dca7553e Christos Stavrakakis
            assert isinstance(p, dict)
345 dca7553e Christos Stavrakakis
            keys = set(p.keys())
346 dca7553e Christos Stavrakakis
            allowed = set(['contents', 'group', 'mode', 'owner', 'path'])
347 dca7553e Christos Stavrakakis
            assert keys.issubset(allowed)
348 dca7553e Christos Stavrakakis
            contents = p['contents']
349 dca7553e Christos Stavrakakis
            if len(contents) > settings.MAX_PERSONALITY_SIZE:
350 dca7553e Christos Stavrakakis
                # No need to decode if contents already exceed limit
351 bd40abfa Christos Stavrakakis
                raise faults.OverLimit("Maximum size of personality exceeded")
352 dca7553e Christos Stavrakakis
            if len(b64decode(contents)) > settings.MAX_PERSONALITY_SIZE:
353 bd40abfa Christos Stavrakakis
                raise faults.OverLimit("Maximum size of personality exceeded")
354 dca7553e Christos Stavrakakis
        except AssertionError:
355 bd40abfa Christos Stavrakakis
            raise faults.BadRequest("Malformed personality in request")
356 2a599282 Christos Stavrakakis
357 2a599282 Christos Stavrakakis
358 b7d38981 Dimitris Aragiorgis
def values_from_flavor(flavor):
359 b7d38981 Dimitris Aragiorgis
    """Get Ganeti connectivity info from flavor type.
360 b7d38981 Dimitris Aragiorgis

361 b7d38981 Dimitris Aragiorgis
    If link or mac_prefix equals to "pool", then the resources
362 b7d38981 Dimitris Aragiorgis
    are allocated from the corresponding Pools.
363 b7d38981 Dimitris Aragiorgis

364 b7d38981 Dimitris Aragiorgis
    """
365 b7d38981 Dimitris Aragiorgis
    try:
366 b7d38981 Dimitris Aragiorgis
        flavor = Network.FLAVORS[flavor]
367 b7d38981 Dimitris Aragiorgis
    except KeyError:
368 bd40abfa Christos Stavrakakis
        raise faults.BadRequest("Unknown network flavor")
369 b7d38981 Dimitris Aragiorgis
370 b7d38981 Dimitris Aragiorgis
    mode = flavor.get("mode")
371 b7d38981 Dimitris Aragiorgis
372 b7d38981 Dimitris Aragiorgis
    link = flavor.get("link")
373 b7d38981 Dimitris Aragiorgis
    if link == "pool":
374 b7d38981 Dimitris Aragiorgis
        link = allocate_resource("bridge")
375 b7d38981 Dimitris Aragiorgis
376 b7d38981 Dimitris Aragiorgis
    mac_prefix = flavor.get("mac_prefix")
377 b7d38981 Dimitris Aragiorgis
    if mac_prefix == "pool":
378 b7d38981 Dimitris Aragiorgis
        mac_prefix = allocate_resource("mac_prefix")
379 b7d38981 Dimitris Aragiorgis
380 b7d38981 Dimitris Aragiorgis
    tags = flavor.get("tags")
381 b7d38981 Dimitris Aragiorgis
382 b7d38981 Dimitris Aragiorgis
    return mode, link, mac_prefix, tags
383 b7d38981 Dimitris Aragiorgis
384 b7d38981 Dimitris Aragiorgis
385 b7d38981 Dimitris Aragiorgis
def allocate_resource(res_type):
386 b7d38981 Dimitris Aragiorgis
    table = get_pool_table(res_type)
387 b7d38981 Dimitris Aragiorgis
    pool = table.get_pool()
388 b7d38981 Dimitris Aragiorgis
    value = pool.get()
389 b7d38981 Dimitris Aragiorgis
    pool.save()
390 b7d38981 Dimitris Aragiorgis
    return value
391 b7d38981 Dimitris Aragiorgis
392 b7d38981 Dimitris Aragiorgis
393 b7d38981 Dimitris Aragiorgis
def release_resource(res_type, value):
394 b7d38981 Dimitris Aragiorgis
    table = get_pool_table(res_type)
395 b7d38981 Dimitris Aragiorgis
    pool = table.get_pool()
396 b7d38981 Dimitris Aragiorgis
    pool.put(value)
397 b7d38981 Dimitris Aragiorgis
    pool.save()
398 b7d38981 Dimitris Aragiorgis
399 b7d38981 Dimitris Aragiorgis
400 b7d38981 Dimitris Aragiorgis
def get_pool_table(res_type):
401 b7d38981 Dimitris Aragiorgis
    if res_type == "bridge":
402 b7d38981 Dimitris Aragiorgis
        return BridgePoolTable
403 b7d38981 Dimitris Aragiorgis
    elif res_type == "mac_prefix":
404 b7d38981 Dimitris Aragiorgis
        return MacPrefixPoolTable
405 b7d38981 Dimitris Aragiorgis
    else:
406 b7d38981 Dimitris Aragiorgis
        raise Exception("Unknown resource type")
407 55f562a4 Kostas Papadimitriou
408 55f562a4 Kostas Papadimitriou
409 55f562a4 Kostas Papadimitriou
def get_existing_users():
410 55f562a4 Kostas Papadimitriou
    """
411 55f562a4 Kostas Papadimitriou
    Retrieve user ids stored in cyclades user agnostic models.
412 55f562a4 Kostas Papadimitriou
    """
413 55f562a4 Kostas Papadimitriou
    # also check PublicKeys a user with no servers/networks exist
414 b47b110d Kostas Papadimitriou
    from synnefo.userdata.models import PublicKeyPair
415 55f562a4 Kostas Papadimitriou
    from synnefo.db.models import VirtualMachine, Network
416 55f562a4 Kostas Papadimitriou
417 55f562a4 Kostas Papadimitriou
    keypairusernames = PublicKeyPair.objects.filter().values_list('user',
418 e440e835 Christos Stavrakakis
                                                                  flat=True)
419 55f562a4 Kostas Papadimitriou
    serverusernames = VirtualMachine.objects.filter().values_list('userid',
420 e440e835 Christos Stavrakakis
                                                                  flat=True)
421 55f562a4 Kostas Papadimitriou
    networkusernames = Network.objects.filter().values_list('userid',
422 55f562a4 Kostas Papadimitriou
                                                            flat=True)
423 55f562a4 Kostas Papadimitriou
424 e440e835 Christos Stavrakakis
    return set(list(keypairusernames) + list(serverusernames) +
425 e440e835 Christos Stavrakakis
               list(networkusernames))
426 1b696c26 Christos Stavrakakis
427 1b696c26 Christos Stavrakakis
428 1b696c26 Christos Stavrakakis
def vm_to_links(vm_id):
429 73fbaad3 Christos Stavrakakis
    href = join_urls(SERVERS_URL, str(vm_id))
430 73fbaad3 Christos Stavrakakis
    return [{"rel": rel, "href": href} for rel in ("self", "bookmark")]
431 1b696c26 Christos Stavrakakis
432 1b696c26 Christos Stavrakakis
433 1b696c26 Christos Stavrakakis
def network_to_links(network_id):
434 73fbaad3 Christos Stavrakakis
    href = join_urls(NETWORKS_URL, str(network_id))
435 73fbaad3 Christos Stavrakakis
    return [{"rel": rel, "href": href} for rel in ("self", "bookmark")]
436 1b696c26 Christos Stavrakakis
437 1b696c26 Christos Stavrakakis
438 24ea227b Dionysis Grigoropoulos
def subnet_to_links(subnet_id):
439 24ea227b Dionysis Grigoropoulos
    href = join_urls(SUBNETS_URL, str(subnet_id))
440 24ea227b Dionysis Grigoropoulos
    return [{"rel": rel, "href": href} for rel in ("self", "bookmark")]
441 24ea227b Dionysis Grigoropoulos
442 24ea227b Dionysis Grigoropoulos
443 24ea227b Dionysis Grigoropoulos
def port_to_links(port_id):
444 24ea227b Dionysis Grigoropoulos
    href = join_urls(PORTS_URL, str(port_id))
445 24ea227b Dionysis Grigoropoulos
    return [{"rel": rel, "href": href} for rel in ("self", "bookmark")]
446 24ea227b Dionysis Grigoropoulos
447 24ea227b Dionysis Grigoropoulos
448 1b696c26 Christos Stavrakakis
def flavor_to_links(flavor_id):
449 73fbaad3 Christos Stavrakakis
    href = join_urls(FLAVORS_URL, str(flavor_id))
450 73fbaad3 Christos Stavrakakis
    return [{"rel": rel, "href": href} for rel in ("self", "bookmark")]
451 1b696c26 Christos Stavrakakis
452 1b696c26 Christos Stavrakakis
453 1b696c26 Christos Stavrakakis
def image_to_links(image_id):
454 73fbaad3 Christos Stavrakakis
    href = join_urls(IMAGES_URL, str(image_id))
455 73fbaad3 Christos Stavrakakis
    links = [{"rel": rel, "href": href} for rel in ("self", "bookmark")]
456 1b696c26 Christos Stavrakakis
    links.append({"rel": "alternate",
457 73fbaad3 Christos Stavrakakis
                  "href": join_urls(IMAGES_PLANKTON_URL, str(image_id))})
458 1b696c26 Christos Stavrakakis
    return links
459 41a7fae7 Christos Stavrakakis
460 32e4e343 Christos Stavrakakis
461 41a7fae7 Christos Stavrakakis
def start_action(vm, action, jobId):
462 41a7fae7 Christos Stavrakakis
    vm.action = action
463 41a7fae7 Christos Stavrakakis
    vm.backendjobid = jobId
464 41a7fae7 Christos Stavrakakis
    vm.backendopcode = None
465 41a7fae7 Christos Stavrakakis
    vm.backendjobstatus = None
466 41a7fae7 Christos Stavrakakis
    vm.backendlogmsg = None
467 41a7fae7 Christos Stavrakakis
    vm.save()