Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.7 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from django.core.management import CommandError
35
from synnefo.db.models import Backend, VirtualMachine, Network, Flavor
36
from functools import wraps
37

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

    
44
import logging
45
log = logging.getLogger(__name__)
46

    
47

    
48
def format_vm_state(vm):
49
    if vm.operstate == "BUILD":
50
        return "BUILD(" + str(vm.buildpercentage) + "%)"
51
    else:
52
        return vm.operstate
53

    
54

    
55
def get_backend(backend_id):
56
    try:
57
        backend_id = int(backend_id)
58
        return Backend.objects.get(id=backend_id)
59
    except ValueError:
60
        raise CommandError("Invalid Backend ID: %s" % backend_id)
61
    except Backend.DoesNotExist:
62
        raise CommandError("Backend with ID %s not found in DB. "
63
                           " Use snf-manage backend-list to find"
64
                           " out available backend IDs." % backend_id)
65

    
66

    
67
def get_image(image_id, user_id):
68
    if image_id:
69
        try:
70
            return util.get_image_dict(image_id, user_id)
71
        except faults.ItemNotFound:
72
            raise CommandError("Image with ID %s not found."
73
                               " Use snf-manage image-list to find"
74
                               " out available image IDs." % image_id)
75
    else:
76
        raise CommandError("image-id is mandatory")
77

    
78

    
79
def get_vm(server_id):
80
    """Get a VirtualMachine object by its ID.
81

82
    @type server_id: int or string
83
    @param server_id: The server's DB id or the Ganeti name
84

85
    """
86
    try:
87
        server_id = int(server_id)
88
    except (ValueError, TypeError):
89
        try:
90
            server_id = id_from_instance_name(server_id)
91
        except VirtualMachine.InvalidBackendIdError:
92
            raise CommandError("Invalid server ID: %s" % server_id)
93

    
94
    try:
95
        return VirtualMachine.objects.get(id=server_id)
96
    except VirtualMachine.DoesNotExist:
97
        raise CommandError("Server with ID %s not found in DB."
98
                           " Use snf-manage server-list to find out"
99
                           " available server IDs." % server_id)
100

    
101

    
102
def get_network(network_id, for_update=True):
103
    """Get a Network object by its ID.
104

105
    @type network_id: int or string
106
    @param network_id: The networks DB id or the Ganeti name
107

108
    """
109

    
110
    try:
111
        network_id = int(network_id)
112
    except (ValueError, TypeError):
113
        try:
114
            network_id = id_from_network_name(network_id)
115
        except Network.InvalidBackendIdError:
116
            raise CommandError("Invalid network ID: %s" % network_id)
117

    
118
    networks = Network.objects
119
    if for_update:
120
        networks = networks.select_for_update()
121
    try:
122
        return networks.get(id=network_id)
123
    except Network.DoesNotExist:
124
        raise CommandError("Network with ID %s not found in DB."
125
                           " Use snf-manage network-list to find out"
126
                           " available network IDs." % network_id)
127

    
128

    
129
def get_flavor(flavor_id):
130
    try:
131
        flavor_id = int(flavor_id)
132
        return Flavor.objects.get(id=flavor_id)
133
    except ValueError:
134
        raise CommandError("Invalid flavor ID: %s", flavor_id)
135
    except Flavor.DoesNotExist:
136
        raise CommandError("Flavor with ID %s not found in DB."
137
                           " Use snf-manage flavor-list to find out"
138
                           " available flavor IDs." % flavor_id)
139

    
140

    
141
def check_backend_credentials(clustername, port, username, password):
142
    try:
143
        client = GanetiRapiClient(clustername, port, username, password)
144
        # This command will raise an exception if there is no
145
        # write-access
146
        client.ModifyCluster()
147
    except GanetiApiError as e:
148
        raise CommandError(e)
149

    
150
    info = client.GetInfo()
151
    info_name = info['name']
152
    if info_name != clustername:
153
        raise CommandError("Invalid clustername value. Please use the"
154
                           " Ganeti Cluster name: %s" % info_name)
155

    
156

    
157
def convert_api_faults(func):
158
    @wraps(func)
159
    def wrapper(*args, **kwargs):
160
        try:
161
            return func(*args, **kwargs)
162
        except faults.Fault as e:
163
            raise CommandError(e.message)
164
    return wrapper
165

    
166

    
167
class Omit(object):
168
    pass