X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FRO.git;a=blobdiff_plain;f=RO-VIM-vmware%2Fosm_rovim_vmware%2Fvimconn_vmware.py;fp=RO-VIM-vmware%2Fosm_rovim_vmware%2Fvimconn_vmware.py;h=39033cf2487f58cd66359ec5841d31dc5984ff19;hp=e06b2f91b4ea0adbc1d041ce93571c8e08d48f57;hb=eaccf71d78032c68f6fb4dadfc98308f007b63af;hpb=d0571febfae2dea93305bd99d09ff52204c26662 diff --git a/RO-VIM-vmware/osm_rovim_vmware/vimconn_vmware.py b/RO-VIM-vmware/osm_rovim_vmware/vimconn_vmware.py index e06b2f91..39033cf2 100644 --- a/RO-VIM-vmware/osm_rovim_vmware/vimconn_vmware.py +++ b/RO-VIM-vmware/osm_rovim_vmware/vimconn_vmware.py @@ -693,113 +693,6 @@ class vimconnector(vimconn.VimConnector): "Failed create a new network {}".format(net_name) ) - def get_vcd_network_list(self): - """Method available organization for a logged in tenant - - Returns: - The return vca object that letter can be used to connect to vcloud direct as admin - """ - - self.logger.debug( - "get_vcd_network_list(): retrieving network list for vcd {}".format( - self.tenant_name - ) - ) - - if not self.tenant_name: - raise vimconn.VimConnConnectionException("Tenant name is empty.") - - _, vdc = self.get_vdc_details() - if vdc is None: - raise vimconn.VimConnConnectionException( - "Can't retrieve information for a VDC {}".format(self.tenant_name) - ) - - vdc_uuid = vdc.get("id").split(":")[3] - if self.client._session: - headers = { - "Accept": "application/*+xml;version=" + API_VERSION, - "x-vcloud-authorization": self.client._session.headers[ - "x-vcloud-authorization" - ], - } - response = self.perform_request( - req_type="GET", url=vdc.get("href"), headers=headers - ) - - if response.status_code != 200: - self.logger.error("Failed to get vdc content") - raise vimconn.VimConnNotFoundException("Failed to get vdc content") - else: - content = XmlElementTree.fromstring(response.text) - - network_list = [] - try: - for item in content: - if item.tag.split("}")[-1] == "AvailableNetworks": - for net in item: - response = self.perform_request( - req_type="GET", url=net.get("href"), headers=headers - ) - - if response.status_code != 200: - self.logger.error("Failed to get network content") - raise vimconn.VimConnNotFoundException( - "Failed to get network content" - ) - else: - net_details = XmlElementTree.fromstring(response.text) - - filter_dict = {} - net_uuid = net_details.get("id").split(":") - - if len(net_uuid) != 4: - continue - else: - net_uuid = net_uuid[3] - # create dict entry - self.logger.debug( - "get_vcd_network_list(): Adding network {} " - "to a list vcd id {} network {}".format( - net_uuid, vdc_uuid, net_details.get("name") - ) - ) - filter_dict["name"] = net_details.get("name") - filter_dict["id"] = net_uuid - - if [ - i.text - for i in net_details - if i.tag.split("}")[-1] == "IsShared" - ][0] == "true": - shared = True - else: - shared = False - - filter_dict["shared"] = shared - filter_dict["tenant_id"] = vdc_uuid - - if int(net_details.get("status")) == 1: - filter_dict["admin_state_up"] = True - else: - filter_dict["admin_state_up"] = False - - filter_dict["status"] = "ACTIVE" - filter_dict["type"] = "bridge" - network_list.append(filter_dict) - self.logger.debug( - "get_vcd_network_list adding entry {}".format( - filter_dict - ) - ) - except Exception: - self.logger.debug("Error in get_vcd_network_list", exc_info=True) - pass - - self.logger.debug("get_vcd_network_list returning {}".format(network_list)) - - return network_list - def get_network_list(self, filter_dict={}): """Obtain tenant networks of VIM Filter_dict can be: @@ -1026,19 +919,6 @@ class vimconnector(vimconn.VimConnector): :param created_items: dictionary with extra items to be deleted. provided by method new_network Returns the network identifier or raises an exception upon error or when network is not found """ - - # ############# Stub code for SRIOV ################# - # dvport_group = self.get_dvport_group(net_id) - # if dvport_group: - # #delete portgroup - # status = self.destroy_dvport_group(net_id) - # if status: - # # Remove vlanID from persistent info - # if net_id in self.persistent_info["used_vlanIDs"]: - # del self.persistent_info["used_vlanIDs"][net_id] - # - # return net_id - vcd_network = self.get_vcd_network(network_uuid=net_id) if vcd_network is not None and vcd_network: if self.delete_network_action(network_uuid=net_id): @@ -1800,69 +1680,6 @@ class vimconnector(vimconn.VimConnector): "Exception occured while retriving catalog items {}".format(exp) ) - def get_vappid(self, vdc=None, vapp_name=None): - """Method takes vdc object and vApp name and returns vapp uuid or None - - Args: - vdc: The VDC object. - vapp_name: is application vappp name identifier - - Returns: - The return vApp name otherwise None - """ - if vdc is None or vapp_name is None: - return None - - # UUID has following format https://host/api/vApp/vapp-30da58a3-e7c7-4d09-8f68-d4c8201169cf - try: - refs = [ - ref - for ref in vdc.ResourceEntities.ResourceEntity - if ref.name == vapp_name - and ref.type_ == "application/vnd.vmware.vcloud.vApp+xml" - ] - - if len(refs) == 1: - return refs[0].href.split("vapp")[1][1:] - except Exception as e: - self.logger.exception(e) - return False - - return None - - def check_vapp(self, vdc=None, vapp_uuid=None): - """Method Method returns True or False if vapp deployed in vCloud director - - Args: - vca: Connector to VCA - vdc: The VDC object. - vappid: vappid is application identifier - - Returns: - The return True if vApp deployed - :param vdc: - :param vapp_uuid: - """ - try: - refs = [ - ref - for ref in vdc.ResourceEntities.ResourceEntity - if ref.type_ == "application/vnd.vmware.vcloud.vApp+xml" - ] - - for ref in refs: - vappid = ref.href.split("vapp")[1][1:] - # find vapp with respected vapp uuid - - if vappid == vapp_uuid: - return True - except Exception as e: - self.logger.exception(e) - - return False - - return False - def get_namebyvappid(self, vapp_uuid=None): """Method returns vApp name from vCD and lookup done by vapp_id. @@ -2841,59 +2658,6 @@ class vimconnector(vimconn.VimConnector): "The upload iso task failed with status {}".format(result.get("status")) ) - def get_vcd_availibility_zones(self, respool_href, headers): - """Method to find presence of av zone is VIM resource pool - - Args: - respool_href - resource pool href - headers - header information - - Returns: - vcd_az - list of azone present in vCD - """ - vcd_az = [] - url = respool_href - resp = self.perform_request(req_type="GET", url=respool_href, headers=headers) - - if resp.status_code != requests.codes.ok: - self.logger.debug( - "REST API call {} failed. Return status code {}".format( - url, resp.status_code - ) - ) - else: - # Get the href to hostGroups and find provided hostGroup is present in it - resp_xml = XmlElementTree.fromstring(resp.content) - for child in resp_xml: - if "VMWProviderVdcResourcePool" in child.tag: - for schild in child: - if "Link" in schild.tag: - if ( - schild.attrib.get("type") - == "application/vnd.vmware.admin.vmwHostGroupsType+xml" - ): - hostGroup = schild.attrib.get("href") - hg_resp = self.perform_request( - req_type="GET", url=hostGroup, headers=headers - ) - - if hg_resp.status_code != requests.codes.ok: - self.logger.debug( - "REST API call {} failed. Return status code {}".format( - hostGroup, hg_resp.status_code - ) - ) - else: - hg_resp_xml = XmlElementTree.fromstring( - hg_resp.content - ) - for hostGroup in hg_resp_xml: - if "HostGroup" in hostGroup.tag: - # append host group name to the list - vcd_az.append(hostGroup.attrib.get("name")) - - return vcd_az - def set_availability_zones(self): """ Set vim availability zone @@ -3420,21 +3184,6 @@ class vimconnector(vimconn.VimConnector): raise vimconn.VimConnException(msg) - # # - # # - # # based on current discussion - # # - # # - # # server: - # created: '2016-09-08T11:51:58' - # description: simple-instance.linux1.1 - # flavor: ddc6776e-75a9-11e6-ad5f-0800273e724c - # hostId: e836c036-74e7-11e6-b249-0800273e724c - # image: dde30fe6-75a9-11e6-ad5f-0800273e724c - # status: ACTIVE - # error_msg: - # interfaces: … - # def get_vminstance(self, vim_vm_uuid=None): """Returns the VM instance information from VIM""" self.logger.debug("Client requesting vm instance {} ".format(vim_vm_uuid)) @@ -4195,14 +3944,6 @@ class vimconnector(vimconn.VimConnector): return console_dict - # NOT USED METHODS in current version - - def host_vim2gui(self, host, server_dict): - """Transform host dictionary from VIM format to GUI format, - and append to the server_dict - """ - raise vimconn.VimConnNotImplemented("Should have implemented this") - def get_hosts_info(self): """Get the information of deployed hosts Returns the hosts content""" @@ -4213,35 +3954,6 @@ class vimconnector(vimconn.VimConnector): Returns the hosts content""" raise vimconn.VimConnNotImplemented("Should have implemented this") - def get_processor_rankings(self): - """Get the processor rankings in the VIM database""" - raise vimconn.VimConnNotImplemented("Should have implemented this") - - def new_host(self, host_data): - """Adds a new host to VIM""" - """Returns status code of the VIM response""" - raise vimconn.VimConnNotImplemented("Should have implemented this") - - def new_external_port(self, port_data): - """Adds a external port to VIM""" - """Returns the port identifier""" - raise vimconn.VimConnNotImplemented("Should have implemented this") - - def new_external_network(self, net_name, net_type): - """Adds a external network to VIM (shared)""" - """Returns the network identifier""" - raise vimconn.VimConnNotImplemented("Should have implemented this") - - def connect_port_network(self, port_id, network_id, admin=False): - """Connects a external port to a network""" - """Returns status code of the VIM response""" - raise vimconn.VimConnNotImplemented("Should have implemented this") - - def new_vminstancefromJSON(self, vm_data): - """Adds a VM instance to VIM""" - """Returns the instance identifier""" - raise vimconn.VimConnNotImplemented("Should have implemented this") - def get_network_name_by_id(self, network_uuid=None): """Method gets vcloud director network named based on supplied uuid. @@ -4586,76 +4298,6 @@ class vimconnector(vimconn.VimConnector): return None - def get_vapp_list(self, vdc_name=None): - """ - Method retrieves vApp list deployed vCloud director and returns a dictionary - contains a list of all vapp deployed for queried VDC. - The key for a dictionary is vApp UUID - - - Args: - vca - is active VCA connection. - vdc_name - is a vdc name that will be used to query vms action - - Returns: - The return dictionary and key for each entry vapp UUID - """ - vapp_dict = {} - - if vdc_name is None: - return vapp_dict - - content = self.vms_view_action(vdc_name=vdc_name) - try: - vm_list_xmlroot = XmlElementTree.fromstring(content) - for vm_xml in vm_list_xmlroot: - if vm_xml.tag.split("}")[1] == "VMRecord": - if vm_xml.attrib["isVAppTemplate"] == "true": - rawuuid = vm_xml.attrib["container"].split("/")[-1:] - if "vappTemplate-" in rawuuid[0]: - # vm in format vappTemplate-e63d40e7-4ff5-4c6d-851f-96c1e4da86a5 we remove - # vm and use raw UUID as key - vapp_dict[rawuuid[0][13:]] = vm_xml.attrib - except Exception: - pass - - return vapp_dict - - def get_vm_list(self, vdc_name=None): - """ - Method retrieves VM's list deployed vCloud director. It returns a dictionary - contains a list of all VM's deployed for queried VDC. - The key for a dictionary is VM UUID - - - Args: - vca - is active VCA connection. - vdc_name - is a vdc name that will be used to query vms action - - Returns: - The return dictionary and key for each entry vapp UUID - """ - vm_dict = {} - - if vdc_name is None: - return vm_dict - - content = self.vms_view_action(vdc_name=vdc_name) - try: - vm_list_xmlroot = XmlElementTree.fromstring(content) - for vm_xml in vm_list_xmlroot: - if vm_xml.tag.split("}")[1] == "VMRecord": - if vm_xml.attrib["isVAppTemplate"] == "false": - rawuuid = vm_xml.attrib["href"].split("/")[-1:] - if "vm-" in rawuuid[0]: - # vm in format vm-e63d40e7-4ff5-4c6d-851f-96c1e4da86a5 we remove - # vm and use raw UUID as key - vm_dict[rawuuid[0][3:]] = vm_xml.attrib - except Exception: - pass - - return vm_dict - def get_vapp(self, vdc_name=None, vapp_name=None, isuuid=False): """ Method retrieves VM deployed vCloud director. It returns VM attribute as dictionary @@ -5367,147 +5009,36 @@ class vimconnector(vimconn.VimConnector): return None - def create_vdc_rest(self, vdc_name=None): + def get_vapp_details_rest(self, vapp_uuid=None, need_admin_access=False): """ - Method create network in vCloud director + Method retrieve vapp detail from vCloud director Args: - vdc_name - vdc name to be created + vapp_uuid - is vapp identifier. + Returns: - The return response + The return network uuid or return None """ - self.logger.info("Creating new vdc {}".format(vdc_name)) - vca = self.connect_as_admin() + parsed_respond = {} + vca = None + + if need_admin_access: + vca = self.connect_as_admin() + else: + vca = self.client if not vca: raise vimconn.VimConnConnectionException("Failed to connect vCD") - - if vdc_name is None: + if vapp_uuid is None: return None - url_list = [self.url, "/api/admin/org/", self.org_uuid] - vm_list_rest_call = "".join(url_list) + url_list = [self.url, "/api/vApp/vapp-", vapp_uuid] + get_vapp_restcall = "".join(url_list) if vca._session: headers = { "Accept": "application/*+xml;version=" + API_VERSION, - "x-vcloud-authorization": self.client._session.headers[ - "x-vcloud-authorization" - ], - } - response = self.perform_request( - req_type="GET", url=vm_list_rest_call, headers=headers - ) - provider_vdc_ref = None - add_vdc_rest_url = None - # available_networks = None - - if response.status_code != requests.codes.ok: - self.logger.debug( - "REST API call {} failed. Return status code {}".format( - vm_list_rest_call, response.status_code - ) - ) - - return None - else: - try: - vm_list_xmlroot = XmlElementTree.fromstring(response.text) - for child in vm_list_xmlroot: - # application/vnd.vmware.admin.providervdc+xml - if child.tag.split("}")[1] == "Link": - if ( - child.attrib.get("type") - == "application/vnd.vmware.admin.createVdcParams+xml" - and child.attrib.get("rel") == "add" - ): - add_vdc_rest_url = child.attrib.get("href") - except Exception: - self.logger.debug( - "Failed parse respond for rest api call {}".format( - vm_list_rest_call - ) - ) - self.logger.debug("Respond body {}".format(response.text)) - - return None - - response = self.get_provider_rest(vca=vca) - try: - vm_list_xmlroot = XmlElementTree.fromstring(response) - for child in vm_list_xmlroot: - if child.tag.split("}")[1] == "ProviderVdcReferences": - for sub_child in child: - provider_vdc_ref = sub_child.attrib.get("href") - except Exception: - self.logger.debug( - "Failed parse respond for rest api call {}".format( - vm_list_rest_call - ) - ) - self.logger.debug("Respond body {}".format(response)) - - return None - - if add_vdc_rest_url is not None and provider_vdc_ref is not None: - data = """ {1:s} - ReservationPool - MHz20482048 - MB20482048 - 0100 - trueMB20480true - - true""".format( - escape(vdc_name), escape(vdc_name), provider_vdc_ref - ) - headers[ - "Content-Type" - ] = "application/vnd.vmware.admin.createVdcParams+xml" - response = self.perform_request( - req_type="POST", - url=add_vdc_rest_url, - headers=headers, - data=data, - ) - - # if we all ok we respond with content otherwise by default None - if response.status_code == 201: - return response.text - - return None - - def get_vapp_details_rest(self, vapp_uuid=None, need_admin_access=False): - """ - Method retrieve vapp detail from vCloud director - - Args: - vapp_uuid - is vapp identifier. - - Returns: - The return network uuid or return None - """ - parsed_respond = {} - vca = None - - if need_admin_access: - vca = self.connect_as_admin() - else: - vca = self.client - - if not vca: - raise vimconn.VimConnConnectionException("Failed to connect vCD") - if vapp_uuid is None: - return None - - url_list = [self.url, "/api/vApp/vapp-", vapp_uuid] - get_vapp_restcall = "".join(url_list) - - if vca._session: - headers = { - "Accept": "application/*+xml;version=" + API_VERSION, - "x-vcloud-authorization": vca._session.headers[ + "x-vcloud-authorization": vca._session.headers[ "x-vcloud-authorization" ], } @@ -5675,33 +5206,6 @@ class vimconnector(vimconn.VimConnector): return parsed_respond - def acquire_console(self, vm_uuid=None): - if vm_uuid is None: - return None - - if self.client._session: - headers = { - "Accept": "application/*+xml;version=" + API_VERSION, - "x-vcloud-authorization": self.client._session.headers[ - "x-vcloud-authorization" - ], - } - vm_dict = self.get_vapp_details_rest(vapp_uuid=vm_uuid) - console_dict = vm_dict["acquireTicket"] - console_rest_call = console_dict["href"] - - response = self.perform_request( - req_type="POST", url=console_rest_call, headers=headers - ) - - if response.status_code == 403: - response = self.retry_rest("POST", console_rest_call) - - if response.status_code == requests.codes.ok: - return response.text - - return None - def modify_vm_disk(self, vapp_uuid, flavor_disk): """ Method retrieve vm disk details @@ -7042,197 +6546,6 @@ class vimconnector(vimconn.VimConnector): "affinity".format(exp) ) - def cloud_init(self, vapp, cloud_config): - """ - Method to inject ssh-key - vapp - vapp object - cloud_config a dictionary with: - 'key-pairs': (optional) list of strings with the public key to be inserted to the default user - 'users': (optional) list of users to be inserted, each item is a dict with: - 'name': (mandatory) user name, - 'key-pairs': (optional) list of strings with the public key to be inserted to the user - 'user-data': (optional) can be a string with the text script to be passed directly to cloud-init, - or a list of strings, each one contains a script to be passed, usually with a MIMEmultipart file - 'config-files': (optional). List of files to be transferred. Each item is a dict with: - 'dest': (mandatory) string with the destination absolute path - 'encoding': (optional, by default text). Can be one of: - 'b64', 'base64', 'gz', 'gz+b64', 'gz+base64', 'gzip+b64', 'gzip+base64' - 'content' (mandatory): string with the content of the file - 'permissions': (optional) string with file permissions, typically octal notation '0644' - 'owner': (optional) file owner, string with the format 'owner:group' - 'boot-data-drive': boolean to indicate if user-data must be passed using a boot drive (hard disk - """ - try: - if not isinstance(cloud_config, dict): - raise Exception( - "cloud_init : parameter cloud_config is not a dictionary" - ) - else: - key_pairs = [] - userdata = [] - - if "key-pairs" in cloud_config: - key_pairs = cloud_config["key-pairs"] - - if "users" in cloud_config: - userdata = cloud_config["users"] - - self.logger.debug("cloud_init : Guest os customization started..") - customize_script = self.format_script( - key_pairs=key_pairs, users_list=userdata - ) - customize_script = customize_script.replace("&", "&") - self.guest_customization(vapp, customize_script) - except Exception as exp: - self.logger.error( - "cloud_init : exception occurred while injecting " "ssh-key" - ) - - raise vimconn.VimConnException( - "cloud_init : Error {} failed to inject " "ssh-key".format(exp) - ) - - def format_script(self, key_pairs=[], users_list=[]): - bash_script = """#!/bin/sh -echo performing customization tasks with param $1 at `date "+DATE: %Y-%m-%d - TIME: %H:%M:%S"`>> /root/customization.log -if [ "$1" = "precustomization" ];then - echo performing precustomization tasks on `date "+DATE: %Y-%m-%d - TIME: %H:%M:%S"` >> /root/customization.log -""" - - keys = "\n".join(key_pairs) - if keys: - keys_data = """ - if [ ! -d /root/.ssh ];then - mkdir /root/.ssh - chown root:root /root/.ssh - chmod 700 /root/.ssh - touch /root/.ssh/authorized_keys - chown root:root /root/.ssh/authorized_keys - chmod 600 /root/.ssh/authorized_keys - # make centos with selinux happy - which restorecon && restorecon -Rv /root/.ssh - else - touch /root/.ssh/authorized_keys - chown root:root /root/.ssh/authorized_keys - chmod 600 /root/.ssh/authorized_keys - fi - echo '{key}' >> /root/.ssh/authorized_keys - """.format( - key=keys - ) - - bash_script += keys_data - - for user in users_list: - if "name" in user: - user_name = user["name"] - - if "key-pairs" in user: - user_keys = "\n".join(user["key-pairs"]) - else: - user_keys = None - - add_user_name = """ - useradd -d /home/{user_name} -m -g users -s /bin/bash {user_name} - """.format( - user_name=user_name - ) - - bash_script += add_user_name - - if user_keys: - user_keys_data = """ - mkdir /home/{user_name}/.ssh - chown {user_name}:{user_name} /home/{user_name}/.ssh - chmod 700 /home/{user_name}/.ssh - touch /home/{user_name}/.ssh/authorized_keys - chown {user_name}:{user_name} /home/{user_name}/.ssh/authorized_keys - chmod 600 /home/{user_name}/.ssh/authorized_keys - # make centos with selinux happy - which restorecon && restorecon -Rv /home/{user_name}/.ssh - echo '{user_key}' >> /home/{user_name}/.ssh/authorized_keys - """.format( - user_name=user_name, user_key=user_keys - ) - bash_script += user_keys_data - - return bash_script + "\n\tfi" - - def guest_customization(self, vapp, customize_script): - """ - Method to customize guest os - vapp - Vapp object - customize_script - Customize script to be run at first boot of VM. - """ - for vm in vapp.get_all_vms(): - vm_id = vm.get("id").split(":")[-1] - vm_name = vm.get("name") - vm_name = vm_name.replace("_", "-") - - vm_customization_url = ( - "{}/api/vApp/vm-{}/guestCustomizationSection/".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.guestCustomizationSection+xml" - - data = """ - Specifies Guest OS Customization Settings - true - false - {} - false - false - false - true - false - 0 - false - {} - {} - - - """.format( - vm_customization_url, - vm_id, - customize_script, - vm_name, - vm_customization_url, - ) - - response = self.perform_request( - req_type="PUT", url=vm_customization_url, headers=headers, data=data - ) - if response.status_code == 202: - guest_task = self.get_task_from_response(response.text) - self.client.get_task_monitor().wait_for_success(task=guest_task) - self.logger.info( - "guest_customization : customized guest os task " - "completed for VM {}".format(vm_name) - ) - else: - self.logger.error( - "guest_customization : task for customized guest os" - "failed for VM {}".format(vm_name) - ) - - raise vimconn.VimConnException( - "guest_customization : failed to perform" - "guest os customization on VM {}".format(vm_name) - ) - def add_new_disk(self, vapp_uuid, disk_size): """ Method to create an empty vm disk @@ -7762,157 +7075,6 @@ if [ "$1" = "precustomization" ];then elif exp_type == "NotFound": raise vimconn.VimConnNotFoundException(message=msg) - def add_sriov(self, vapp_uuid, sriov_nets, vmname_andid): - """ - Method to attach SRIOV adapters to VM - - Args: - vapp_uuid - uuid of vApp/VM - sriov_nets - SRIOV devices infromation as specified in VNFD (flavor) - vmname_andid - vmname - - Returns: - The status of add SRIOV adapter task , vm object and - vcenter_conect object - """ - vm_obj = None - vcenter_conect, content = self.get_vcenter_content() - vm_moref_id = self.get_vm_moref_id(vapp_uuid) - - if vm_moref_id: - try: - no_of_sriov_devices = len(sriov_nets) - if no_of_sriov_devices > 0: - # Get VM and its host - host_obj, vm_obj = self.get_vm_obj(content, vm_moref_id) - self.logger.info( - "VM {} is currently on host {}".format(vm_obj, host_obj) - ) - - if host_obj and vm_obj: - # get SRIOV devies from host on which vapp is currently installed - avilable_sriov_devices = self.get_sriov_devices( - host_obj, - no_of_sriov_devices, - ) - - if len(avilable_sriov_devices) == 0: - # find other hosts with active pci devices - ( - new_host_obj, - avilable_sriov_devices, - ) = self.get_host_and_sriov_devices( - content, - no_of_sriov_devices, - ) - - if ( - new_host_obj is not None - and len(avilable_sriov_devices) > 0 - ): - # Migrate vm to the host where SRIOV devices are available - self.logger.info( - "Relocate VM {} on new host {}".format( - vm_obj, new_host_obj - ) - ) - task = self.relocate_vm(new_host_obj, vm_obj) - - if task is not None: - result = self.wait_for_vcenter_task( - task, vcenter_conect - ) - self.logger.info( - "Migrate VM status: {}".format(result) - ) - host_obj = new_host_obj - else: - self.logger.info( - "Fail to migrate VM : {}".format(result) - ) - - raise vimconn.VimConnNotFoundException( - "Fail to migrate VM : {} to host {}".format( - vmname_andid, new_host_obj - ) - ) - - if ( - host_obj is not None - and avilable_sriov_devices is not None - and len(avilable_sriov_devices) > 0 - ): - # Add SRIOV devices one by one - for sriov_net in sriov_nets: - network_name = sriov_net.get("net_id") - self.create_dvPort_group(network_name) - - if ( - sriov_net.get("type") == "VF" - or sriov_net.get("type") == "SR-IOV" - ): - # add vlan ID ,Modify portgroup for vlan ID - self.configure_vlanID( - content, vcenter_conect, network_name - ) - - task = self.add_sriov_to_vm( - content, - vm_obj, - host_obj, - network_name, - avilable_sriov_devices[0], - ) - - if task: - status = self.wait_for_vcenter_task( - task, vcenter_conect - ) - - if status: - self.logger.info( - "Added SRIOV {} to VM {}".format( - no_of_sriov_devices, str(vm_obj) - ) - ) - else: - self.logger.error( - "Fail to add SRIOV {} to VM {}".format( - no_of_sriov_devices, str(vm_obj) - ) - ) - - raise vimconn.VimConnUnexpectedResponse( - "Fail to add SRIOV adapter in VM {}".format( - str(vm_obj) - ) - ) - - return True, vm_obj, vcenter_conect - else: - self.logger.error( - "Currently there is no host with" - " {} number of avaialble SRIOV " - "VFs required for VM {}".format( - no_of_sriov_devices, vmname_andid - ) - ) - - raise vimconn.VimConnNotFoundException( - "Currently there is no host with {} " - "number of avaialble SRIOV devices required for VM {}".format( - no_of_sriov_devices, vmname_andid - ) - ) - else: - self.logger.debug( - "No infromation about SRIOV devices {} ", sriov_nets - ) - except vmodl.MethodFault as error: - self.logger.error("Error occurred while adding SRIOV {} ", error) - - return None, vm_obj, vcenter_conect - def get_sriov_devices(self, host, no_of_vfs): """ Method to get the details of SRIOV devices on given host @@ -7934,173 +7096,6 @@ if [ "$1" = "precustomization" ];then return sriovInfo - def get_host_and_sriov_devices(self, content, no_of_vfs): - """ - Method to get the details of SRIOV devices infromation on all hosts - - Args: - content - vSphere host object - no_of_vfs - number of pci VFs needed on host - - Returns: - array of SRIOV devices and host object - """ - host_obj = None - sriov_device_objs = None - - try: - if content: - container = content.viewManager.CreateContainerView( - content.rootFolder, [vim.HostSystem], True - ) - - for host in container.view: - devices = self.get_sriov_devices(host, no_of_vfs) - - if devices: - host_obj = host - sriov_device_objs = devices - break - except Exception as exp: - self.logger.error( - "Error {} occurred while finding SRIOV devices on host: {}".format( - exp, host_obj - ) - ) - - return host_obj, sriov_device_objs - - def add_sriov_to_vm(self, content, vm_obj, host_obj, network_name, sriov_device): - """ - Method to add SRIOV adapter to vm - - Args: - host_obj - vSphere host object - vm_obj - vSphere vm object - content - vCenter content object - network_name - name of distributed virtaul portgroup - sriov_device - SRIOV device info - - Returns: - task object - """ - devices = [] - vnic_label = "sriov nic" - - try: - dvs_portgr = self.get_dvport_group(network_name) - network_name = dvs_portgr.name - nic = vim.vm.device.VirtualDeviceSpec() - # VM device - nic.operation = vim.vm.device.VirtualDeviceSpec.Operation.add - nic.device = vim.vm.device.VirtualSriovEthernetCard() - nic.device.addressType = "assigned" - # nic.device.key = 13016 - nic.device.deviceInfo = vim.Description() - nic.device.deviceInfo.label = vnic_label - nic.device.deviceInfo.summary = network_name - nic.device.backing = vim.vm.device.VirtualEthernetCard.NetworkBackingInfo() - - nic.device.backing.network = self.get_obj( - content, [vim.Network], network_name - ) - nic.device.backing.deviceName = network_name - nic.device.backing.useAutoDetect = False - nic.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo() - nic.device.connectable.startConnected = True - nic.device.connectable.allowGuestControl = True - - nic.device.sriovBacking = ( - vim.vm.device.VirtualSriovEthernetCard.SriovBackingInfo() - ) - nic.device.sriovBacking.physicalFunctionBacking = ( - vim.vm.device.VirtualPCIPassthrough.DeviceBackingInfo() - ) - nic.device.sriovBacking.physicalFunctionBacking.id = sriov_device.id - - devices.append(nic) - vmconf = vim.vm.ConfigSpec(deviceChange=devices) - task = vm_obj.ReconfigVM_Task(vmconf) - - return task - except Exception as exp: - self.logger.error( - "Error {} occurred while adding SRIOV adapter in VM: {}".format( - exp, vm_obj - ) - ) - - return None - - def create_dvPort_group(self, network_name): - """ - Method to create disributed virtual portgroup - - Args: - network_name - name of network/portgroup - - Returns: - portgroup key - """ - try: - new_network_name = [network_name, "-", str(uuid.uuid4())] - network_name = "".join(new_network_name) - vcenter_conect, content = self.get_vcenter_content() - - dv_switch = self.get_obj( - content, [vim.DistributedVirtualSwitch], self.dvs_name - ) - - if dv_switch: - dv_pg_spec = vim.dvs.DistributedVirtualPortgroup.ConfigSpec() - dv_pg_spec.name = network_name - - dv_pg_spec.type = ( - vim.dvs.DistributedVirtualPortgroup.PortgroupType.earlyBinding - ) - dv_pg_spec.defaultPortConfig = ( - vim.dvs.VmwareDistributedVirtualSwitch.VmwarePortConfigPolicy() - ) - dv_pg_spec.defaultPortConfig.securityPolicy = ( - vim.dvs.VmwareDistributedVirtualSwitch.SecurityPolicy() - ) - dv_pg_spec.defaultPortConfig.securityPolicy.allowPromiscuous = ( - vim.BoolPolicy(value=False) - ) - dv_pg_spec.defaultPortConfig.securityPolicy.forgedTransmits = ( - vim.BoolPolicy(value=False) - ) - dv_pg_spec.defaultPortConfig.securityPolicy.macChanges = vim.BoolPolicy( - value=False - ) - - task = dv_switch.AddDVPortgroup_Task([dv_pg_spec]) - self.wait_for_vcenter_task(task, vcenter_conect) - - dvPort_group = self.get_obj( - content, [vim.dvs.DistributedVirtualPortgroup], network_name - ) - - if dvPort_group: - self.logger.info( - "Created disributed virtaul port group: {}".format(dvPort_group) - ) - return dvPort_group.key - else: - self.logger.debug( - "No disributed virtual switch found with name {}".format( - network_name - ) - ) - - except Exception as exp: - self.logger.error( - "Error occurred while creating disributed virtaul port group {}" - " : {}".format(network_name, exp) - ) - - return None - def reconfig_portgroup(self, content, dvPort_group_name, config_info={}): """ Method to reconfigure disributed virtual portgroup @@ -8142,36 +7137,6 @@ if [ "$1" = "precustomization" ];then return None - def destroy_dvport_group(self, dvPort_group_name): - """ - Method to destroy disributed virtual portgroup - - Args: - network_name - name of network/portgroup - - Returns: - True if portgroup successfully got deleted else false - """ - vcenter_conect, _ = self.get_vcenter_content() - - try: - status = None - dvPort_group = self.get_dvport_group(dvPort_group_name) - - if dvPort_group: - task = dvPort_group.Destroy_Task() - status = self.wait_for_vcenter_task(task, vcenter_conect) - - return status - except vmodl.MethodFault as exp: - self.logger.error( - "Caught vmodl fault {} while deleting disributed virtaul port group {}".format( - exp, dvPort_group_name - ) - ) - - return None - def get_dvport_group(self, dvPort_group_name): """ Method to get disributed virtual portgroup @@ -8231,97 +7196,6 @@ if [ "$1" = "precustomization" ];then return vlanId - def configure_vlanID(self, content, vcenter_conect, dvPort_group_name): - """ - Method to configure vlanID in disributed virtual portgroup vlanID - - Args: - network_name - name of network/portgroup - - Returns: - None - """ - vlanID = self.get_vlanID_from_dvs_portgr(dvPort_group_name) - - if vlanID == 0: - # configure vlanID - vlanID = self.genrate_vlanID(dvPort_group_name) - config = {"vlanID": vlanID} - task = self.reconfig_portgroup( - content, dvPort_group_name, config_info=config - ) - - if task: - status = self.wait_for_vcenter_task(task, vcenter_conect) - - if status: - self.logger.info( - "Reconfigured Port group {} for vlan ID {}".format( - dvPort_group_name, vlanID - ) - ) - else: - self.logger.error( - "Fail reconfigure portgroup {} for vlanID{}".format( - dvPort_group_name, vlanID - ) - ) - - def genrate_vlanID(self, network_name): - """ - Method to get unused vlanID - Args: - network_name - name of network/portgroup - Returns: - vlanID - """ - vlan_id = None - used_ids = [] - - if self.config.get("vlanID_range") is None: - raise vimconn.VimConnConflictException( - "You must provide a 'vlanID_range' " - "at config value before creating sriov network with vlan tag" - ) - - if "used_vlanIDs" not in self.persistent_info: - self.persistent_info["used_vlanIDs"] = {} - else: - used_ids = list(self.persistent_info["used_vlanIDs"].values()) - - for vlanID_range in self.config.get("vlanID_range"): - start_vlanid, end_vlanid = vlanID_range.split("-") - - if start_vlanid > end_vlanid: - raise vimconn.VimConnConflictException( - "Invalid vlan ID range {}".format(vlanID_range) - ) - - for vid in range(int(start_vlanid), int(end_vlanid) + 1): - if vid not in used_ids: - vlan_id = vid - self.persistent_info["used_vlanIDs"][network_name] = vlan_id - return vlan_id - - if vlan_id is None: - raise vimconn.VimConnConflictException("All Vlan IDs are in use") - - def get_obj(self, content, vimtype, name): - """ - Get the vsphere object associated with a given text name - """ - obj = None - container = content.viewManager.CreateContainerView( - content.rootFolder, vimtype, True - ) - - for item in container.view: - if item.name == name: - obj = item - break - - return obj - def insert_media_to_vm(self, vapp, image_id): """ Method to insert media CD-ROM (ISO image) from catalog to vm.