Revision 11d4d283 snf-cyclades-app/synnefo/logic/backend.py

b/snf-cyclades-app/synnefo/logic/backend.py
32 32
# or implied, of GRNET S.A.
33 33
from django.conf import settings
34 34
from django.db import transaction
35
from django.utils import simplejson as json
35 36
from datetime import datetime, timedelta
36 37

  
37 38
from synnefo.db.models import (VirtualMachine, Network,
......
43 44
from synnefo.api.util import release_resource
44 45
from synnefo.util.mac2eui64 import mac2eui64
45 46
from synnefo.logic import rapi
47
from synnefo.volume.util import update_snapshot_status
46 48

  
47 49
from logging import getLogger
48 50
log = getLogger(__name__)
......
134 136
    if status not in [x[0] for x in BACKEND_STATUSES]:
135 137
        raise VirtualMachine.InvalidBackendMsgError(opcode, status)
136 138

  
139
    if opcode == "OP_INSTANCE_SNAPSHOT":
140
        for disk_id, disk_info in job_fields.get("disks", []):
141
            snapshot_name = disk_info.get("snapshot_name")
142
            snapshot_info = json.loads(disk_info["snapshot_info"])
143
            user_id = vm.userid
144
            _process_snapshot_status(snapshot_name, snapshot_info,
145
                                     user_id, etime, jobid, status)
146
        return
147

  
137 148
    vm.backendjobid = jobid
138 149
    vm.backendjobstatus = status
139 150
    vm.backendopcode = opcode
......
509 520

  
510 521

  
511 522
@transaction.commit_on_success
523
def process_snapshot_status(*args, **kwargs):
524
    return _process_snapshot_status(*args, **kwargs)
525

  
526

  
527
def _process_snapshot_status(snapshot_name, snapshot_info, user_id, etime,
528
                             jobid, status):
529
    """Process a notification for a snapshot."""
530
    snapshot_id = snapshot_info.get("snapshot_id")
531
    assert(snapshot_id is not None), "Missing snapshot_id"
532
    if status in rapi.JOB_STATUS_FINALIZED:
533
        snapshot_status = rapi.JOB_STATUS_SUCCESS and "AVAILABLE" or "ERROR"
534
        log.debug("Updating status of snapshot '%s' to '%s'", snapshot_id,
535
                  snapshot_status)
536
        update_snapshot_status(snapshot_id, user_id, status=snapshot_status)
537

  
538

  
539
@transaction.commit_on_success
512 540
def process_network_status(back_network, etime, jobid, opcode, status, logmsg):
513 541
    if status not in [x[0] for x in BACKEND_STATUSES]:
514 542
        raise Network.InvalidBackendMsgError(opcode, status)
......
1183 1211
        return client.ModifyInstance(**kwargs)
1184 1212

  
1185 1213

  
1186
def snapshot_instance(vm, snapshot_name):
1214
def snapshot_instance(vm, snapshot_name, snapshot_id):
1187 1215
    #volume = instance.volumes.all()[0]
1216
    reason = json.dumps({"snapshot_id": snapshot_id})
1188 1217
    with pooled_rapi_client(vm) as client:
1189 1218
        return client.SnapshotInstance(instance=vm.backend_vm_id,
1190
                                       snapshot_name=snapshot_name)
1219
                                       snapshot_name=snapshot_name,
1220
                                       reason=reason)
1191 1221

  
1192 1222

  
1193 1223
def get_instances(backend, bulk=True):

Also available in: Unified diff