-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Functional test from VM remove event
Depends-On: I87cf8f4ab6d6b584b406f6240e51896324f18174 Change-Id: Ie08a50b91b7d2f9ccc5d1b8e885bfbd33bff3289 Partial-Bug: #1776434
- Loading branch information
1 parent
dd1cc56
commit 882ef9d
Showing
4 changed files
with
137 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
from mock import Mock, patch | ||
|
||
from tests.utils import reserve_vlan_ids | ||
|
||
|
||
@patch('cvm.services.VirtualMachineService._can_modify_in_vnc', Mock(return_value=True)) | ||
@patch('cvm.services.VirtualMachineInterfaceService._can_modify_in_vnc', Mock(return_value=True)) | ||
def test_full_remove_vm(controller, database, vcenter_api_client, vnc_api_client, vrouter_api_client, | ||
vm_created_update, vm_removed_update, vn_model_1, vlan_id_pool): | ||
# Virtual Networks are already created for us and after synchronization, | ||
# their models are stored in our database | ||
database.save(vn_model_1) | ||
|
||
# Some vlan ids should be already reserved | ||
vcenter_api_client.get_vlan_id.return_value = None | ||
reserve_vlan_ids(vlan_id_pool, [0, 1, 2, 3]) | ||
|
||
# A new update containing VmCreatedEvent arrives and is being handled by the controller | ||
controller.handle_update(vm_created_update) | ||
|
||
# After VmCreatedEvent has been handled | ||
# proper VM model should exists | ||
vm_model = database.get_vm_model_by_uuid('12345678-1234-1234-1234-123456789012') | ||
assert vm_model is not None | ||
# And associated VMI model | ||
vmi_models = vm_model.vmi_models | ||
assert len(vmi_models) == 1 | ||
vmi_model = vmi_models[0] | ||
assert vmi_model is not None | ||
# And proper VLAN ID should be acquired | ||
assert not vlan_id_pool.is_available(4) | ||
|
||
# Then VmRemovedEvent is being handled | ||
controller.handle_update(vm_removed_update) | ||
|
||
# Check that VM Model has been removed from Database: | ||
assert database.get_vm_model_by_uuid(vm_model.uuid) is None | ||
|
||
# Check that VM has been removed from VNC | ||
vnc_api_client.delete_vm.assert_called_once_with(vm_model.uuid) | ||
|
||
# Check that VMI Model which was associated with removed VM has been removed | ||
# from Database | ||
vmi_models = database.get_vmi_models_by_vm_uuid(vm_model.uuid) | ||
assert len(vmi_models) == 0 | ||
|
||
# from VNC | ||
vnc_api_client.delete_vmi.assert_called_with(vmi_model.uuid) | ||
|
||
# Check that VMI's vRouter Port has been deleted: | ||
vrouter_api_client.delete_port.assert_called_with(vmi_model.uuid) | ||
assert vrouter_api_client.delete_port.call_count == 2 | ||
assert vrouter_api_client.add_port.call_count == 1 | ||
|
||
# Check that VLAN ID has been released | ||
vcenter_api_client.restore_vlan_id.assert_called_once_with(vmi_model.vcenter_port) | ||
assert vlan_id_pool.is_available(4) | ||
|
||
|
||
@patch('cvm.services.VirtualMachineService._can_modify_in_vnc', Mock(return_value=False)) | ||
@patch('cvm.services.VirtualMachineInterfaceService._can_modify_in_vnc', Mock(return_value=False)) | ||
def test_vm_removed_local_remove(controller, database, vcenter_api_client, vnc_api_client, vrouter_api_client, | ||
vm_created_update, vm_removed_update, vn_model_1, vlan_id_pool): | ||
""" | ||
Same situation as in test_full_remove_vm, but between VmCreatedEvent and VmDeletedEvent VM | ||
changed its ESXi host. It happens during vMotion. So we have to remove that VM and its associated objects | ||
from database and vRouter. But cannot remove them from VNC and vCenter | ||
""" | ||
# Virtual Networks are already created for us and after synchronization, | ||
# their models are stored in our database | ||
database.save(vn_model_1) | ||
|
||
# Some vlan ids should be already reserved | ||
vcenter_api_client.get_vlan_id.return_value = None | ||
reserve_vlan_ids(vlan_id_pool, [0, 1, 2, 3]) | ||
|
||
# A new update containing VmCreatedEvent arrives and is being handled by the controller | ||
controller.handle_update(vm_created_update) | ||
|
||
# After VmCreatedEvent has been handled | ||
# proper VM model should exists | ||
vm_model = database.get_vm_model_by_uuid('12345678-1234-1234-1234-123456789012') | ||
assert vm_model is not None | ||
# And associated VMI model | ||
vmi_models = vm_model.vmi_models | ||
assert len(vmi_models) == 1 | ||
vmi_model = vmi_models[0] | ||
assert vmi_model is not None | ||
# And proper VLAN ID should be acquired | ||
assert not vlan_id_pool.is_available(4) | ||
|
||
# Then VmRemovedEvent is being handled | ||
controller.handle_update(vm_removed_update) | ||
|
||
# Check that VM Model has been removed from Database: | ||
assert database.get_vm_model_by_uuid(vm_model.uuid) is None | ||
|
||
# Cannot remove VM from VNC | ||
vnc_api_client.delete_vm.assert_not_called() | ||
|
||
# Check that VMI Model which was associated with removed VM has been removed | ||
# from Database | ||
vmi_models = database.get_vmi_models_by_vm_uuid(vm_model.uuid) | ||
assert len(vmi_models) == 0 | ||
|
||
# Cannot remove VMI from VNC | ||
vnc_api_client.delete_vmi.assert_not_called() | ||
|
||
# Check that VMI's vRouter Port has been deleted: | ||
vrouter_api_client.delete_port.assert_called_with(vmi_model.uuid) | ||
assert vrouter_api_client.delete_port.call_count == 2 | ||
assert vrouter_api_client.add_port.call_count == 1 | ||
|
||
# Cannot remove VLAN ID from vCenter | ||
vcenter_api_client.restore_vlan_id.assert_not_called() | ||
|
||
# Check that VLAN ID has been restored to local pool | ||
assert vlan_id_pool.is_available(4) |