def pvdc_del_storage_profile(self, pvdc_name, storage_profile_names): """Delete storage profiles from a PVDC. :param str pvdc_name: name of the Provider Virtual Datacenter. :param list storage_profile_names: list of storage profile names. :return: an object containing EntityType.TASK XML data which represents the async task that is deleting storage profiles from the PVDC. :rtype: lxml.objectify.ObjectifiedElement :raises: EntityNotFoundException: if any storage_profile_name is not associated with the specified PVDC. """ provider_vdc, pvdc_ext_href, pvdc_ext_resource = self.get_pvdc( pvdc_name) sp_map = {} if hasattr(pvdc_ext_resource, '{' + NSMAP['vcloud'] + '}StorageProfiles'): stor_profs = \ pvdc_ext_resource['{' + NSMAP['vcloud'] + '}StorageProfiles'] if hasattr(stor_profs, '{' + NSMAP['vcloud'] + '}ProviderVdcStorageProfile'): for stor_prof in stor_profs.ProviderVdcStorageProfile: sp_map[stor_prof.get('name')] = stor_prof.get('href') payload = E_VMEXT.UpdateProviderVdcStorageProfiles() for sp_name in storage_profile_names: if sp_name not in sp_map.keys(): raise EntityNotFoundException( 'storage profile: \'%s\' not in this PVDC' % sp_name) sp_href = sp_map[sp_name] payload.append(E_VMEXT.RemoveStorageProfile(href=sp_href)) sp_resource = self.client.get_resource(sp_href) links = get_links( resource=sp_resource, rel=RelationType.EDIT, media_type=EntityType.VMW_PVDC_STORAGE_PROFILE.value) num_links = len(links) if num_links == 1: if hasattr(sp_resource, '{' + NSMAP['vcloud'] + '}Units'): units = \ sp_resource['{' + NSMAP['vcloud'] + '}Units'] disable_payload = \ E_VMEXT.VMWProviderVdcStorageProfile( name=sp_name, href=sp_href ) disable_payload.append(E.Enabled('false')) disable_payload.append(units) self.client.put_linked_resource( resource=sp_resource, rel=RelationType.EDIT, media_type=EntityType.VMW_PVDC_STORAGE_PROFILE.value, contents=disable_payload) return self.client.post_linked_resource( resource=pvdc_ext_resource, rel=RelationType.EDIT, media_type=EntityType.UPDATE_PROVIDER_VDC_STORAGE_PROFILES.value, contents=payload)
def enable_guest_customization(self, is_enabled=False): """Enable guest customization. :param: bool is_enabled: if True, it will enable guest customization. If False, it will disable guest customization :return: returns lxml.objectify.ObjectifiedElement resource: object containing EntityType.GUESTCUSTOMIZATIONSECTION XML data representing the guestcustomizationsection. :rtype: lxml.objectify.ObjectifiedElement """ self.get_resource() gc_section = self.get_guest_customization_section() if hasattr(gc_section, 'Enabled'): gc_section.Enabled = E.Enabled(is_enabled) uri = self.href + '/guestCustomizationSection/' return self.client.\ put_resource(uri, gc_section, EntityType.GUEST_CUSTOMIZATION_SECTION.value)
def create_org_vdc(self, vdc_name, provider_vdc_name, description='', allocation_model='AllocationVApp', cpu_units='MHz', cpu_allocated=0, cpu_limit=0, mem_units='MB', mem_allocated=0, mem_limit=0, nic_quota=0, network_quota=0, vm_quota=0, storage_profiles=[], resource_guaranteed_memory=None, resource_guaranteed_cpu=None, vcpu_in_mhz=None, is_thin_provision=None, network_pool_name=None, uses_fast_provisioning=None, over_commit_allowed=None, vm_discovery_enabled=None, is_enabled=True): """Create Organization VDC in the current Org. :param vdc_name (str): The name of the new org vdc. :param provider_vdc_name (str): The name of an existing provider vdc. :param description (str): The description of the new org vdc. :param allocation_model (str): The allocation model used by this vDC. One of AllocationVApp, AllocationPool or ReservationPool. :param cpu_units (str): The cpu units compute capacity allocated to this vDC. One of MHz or GHz :param cpu_allocated (int): Capacity that is committed to be available. :param cpu_limit (int): Capacity limit relative to the value specified for Allocation. :param mem_units (str): The memory units compute capacity allocated to this vDC. One of MB or GB. :param mem_allocated (int): Memory capacity that is committed to be available. :param mem_limit (int): Memory capacity limit relative to the value specified for Allocation. :param nic_quota (int): Maximum number of virtual NICs allowed in this vDC. Defaults to 0, which specifies an unlimited number. :param network_quota (int): Maximum number of network objects that can be deployed in this vDC. Defaults to 0, which means no networks can be deployed. :param vm_quota (int): The maximum number of VMs that can be created in this vDC. Defaults to 0, which specifies an unlimited number. :param storage_profiles: List of provider vDC storage profiles to add to this vDC. Each item is a dictionary that should include the following elements: name: (string) name of the PVDC storage profile. enabled: (bool) True if the storage profile is enabled for this vDC. units: (string) Units used to define limit. One of MB or GB. limit: (int) Max number of units allocated for this storage profile. default: (bool) True if this is default storage profile for this vDC. :param resource_guaranteed_memory (float): Percentage of allocated CPU resources guaranteed to vApps deployed in this vDC. Value defaults to 1.0 if the element is empty. :param resource_guaranteed_cpu (float): Percentage of allocated memory resources guaranteed to vApps deployed in this vDC. Value defaults to 1.0 if the element is empty. :param vcpu_in_mhz (int): Specifies the clock frequency, in Megahertz, for any virtual CPU that is allocated to a VM. :param is_thin_provision (bool): Boolean to request thin provisioning. :param network_pool_name (str): Reference to a network pool in the Provider vDC. :param uses_fast_provisioning (bool): Boolean to request fast provisioning. :param over_commit_allowed (bool): Set to false to disallow creation of the VDC if the AllocationModel is AllocationPool or ReservationPool and the ComputeCapacity you specified is greater than what the backing Provider VDC can supply. Defaults to true if empty or missing. :param vm_discovery_enabled (bool): True if discovery of vCenter VMs is enabled for resource pools backing this vDC. :param is_enabled (bool): True if this vDC is enabled for use by the organization users. :return: A :class:`lxml.objectify.StringElement` object describing the new VDC. """ if self.resource is None: self.resource = self.client.get_resource(self.href) sys_admin_resource = self.client.get_admin() system = System(self.client, admin_resource=sys_admin_resource) pvdc = system.get_provider_vdc(provider_vdc_name) resource_admin = self.client.get_resource(self.href_admin) params = E.CreateVdcParams(E.Description(description), E.AllocationModel(allocation_model), E.ComputeCapacity( E.Cpu(E.Units(cpu_units), E.Allocated(cpu_allocated), E.Limit(cpu_limit)), E.Memory(E.Units(mem_units), E.Allocated(mem_allocated), E.Limit(mem_limit))), E.NicQuota(nic_quota), E.NetworkQuota(network_quota), E.VmQuota(vm_quota), E.IsEnabled(is_enabled), name=vdc_name) for sp in storage_profiles: pvdc_sp = system.get_provider_vdc_storage_profile(sp['name']) params.append( E.VdcStorageProfile( E.Enabled(sp['enabled']), E.Units(sp['units']), E.Limit(sp['limit']), E.Default(sp['default']), E.ProviderVdcStorageProfile(href=pvdc_sp.get('href')))) if resource_guaranteed_memory is not None: params.append( E.ResourceGuaranteedMemory(resource_guaranteed_memory)) if resource_guaranteed_cpu is not None: params.append(E.ResourceGuaranteedCpu(resource_guaranteed_cpu)) if vcpu_in_mhz is not None: params.append(E.VCpuInMhz(vcpu_in_mhz)) if is_thin_provision is not None: params.append(E.IsThinProvision(is_thin_provision)) if network_pool_name is not None: npr = system.get_network_pool_reference(network_pool_name) href = npr.get('href') params.append( E.NetworkPoolReference(href=href, id=href.split('/')[-1], type=npr.get('type'), name=npr.get('name'))) params.append(pvdc) if uses_fast_provisioning is not None: params.append(E.UsesFastProvisioning(uses_fast_provisioning)) if over_commit_allowed is not None: params.append(E.OverCommitAllowed(over_commit_allowed)) if vm_discovery_enabled is not None: params.append(E.VmDiscoveryEnabled(vm_discovery_enabled)) return self.client.post_linked_resource(resource_admin, RelationType.ADD, EntityType.VDCS_PARAMS.value, params)
def instantiate_vapp(self, name, catalog, template, network=None, fence_mode='bridged', ip_allocation_mode='dhcp', deploy=True, power_on=True, accept_all_eulas=True, memory=None, cpu=None, password=None, cust_script=None, identical=False): """ Instantiate a vApp from a vApp template. :param name: (str): The name of the new vApp. :param catalog: (str): The name of the catalog. :param template: (str): The name of the vApp template. :param identical: (bool): If True, no guest customization or VM name update is performed :return: A :class:`lxml.objectify.StringElement` object describing the new vApp. """ # NOQA if self.resource is None: self.resource = self.client.get_resource(self.href) network_href = None if hasattr(self.resource, 'AvailableNetworks') and \ hasattr(self.resource.AvailableNetworks, 'Network'): for n in self.resource.AvailableNetworks.Network: if network is None or network == n.get('name'): network_href = n.get('href') network_name = n.get('name') if network_href is None: raise Exception('Network not found in the Virtual Datacenter.') org_href = find_link(self.resource, RelationType.UP, EntityType.ORG.value).href org = Org(self.client, href=org_href) template_resource = org.get_catalog_item(catalog, template) v = self.client.get_resource(template_resource.Entity.get('href')) n = v.xpath( '//ovf:NetworkSection/ovf:Network', namespaces={'ovf': 'http://schemas.dmtf.org/ovf/envelope/1'}) assert len(n) > 0 network_name_from_template = n[0].get( '{http://schemas.dmtf.org/ovf/envelope/1}name') deploy_param = 'true' if deploy else 'false' power_on_param = 'true' if power_on else 'false' network_configuration = E.Configuration( E.ParentNetwork(href=network_href), E.FenceMode(fence_mode)) # if fence_mode == 'natRouted': # network_configuration.append( # E.Features( # E.NatService( # E.IsEnabled('true'), # E.NatType('ipTranslation'), # E.Policy('allowTraffic'), # E.NatRule( # E.OneToOneVmRule( # E.MappingMode('automatic'), # E.VAppScopedVmId(vm_id), # E.VmNicId(0) # ) # ) # ) # ) # ) vapp_network_name = network_name_from_template if vapp_network_name == 'none': vapp_network_name = network_name vapp_template_params = E.InstantiateVAppTemplateParams( name=name, deploy=deploy_param, powerOn=power_on_param) if network_name is not None: vapp_template_params.append( E.InstantiationParams( E.NetworkConfigSection( E_OVF.Info('Configuration for logical networks'), E.NetworkConfig(network_configuration, networkName=vapp_network_name)))) vapp_template_params.append( E.Source(href=template_resource.Entity.get('href'))) vm = v.xpath('//vcloud:VAppTemplate/vcloud:Children/vcloud:Vm', namespaces=NSMAP) assert len(vm) > 0 ip = E.InstantiationParams() if not identical: gc = E.GuestCustomizationSection( E_OVF.Info('Specifies Guest OS Customization Settings'), E.Enabled('false'), ) if password is not None: gc.append(E.AdminPasswordEnabled('true')) gc.append(E.AdminPasswordAuto('false')) gc.append(E.AdminPassword(password)) gc.append(E.ResetPasswordRequired('false')) else: gc.append(E.AdminPasswordEnabled('false')) if cust_script is not None: gc.append(E.CustomizationScript(cust_script)) gc.Enabled = E.Enabled('true') gc.append(E.ComputerName(name)) ip.append(gc) primary_index = int( vm[0].NetworkConnectionSection.PrimaryNetworkConnectionIndex.text) ip.append( E.NetworkConnectionSection( E_OVF.Info('Specifies the available VM network connections'), E.NetworkConnection(E.NetworkConnectionIndex(primary_index), E.IsConnected('true'), E.IpAddressAllocationMode( ip_allocation_mode.upper()), network=vapp_network_name))) if memory is not None: items = v.Children[0].Vm.xpath( '//ovf:VirtualHardwareSection/ovf:Item', namespaces={'ovf': 'http://schemas.dmtf.org/ovf/envelope/1'}) for item in items: if item['{http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData}ResourceType'] == 4: # NOQA item[ '{http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData}ElementName'] = '%s MB of memory' % memory # NOQA item[ '{http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData}VirtualQuantity'] = memory # NOQA memory_params = item break if cpu is not None: items = v.Children[0].Vm.xpath( '//ovf:VirtualHardwareSection/ovf:Item', namespaces={'ovf': 'http://schemas.dmtf.org/ovf/envelope/1'}) for item in items: if item['{http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData}ResourceType'] == 3: # NOQA item[ '{http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData}ElementName'] = '%s virtual CPU(s)' % cpu # NOQA item[ '{http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData}VirtualQuantity'] = cpu # NOQA cpu_params = item break if memory is not None or cpu is not None: vhs = E_OVF.VirtualHardwareSection( E_OVF.Info('Virtual hardware requirements')) if memory is not None: vhs.append(memory_params) if cpu is not None: vhs.append(cpu_params) ip.append(vhs) if identical or (password is None and cust_script is None): needs_customization = 'false' else: needs_customization = 'true' si = E.SourcedItem( E.Source(href=vm[0].get('href'), id=vm[0].get('id'), name=vm[0].get('name'), type=vm[0].get('type'))) if not identical: si.append( E.VmGeneralParams(E.Name(name), E.NeedsCustomization(needs_customization))) si.append(ip) # if network_name != network_name_from_template: # si.append(E.NetworkAssignment( # innerNetwork=network_name_from_template, # containerNetwork=network_name)) vapp_template_params.append(si) all_eulas_accepted = 'true' if accept_all_eulas else 'false' vapp_template_params.append(E.AllEULAsAccepted(all_eulas_accepted)) return self.client.post_resource( self.href + '/action/instantiateVAppTemplate', vapp_template_params, EntityType.INSTANTIATE_VAPP_TEMPLATE_PARAMS.value)
def to_sourced_item(self, spec): """Creates a VM SourcedItem from a VM specification. :param spec: (dict) containing: vapp: (resource): (required) source vApp or vAppTemplate resource source_vm_name: (str): (required) source VM name target_vm_name: (str): (optional) target VM name hostname: (str): (optional) target guest hostname password: (str): (optional) set the administrator password of this machine to this value password_auto: (bool): (optional) autogenerate administrator password password_reset: (bool): (optional) True if the administrator password for this virtual machine must be reset after first use cust_script: (str): (optional) script to run on guest customization network: (str): (optional) Name of the vApp network to connect. If omitted, the VM won't be connected to any network storage_profile: (str): (optional) the name of the storage profile to be used for this VM :return: SourcedItem: (:class:`lxml.objectify.StringElement`): object representing the 'SourcedItem' xml object created from the specification. """ source_vapp = VApp(self.client, resource=spec['vapp']) source_vm_resource = source_vapp.get_vm(spec['source_vm_name']) sourced_item = E.SourcedItem( E.Source(href=source_vm_resource.get('href'), id=source_vm_resource.get('id'), name=source_vm_resource.get('name'), type=source_vm_resource.get('type'))) vm_general_params = E.VmGeneralParams() if 'target_vm_name' in spec: vm_general_params.append(E.Name(spec['target_vm_name'])) vm_instantiation_param = E.InstantiationParams() if 'network' in spec: primary_index = int(source_vm_resource.NetworkConnectionSection. PrimaryNetworkConnectionIndex.text) if 'ip_allocation_mode' in spec: ip_allocation_mode = spec['ip_allocation_mode'] else: ip_allocation_mode = 'DHCP' vm_instantiation_param.append( E.NetworkConnectionSection( E_OVF.Info(), E.NetworkConnection( E.NetworkConnectionIndex(primary_index), E.IsConnected(True), E.IpAddressAllocationMode(ip_allocation_mode.upper()), network=spec['network']))) needs_customization = 'disk_size' in spec or 'password' in spec or \ 'cust_script' in spec or 'hostname' in spec if needs_customization: guest_customization_param = E.GuestCustomizationSection( E_OVF.Info(), E.Enabled(True), ) if 'password' in spec: guest_customization_param.append(E.AdminPasswordEnabled(True)) guest_customization_param.append(E.AdminPasswordAuto(False)) guest_customization_param.append( E.AdminPassword(spec['password'])) else: if 'password_auto' in spec: guest_customization_param.append( E.AdminPasswordEnabled(True)) guest_customization_param.append(E.AdminPasswordAuto(True)) else: guest_customization_param.append( E.AdminPasswordEnabled(False)) if 'password_reset' in spec: guest_customization_param.append( E.ResetPasswordRequired(spec['password_reset'])) if 'cust_script' in spec: guest_customization_param.append( E.CustomizationScript(spec['cust_script'])) if 'hostname' in spec: guest_customization_param.append( E.ComputerName(spec['hostname'])) vm_instantiation_param.append(guest_customization_param) vm_general_params.append(E.NeedsCustomization(needs_customization)) sourced_item.append(vm_general_params) sourced_item.append(vm_instantiation_param) if 'storage_profile' in spec: sp = spec['storage_profile'] storage_profile = E.StorageProfile( href=sp.get('href'), id=sp.get('href').split('/')[-1], type=sp.get('type'), name=sp.get('name')) sourced_item.append(storage_profile) return sourced_item
def to_sourced_item(self, spec): """Creates a vm SourcedItem from a vm specification. :param dict spec: a dictionary containing - vapp: (resource): (required) source vApp or vAppTemplate resource. - source_vm_name: (str): (required) source vm name. - target_vm_name: (str): (optional) target vm name. - hostname: (str): (optional) target guest hostname. - password: (str): (optional) the administrator password of the vm. - password_auto: (bool): (optional) auto generate administrator password. - password_reset: (bool): (optional) True, if the administrator password for this vm must be reset after first use. - cust_script: (str): (optional) script to run on guest customization. - network: (str): (optional) name of the vApp network to connect. If omitted, the vm won't be connected to any network. - storage_profile: (str): (optional) the name of the storage profile to be used for this vm. :return: an object containing SourcedItem XML element. :rtype: lxml.objectify.ObjectifiedElement """ source_vapp = VApp(self.client, resource=spec['vapp']) source_vapp.reload() source_vm_resource = source_vapp.get_vm(spec['source_vm_name']) sourced_item = E.SourcedItem( E.Source(href=source_vm_resource.get('href'), id=source_vm_resource.get('id'), name=source_vm_resource.get('name'), type=source_vm_resource.get('type'))) vm_general_params = E.VmGeneralParams() if 'target_vm_name' in spec: vm_general_params.append(E.Name(spec['target_vm_name'])) vm_instantiation_param = E.InstantiationParams() if 'network' in spec: primary_index = int(source_vm_resource.NetworkConnectionSection. PrimaryNetworkConnectionIndex.text) if 'ip_allocation_mode' in spec: ip_allocation_mode = spec['ip_allocation_mode'] else: ip_allocation_mode = 'DHCP' new_connection = E.NetworkConnection( E.NetworkConnectionIndex(primary_index), network=spec['network']) if spec['ip_address'] and ip_allocation_mode == 'MANUAL': new_connection.append(E.IpAddress(spec['ip_address'])) new_connection.append(E.IsConnected(True)) new_connection.append( E.IpAddressAllocationMode(ip_allocation_mode.upper())) vm_instantiation_param.append( E.NetworkConnectionSection( E_OVF.Info("Something"), E.PrimaryNetworkConnectionIndex(primary_index), new_connection)) needs_customization = 'disk_size' in spec or 'password' in spec or \ 'cust_script' in spec or 'hostname' in spec if needs_customization: guest_customization_param = E.GuestCustomizationSection( E_OVF.Info(), E.Enabled(True), ) if 'password' in spec: guest_customization_param.append(E.AdminPasswordEnabled(True)) guest_customization_param.append(E.AdminPasswordAuto(False)) guest_customization_param.append( E.AdminPassword(spec['password'])) else: if 'password_auto' in spec: guest_customization_param.append( E.AdminPasswordEnabled(True)) guest_customization_param.append(E.AdminPasswordAuto(True)) else: guest_customization_param.append( E.AdminPasswordEnabled(False)) if 'password_reset' in spec: guest_customization_param.append( E.ResetPasswordRequired(spec['password_reset'])) if 'cust_script' in spec: guest_customization_param.append( E.CustomizationScript(spec['cust_script'])) if 'hostname' in spec: guest_customization_param.append( E.ComputerName(spec['hostname'])) vm_instantiation_param.append(guest_customization_param) vm_general_params.append(E.NeedsCustomization(needs_customization)) sourced_item.append(vm_general_params) sourced_item.append(vm_instantiation_param) if 'storage_profile' in spec: sp = spec['storage_profile'] storage_profile = E.StorageProfile( href=sp.get('href'), id=sp.get('href').split('/')[-1], type=sp.get('type'), name=sp.get('name')) sourced_item.append(storage_profile) return sourced_item
def instantiate_vapp(self, name, catalog, template, network=None, fence_mode=FenceMode.BRIDGED.value, ip_allocation_mode='dhcp', deploy=True, power_on=True, accept_all_eulas=False, memory=None, cpu=None, disk_size=None, password=None, cust_script=None, vm_name=None, hostname=None, storage_profile=None): """Instantiate a vApp from a vApp template in a catalog. If customization parameters are provided, it will customize the VM and guest OS, taking some assumptions. See each parameter for details. :param name: (str): The name of the new vApp. :param catalog: (str): The name of the catalog. :param template: (str): The name of the vApp template. :param network: (str): The name of a vdc network. When provided, connects the VM to the network. It assumes one VM in the vApp and one NIC in the VM. :param fence_mode: (str): Fence mode. Possible values are `bridged` and `natRouted` :param ip_allocation_mode: (str): IP allocation mode. Possible values are `pool`, `dhcp` and `static` :param deploy: (bool): :param power_on: (bool): :param accept_all_eulas: (bool): True confirms acceptance of all EULAs in a vApp template. :param memory: (int): :param cpu: (int): :param disk_size: (int): :param password: (str): :param cust_script: (str): :param vm_name: (str): When provided, set the name of the VM. It assumes one VM in the vApp. :param hostname: (str): When provided, set the hostname of the guest OS. It assumes one VM in the vApp. :param storage_profile: (str): :return: A :class:`lxml.objectify.StringElement` object describing the new vApp. """ if self.resource is None: self.resource = self.client.get_resource(self.href) # Get hold of the template org_href = find_link(self.resource, RelationType.UP, EntityType.ORG.value).href org = Org(self.client, href=org_href) catalog_item = org.get_catalog_item(catalog, template) template_resource = self.client.get_resource( catalog_item.Entity.get('href')) # If network is not specified by user then default to # vApp network name specified in the template template_networks = template_resource.xpath( '//ovf:NetworkSection/ovf:Network', namespaces={'ovf': NSMAP['ovf']}) assert len(template_networks) > 0 network_name_from_template = template_networks[0].get('{' + NSMAP['ovf'] + '}name') if ((network is None) and (network_name_from_template != 'none')): network = network_name_from_template # Find the network in vdc referred to by user, using # name of the network network_href = network_name = None if network is not None: if hasattr(self.resource, 'AvailableNetworks') and \ hasattr(self.resource.AvailableNetworks, 'Network'): for n in self.resource.AvailableNetworks.Network: if network == n.get('name'): network_href = n.get('href') network_name = n.get('name') break if network_href is None: raise Exception( 'Network \'%s\' not found in the Virtual Datacenter.' % network) # Configure the network of the vApp vapp_instantiation_param = None if network_name is not None: network_configuration = E.Configuration( E.ParentNetwork(href=network_href), E.FenceMode(fence_mode)) if fence_mode == 'natRouted': # TODO(need to find the vm_id) vm_id = None network_configuration.append( E.Features( E.NatService( E.IsEnabled('true'), E.NatType('ipTranslation'), E.Policy('allowTraffic'), E.NatRule( E.OneToOneVmRule(E.MappingMode('automatic'), E.VAppScopedVmId(vm_id), E.VmNicId(0)))))) vapp_instantiation_param = E.InstantiationParams( E.NetworkConfigSection( E_OVF.Info('Configuration for logical networks'), E.NetworkConfig(network_configuration, networkName=network_name))) # Get all vms in the vapp template vms = template_resource.xpath( '//vcloud:VAppTemplate/vcloud:Children/vcloud:Vm', namespaces=NSMAP) assert len(vms) > 0 vm_instantiation_param = E.InstantiationParams() # Configure network of the first vm if network_name is not None: primary_index = int(vms[0].NetworkConnectionSection. PrimaryNetworkConnectionIndex.text) vm_instantiation_param.append( E.NetworkConnectionSection( E_OVF.Info( 'Specifies the available VM network connections'), E.NetworkConnection( E.NetworkConnectionIndex(primary_index), E.IsConnected('true'), E.IpAddressAllocationMode(ip_allocation_mode.upper()), network=network_name))) # Configure cpu, memory, disk of the first vm cpu_params = memory_params = disk_params = None if memory is not None or cpu is not None or disk_size is not None: virtual_hardware_section = E_OVF.VirtualHardwareSection( E_OVF.Info('Virtual hardware requirements')) items = vms[0].xpath('//ovf:VirtualHardwareSection/ovf:Item', namespaces={'ovf': NSMAP['ovf']}) for item in items: if memory is not None and memory_params is None: if item['{' + NSMAP['rasd'] + '}ResourceType'] == 4: item['{' + NSMAP['rasd'] + '}ElementName'] = '%s MB of memory' % memory item['{' + NSMAP['rasd'] + '}VirtualQuantity'] = memory memory_params = item virtual_hardware_section.append(memory_params) if cpu is not None and cpu_params is None: if item['{' + NSMAP['rasd'] + '}ResourceType'] == 3: item['{' + NSMAP['rasd'] + '}ElementName'] = '%s virtual CPU(s)' % cpu item['{' + NSMAP['rasd'] + '}VirtualQuantity'] = cpu cpu_params = item virtual_hardware_section.append(cpu_params) if disk_size is not None and disk_params is None: if item['{' + NSMAP['rasd'] + '}ResourceType'] == 17: item['{' + NSMAP['rasd'] + '}Parent'] = None item['{' + NSMAP['rasd'] + '}HostResource'].attrib[ '{' + NSMAP['vcloud'] + '}capacity'] = '%s' % disk_size item['{' + NSMAP['rasd'] + '}VirtualQuantity'] = disk_size * 1024 * 1024 disk_params = item virtual_hardware_section.append(disk_params) vm_instantiation_param.append(virtual_hardware_section) # Configure guest customization for the vm if password is not None or cust_script is not None or \ hostname is not None: guest_customization_param = E.GuestCustomizationSection( E_OVF.Info('Specifies Guest OS Customization Settings'), E.Enabled('true'), ) if password is None: guest_customization_param.append( E.AdminPasswordEnabled('false')) else: guest_customization_param.append( E.AdminPasswordEnabled('true')) guest_customization_param.append(E.AdminPasswordAuto('false')) guest_customization_param.append(E.AdminPassword(password)) guest_customization_param.append( E.ResetPasswordRequired('false')) if cust_script is not None: guest_customization_param.append( E.CustomizationScript(cust_script)) if hostname is not None: guest_customization_param.append(E.ComputerName(hostname)) vm_instantiation_param.append(guest_customization_param) # Craft the <SourcedItem> element for the first VM sourced_item = E.SourcedItem( E.Source(href=vms[0].get('href'), id=vms[0].get('id'), name=vms[0].get('name'), type=vms[0].get('type'))) vm_general_params = E.VmGeneralParams() if vm_name is not None: vm_general_params.append(E.Name(vm_name)) # TODO(check if it needs customization if network, cpu or memory...) if disk_size is None and \ password is None and \ cust_script is None and \ hostname is None: needs_customization = 'false' else: needs_customization = 'true' vm_general_params.append(E.NeedsCustomization(needs_customization)) sourced_item.append(vm_general_params) sourced_item.append(vm_instantiation_param) if storage_profile is not None: sp = self.get_storage_profile(storage_profile) vapp_storage_profile = E.StorageProfile( href=sp.get('href'), id=sp.get('href').split('/')[-1], type=sp.get('type'), name=sp.get('name')) sourced_item.append(vapp_storage_profile) # Cook the entire vApp Template instantiation element deploy_param = 'true' if deploy else 'false' power_on_param = 'true' if power_on else 'false' all_eulas_accepted = 'true' if accept_all_eulas else 'false' vapp_template_params = E.InstantiateVAppTemplateParams( name=name, deploy=deploy_param, powerOn=power_on_param) if vapp_instantiation_param is not None: vapp_template_params.append(vapp_instantiation_param) vapp_template_params.append( E.Source(href=catalog_item.Entity.get('href'))) vapp_template_params.append(sourced_item) vapp_template_params.append(E.AllEULAsAccepted(all_eulas_accepted)) # TODO(use post_linked_resource?) return self.client.post_resource( self.href + '/action/instantiateVAppTemplate', vapp_template_params, EntityType.INSTANTIATE_VAPP_TEMPLATE_PARAMS.value)
def to_instantiate_vm_template_params(self, spec): source_vapp = VApp(self.client, resource=spec['vapp']) vm_template = source_vapp.get_vm(spec['source_vm_name']) params = E.InstantiateVmTemplateParams( E.SourcedVmTemplateItem( E.Source( href=vm_template.get('href'), id=vm_template.get('id'), type=vm_template.get('type'), name=vm_template.get('name'), )), name=spec['target_vm_name'], powerOn='true' if spec['power_on'] else 'false') vm_general_params = E.VmGeneralParams() vm_instantiation_param = E.VmTemplateInstantiationParams() if spec.get('network'): primary_index = int(vm_template.NetworkConnectionSection. PrimaryNetworkConnectionIndex.text) vm_instantiation_param.append( E.NetworkConnectionSection( E_OVF.Info(), E.NetworkConnection( E.NetworkConnectionIndex(primary_index), E.IsConnected(True), E.IpAddressAllocationMode( spec['ip_allocation_mode'].upper()), network=spec['network']))) needs_customization = 'disk_size' in spec or 'password' in spec or \ 'cust_script' in spec or 'hostname' in spec if needs_customization: guest_customization_param = E.GuestCustomizationSection( E_OVF.Info(), E.Enabled(True), ) if spec.get('password'): guest_customization_param.append(E.AdminPasswordEnabled(True)) guest_customization_param.append(E.AdminPasswordAuto(False)) guest_customization_param.append( E.AdminPassword(spec['password'])) else: if spec.get('password_auto'): guest_customization_param.append( E.AdminPasswordEnabled(True)) guest_customization_param.append(E.AdminPasswordAuto(True)) else: guest_customization_param.append( E.AdminPasswordEnabled(False)) if spec.get('password_reset'): guest_customization_param.append( E.ResetPasswordRequired(spec['password_reset'])) if spec.get('cust_script'): guest_customization_param.append( E.CustomizationScript(spec['cust_script'])) if spec.get('hostname'): guest_customization_param.append( E.ComputerName(spec['hostname'])) vm_instantiation_param.append(guest_customization_param) vm_general_params.append(E.NeedsCustomization(needs_customization)) params.SourcedVmTemplateItem.append(vm_general_params) params.SourcedVmTemplateItem.append(vm_instantiation_param) if spec.get('storage_profile'): sp = spec['storage_profile'] storage_profile = E.StorageProfile( href=sp.get('href'), id=sp.get('href').split('/')[-1], type=sp.get('type'), name=sp.get('name')) params.SourcedVmTemplateItem.append(storage_profile) return params