root / logic / utils.py @ fc30c430
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 | fc30c430 | Vangelis Koukis | * To support any transitive 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 |