Navigation Menu

Skip to content

Commit

Permalink
Support different types of VirtualEthernetCard
Browse files Browse the repository at this point in the history
Change-Id: I6ec97b3c80c64d69d8a22baa4badaa0d980a3920
Closes-Bug: #1779296
  • Loading branch information
aszc-dev committed Jun 29, 2018
1 parent fe78b94 commit 475c2c8
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 15 deletions.
2 changes: 1 addition & 1 deletion cvm/controllers.py
Expand Up @@ -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()
Expand Down
26 changes: 22 additions & 4 deletions tests/test_controllers.py
Expand Up @@ -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)

Expand All @@ -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):
Expand Down Expand Up @@ -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()
29 changes: 19 additions & 10 deletions tests/test_events.py
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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()
Expand All @@ -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)
Expand Down

0 comments on commit 475c2c8

Please sign in to comment.