X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FRO.git;a=blobdiff_plain;f=RO-VIM-azure%2Fosm_rovim_azure%2Fvimconn_azure.py;h=c78b0f9238a040ea0fcc451aa733599ff170bb26;hp=71c7f5926b653f4593f4f0ad47c62b92483f1620;hb=c878ac41bd98ef064b8e8fd1d39dbd879095a722;hpb=c8138e84753752ccebda0e41b6a972184abe4abc;ds=sidebyside diff --git a/RO-VIM-azure/osm_rovim_azure/vimconn_azure.py b/RO-VIM-azure/osm_rovim_azure/vimconn_azure.py index 71c7f592..c78b0f92 100755 --- a/RO-VIM-azure/osm_rovim_azure/vimconn_azure.py +++ b/RO-VIM-azure/osm_rovim_azure/vimconn_azure.py @@ -49,6 +49,14 @@ if getenv("OSMRO_PDB_DEBUG"): pdb.set_trace() +def find_in_list(the_list, condition_lambda): + for item in the_list: + if condition_lambda(item): + return item + else: + return None + + class vimconnector(vimconn.VimConnector): # Translate azure provisioning state to OSM provision state @@ -253,6 +261,13 @@ class vimconnector(vimconn.VimConnector): if "flavors_pattern" in config: self._config["flavors_pattern"] = config["flavors_pattern"] + def _find_in_capabilities(self, capabilities, name): + cap = find_in_list(capabilities, lambda c: c["name"] == name) + if cap: + return cap.get("value") + else: + return None + def _reload_connection(self): """ Called before any operation, checks python azure clients @@ -1223,9 +1238,9 @@ class vimconnector(vimconn.VimConnector): try: self._reload_connection() vm_sizes_list = [ - vm_size.serialize() + vm_size.as_dict() for vm_size in self.conn_compute.resource_skus.list( - "location={}".format(self.region) + "location eq '{}'".format(self.region) ) ] @@ -1234,31 +1249,56 @@ class vimconnector(vimconn.VimConnector): numberInterfaces = len(filter_dict.get("interfaces", [])) or 0 # Filter - if self._config.get("flavors_pattern"): - filtered_sizes = [ - size - for size in vm_sizes_list - if size["capabilities"]["vCPUs"] >= cpus - and size["capabilities"]["MemoryGB"] >= memMB / 1024 - and size["capabilities"]["MaxNetworkInterfaces"] >= numberInterfaces - and re.search(self._config.get("flavors_pattern"), size["name"]) - ] - else: - filtered_sizes = [ - size - for size in vm_sizes_list - if size["capabilities"]["vCPUs"] >= cpus - and size["capabilities"]["MemoryGB"] >= memMB / 1024 - and size["capabilities"]["MaxNetworkInterfaces"] >= numberInterfaces - ] + filtered_sizes = [] + for size in vm_sizes_list: + if size["resource_type"] == "virtualMachines": + size_cpus = int( + self._find_in_capabilities(size["capabilities"], "vCPUs") + ) + size_memory = float( + self._find_in_capabilities(size["capabilities"], "MemoryGB") + ) + size_interfaces = self._find_in_capabilities( + size["capabilities"], "MaxNetworkInterfaces" + ) + if size_interfaces: + size_interfaces = int(size_interfaces) + else: + self.logger.debug( + "Flavor with no defined MaxNetworkInterfaces: {}".format( + size["name"] + ) + ) + continue + if ( + size_cpus >= cpus + and size_memory >= memMB / 1024 + and size_interfaces >= numberInterfaces + ): + if self._config.get("flavors_pattern"): + if re.search( + self._config.get("flavors_pattern"), size["name"] + ): + new_size = { + e["name"]: e["value"] for e in size["capabilities"] + } + new_size["name"] = size["name"] + filtered_sizes.append(new_size) + else: + new_size = { + e["name"]: e["value"] for e in size["capabilities"] + } + new_size["name"] = size["name"] + filtered_sizes.append(new_size) # Sort listedFilteredSizes = sorted( filtered_sizes, key=lambda k: ( - k["numberOfCores"], - k["memoryInMB"], - k["resourceDiskSizeInMB"], + int(k["vCPUs"]), + float(k["MemoryGB"]), + int(k["MaxNetworkInterfaces"]), + int(k["MaxResourceVolumeMB"]), ), ) @@ -1276,9 +1316,9 @@ class vimconnector(vimconn.VimConnector): try: self._reload_connection() vm_sizes_list = [ - vm_size.serialize() + vm_size.as_dict() for vm_size in self.conn_compute.resource_skus.list( - "location={}".format(self.region) + "location eq '{}'".format(self.region) ) ] @@ -2004,7 +2044,7 @@ if __name__ == "__main__": logger.debug("Network_list: {}".format(network_list)) logger.debug("List flavors") - flavors = azure.get_flavor_id_from_data({"vcpu": "2"}) + flavors = azure.get_flavor_id_from_data({"vcpus": 2}) logger.debug("flavors: {}".format(flavors)) """ @@ -2034,10 +2074,12 @@ if __name__ == "__main__": logger.debug("Vmachine: {}".format(vmachine)) """ + """ logger.debug("List images") image = azure.get_image_list({"name": "Canonical:UbuntuServer:16.04"}) # image = azure.get_image_list({"name": "Canonical:UbuntuServer:18.04-LTS"}) logger.debug("image: {}".format(image)) + """ """ # Create network and test machine