diff --git a/cvm/controllers.py b/cvm/controllers.py index ec37625..29f1d06 100644 --- a/cvm/controllers.py +++ b/cvm/controllers.py @@ -144,7 +144,7 @@ def _handle_event(self, event): vmware_vm = event.vm.vm for device_spec in event.configSpec.deviceChange: device = device_spec.device - if isinstance(device, vim.vm.device.VirtualVmxnet3): + if isinstance(device, vim.vm.device.VirtualEthernetCard): logger.info('Detected VmReconfiguredEvent with %s device', type(device)) self._vm_service.update_vm_models_interfaces(vmware_vm) self._vn_service.update_vns() diff --git a/tests/test_controllers.py b/tests/test_controllers.py index 5dc71c8..862142c 100644 --- a/tests/test_controllers.py +++ b/tests/test_controllers.py @@ -4,8 +4,8 @@ from mock import Mock, patch from pyVmomi import vim, vmodl # pylint: disable=no-name-in-module -from cvm.controllers import (VmRemovedHandler, VmRenamedHandler, - VmwareController) +from cvm.controllers import (VmReconfiguredHandler, VmRemovedHandler, + VmRenamedHandler, VmwareController) logging.disable(logging.CRITICAL) @@ -24,13 +24,17 @@ def setUp(self): self.database = Mock() self.vm_service = Mock(database=self.database) self.vmi_service = Mock() + self.vn_service = Mock() self.vrouter_port_service = Mock() vm_renamed_handler = VmRenamedHandler(self.vm_service, self.vmi_service, self.vrouter_port_service) vm_removed_handler = VmRemovedHandler(self.vm_service, self.vmi_service, Mock()) - handlers = [vm_renamed_handler, vm_removed_handler] + vm_reconfigured_handler = VmReconfiguredHandler(self.vm_service, self.vn_service, + self.vmi_service, self.vrouter_port_service) + handlers = [vm_renamed_handler, vm_removed_handler, vm_reconfigured_handler] + lock = Mock(__enter__=Mock(), __exit__=Mock()) self.vmware_controller = VmwareController(self.vm_service, None, self.vmi_service, None, - handlers) + handlers, lock) @patch.object(VmwareController, '_handle_change') def test_handle_update_no_fltr_set(self, mocked_handle_change): @@ -110,3 +114,17 @@ def test_vm_renamed(self): self.vm_service.rename_vm.assert_called_once() self.vmi_service.rename_vmis.assert_called_once() + + def test_virtual_ethernet_card(self): + event = Mock(spec=vim.event.VmReconfiguredEvent()) + device_spec = Mock() + device_spec.device = Mock(spec=vim.vm.device.VirtualE1000()) + event.configSpec.deviceChange = [device_spec] + update_set = construct_update_set('latestPage', event) + + self.vmware_controller.handle_update(update_set) + + self.vm_service.update_vm_models_interfaces.assert_called_once() + self.vn_service.update_vns.assert_called_once() + self.vmi_service.update_vmis.assert_called_once() + self.vrouter_port_service.sync_ports.assert_called_once() diff --git a/tests/test_events.py b/tests/test_events.py index 340639d..7d09374 100644 --- a/tests/test_events.py +++ b/tests/test_events.py @@ -168,6 +168,14 @@ def esxi_api_client(vm_properties_1): return esxi_client +@pytest.fixture() +def lock(): + semaphore = Mock() + semaphore.__enter__ = Mock() + semaphore.__exit__ = Mock() + return semaphore + + def assert_vmi_model_state(vmi_model, mac_address=None, ip_address=None, vlan_id=None, display_name=None, vn_model=None, vm_model=None): if mac_address is not None: @@ -218,14 +226,14 @@ def reserve_vlan_ids(vn_model, vlan_ids): def test_vm_created(vcenter_api_client, vn_model_1, vm_created_update, - esxi_api_client, vnc_api_client, vnc_vn_1): + esxi_api_client, vnc_api_client, vnc_vn_1, lock): vrouter_api_client = Mock() database = Database() vm_service = VirtualMachineService(esxi_api_client, vnc_api_client, database) vn_service = VirtualNetworkService(esxi_api_client, vnc_api_client, database) vmi_service = VirtualMachineInterfaceService(vcenter_api_client, vnc_api_client, database) vrouter_port_service = VRouterPortService(vrouter_api_client, database) - controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, []) + controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, [], lock) # Virtual Networks are already created for us and after synchronization, # their models are stored in our database @@ -284,7 +292,7 @@ def test_vm_created(vcenter_api_client, vn_model_1, vm_created_update, def test_vm_renamed(vcenter_api_client, vn_model_1, vm_created_update, esxi_api_client, vm_renamed_update, - vm_properties_renamed, vnc_api_client): + vm_properties_renamed, vnc_api_client, lock): vrouter_api_client = Mock() database = Database() vm_service = VirtualMachineService(esxi_api_client, vnc_api_client, database) @@ -296,7 +304,7 @@ def test_vm_renamed(vcenter_api_client, vn_model_1, vm_created_update, ) vrouter_port_service = VRouterPortService(vrouter_api_client, database) vm_renamed_handler = VmRenamedHandler(vm_service, vmi_service, vrouter_port_service) - controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, [vm_renamed_handler]) + controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, [vm_renamed_handler], lock) # Virtual Networks are already created for us and after synchronization, # their models are stored in our database @@ -359,7 +367,7 @@ def test_vm_renamed(vcenter_api_client, vn_model_1, vm_created_update, def test_vm_reconfigured(vcenter_api_client, vn_model_1, vn_model_2, vm_created_update, esxi_api_client, vm_reconfigure_update, vnc_api_client, vnc_vn_2, - vmware_vm_1): + vmware_vm_1, lock): vrouter_api_client = Mock() database = Database() vm_service = VirtualMachineService(esxi_api_client, vnc_api_client, database) @@ -371,7 +379,8 @@ def test_vm_reconfigured(vcenter_api_client, vn_model_1, vn_model_2, vm_created_ ) vrouter_port_service = VRouterPortService(vrouter_api_client, database) vm_reconfigure_handler = VmReconfiguredHandler(vm_service, vn_service, vmi_service, vrouter_port_service) - controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, [vm_reconfigure_handler]) + controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, + [vm_reconfigure_handler], lock) # Virtual Networks are already created for us and after synchronization, # their models are stored in our database @@ -445,7 +454,7 @@ def test_vm_reconfigured(vcenter_api_client, vn_model_1, vn_model_2, vm_created_ def test_vm_created_vlan_id(vcenter_api_client, vn_model_1, vm_created_update, - esxi_api_client, vnc_api_client): + esxi_api_client, vnc_api_client, lock): """ What happens when the created interface is already using an overriden VLAN ID? We should keep it, not removing old/adding new VLAN ID, since it breaks the connectivity @@ -457,7 +466,7 @@ def test_vm_created_vlan_id(vcenter_api_client, vn_model_1, vm_created_update, vn_service = VirtualNetworkService(esxi_api_client, vnc_api_client, database) vmi_service = VirtualMachineInterfaceService(vcenter_api_client, vnc_api_client, database) vrouter_port_service = VRouterPortService(vrouter_api_client, database) - controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, []) + controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, [], lock) # Virtual Networks are already created for us and after synchronization, # their models are stored in our database @@ -490,7 +499,7 @@ def test_vm_created_vlan_id(vcenter_api_client, vn_model_1, vm_created_update, def test_contrail_vm(vcenter_api_client, vm_created_update, esxi_api_client, - vnc_api_client, contrail_vm_properties): + vnc_api_client, contrail_vm_properties, lock): """ We don't need ContrailVM model for CVM to operate properly. """ vrouter_api_client = Mock() database = Database() @@ -499,7 +508,7 @@ def test_contrail_vm(vcenter_api_client, vm_created_update, esxi_api_client, vmi_service = VirtualMachineInterfaceService(vcenter_api_client, vnc_api_client, database) vrouter_port_service = VRouterPortService(vrouter_api_client, database) esxi_api_client.read_vm_properties.return_value = contrail_vm_properties - controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, []) + controller = VmwareController(vm_service, vn_service, vmi_service, vrouter_port_service, [], lock) # A new update containing VmCreatedEvent arrives and is being handled by the controller controller.handle_update(vm_created_update)