Statistics
| Branch: | Tag: | Revision:

root / logic / backend.py @ 7d52c0b4

History | View | Annotate | Download (1.8 kB)

1 02feca11 Vassilios Karakoidas
2 02feca11 Vassilios Karakoidas
from db.models import VirtualMachine
3 02feca11 Vassilios Karakoidas
4 02feca11 Vassilios Karakoidas
def process_backend_msg(vm, jobid, opcode, status, logmsg):
5 02feca11 Vassilios Karakoidas
    """Process a job progress notification from the backend.
6 02feca11 Vassilios Karakoidas

7 02feca11 Vassilios Karakoidas
    Process an incoming message from the backend (currently Ganeti).
8 02feca11 Vassilios Karakoidas
    Job notifications with a terminating status (sucess, error, or canceled),
9 02feca11 Vassilios Karakoidas
    also update the operating state of the VM.
10 02feca11 Vassilios Karakoidas

11 02feca11 Vassilios Karakoidas
    """
12 02feca11 Vassilios Karakoidas
    if (opcode not in [x[0] for x in VirtualMachine.BACKEND_OPCODES] or
13 02feca11 Vassilios Karakoidas
       status not in [x[0] for x in VirtualMachine.BACKEND_STATUSES]):
14 02feca11 Vassilios Karakoidas
        raise VirtualMachine.InvalidBackendMsgError(opcode, status)
15 02feca11 Vassilios Karakoidas
16 02feca11 Vassilios Karakoidas
    vm._backendjobid = jobid
17 02feca11 Vassilios Karakoidas
    vm._backendjobstatus = status
18 02feca11 Vassilios Karakoidas
    vm._backendopcode = opcode
19 02feca11 Vassilios Karakoidas
    vm._backendlogmsg = logmsg
20 02feca11 Vassilios Karakoidas
21 02feca11 Vassilios Karakoidas
    # Notifications of success change the operating state
22 02feca11 Vassilios Karakoidas
    if status == 'success':
23 02feca11 Vassilios Karakoidas
        vm._update_state(VirtualMachine.OPER_STATE_FROM_OPCODE[opcode])
24 02feca11 Vassilios Karakoidas
    # Special cases OP_INSTANCE_CREATE fails --> ERROR
25 02feca11 Vassilios Karakoidas
    if status in ('canceled', 'error') and opcode == 'OP_INSTANCE_CREATE':
26 02feca11 Vassilios Karakoidas
        vm._update_state('ERROR')
27 02feca11 Vassilios Karakoidas
    # Any other notification of failure leaves the operating state unchanged
28 02feca11 Vassilios Karakoidas
29 02feca11 Vassilios Karakoidas
    vm.save()
30 22e52ede Vassilios Karakoidas
31 22e52ede Vassilios Karakoidas
def start_action(vm, action):
32 22e52ede Vassilios Karakoidas
    """Update the state of a VM when a new action is initiated."""
33 22e52ede Vassilios Karakoidas
    if not action in [x[0] for x in VirtualMachine.ACTIONS]:
34 22e52ede Vassilios Karakoidas
        raise VirtualMachine.InvalidActionError(action)
35 22e52ede Vassilios Karakoidas
36 22e52ede Vassilios Karakoidas
    # No actions to deleted and no actions beside destroy to suspended VMs
37 22e52ede Vassilios Karakoidas
    if vm.deleted:
38 22e52ede Vassilios Karakoidas
        raise VirtualMachine.InvalidActionError(action)
39 22e52ede Vassilios Karakoidas
40 22e52ede Vassilios Karakoidas
    vm._action = action
41 22e52ede Vassilios Karakoidas
    vm._backendjobid = None
42 22e52ede Vassilios Karakoidas
    vm._backendopcode = None
43 22e52ede Vassilios Karakoidas
    vm._backendjobstatus = None
44 22e52ede Vassilios Karakoidas
    vm._backendlogmsg = None
45 22e52ede Vassilios Karakoidas
46 22e52ede Vassilios Karakoidas
    # Update the relevant flags if the VM is being suspended or destroyed
47 22e52ede Vassilios Karakoidas
    if action == "DESTROY":
48 22e52ede Vassilios Karakoidas
        vm.deleted = True
49 22e52ede Vassilios Karakoidas
    elif action == "SUSPEND":
50 22e52ede Vassilios Karakoidas
        vm.suspended = True
51 22e52ede Vassilios Karakoidas
    elif action == "START":
52 22e52ede Vassilios Karakoidas
        vm.suspended = False
53 22e52ede Vassilios Karakoidas
    vm.save()