def spawn(self, context, instance, image_meta, injected_files, admin_password, network_info, block_device_info=None, power_on=False): LOG.info(_LI("Inside OVSvApp VMOps spawn method.")) client_factory = self._session.vim.client.factory image_info = images.VMwareImage.from_image(instance.image_ref, image_meta) extra_specs = self._get_extra_specs(instance.flavor, image_meta) vi = self._get_vm_config_info(instance, image_info, extra_specs) metadata = self._get_instance_metadata(context, instance) # Creates the virtual machine. The virtual machine reference returned # is unique within Virtual Center. vm_ref = self.build_virtual_machine(instance, image_info, vi.dc_info, vi.datastore, network_info, extra_specs, metadata) # Cache the vm_ref. This saves a remote call to the VC. This uses the # instance uuid. vm_util.vm_ref_cache_update(instance.uuid, vm_ref) # Update the Neutron VNIC index self._update_vnic_index(context, instance, network_info) # Set the machine.id parameter of the instance to inject # the NIC configuration inside the VM if CONF.flat_injected: self._set_machine_id(client_factory, instance, network_info, vm_ref=vm_ref) # Set the vnc configuration of the instance, vnc port starts from 5900 if CONF.vnc.enabled: self._get_and_set_vnc_config(client_factory, instance, vm_ref) block_device_mapping = [] if block_device_info is not None: block_device_mapping = driver.block_device_info_get_mapping( block_device_info) if instance.image_ref: self._imagecache.enlist_image(image_info.image_id, vi.datastore, vi.dc_info.ref) self._fetch_image_if_missing(context, vi) if image_info.is_iso: self._use_iso_image(vm_ref, vi) elif image_info.linked_clone: self._use_disk_image_as_linked_clone(vm_ref, vi) else: self._use_disk_image_as_full_clone(vm_ref, vi) if block_device_mapping: msg = "Block device information present: %s" % block_device_info # NOTE(mriedem): block_device_info can contain an auth_password # so we have to scrub the message before logging it. LOG.debug(strutils.mask_password(msg), instance=instance) # Before attempting to attach any volume, make sure the # block_device_mapping (i.e. disk_bus) is valid self._is_bdm_valid(block_device_mapping) for disk in block_device_mapping: connection_info = disk['connection_info'] adapter_type = disk.get('disk_bus') or vi.ii.adapter_type # TODO(hartsocks): instance is unnecessary, remove it # we still use instance in many locations for no other purpose # than logging, can we simplify this? if disk.get('boot_index') == 0: self._volumeops.attach_root_volume(connection_info, instance, vi.datastore.ref, adapter_type) else: self._volumeops.attach_volume(connection_info, instance, adapter_type) # Create ephemeral disks self._create_ephemeral(block_device_info, instance, vm_ref, vi.dc_info, vi.datastore, instance.uuid, vi.ii.adapter_type) self._create_swap(block_device_info, instance, vm_ref, vi.dc_info, vi.datastore, instance.uuid, vi.ii.adapter_type) if configdrive.required_by(instance): self._configure_config_drive(instance, vm_ref, vi.dc_info, vi.datastore, injected_files, admin_password, network_info) if power_on: vm_util.power_on_instance(self._session, instance, vm_ref=vm_ref)
def spawn(self, context, instance, image_meta, injected_files, admin_password, network_info, ovsport_info, pg_vlan_instance_map, block_device_info=None, instance_name=None, power_on=True): client_factory = self._session._get_vim().client.factory image_info = vmware_images.VMwareImage.from_image(instance.image_ref, image_meta) #add by liuling image_info.file_type = 'vmdk' vi = self._get_vm_config_info(instance, image_info, instance_name) # Creates the virtual machine. The virtual machine reference returned # is unique within Virtual Center. vm_ref = self.build_virtual_machine(instance, vi.instance_name, image_info, vi.dc_info, vi.datastore, network_info, pg_vlan_instance_map) # Cache the vm_ref. This saves a remote call to the VC. This uses the # instance_name. This covers all use cases including rescue and resize. vm_util.vm_ref_cache_update(vi.instance_name, vm_ref) # Set the machine.id parameter of the instance to inject # the NIC configuration inside the VM if CONF.flat_injected: self._set_machine_id(client_factory, instance, network_info) # Set the vnc configuration of the instance, vnc port starts from 5900 if CONF.vnc_enabled: self._get_and_set_vnc_config(client_factory, instance) block_device_mapping = [] if block_device_info is not None: block_device_mapping = driver.block_device_info_get_mapping( block_device_info) # NOTE(mdbooth): the logic here is that we ignore the image if there # are block device mappings. This behaviour is incorrect, and a bug in # the driver. We should be able to accept an image and block device # mappings. if len(block_device_mapping) > 0: msg = "Block device information present: %s" % block_device_info # NOTE(mriedem): block_device_info can contain an auth_password # so we have to scrub the message before logging it. LOG.debug(logging.mask_password(msg), instance=instance) for root_disk in block_device_mapping: connection_info = root_disk['connection_info'] # TODO(hartsocks): instance is unnecessary, remove it # we still use instance in many locations for no other purpose # than logging, can we simplify this? self._volumeops.attach_root_volume(connection_info, instance, self._default_root_device, vi.datastore.ref) else: self._imagecache.enlist_image( image_info.image_id, vi.datastore, vi.dc_info.ref) self._fetch_image_if_missing(context, vi) if image_info.is_iso: self._use_iso_image(vm_ref, vi) elif image_info.linked_clone: self._use_disk_image_as_linked_clone(vm_ref, vi) else: self._use_disk_image_as_full_clone(vm_ref, vi) if configdrive.required_by(instance): self._configure_config_drive( instance, vm_ref, vi.dc_info, vi.datastore, injected_files, admin_password) LOG.debug('Start to create network', instance=instance) self.create_network( instance, network_info, ovsport_info, pg_vlan_instance_map) LOG.debug('Create network finished', instance=instance) if power_on: vm_util.power_on_instance(self._session, instance, vm_ref=vm_ref)
def spawn(self, context, instance, image_meta, injected_files, admin_password, network_info, block_device_info=None, power_on=False): LOG.info(_LI("Inside OVSvApp VMOps spawn method.")) client_factory = self._session.vim.client.factory image_info = images.VMwareImage.from_image(context, instance.image_ref, image_meta) extra_specs = self._get_extra_specs(instance.flavor, image_meta) vi = self._get_vm_config_info(instance, image_info, extra_specs) metadata = self._get_instance_metadata(context, instance) # Creates the virtual machine. The virtual machine reference returned # is unique within Virtual Center. vm_ref = self.build_virtual_machine(instance, image_info, vi.dc_info, vi.datastore, network_info, extra_specs, metadata) # Cache the vm_ref. This saves a remote call to the VC. This uses the # instance uuid. vm_util.vm_ref_cache_update(instance.uuid, vm_ref) # Update the Neutron VNIC index self._update_vnic_index(context, instance, network_info) # Set the machine.id parameter of the instance to inject # the NIC configuration inside the VM if CONF.flat_injected: self._set_machine_id(client_factory, instance, network_info, vm_ref=vm_ref) # Set the vnc configuration of the instance, vnc port starts from 5900 if CONF.vnc.enabled: self._get_and_set_vnc_config(client_factory, instance, vm_ref) block_device_mapping = [] if block_device_info is not None: block_device_mapping = driver.block_device_info_get_mapping( block_device_info) if instance.image_ref: self._imagecache.enlist_image(image_info.image_id, vi.datastore, vi.dc_info.ref) self._fetch_image_if_missing(context, vi) if image_info.is_iso: self._use_iso_image(vm_ref, vi) elif image_info.linked_clone: self._use_disk_image_as_linked_clone(vm_ref, vi) else: self._use_disk_image_as_full_clone(vm_ref, vi) if block_device_mapping: msg = "Block device information present: %s" % block_device_info # NOTE(mriedem): block_device_info can contain an auth_password # so we have to scrub the message before logging it. LOG.debug(strutils.mask_password(msg), instance=instance) # Before attempting to attach any volume, make sure the # block_device_mapping (i.e. disk_bus) is valid self._is_bdm_valid(block_device_mapping) for disk in block_device_mapping: connection_info = disk['connection_info'] adapter_type = disk.get('disk_bus') or vi.ii.adapter_type # TODO(hartsocks): instance is unnecessary, remove it # we still use instance in many locations for no other purpose # than logging, can we simplify this? if disk.get('boot_index') == 0: self._volumeops.attach_root_volume(connection_info, instance, vi.datastore.ref, adapter_type) else: self._volumeops.attach_volume(connection_info, instance, adapter_type) # Create ephemeral disks self._create_ephemeral(block_device_info, instance, vm_ref, vi.dc_info, vi.datastore, instance.uuid, vi.ii.adapter_type) self._create_swap(block_device_info, instance, vm_ref, vi.dc_info, vi.datastore, instance.uuid, vi.ii.adapter_type) if configdrive.required_by(instance): self._configure_config_drive(context, instance, vm_ref, vi.dc_info, vi.datastore, injected_files, admin_password, network_info) if power_on: vm_util.power_on_instance(self._session, instance, vm_ref=vm_ref)