def connect_bulk(self, si, logger, vcenter_data_model, request): """ :param si: :param logger: :param VMwarevCenterResourceModel vcenter_data_model: :param request: :return: """ self.vcenter_data_model = vcenter_data_model if vcenter_data_model.reserved_networks: self.reserved_networks = [name.strip() for name in vcenter_data_model.reserved_networks.split(',')] dvswitch_location = VMLocation.create_from_full_path(vcenter_data_model.default_dvswitch) self.dv_switch_path = VMLocation.combine([vcenter_data_model.default_datacenter, dvswitch_location.path]) self.dv_switch_name = dvswitch_location.name self.port_group_path = vcenter_data_model.default_port_group_location self.default_network = VMLocation.combine( [vcenter_data_model.default_datacenter, vcenter_data_model.holding_network]) holder = DeployDataHolder(jsonpickle.decode(request)) mappings = self._map_requsets(holder.driverRequest.actions) pool = ThreadPool() async_results = self._run_async_connection_actions(si, mappings, pool, logger) results = self._get_async_results(async_results, pool) return results
def clone_vm(self, clone_params, logger): """ Clone a VM from a template/VM and return the vm oject or throws argument is not valid :param clone_params: CloneVmParameters = :param logger: """ result = self.CloneVmResult() if not isinstance(clone_params.si, self.vim.ServiceInstance): result.error = 'si must be init as ServiceInstance' return result if clone_params.template_name is None: result.error = 'template_name param cannot be None' return result if clone_params.vm_name is None: result.error = 'vm_name param cannot be None' return result if clone_params.vm_folder is None: result.error = 'vm_folder param cannot be None' return result datacenter = self.get_datacenter(clone_params) dest_folder = self._get_destination_folder(clone_params) vm_location = VMLocation.create_from_full_path(clone_params.template_name) template = self._get_template(clone_params, vm_location) datastore = self._get_datastore(clone_params) resource_pool, host = self._get_resource_pool(datacenter.name, clone_params) if not resource_pool and not host: raise ValueError('The specifed host, cluster or resource pool could not be found') '# set relo_spec' placement = self.vim.vm.RelocateSpec() placement.datastore = datastore if resource_pool: placement.pool = resource_pool if host: placement.host = host clone_spec = self.vim.vm.CloneSpec() clone_spec.location = placement clone_spec.powerOn = clone_params.power_on logger.info("cloning VM...") task = template.Clone(folder=dest_folder, name=clone_params.vm_name, spec=clone_spec) vm = self.wait_for_task(task, logger) result.vm = vm return result
def connect_bulk(self, si, logger, vcenter_data_model, request): """ :param si: :param logger: :param VMwarevCenterResourceModel vcenter_data_model: :param request: :return: """ self.logger = logger self.logger.info('Apply connectivity changes has started') self.logger.debug( 'Apply connectivity changes has started with the requet: {0}'. format(request)) holder = DeployDataHolder(jsonpickle.decode(request)) self.vcenter_data_model = vcenter_data_model if vcenter_data_model.reserved_networks: self.reserved_networks = [ name.strip() for name in vcenter_data_model.reserved_networks.split(',') ] if not vcenter_data_model.default_dvswitch: return self._handle_no_dvswitch_error(holder) dvswitch_location = VMLocation.create_from_full_path( vcenter_data_model.default_dvswitch) self.dv_switch_path = VMLocation.combine( [vcenter_data_model.default_datacenter, dvswitch_location.path]) self.dv_switch_name = dvswitch_location.name self.default_network = VMLocation.combine([ vcenter_data_model.default_datacenter, vcenter_data_model.holding_network ]) mappings = self._map_requsets(holder.driverRequest.actions) self.logger.debug('Connectivity actions mappings: {0}'.format( jsonpickle.encode(mappings, unpicklable=False))) pool = ThreadPool() async_results = self._run_async_connection_actions( si, mappings, pool, logger) results = self._get_async_results(async_results, pool) self.logger.info('Apply connectivity changes done') self.logger.debug( 'Apply connectivity has finished with the results: {0}'.format( jsonpickle.encode(results, unpicklable=False))) return results
def connect_bulk(self, si, logger, vcenter_data_model, request): """ :param si: :param logger: :param VMwarevCenterResourceModel vcenter_data_model: :param request: :return: """ self.logger = logger self.logger.info('Apply connectivity changes has started') self.logger.debug('Apply connectivity changes has started with the requet: {0}'.format(request)) holder = DeployDataHolder(jsonpickle.decode(request)) self.vcenter_data_model = vcenter_data_model if vcenter_data_model.reserved_networks: self.reserved_networks = [name.strip() for name in vcenter_data_model.reserved_networks.split(',')] if not vcenter_data_model.default_dvswitch: return self._handle_no_dvswitch_error(holder) dvswitch_location = VMLocation.create_from_full_path(vcenter_data_model.default_dvswitch) self.dv_switch_path = VMLocation.combine([vcenter_data_model.default_datacenter, dvswitch_location.path]) self.dv_switch_name = dvswitch_location.name self.default_network = VMLocation.combine( [vcenter_data_model.default_datacenter, vcenter_data_model.holding_network]) mappings = self._map_requsets(holder.driverRequest.actions) self.logger.debug('Connectivity actions mappings: {0}'.format(jsonpickle.encode(mappings, unpicklable=False))) pool = ThreadPool() async_results = self._run_async_connection_actions(si, mappings, pool, logger) results = self._get_async_results(async_results, pool) self.logger.info('Apply connectivity changes done') self.logger.debug('Apply connectivity has finished with the results: {0}'.format(jsonpickle.encode(results, unpicklable=False))) return results
def clone_vm(self, clone_params, logger, cancellation_context): """ Clone a VM from a template/VM and return the vm oject or throws argument is not valid :param cancellation_context: :param clone_params: CloneVmParameters = :param logger: """ result = self.CloneVmResult() if not isinstance(clone_params.si, self.vim.ServiceInstance): result.error = 'si must be init as ServiceInstance' return result if clone_params.template_name is None: result.error = 'template_name param cannot be None' return result if clone_params.vm_name is None: result.error = 'vm_name param cannot be None' return result if clone_params.vm_folder is None: result.error = 'vm_folder param cannot be None' return result datacenter = self.get_datacenter(clone_params) dest_folder = self._get_destination_folder(clone_params) vm_location = VMLocation.create_from_full_path( clone_params.template_name) template = self._get_template(clone_params, vm_location) snapshot = self._get_snapshot(clone_params, template) resource_pool, host = self.get_resource_pool(datacenter.name, clone_params) if not resource_pool and not host: raise ValueError( 'The specifed host, cluster or resource pool could not be found' ) '# set relo_spec' placement = self.vim.vm.RelocateSpec() if resource_pool: placement.pool = resource_pool if host: placement.host = host clone_spec = self.vim.vm.CloneSpec() if snapshot: clone_spec.snapshot = snapshot clone_spec.template = False placement.diskMoveType = 'createNewChildDiskBacking' placement.datastore = self._get_datastore(clone_params) # after deployment the vm must be powered off and will be powered on if needed by orchestration driver clone_spec.location = placement # clone_params.power_on # due to hotfix 1 for release 1.0, clone_spec.powerOn = False logger.info("cloning VM...") try: task = template.Clone(folder=dest_folder, name=clone_params.vm_name, spec=clone_spec) vm = self.task_waiter.wait_for_task( task=task, logger=logger, action_name='Clone VM', cancellation_context=cancellation_context) except TaskFaultException: raise except vim.fault.NoPermission as error: logger.error("vcenter returned - no permission: {0}".format(error)) raise Exception( 'Permissions is not set correctly, please check the log for more info.' ) except Exception as e: logger.error("error deploying: {0}".format(e)) raise Exception( 'Error has occurred while deploying, please look at the log for more info.' ) result.vm = vm return result
def clone_vm(self, clone_params, logger): """ Clone a VM from a template/VM and return the vm oject or throws argument is not valid :param clone_params: CloneVmParameters = :param logger: """ result = self.CloneVmResult() if not isinstance(clone_params.si, self.vim.ServiceInstance): result.error = 'si must be init as ServiceInstance' return result if clone_params.template_name is None: result.error = 'template_name param cannot be None' return result if clone_params.vm_name is None: result.error = 'vm_name param cannot be None' return result if clone_params.vm_folder is None: result.error = 'vm_folder param cannot be None' return result datacenter = self.get_datacenter(clone_params) dest_folder = self._get_destination_folder(clone_params) vm_location = VMLocation.create_from_full_path(clone_params.template_name) template = self._get_template(clone_params, vm_location) snapshot = self._get_snapshot(clone_params, template) resource_pool, host = self._get_resource_pool(datacenter.name, clone_params) if not resource_pool and not host: raise ValueError('The specifed host, cluster or resource pool could not be found') '# set relo_spec' placement = self.vim.vm.RelocateSpec() if resource_pool: placement.pool = resource_pool if host: placement.host = host clone_spec = self.vim.vm.CloneSpec() if snapshot: clone_spec.snapshot = snapshot clone_spec.template = False placement.diskMoveType = 'createNewChildDiskBacking' placement.datastore = self._get_datastore(clone_params) # after deployment the vm must be powered off and will be powered on if needed by orchestration driver clone_spec.location = placement # clone_params.power_on # due to hotfix 1 for release 1.0, clone_spec.powerOn = False logger.info("cloning VM...") try: task = template.Clone(folder=dest_folder, name=clone_params.vm_name, spec=clone_spec) vm = self.task_waiter.wait_for_task(task=task, logger=logger, action_name='Clone VM') except vim.fault.NoPermission as error: logger.error("vcenter returned - no permission: {0}".format(error)) raise Exception('Permissions is not set correctly, please check the log for more info.') except Exception as e: logger.error("error deploying: {0}".format(e)) raise Exception('Error has occurred while deploying, please look at the log for more info.') result.vm = vm return result
def test_create_from_full_path(self): vm_location = VMLocation.create_from_full_path('QualiSB/Alex/test') self.assertEqual(vm_location.path, 'QualiSB/Alex') self.assertEqual(vm_location.name, 'test')