Exemple #1
0
 def test_get_vm_create_spec(self):
     instance_uuid = uuidutils.generate_uuid()
     fake_instance = {'id': 7, 'name': 'fake!',
                      'uuid': instance_uuid,
                      'vcpus': 2, 'memory_mb': 2048}
     extra_specs = vm_util.ExtraSpecs()
     result = vm_util.get_vm_create_spec(fake.FakeFactory(),
                                         fake_instance, instance_uuid,
                                         'fake-datastore', [],
                                         extra_specs)
     expected = """{
         'files': {'vmPathName': '[fake-datastore]',
         'obj_name': 'ns0:VirtualMachineFileInfo'},
         'instanceUuid': '%(instance_uuid)s',
         'name': '%(instance_uuid)s', 'deviceChange': [],
         'extraConfig': [{'value': '%(instance_uuid)s',
                          'key': 'nvp.vm-uuid',
                          'obj_name': 'ns0:OptionValue'}],
         'memoryMB': 2048,
         'managedBy':  {'extensionKey': 'org.openstack.compute',
                        'type': 'instance',
                        'obj_name': 'ns0:ManagedByInfo'},
         'obj_name': 'ns0:VirtualMachineConfigSpec',
         'guestId': 'otherGuest',
         'tools': {'beforeGuestStandby': True,
                   'beforeGuestReboot': True,
                   'beforeGuestShutdown': True,
                   'afterResume': True,
                   'afterPowerOn': True,
         'obj_name': 'ns0:ToolsConfigInfo'},
         'numCPUs': 2}""" % {'instance_uuid': instance_uuid}
     expected = re.sub(r'\s+', '', expected)
     result = re.sub(r'\s+', '', repr(result))
     self.assertEqual(expected, result)
Exemple #2
0
    def _test_get_spawn_vm_config_info(self,
                                       mock_get_datacenter_ref_and_name,
                                       mock_get_datastore,
                                       image_size_bytes=0):
        image_info = images.VMwareImage(image_id=self._image_id,
                                        file_size=image_size_bytes,
                                        linked_clone=True)

        mock_get_datastore.return_value = self._ds
        mock_get_datacenter_ref_and_name.return_value = self._dc_info
        extra_specs = vm_util.ExtraSpecs()

        vi = self._vmops._get_vm_config_info(self._instance, image_info,
                                             extra_specs)
        self.assertEqual(image_info, vi.ii)
        self.assertEqual(self._ds, vi.datastore)
        self.assertEqual(self._instance.root_gb, vi.root_gb)
        self.assertEqual(self._instance, vi.instance)
        self.assertEqual(self._instance.uuid, vi.instance.uuid)
        self.assertEqual(extra_specs, vi._extra_specs)

        cache_image_path = '[%s] vmware_base/%s/%s.vmdk' % (
            self._ds.name, self._image_id, self._image_id)
        self.assertEqual(cache_image_path, str(vi.cache_image_path))

        cache_image_folder = '[%s] vmware_base/%s' % (
            self._ds.name, self._image_id)
        self.assertEqual(cache_image_folder, str(vi.cache_image_folder))
Exemple #3
0
    def test_create_vm_invalid_guestid(self, mock_log_warn):
        """Ensure we warn when create_vm() fails after we passed an
        unrecognised guestId
        """

        found = [False]

        def fake_log_warn(msg, values):
            if not isinstance(values, dict):
                return
            if values.get('ostype') == 'invalid_os_type':
                found[0] = True
        mock_log_warn.side_effect = fake_log_warn

        instance_values = {'id': 7, 'name': 'fake-name',
                           'uuid': uuidutils.generate_uuid(),
                           'vcpus': 2, 'memory_mb': 2048}
        instance = fake_instance.fake_instance_obj(
            context.RequestContext('fake', 'fake', is_admin=False),
            **instance_values)

        session = driver.VMwareAPISession()

        config_spec = vm_util.get_vm_create_spec(
            session.vim.client.factory,
            instance, instance.name, 'fake-datastore', [],
            vm_util.ExtraSpecs(),
            os_type='invalid_os_type')

        self.assertRaises(vexc.VMwareDriverException,
                          vm_util.create_vm, session, instance, 'folder',
                          config_spec, 'res-pool')
        self.assertTrue(found[0])
Exemple #4
0
 def test_spawn_vif_shares_custom(self):
     vif_limits = vm_util.Limits(shares_level='custom',
                                 shares_share=1948)
     extra_specs = vm_util.ExtraSpecs(vif_limits=vif_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #5
0
 def test_spawn_vif_shares_level(self):
     vif_limits = vm_util.Limits(shares_level='high')
     extra_specs = vm_util.ExtraSpecs(vif_limits=vif_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #6
0
 def test_spawn_vif_reservation(self):
     vif_limits = vm_util.Limits(reservation=7)
     extra_specs = vm_util.ExtraSpecs(vif_limits=vif_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #7
0
 def test_spawn_vif_limit(self):
     vif_limits = vm_util.Limits(limit=7)
     extra_specs = vm_util.ExtraSpecs(vif_limits=vif_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #8
0
 def test_spawn_memory_shares_custom(self):
     memory_limits = vm_util.Limits(shares_level='custom',
                                    shares_share=1948)
     extra_specs = vm_util.ExtraSpecs(memory_limits=memory_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #9
0
 def test_spawn_memory_shares_level(self):
     memory_limits = vm_util.Limits(shares_level='high')
     extra_specs = vm_util.ExtraSpecs(memory_limits=memory_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #10
0
 def test_spawn_memory_reservation(self):
     memory_limits = vm_util.Limits(reservation=7)
     extra_specs = vm_util.ExtraSpecs(memory_limits=memory_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #11
0
 def test_spawn_memory_limit(self):
     memory_limits = vm_util.Limits(limit=7)
     extra_specs = vm_util.ExtraSpecs(memory_limits=memory_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #12
0
 def test_spawn_cpu_shares_level(self):
     cpu_limits = vm_util.Limits(shares_level='high')
     extra_specs = vm_util.ExtraSpecs(cpu_limits=cpu_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #13
0
 def test_spawn_cpu_allocations(self):
     cpu_limits = vm_util.Limits(limit=7,
                                 reservation=6)
     extra_specs = vm_util.ExtraSpecs(cpu_limits=cpu_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #14
0
 def test_spawn_cpu_reservation(self):
     cpu_limits = vm_util.Limits(reservation=7)
     extra_specs = vm_util.ExtraSpecs(cpu_limits=cpu_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #15
0
 def test_spawn_cpu_limit(self):
     cpu_limits = vm_util.Limits(limit=7)
     extra_specs = vm_util.ExtraSpecs(cpu_limits=cpu_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #16
0
 def test_spawn_memory_allocations(self):
     memory_limits = vm_util.Limits(limit=7,
                                    reservation=6)
     extra_specs = vm_util.ExtraSpecs(memory_limits=memory_limits)
     self._test_spawn(extra_specs=extra_specs)
Exemple #17
0
    def _test_spawn(self,
                    mock_copy_virtual_disk,
                    mock_power_on_instance,
                    mock_get_and_set_vnc_config,
                    mock_enlist_image,
                    mock_set_machine_id,
                    mock_mkdir,
                    mock_create_vm,
                    mock_get_create_spec,
                    mock_is_neutron,
                    mock_get_vif_info,
                    mock_get_datacenter_ref_and_name,
                    mock_get_datastore,
                    mock_configure_config_drive,
                    mock_update_vnic_index,
                    mock_create_folders,
                    block_device_info=None,
                    extra_specs=None,
                    config_drive=False):

        if extra_specs is None:
            extra_specs = vm_util.ExtraSpecs()

        image_size = (self._instance.root_gb) * units.Gi / 2
        image = {
            'id': self._image_id,
            'disk_format': 'vmdk',
            'size': image_size,
        }
        image = objects.ImageMeta.from_dict(image)
        image_info = images.VMwareImage(
            image_id=self._image_id,
            file_size=image_size)
        vi = self._vmops._get_vm_config_info(
            self._instance, image_info, extra_specs)

        self._vmops._volumeops = mock.Mock()
        network_info = mock.Mock()
        mock_get_datastore.return_value = self._ds
        mock_get_datacenter_ref_and_name.return_value = self._dc_info
        mock_call_method = mock.Mock(return_value='fake_task')

        if extra_specs is None:
            extra_specs = vm_util.ExtraSpecs()

        with test.nested(
                mock.patch.object(self._session, '_wait_for_task'),
                mock.patch.object(self._session, '_call_method',
                                  mock_call_method),
                mock.patch.object(uuidutils, 'generate_uuid',
                                  return_value='tmp-uuid'),
                mock.patch.object(images, 'fetch_image'),
                mock.patch('nova.image.api.API.get'),
                mock.patch.object(vutil, 'get_inventory_path',
                                  return_value=self._dc_info.name),
                mock.patch.object(self._vmops, '_get_extra_specs',
                                  return_value=extra_specs),
                mock.patch.object(self._vmops, '_get_instance_metadata',
                                  return_value='fake-metadata')
        ) as (_wait_for_task, _call_method, _generate_uuid, _fetch_image,
              _get_img_svc, _get_inventory_path, _get_extra_specs,
              _get_instance_metadata):
            self._vmops.spawn(self._context, self._instance, image,
                              injected_files='fake_files',
                              admin_password='******',
                              network_info=network_info,
                              block_device_info=block_device_info)

            mock_is_neutron.assert_called_once_with()

            self.assertEqual(2, mock_mkdir.call_count)

            mock_get_vif_info.assert_called_once_with(
                self._session, self._cluster.obj, False,
                constants.DEFAULT_VIF_MODEL, network_info)
            mock_get_create_spec.assert_called_once_with(
                self._session.vim.client.factory, self._instance,
                'fake_ds', [], extra_specs, constants.DEFAULT_OS_TYPE,
                profile_spec=None,
                metadata='fake-metadata')
            mock_create_vm.assert_called_once_with(
                self._session, self._instance, 'fake_vm_folder',
                'fake_create_spec', self._cluster.resourcePool)
            mock_get_and_set_vnc_config.assert_called_once_with(
                self._session.vim.client.factory,
                self._instance, 'fake_vm_ref')
            mock_set_machine_id.assert_called_once_with(
                self._session.vim.client.factory,
                self._instance, network_info, vm_ref='fake_vm_ref')
            mock_power_on_instance.assert_called_once_with(
                self._session, self._instance, vm_ref='fake_vm_ref')

            if (block_device_info and
                    'block_device_mapping' in block_device_info):
                bdms = block_device_info['block_device_mapping']
                for bdm in bdms:
                    mock_attach_root = (
                        self._vmops._volumeops.attach_root_volume)
                    mock_attach = self._vmops._volumeops.attach_volume
                    adapter_type = bdm.get('disk_bus') or vi.ii.adapter_type
                    if bdm.get('boot_index') == 0:
                        mock_attach_root.assert_any_call(
                            bdm['connection_info'], self._instance,
                            self._ds.ref, adapter_type)
                    else:
                        mock_attach.assert_any_call(
                            bdm['connection_info'], self._instance,
                            self._ds.ref, adapter_type)

            mock_enlist_image.assert_called_once_with(
                self._image_id, self._ds, self._dc_info.ref)

            upload_file_name = 'vmware_temp/tmp-uuid/%s/%s-flat.vmdk' % (
                self._image_id, self._image_id)
            _fetch_image.assert_called_once_with(
                self._context, self._instance, self._session._host,
                self._session._port, self._dc_info.name, self._ds.name,
                upload_file_name, cookies='Fake-CookieJar')
            self.assertGreater(len(_wait_for_task.mock_calls), 0)
            _get_inventory_path.call_count = 1
            extras = None
            if block_device_info and ('ephemerals' in block_device_info or
                                      'swap' in block_device_info):
                extras = ['CreateVirtualDisk_Task']
            self._verify_spawn_method_calls(_call_method, extras)

            dc_ref = 'fake_dc_ref'
            source_file = six.text_type('[fake_ds] vmware_base/%s/%s.vmdk' %
                                        (self._image_id, self._image_id))
            dest_file = six.text_type('[fake_ds] vmware_base/%s/%s.%d.vmdk' %
                                      (self._image_id, self._image_id,
                                       self._instance['root_gb']))
            # TODO(dims): add more tests for copy_virtual_disk after
            # the disk/image code in spawn gets refactored
            mock_copy_virtual_disk.assert_called_with(self._session,
                                                      dc_ref,
                                                      source_file,
                                                      dest_file)

            if config_drive:
                mock_configure_config_drive.assert_called_once_with(
                    self._instance, 'fake_vm_ref', self._dc_info,
                    self._ds, 'fake_files', 'password', network_info)
            mock_update_vnic_index.assert_called_once_with(
                self._context, self._instance, network_info)