root / logic / backend.py @ fc30c430
History | View | Annotate | Download (2.2 kB)
1 | 234f8b07 | Vangelis Koukis | #
|
---|---|---|---|
2 | 234f8b07 | Vangelis Koukis | # Business Logic for communication with the Ganeti backend
|
3 | 234f8b07 | Vangelis Koukis | #
|
4 | 234f8b07 | Vangelis Koukis | # Copyright 2010 Greek Research and Technology Network
|
5 | 234f8b07 | Vangelis Koukis | #
|
6 | 02feca11 | Vassilios Karakoidas | |
7 | 234f8b07 | Vangelis Koukis | from synnefo.db.models import VirtualMachine |
8 | 234f8b07 | Vangelis Koukis | from synnefo.logic import utils |
9 | 02feca11 | Vassilios Karakoidas | |
10 | 02feca11 | Vassilios Karakoidas | def process_backend_msg(vm, jobid, opcode, status, logmsg): |
11 | 02feca11 | Vassilios Karakoidas | """Process a job progress notification from the backend.
|
12 | 02feca11 | Vassilios Karakoidas |
|
13 | 02feca11 | Vassilios Karakoidas | Process an incoming message from the backend (currently Ganeti).
|
14 | 02feca11 | Vassilios Karakoidas | Job notifications with a terminating status (sucess, error, or canceled),
|
15 | 02feca11 | Vassilios Karakoidas | also update the operating state of the VM.
|
16 | 02feca11 | Vassilios Karakoidas |
|
17 | 02feca11 | Vassilios Karakoidas | """
|
18 | 02feca11 | Vassilios Karakoidas | if (opcode not in [x[0] for x in VirtualMachine.BACKEND_OPCODES] or |
19 | 02feca11 | Vassilios Karakoidas | status not in [x[0] for x in VirtualMachine.BACKEND_STATUSES]): |
20 | 02feca11 | Vassilios Karakoidas | raise VirtualMachine.InvalidBackendMsgError(opcode, status)
|
21 | 02feca11 | Vassilios Karakoidas | |
22 | dfd19c2d | Vassilios Karakoidas | vm.backendjobid = jobid |
23 | dfd19c2d | Vassilios Karakoidas | vm.backendjobstatus = status |
24 | dfd19c2d | Vassilios Karakoidas | vm.backendopcode = opcode |
25 | dfd19c2d | Vassilios Karakoidas | vm.backendlogmsg = logmsg |
26 | 02feca11 | Vassilios Karakoidas | |
27 | 02feca11 | Vassilios Karakoidas | # Notifications of success change the operating state
|
28 | 02feca11 | Vassilios Karakoidas | if status == 'success': |
29 | 234f8b07 | Vangelis Koukis | utils.update_state(vm, VirtualMachine.OPER_STATE_FROM_OPCODE[opcode]) |
30 | 685b219e | Vangelis Koukis | # Set the deleted flag explicitly, to cater for admin-initiated removals
|
31 | 685b219e | Vangelis Koukis | if opcode == 'OP_INSTANCE_REMOVE': |
32 | 685b219e | Vangelis Koukis | vm.deleted = True
|
33 | 685b219e | Vangelis Koukis | |
34 | 685b219e | Vangelis Koukis | # Special case: if OP_INSTANCE_CREATE fails --> ERROR
|
35 | 02feca11 | Vassilios Karakoidas | if status in ('canceled', 'error') and opcode == 'OP_INSTANCE_CREATE': |
36 | 234f8b07 | Vangelis Koukis | utils.update_state(vm, 'ERROR')
|
37 | 02feca11 | Vassilios Karakoidas | # Any other notification of failure leaves the operating state unchanged
|
38 | 02feca11 | Vassilios Karakoidas | |
39 | 02feca11 | Vassilios Karakoidas | vm.save() |
40 | 22e52ede | Vassilios Karakoidas | |
41 | 22e52ede | Vassilios Karakoidas | def start_action(vm, action): |
42 | 22e52ede | Vassilios Karakoidas | """Update the state of a VM when a new action is initiated."""
|
43 | 22e52ede | Vassilios Karakoidas | if not action in [x[0] for x in VirtualMachine.ACTIONS]: |
44 | 22e52ede | Vassilios Karakoidas | raise VirtualMachine.InvalidActionError(action)
|
45 | 22e52ede | Vassilios Karakoidas | |
46 | 22e52ede | Vassilios Karakoidas | # No actions to deleted and no actions beside destroy to suspended VMs
|
47 | 22e52ede | Vassilios Karakoidas | if vm.deleted:
|
48 | 22e52ede | Vassilios Karakoidas | raise VirtualMachine.InvalidActionError(action)
|
49 | 22e52ede | Vassilios Karakoidas | |
50 | dfd19c2d | Vassilios Karakoidas | vm.action = action |
51 | dfd19c2d | Vassilios Karakoidas | vm.backendjobid = None
|
52 | dfd19c2d | Vassilios Karakoidas | vm.backendopcode = None
|
53 | dfd19c2d | Vassilios Karakoidas | vm.backendjobstatus = None
|
54 | dfd19c2d | Vassilios Karakoidas | vm.backendlogmsg = None
|
55 | 22e52ede | Vassilios Karakoidas | |
56 | 22e52ede | Vassilios Karakoidas | # Update the relevant flags if the VM is being suspended or destroyed
|
57 | 22e52ede | Vassilios Karakoidas | if action == "DESTROY": |
58 | 22e52ede | Vassilios Karakoidas | vm.deleted = True
|
59 | 22e52ede | Vassilios Karakoidas | elif action == "SUSPEND": |
60 | 22e52ede | Vassilios Karakoidas | vm.suspended = True
|
61 | 22e52ede | Vassilios Karakoidas | elif action == "START": |
62 | 22e52ede | Vassilios Karakoidas | vm.suspended = False
|
63 | 22e52ede | Vassilios Karakoidas | vm.save() |