root / logic / backend.py @ 22e52ede
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() |