diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-07-10 16:44:23 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-07-10 16:44:23 +0000 |
| commit | 22a17f792425af928f8098b77fd8739a2f5bd243 (patch) | |
| tree | ec0ced6d913f80ddafae0e544399f5a63c4f3285 | |
| parent | 5dd9e6150c0bebaef53e23fff7e55a17ef694537 (diff) | |
| parent | 45f9c298c2a6ba3b182ce3c225d09a0bfcb7dd2d (diff) | |
| download | nova-22a17f792425af928f8098b77fd8739a2f5bd243.tar.gz nova-22a17f792425af928f8098b77fd8739a2f5bd243.tar.xz nova-22a17f792425af928f8098b77fd8739a2f5bd243.zip | |
Merge "Properly track VBD and VDI connections in xenapi fake"
| -rw-r--r-- | nova/tests/xenapi/stubs.py | 6 | ||||
| -rw-r--r-- | nova/virt/xenapi/fake.py | 48 |
2 files changed, 42 insertions, 12 deletions
diff --git a/nova/tests/xenapi/stubs.py b/nova/tests/xenapi/stubs.py index 01766e745..037053473 100644 --- a/nova/tests/xenapi/stubs.py +++ b/nova/tests/xenapi/stubs.py @@ -211,12 +211,6 @@ class FakeSessionForVMTests(fake.SessionBase): template_vbd_ref = fake.create_vbd(template_vm_ref, template_vdi_ref) return template_vm_ref - def VDI_destroy(self, session_ref, vdi_ref): - fake.destroy_vdi(vdi_ref) - - def VM_destroy(self, session_ref, vm_ref): - fake.destroy_vm(vm_ref) - def SR_scan(self, session_ref, sr_ref): pass diff --git a/nova/virt/xenapi/fake.py b/nova/virt/xenapi/fake.py index 050b696f0..228895ae3 100644 --- a/nova/virt/xenapi/fake.py +++ b/nova/virt/xenapi/fake.py @@ -127,17 +127,37 @@ def destroy_vm(vm_ref): vm_rec = _db_content['VM'][vm_ref] vbd_refs = vm_rec['VBDs'] - for vbd_ref in vbd_refs: + # NOTE(johannes): Shallow copy since destroy_vbd will remove itself + # from the list + for vbd_ref in vbd_refs[:]: destroy_vbd(vbd_ref) del _db_content['VM'][vm_ref] def destroy_vbd(vbd_ref): + vbd_rec = _db_content['VBD'][vbd_ref] + + vm_ref = vbd_rec['VM'] + vm_rec = _db_content['VM'][vm_ref] + vm_rec['VBDs'].remove(vbd_ref) + + vdi_ref = vbd_rec['VDI'] + vdi_rec = _db_content['VDI'][vdi_ref] + vdi_rec['VBDs'].remove(vbd_ref) + del _db_content['VBD'][vbd_ref] def destroy_vdi(vdi_ref): + vdi_rec = _db_content['VDI'][vdi_ref] + + vbd_refs = vdi_rec['VBDs'] + # NOTE(johannes): Shallow copy since destroy_vbd will remove itself + # from the list + for vbd_ref in vbd_refs[:]: + destroy_vbd(vbd_ref) + del _db_content['VDI'][vdi_ref] @@ -155,10 +175,15 @@ def create_vdi(name_label, sr_ref, **kwargs): 'sm_config': {}, 'physical_utilisation': '123', 'managed': True, - 'VBDs': {}, } vdi_rec.update(kwargs) - return _create_object('VDI', vdi_rec) + vdi_ref = _create_object('VDI', vdi_rec) + after_VDI_create(vdi_ref, vdi_rec) + return vdi_ref + + +def after_VDI_create(vdi_ref, vdi_rec): + vdi_rec.setdefault('VBDs', []) def create_vbd(vm_ref, vdi_ref, userdevice=0): @@ -172,14 +197,19 @@ def create_vbd(vm_ref, vdi_ref, userdevice=0): def after_VBD_create(vbd_ref, vbd_rec): - """Create read-only fields and backref from VM to VBD when VBD is - created.""" + """Create read-only fields and backref from VM and VDI to VBD when VBD + is created.""" vbd_rec['currently_attached'] = False vbd_rec['device'] = '' + vm_ref = vbd_rec['VM'] vm_rec = _db_content['VM'][vm_ref] vm_rec['VBDs'].append(vbd_ref) + vdi_ref = vbd_rec['VDI'] + vdi_rec = _db_content['VDI'][vdi_ref] + vdi_rec['VBDs'].append(vbd_ref) + vm_name_label = _db_content['VM'][vm_ref]['name_label'] vbd_rec['vm_name_label'] = vm_name_label @@ -737,7 +767,13 @@ class SessionBase(object): ref = params[1] if ref not in _db_content[table]: raise Failure(['HANDLE_INVALID', table, ref]) - del _db_content[table][ref] + + # Call destroy function (if exists) + destroy_func = globals().get('destroy_%s' % table.lower()) + if destroy_func: + destroy_func(ref) + else: + del _db_content[table][ref] def _async(self, name, params): task_ref = create_task(name) |
