Statistics
| Branch: | Tag: | Revision:

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()