Statistics
| Branch: | Tag: | Revision:

root / logic / utils.py @ 7ca9e930

History | View | Annotate | Download (2.3 kB)

1 8d97deff Vassilios Karakoidas
#
2 8d97deff Vassilios Karakoidas
# Utility functions
3 8d97deff Vassilios Karakoidas
#
4 8d97deff Vassilios Karakoidas
# Various functions
5 8d97deff Vassilios Karakoidas
#
6 8d97deff Vassilios Karakoidas
# Copyright 2010 Greek Research and Technology Network
7 8d97deff Vassilios Karakoidas
#
8 8d97deff Vassilios Karakoidas
9 234f8b07 Vangelis Koukis
from synnefo.db.models import VirtualMachine
10 234f8b07 Vangelis Koukis
from synnefo.logic import credits
11 8d97deff Vassilios Karakoidas
12 8d97deff Vassilios Karakoidas
import synnefo.settings as settings
13 8d97deff Vassilios Karakoidas
14 8d97deff Vassilios Karakoidas
def id_from_instance_name(name):
15 8d97deff Vassilios Karakoidas
    """Returns VirtualMachine's Django id, given a ganeti machine name.
16 8d97deff Vassilios Karakoidas

17 8d97deff Vassilios Karakoidas
    Strips the ganeti prefix atm. Needs a better name!
18 8d97deff Vassilios Karakoidas

19 8d97deff Vassilios Karakoidas
    """
20 8d97deff Vassilios Karakoidas
    if not str(name).startswith(settings.BACKEND_PREFIX_ID):
21 8d97deff Vassilios Karakoidas
        raise VirtualMachine.InvalidBackendIdError(str(name))
22 8d97deff Vassilios Karakoidas
    ns = str(name).lstrip(settings.BACKEND_PREFIX_ID)
23 8d97deff Vassilios Karakoidas
    if not ns.isdigit():
24 8d97deff Vassilios Karakoidas
        raise VirtualMachine.InvalidBackendIdError(str(name))
25 8d97deff Vassilios Karakoidas
26 8d97deff Vassilios Karakoidas
    return int(ns)
27 8d97deff Vassilios Karakoidas
28 8d97deff Vassilios Karakoidas
def get_rsapi_state(vm):
29 fc30c430 Vangelis Koukis
    """Returns the API state for a virtual machine
30 fc30c430 Vangelis Koukis
    
31 fc30c430 Vangelis Koukis
    The API state for an instance of VirtualMachine is derived as follows:
32 fc30c430 Vangelis Koukis

33 fc30c430 Vangelis Koukis
    * If the deleted flag has been set, it is "DELETED".
34 fc30c430 Vangelis Koukis
    * Otherwise, it is a mapping of the last state reported by Ganeti
35 fc30c430 Vangelis Koukis
      (vm.operstate) through the RSAPI_STATE_FROM_OPER_STATE dictionary.
36 fc30c430 Vangelis Koukis
      
37 fc30c430 Vangelis Koukis
      The last state reported by Ganeti is set whenever Ganeti reports
38 fc30c430 Vangelis Koukis
      successful completion of an operation. If Ganeti says an OP_INSTANCE_STARTUP
39 fc30c430 Vangelis Koukis
      operation succeeded, vm.operstate is set to "STARTED".
40 fc30c430 Vangelis Koukis

41 7e8b41e7 Vangelis Koukis
    * To support any transitional states defined by the API (only REBOOT for the time
42 fc30c430 Vangelis Koukis
      being) this mapping is amended with information reported by Ganeti regarding
43 fc30c430 Vangelis Koukis
      any outstanding operation. If an OP_INSTANCE_STARTUP had succeeded previously
44 fc30c430 Vangelis Koukis
      and an OP_INSTANCE_REBOOT has been reported as in progress, the API state is
45 fc30c430 Vangelis Koukis
      "REBOOT".
46 fc30c430 Vangelis Koukis

47 fc30c430 Vangelis Koukis
    """
48 8d97deff Vassilios Karakoidas
    try:
49 dfd19c2d Vassilios Karakoidas
        r = VirtualMachine.RSAPI_STATE_FROM_OPER_STATE[vm.operstate]
50 8d97deff Vassilios Karakoidas
    except KeyError:
51 8d97deff Vassilios Karakoidas
        return "UNKNOWN"
52 685b219e Vangelis Koukis
    # A machine is DELETED if the deleted flag has been set
53 685b219e Vangelis Koukis
    if vm.deleted:
54 685b219e Vangelis Koukis
        return "DELETED"
55 8d97deff Vassilios Karakoidas
    # A machine is in REBOOT if an OP_INSTANCE_REBOOT request is in progress
56 dfd19c2d Vassilios Karakoidas
    if r == 'ACTIVE' and vm.backendopcode == 'OP_INSTANCE_REBOOT' and \
57 fb381fbe Markos Gogoulos
        vm.backendjobstatus in ('queued', 'waiting', 'running'):
58 8d97deff Vassilios Karakoidas
        return "REBOOT"
59 8d97deff Vassilios Karakoidas
    return r
60 8d97deff Vassilios Karakoidas
61 dfd19c2d Vassilios Karakoidas
def update_state(vm, new_operstate):
62 dfd19c2d Vassilios Karakoidas
    """Wrapper around updates of the VirtualMachine.operstate field"""
63 8d97deff Vassilios Karakoidas
64 8d97deff Vassilios Karakoidas
    # Call charge() unconditionally before any change of
65 8d97deff Vassilios Karakoidas
    # internal state.
66 dfd19c2d Vassilios Karakoidas
    credits.charge(vm)
67 dfd19c2d Vassilios Karakoidas
    vm.operstate = new_operstate