def remove_compute_policy_from_vdc(self, vdc_id, compute_policy_href, remove_compute_policy_from_vms=False): """Delete the compute policy from the specified vdc. :param str vdc_id: id of the vdc to assign the policy :param compute_policy_href: policy href that is created using cloudapi :param bool remove_compute_policy_from_vms: If True, will set affected VMs' compute policy to 'System Default' :return: an object containing VdcComputePolicyReferences XML element that refers to individual VdcComputePolicies. :rtype: lxml.objectify.ObjectifiedElement """ if remove_compute_policy_from_vms: cp_list = self.list_compute_policies_on_vdc(vdc_id) system_default_href = None system_default_id = None for cp_dict in cp_list: if cp_dict['name'] == _SYSTEM_DEFAULT_COMPUTE_POLICY: system_default_href = cp_dict['href'] system_default_id = cp_dict['id'] if system_default_href is None: raise EntityNotFoundException( f"Error: {_SYSTEM_DEFAULT_COMPUTE_POLICY} " f"compute policy not found.") compute_policy_id = retrieve_compute_policy_id_from_href( compute_policy_href) # noqa: E501 vapps = pyvcd_utils.get_all_vapps_in_ovdc(self._vcd_client, vdc_id) for vapp in vapps: vm_resources = vapp.get_all_vms() for vm_resource in vm_resources: if vm_resource.VdcComputePolicy.get( 'id') == compute_policy_id: # noqa: E501 vm = VM(self._vcd_client, resource=vm_resource) task = vm.update_compute_policy( system_default_href, system_default_id) self._vcd_client.get_task_monitor().wait_for_status( task) # noqa: E501 vdc = pyvcd_utils.get_vdc(self._vcd_client, vdc_id=vdc_id, is_admin_operation=True) return vdc.remove_compute_policy(compute_policy_href)
def _remove_compute_policy_from_vdc_async(self, *args, task, task_href, user_href, org_href, ovdc_id, compute_policy_href, remove_compute_policy_from_vms): user_name = self._session.get('user') vdc = pyvcd_utils.get_vdc(self._vcd_client, vdc_id=ovdc_id, is_admin_operation=True) try: if remove_compute_policy_from_vms: cp_list = self.list_compute_policies_on_vdc(ovdc_id) system_default_href = None for cp_dict in cp_list: if cp_dict['name'] == _SYSTEM_DEFAULT_COMPUTE_POLICY: system_default_href = cp_dict['href'] if system_default_href is None: raise EntityNotFoundException( f"Error: {_SYSTEM_DEFAULT_COMPUTE_POLICY} " f"compute policy not found") compute_policy_id = retrieve_compute_policy_id_from_href(compute_policy_href) # noqa: E501 vapps = pyvcd_utils.get_all_vapps_in_ovdc(self._vcd_client, ovdc_id) target_vms = [] for vapp in vapps: vm_resources = vapp.get_all_vms() for vm_resource in vm_resources: if vm_resource.VdcComputePolicy.get('id') == compute_policy_id: # noqa: E501 target_vms.append(vm_resource) vm_names = [vm.get('name') for vm in target_vms] task.update( status=TaskStatus.RUNNING.value, namespace='vcloud.cse', operation=f"Setting compute policy to " f"'{_SYSTEM_DEFAULT_COMPUTE_POLICY}' on " f"{len(vm_names)} affected VMs: {vm_names}", operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href, ) task_monitor = self._vcd_client.get_task_monitor() for vm_resource in target_vms: vm = VM(self._vcd_client, href=vm_resource.get('href')) _task = vm.update_compute_policy(system_default_href) task.update( status=TaskStatus.RUNNING.value, namespace='vcloud.cse', operation=f"Setting compute policy to " f"'{_SYSTEM_DEFAULT_COMPUTE_POLICY}' on VM " f"'{vm_resource.get('name')}'", operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href, ) task_monitor.wait_for_success(_task) task.update( status=TaskStatus.RUNNING.value, namespace='vcloud.cse', operation=f"Removing compute policy (href:" f"{compute_policy_href}) from org VDC '{vdc.name}'", operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href, ) vdc.remove_compute_policy(compute_policy_href) task.update( status=TaskStatus.SUCCESS.value, namespace='vcloud.cse', operation=f"Removed compute policy (href: " f"{compute_policy_href}) from org VDC '{vdc.name}'", operation_name='Updating VDC', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href, ) except Exception as err: LOGGER.error(err, exc_info=True) task.update( status=TaskStatus.ERROR.value, namespace='vcloud.cse', operation='', operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href, error_message=f"{err}" )
def remove_compute_policy_from_vdc_sync(self, vdc, compute_policy_href, force=False, is_placement_policy=False, task_resource=None): """Remove compute policy from vdc. This method makes use of an umbrella task which can be used for tracking progress. If the umbrella task is not specified, it is created. :param pyvcloud.vcd.vdc.VDC vdc: VDC object :param str compute_policy_href: href of the compute policy to remove :param bool force: Force remove compute policy from vms in the VDC as well :param lxml.objectify.Element task_resource: Task resource for the umbrella task """ user_name = self._session.get('user') task = Task(self._sysadmin_client) task_href = None is_umbrella_task = task_resource is not None # Create a task if not umbrella task if not is_umbrella_task: # TODO the following org will be associated with 'System' org. # task created should be associated with the corresponding org of # the vdc object. org = vcd_utils.get_org(self._sysadmin_client) org.reload() user_href = org.get_user(user_name).get('href') org_href = org.href task_resource = task.update( status=vcd_client.TaskStatus.RUNNING.value, namespace='vcloud.cse', operation= f"Removing compute policy (href: {compute_policy_href})" # noqa: E501 f" from org VDC (vdc id: {vdc.name})", operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=vcd_client.EntityType.VDC.value, user_href=user_href, user_name=user_name, org_href=org.href) else: user_href = task_resource.User.get('href') org_href = task_resource.Organization.get('href') task_href = task_resource.get('href') try: # remove the compute policy from VMs if force is True if force: compute_policy_id = retrieve_compute_policy_id_from_href( compute_policy_href) # noqa: E501 vdc_id = vcd_utils.extract_id(vdc.get_resource().get('id')) vapps = vcd_utils.get_all_vapps_in_ovdc( client=self._sysadmin_client, ovdc_id=vdc_id) target_vms = [] system_default_href = None operation_msg = None for cp_dict in self.list_compute_policies_on_vdc(vdc_id): if cp_dict['name'] == _SYSTEM_DEFAULT_COMPUTE_POLICY: system_default_href = cp_dict['href'] break if is_placement_policy: for vapp in vapps: target_vms += \ [vm for vm in vapp.get_all_vms() if self._get_vm_placement_policy_id(vm) == compute_policy_id] # noqa: E501 vm_names = [vm.get('name') for vm in target_vms] operation_msg = f"Removing placement policy from " \ f"{len(vm_names)} VMs. " \ f"Affected VMs: {vm_names}" else: for vapp in vapps: target_vms += \ [vm for vm in vapp.get_all_vms() if self._get_vm_sizing_policy_id(vm) == compute_policy_id] # noqa: E501 vm_names = [vm.get('name') for vm in target_vms] operation_msg = "Setting sizing policy to " \ f"'{_SYSTEM_DEFAULT_COMPUTE_POLICY}' on " \ f"{len(vm_names)} VMs. " \ f"Affected VMs: {vm_names}" task.update(status=vcd_client.TaskStatus.RUNNING.value, namespace='vcloud.cse', operation=operation_msg, operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=vcd_client.EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href) task_monitor = self._sysadmin_client.get_task_monitor() for vm_resource in target_vms: vm = VM(self._sysadmin_client, href=vm_resource.get('href')) _task = None operation_msg = None if is_placement_policy: if hasattr(vm_resource, 'ComputePolicy') and \ not hasattr(vm_resource.ComputePolicy, 'VmSizingPolicy'): # noqa: E501 # Updating sizing policy for the VM _task = vm.update_compute_policy( compute_policy_href=system_default_href) operation_msg = \ "Setting compute policy to " \ f"'{_SYSTEM_DEFAULT_COMPUTE_POLICY}' "\ f"on VM '{vm_resource.get('name')}'" task.update( status=vcd_client.TaskStatus.RUNNING.value, namespace='vcloud.cse', operation=operation_msg, operation_name= f'Setting sizing policy to {_SYSTEM_DEFAULT_COMPUTE_POLICY}', # noqa: E501 details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=vcd_client.EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href) task_monitor.wait_for_success(_task) _task = vm.remove_placement_policy() operation_msg = "Removing placement policy on VM " \ f"'{vm_resource.get('name')}'" task.update( status=vcd_client.TaskStatus.RUNNING.value, namespace='vcloud.cse', operation=operation_msg, operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=vcd_client.EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href) task_monitor.wait_for_success(_task) else: _task = vm.update_compute_policy( compute_policy_href=system_default_href) operation_msg = "Setting sizing policy to " \ f"'{_SYSTEM_DEFAULT_COMPUTE_POLICY}' "\ f"on VM '{vm_resource.get('name')}'" task.update( status=vcd_client.TaskStatus.RUNNING.value, namespace='vcloud.cse', operation=operation_msg, operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=vcd_client.EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href) task_monitor.wait_for_success(_task) final_status = vcd_client.TaskStatus.RUNNING.value \ if is_umbrella_task else vcd_client.TaskStatus.SUCCESS.value task.update(status=final_status, namespace='vcloud.cse', operation=f"Removing compute policy (href:" f"{compute_policy_href}) from org VDC '{vdc.name}'", operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=vcd_client.EntityType.VDC.value, user_href=user_href, user_name=user_name, task_href=task_href, org_href=org_href) vdc.remove_compute_policy(compute_policy_href) except Exception as err: logger.SERVER_LOGGER.error(err, exc_info=True) # Set task to error if not an umbrella task if not is_umbrella_task: msg = 'Failed to remove compute policy: ' \ f'{compute_policy_href} from the OVDC: {vdc.name}' task.update(status=vcd_client.TaskStatus.ERROR.value, namespace='vcloud.cse', operation=msg, operation_name='Remove org VDC compute policy', details='', progress=None, owner_href=vdc.href, owner_name=vdc.name, owner_type=vcd_client.EntityType.VDC.value, user_href=user_href, user_name=self._session.get('user'), task_href=task_href, org_href=org_href, error_message=f"{err}", stack_trace='') raise err