From: Ravi Chamarty Date: Wed, 24 Oct 2018 02:14:53 +0000 (+0000) Subject: Bug 562 Add support for attaching SRIOV NICs to VCD 9.1 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;h=4d4cddd1992a9d8870eb2b0a1c118faf5a33cb49;p=osm%2FRO.git Bug 562 Add support for attaching SRIOV NICs to VCD 9.1 Change-Id: I8acbb0b5ad4e5d6df2b3f539f709aa6ff3fa2b94 Signed-off-by: Ravi Chamarty --- diff --git a/osm_ro/vimconn_vmware.py b/osm_ro/vimconn_vmware.py index 75c2c797..c0d7f020 100644 --- a/osm_ro/vimconn_vmware.py +++ b/osm_ro/vimconn_vmware.py @@ -1523,7 +1523,7 @@ class vimconnector(vimconn.vimconnector): vmname_andid = ''.join(new_vm_name) for net in net_list: - if net['type'] == "SR-IOV" or net['type'] == "PCI-PASSTHROUGH": + if net['type'] == "PCI-PASSTHROUGH": raise vimconn.vimconnNotSupportedException( "Current vCD version does not support type : {}".format(net['type'])) @@ -1554,7 +1554,6 @@ class vimconnector(vimconn.vimconnector): raise vimconn.vimconnNotFoundException("new_vminstance(): Failed create vApp {}: " "(Failed retrieve catalog information {})".format(name, image_id)) - # Set vCPU and Memory based on flavor. vm_cpus = None vm_memory = None @@ -1798,14 +1797,13 @@ class vimconnector(vimconn.vimconnector): #Add PCI passthrough/SRIOV configrations vm_obj = None pci_devices_info = [] - sriov_net_info = [] reserve_memory = False for net in net_list: if net["type"] == "PF" or net["type"] == "PCI-PASSTHROUGH": pci_devices_info.append(net) elif (net["type"] == "VF" or net["type"] == "SR-IOV" or net["type"] == "VFnotShared") and 'net_id'in net: - sriov_net_info.append(net) + reserve_memory = True #Add PCI if len(pci_devices_info) > 0: @@ -1918,7 +1916,7 @@ class vimconnector(vimconn.vimconnector): task = vapp.connect_org_vdc_network(nets[0].get('name')) self.client.get_task_monitor().wait_for_success(task=task) - type_list = ('PF', 'PCI-PASSTHROUGH', 'VF', 'SR-IOV', 'VFnotShared') + type_list = ('PF', 'PCI-PASSTHROUGH', 'VFnotShared') if 'type' in net and net['type'] not in type_list: # fetching nic type from vnf if 'model' in net: @@ -1947,39 +1945,9 @@ class vimconnector(vimconn.vimconnector): if cloud_config: self.cloud_init(vapp,cloud_config) - # ############# Stub code for SRIOV ################# - #Add SRIOV -# if len(sriov_net_info) > 0: -# self.logger.info("Need to add SRIOV adapters {} into VM {}".format(sriov_net_info, -# vmname_andid )) -# sriov_status, vm_obj, vcenter_conect = self.add_sriov(vapp_uuid, -# sriov_net_info, -# vmname_andid) -# if sriov_status: -# self.logger.info("Added SRIOV {} to VM {}".format( -# sriov_net_info, -# vmname_andid) -# ) -# reserve_memory = True -# else: -# self.logger.info("Fail to add SRIOV {} to VM {}".format( -# sriov_net_info, -# vmname_andid) -# ) - # If VM has PCI devices or SRIOV reserve memory for VM if reserve_memory: - memReserve = vm_obj.config.hardware.memoryMB - spec = vim.vm.ConfigSpec() - spec.memoryAllocation = vim.ResourceAllocationInfo(reservation=memReserve) - task = vm_obj.ReconfigVM_Task(spec=spec) - if task: - result = self.wait_for_vcenter_task(task, vcenter_conect) - self.logger.info("Reserved memory {} MB for " - "VM VM status: {}".format(str(memReserve), result)) - else: - self.logger.info("Fail to reserved memory {} to VM {}".format( - str(memReserve), str(vm_obj))) + self.reserve_memory_for_all_vms(vapp, memory_mb) self.logger.debug("new_vminstance(): starting power on vApp {} ".format(vmname_andid)) @@ -4642,6 +4610,78 @@ class vimconnector(vimconn.vimconnector): raise vimconn.vimconnException(message=exp) + def reserve_memory_for_all_vms(self, vapp, memory_mb): + """ + Method to reserve memory for all VMs + Args : + vapp - VApp + memory_mb - Memory in MB + Returns: + None + """ + + self.logger.info("Reserve memory for all VMs") + for vms in vapp.get_all_vms(): + vm_id = vms.get('id').split(':')[-1] + + url_rest_call = "{}/api/vApp/vm-{}/virtualHardwareSection/memory".format(self.url, vm_id) + + headers = {'Accept':'application/*+xml;version=' + API_VERSION, + 'x-vcloud-authorization': self.client._session.headers['x-vcloud-authorization']} + headers['Content-Type'] = 'application/vnd.vmware.vcloud.rasdItem+xml' + response = self.perform_request(req_type='GET', + url=url_rest_call, + headers=headers) + + if response.status_code == 403: + response = self.retry_rest('GET', url_rest_call) + + if response.status_code != 200: + self.logger.error("REST call {} failed reason : {}"\ + "status code : {}".format(url_rest_call, + response.content, + response.status_code)) + raise vimconn.vimconnException("reserve_memory_for_all_vms : Failed to get "\ + "memory") + + bytexml = bytes(bytearray(response.content, encoding='utf-8')) + contentelem = lxmlElementTree.XML(bytexml) + namespaces = {prefix:uri for prefix,uri in contentelem.nsmap.iteritems() if prefix} + namespaces["xmlns"]= "http://www.vmware.com/vcloud/v1.5" + + # Find the reservation element in the response + memelem_list = contentelem.findall(".//rasd:Reservation", namespaces) + for memelem in memelem_list: + memelem.text = str(memory_mb) + + newdata = lxmlElementTree.tostring(contentelem, pretty_print=True) + + response = self.perform_request(req_type='PUT', + url=url_rest_call, + headers=headers, + data=newdata) + + if response.status_code == 403: + add_headers = {'Content-Type': headers['Content-Type']} + response = self.retry_rest('PUT', url_rest_call, add_headers, newdata) + + if response.status_code != 202: + self.logger.error("REST call {} failed reason : {}"\ + "status code : {} ".format(url_rest_call, + response.content, + response.status_code)) + raise vimconn.vimconnException("reserve_memory_for_all_vms : Failed to update "\ + "virtual hardware memory section") + else: + mem_task = self.get_task_from_response(response.content) + result = self.client.get_task_monitor().wait_for_success(task=mem_task) + if result.get('status') == 'success': + self.logger.info("reserve_memory_for_all_vms(): VM {} succeeded "\ + .format(vm_id)) + else: + self.logger.error("reserve_memory_for_all_vms(): VM {} failed "\ + .format(vm_id)) + def remove_primary_network_adapter_from_all_vms(self, vapp): """ Method to remove network adapter type to vm @@ -4866,6 +4906,10 @@ class vimconnector(vimconn.vimconnector): "network connection section") data = response.content data = data.split('' not in data: self.logger.debug("add_network_adapter PrimaryNIC not in data nic_type {}".format(nic_type)) item = """{} @@ -4875,7 +4919,7 @@ class vimconnector(vimconn.vimconnector): {} {} """.format(primary_nic_index, network_name, nicIndex, - allocation_mode, nic_type) + allocation_mode, vcd_netadapter_type) # Stub for ip_address feature if ip_address: ip_tag = '{}'.format(ip_address) @@ -4894,7 +4938,7 @@ class vimconnector(vimconn.vimconnector): {} {} """.format(network_name, nicIndex, - allocation_mode, nic_type) + allocation_mode, vcd_netadapter_type) # Stub for ip_address feature if ip_address: ip_tag = '{}'.format(ip_address)