X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=RO-VIM-vmware%2Fosm_rovim_vmware%2Fvimconn_vmware.py;h=907e20f88c492c2418d2d41130579e28b0caa44b;hb=refs%2Fchanges%2F05%2F14405%2F2;hp=e06b2f91b4ea0adbc1d041ce93571c8e08d48f57;hpb=89598d4d70c054f0892eb7f922c6c8dff09a7ba5;p=osm%2FRO.git
diff --git a/RO-VIM-vmware/osm_rovim_vmware/vimconn_vmware.py b/RO-VIM-vmware/osm_rovim_vmware/vimconn_vmware.py
index e06b2f91..907e20f8 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:
@@ -936,7 +829,8 @@ class vimconnector(vimconn.VimConnector):
def get_network(self, net_id):
"""Method obtains network details of net_id VIM network
- Return a dict with the fields at filter_dict (see get_network_list) plus some VIM specific>}, ...]"""
+ Return a dict with the fields at filter_dict (see get_network_list) plus some VIM specific>}, ...]
+ """
try:
_, vdc = self.get_vdc_details()
vdc_id = vdc.get("id").split(":")[3]
@@ -1026,19 +920,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):
@@ -1372,9 +1253,9 @@ class vimconnector(vimconn.VimConnector):
"x-vcloud-authorization"
],
}
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.uploadVAppTemplateParams+xml"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.uploadVAppTemplateParams+xml"
+ )
response = self.perform_request(
req_type="POST", url=catalog_href, headers=headers, data=data
@@ -1800,69 +1681,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.
@@ -2172,9 +1990,9 @@ class vimconnector(vimconn.VimConnector):
).group(1)
# cores = re.search('(\d+)', result).group(1)
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml"
+ )
vdc_id = vdc.get("id").split(":")[-1]
instantiate_vapp_href = (
"{}/api/vdc/{}/action/instantiateVAppTemplate".format(
@@ -2841,59 +2659,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 +3185,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 +3945,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 +3955,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.
@@ -4507,15 +4220,15 @@ class vimconnector(vimconn.VimConnector):
child.attrib["type"]
== "application/vnd.vmware.vcloud.orgNetwork+xml"
):
- network_list[
- child.attrib["href"].split("/")[-1:][0]
- ] = child.attrib["name"]
+ network_list[child.attrib["href"].split("/")[-1:][0]] = (
+ child.attrib["name"]
+ )
org_dict["networks"] = network_list
if child.attrib["type"] == "application/vnd.vmware.vcloud.catalog+xml":
- catalog_list[
- child.attrib["href"].split("/")[-1:][0]
- ] = child.attrib["name"]
+ catalog_list[child.attrib["href"].split("/")[-1:][0]] = (
+ child.attrib["name"]
+ )
org_dict["catalogs"] = catalog_list
except Exception:
pass
@@ -4586,76 +4299,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
@@ -4797,9 +4440,9 @@ class vimconnector(vimconn.VimConnector):
for configuration in child.iter():
tagKey = configuration.tag.split("}")[1].strip()
if tagKey != "":
- network_configuration[
- tagKey
- ] = configuration.text.strip()
+ network_configuration[tagKey] = (
+ configuration.text.strip()
+ )
except Exception as exp:
self.logger.debug("get_vcd_network: Failed with Exception {}".format(exp))
@@ -5345,9 +4988,9 @@ class vimconnector(vimconn.VimConnector):
""".format(
vdc_name, vdc_template_ref
)
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.instantiateVdcTemplateParams+xml"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.instantiateVdcTemplateParams+xml"
+ )
response = self.perform_request(
req_type="POST", url=vm_list_rest_call, headers=headers, data=data
)
@@ -5367,139 +5010,28 @@ 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:
- return None
-
- url_list = [self.url, "/api/admin/org/", self.org_uuid]
- vm_list_rest_call = "".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
+ if vapp_uuid is None:
+ return None
url_list = [self.url, "/api/vApp/vapp-", vapp_uuid]
get_vapp_restcall = "".join(url_list)
@@ -5570,9 +5102,9 @@ class vimconnector(vimconn.VimConnector):
ip_ranges = scope.getchildren()
for ipblock in ip_ranges:
for block in ipblock:
- parsed_respond[
- block.tag.split("}")[1]
- ] = block.text
+ parsed_respond[block.tag.split("}")[1]] = (
+ block.text
+ )
else:
parsed_respond[tag_key] = scope.text
@@ -5660,9 +5192,9 @@ class vimconnector(vimconn.VimConnector):
if link.attrib["rel"] == "edit" and link.attrib[
"href"
].endswith("/disks"):
- vm_virtual_hardware_info[
- "disk_edit_href"
- ] = link.attrib["href"]
+ vm_virtual_hardware_info["disk_edit_href"] = (
+ link.attrib["href"]
+ )
break
parsed_respond["vm_virtual_hardware"] = vm_virtual_hardware_info
@@ -5675,33 +5207,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
@@ -5801,9 +5306,9 @@ class vimconnector(vimconn.VimConnector):
)
# Send PUT request to modify disk size
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.rasdItemsList+xml; charset=ISO-8859-1"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.rasdItemsList+xml; charset=ISO-8859-1"
+ )
response = self.perform_request(
req_type="PUT", url=disk_href, headers=headers, data=data
@@ -6329,14 +5834,14 @@ class vimconnector(vimconn.VimConnector):
].spec.ip.ipAddress
for device in vm_obj.config.hardware.device:
- if type(device) == vim.vm.device.VirtualPCIPassthrough:
+ if device.isinstance(vim.vm.device.VirtualPCIPassthrough):
device_details = {
"devide_id": device.backing.id,
"pciSlotNumber": device.slotInfo.pciSlotNumber,
}
- vm_pci_devices_info[
- device.deviceInfo.label
- ] = device_details
+ vm_pci_devices_info[device.deviceInfo.label] = (
+ device_details
+ )
else:
self.logger.error(
"Can not connect to vCenter while getting "
@@ -6481,9 +5986,9 @@ class vimconnector(vimconn.VimConnector):
)
data = response.text
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.networkConfigSection+xml"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.networkConfigSection+xml"
+ )
net_id = self.get_network_id_by_name(net_name)
if not net_id:
raise vimconn.VimConnException(
@@ -6598,9 +6103,9 @@ class vimconnector(vimconn.VimConnector):
data = response.text
data = data.split('
"
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.networkConnectionSection+xml"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.networkConnectionSection+xml"
+ )
response = self.perform_request(
req_type="PUT", url=url_rest_call, headers=headers, data=data
@@ -6941,9 +6446,9 @@ class vimconnector(vimconn.VimConnector):
data = data + new_item + ""
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.networkConnectionSection+xml"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.networkConnectionSection+xml"
+ )
response = self.perform_request(
req_type="PUT", url=url_rest_call, headers=headers, data=data
@@ -7042,197 +6547,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
@@ -7357,9 +6671,9 @@ if [ "$1" = "precustomization" ];then
)
# Send PUT request to modify virtual hardware section with new disk
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.rasdItemsList+xml; charset=ISO-8859-1"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.rasdItemsList+xml; charset=ISO-8859-1"
+ )
response = self.perform_request(
req_type="PUT", url=disk_href, data=new_data, headers=headers
@@ -7762,157 +7076,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 +7097,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 +7138,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 +7197,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.
@@ -8383,9 +7258,9 @@ if [ "$1" = "precustomization" ];then
for vms in vapp.get_all_vms():
vm_id = vms.get("id").split(":")[-1]
- headers[
- "Content-Type"
- ] = "application/vnd.vmware.vcloud.mediaInsertOrEjectParams+xml"
+ headers["Content-Type"] = (
+ "application/vnd.vmware.vcloud.mediaInsertOrEjectParams+xml"
+ )
rest_url = "{}/api/vApp/vm-{}/media/action/insertMedia".format(
self.url, vm_id
)