def test_build_virtual_machine(self, mock_get_vim_object): mock_get_vim_object.return_value = vmwareapi_fake.FakeVim() fake_session = driver.VMwareAPISession() fake_vmops = vmops.VMwareVCVMOps(fake_session, None, None) image_id = nova.tests.image.fake.get_valid_image_id() image = vmware_images.VMwareImage(image_id=image_id) vm_ref = fake_vmops.build_virtual_machine(self._instance, 'fake-instance-name', image, self._dc_info, self._ds, self.network_info) vm = vmwareapi_fake._get_object(vm_ref) # Test basic VM parameters self.assertEqual('fake-instance-name', vm.name) # NOTE(mdbooth): The instanceUuid behaviour below is apparently # deliberate. self.assertEqual('fake-instance-name', vm.get('summary.config.instanceUuid')) self.assertEqual(self._instance_values['vcpus'], vm.get('summary.config.numCpu')) self.assertEqual(self._instance_values['memory_mb'], vm.get('summary.config.memorySizeMB')) # Test NSX config for optval in vm.get('config.extraConfig').OptionValue: if optval.key == 'nvp.vm-uuid': self.assertEqual(self._instance_values['uuid'], optval.value) break else: self.fail('nvp.vm-uuid not found in extraConfig') # Test that the VM is associated with the specified datastore datastores = vm.datastore.ManagedObjectReference self.assertEqual(1, len(datastores)) datastore = vmwareapi_fake._get_object(datastores[0]) self.assertEqual(self._ds.name, datastore.get('summary.name')) # Test that the VM's network is configured as specified devices = vm.get('config.hardware.device').VirtualDevice for device in devices: if device.obj_name != 'ns0:VirtualE1000': continue self.assertEqual(self._network_values['address'], device.macAddress) break else: self.fail('NIC not configured')
def _update_resources(self): """This method creates a dictionary of VMOps, VolumeOps and VCState. The VMwareVMOps, VMwareVolumeOps and VCState object is for each cluster/rp. The dictionary is of the form { domain-1000 : {'vmops': vmops_obj, 'volumeops': volumeops_obj, 'vcstate': vcstate_obj, 'name': MyCluster}, resgroup-1000 : {'vmops': vmops_obj, 'volumeops': volumeops_obj, 'vcstate': vcstate_obj, 'name': MyRP}, } """ added_nodes = set(self.dict_mors.keys()) - set(self._resource_keys) for node in added_nodes: _volumeops = volumeops.VMwareVolumeOps( self._session, self.dict_mors[node]['cluster_mor'], vc_support=True) _vmops = vmops.VMwareVCVMOps(self._session, self._virtapi, _volumeops, self.dict_mors[node]['cluster_mor'], datastore_regex=self._datastore_regex) name = self.dict_mors.get(node)['name'] nodename = self._create_nodename(node, name) _vc_state = host.VCState(self._session, nodename, self.dict_mors.get(node)['cluster_mor']) self._resources[nodename] = { 'vmops': _vmops, 'volumeops': _volumeops, 'vcstate': _vc_state, 'name': name, } self._resource_keys.add(node) deleted_nodes = (set(self._resource_keys) - set(self.dict_mors.keys())) for node in deleted_nodes: name = self.dict_mors.get(node)['name'] nodename = self._create_nodename(node, name) del self._resources[nodename] self._resource_keys.discard(node)
def _test_get_datacenter_ref_and_name(self, ds_ref_exists=False): instance_ds_ref = mock.Mock() instance_ds_ref.value = "ds-1" _vcvmops = vmops.VMwareVCVMOps(self._session, None, None) if ds_ref_exists: ds_ref = mock.Mock() ds_ref.value = "ds-1" else: ds_ref = None def fake_call_method(module, method, *args, **kwargs): fake_object1 = vmwareapi_fake.FakeRetrieveResult() fake_object1.add_object(vmwareapi_fake.Datacenter(ds_ref=ds_ref)) if not ds_ref: # Token is set for the fake_object1, so it will continue to # fetch the next object. setattr(fake_object1, 'token', 'token-0') if method == "continue_to_get_objects": fake_object2 = vmwareapi_fake.FakeRetrieveResult() fake_object2.add_object(vmwareapi_fake.Datacenter()) return fake_object2 return fake_object1 with mock.patch.object(self._session, '_call_method', side_effect=fake_call_method) as fake_call: dc_info = _vcvmops.get_datacenter_ref_and_name(instance_ds_ref) if ds_ref: self.assertEqual(1, len(_vcvmops._datastore_dc_mapping)) fake_call.assert_called_once_with( vim_util, "get_objects", "Datacenter", ["name", "datastore", "vmFolder"]) self.assertEqual("ha-datacenter", dc_info.name) else: calls = [ mock.call(vim_util, "get_objects", "Datacenter", ["name", "datastore", "vmFolder"]), mock.call(vim_util, "continue_to_get_objects", "token-0") ] fake_call.assert_has_calls(calls) self.assertIsNone(dc_info)
def setUp(self): super(VMwareVMOpsTestCase, self).setUp() vmwareapi_fake.reset() stubs.set_stubs(self.stubs) self.flags(image_cache_subdirectory_name='vmware_base', my_ip='', flat_injected=True, vnc_enabled=True) self._context = context.RequestContext('fake_user', 'fake_project') self._session = driver.VMwareAPISession() self._virtapi = mock.Mock() self._vmops = vmops.VMwareVCVMOps(self._session, self._virtapi, None) self._image_id = nova.tests.image.fake.get_valid_image_id() values = { 'name': 'fake_name', 'uuid': 'fake_uuid', 'vcpus': 1, 'memory_mb': 512, 'image_ref': self._image_id, 'root_gb': 1, 'node': 'respool-1001(MyResPoolName)' } self._instance = fake_instance.fake_instance_obj( self._context, **values) fake_ds_ref = vmwareapi_fake.ManagedObjectReference('fake-ds') self._ds_record = vm_util.DSRecord( datastore=fake_ds_ref, name='fake_ds', capacity=10 * units.Gi, freespace=10 * units.Gi) self._dc_info = vmops.DcInfo( ref='fake_dc_ref', name='fake_dc', vmFolder='fake_vm_folder') subnet_4 = network_model.Subnet(cidr='192.168.0.1/24', dns=[network_model.IP('192.168.0.1')], gateway= network_model.IP('192.168.0.1'), ips=[ network_model.IP('192.168.0.100')], routes=None) subnet_6 = network_model.Subnet(cidr='dead:beef::1/64', dns=None, gateway= network_model.IP('dead:beef::1'), ips=[network_model.IP( 'dead:beef::dcad:beff:feef:0')], routes=None) network = network_model.Network(id=0, bridge='fa0', label='fake', subnets=[subnet_4, subnet_6], vlan=None, bridge_interface=None, injected=True) self.network_info = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ]) pure_IPv6_network = network_model.Network(id=0, bridge='fa0', label='fake', subnets=[subnet_6], vlan=None, bridge_interface=None, injected=True) self.pure_IPv6_network_info = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=pure_IPv6_network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ])