X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=osm_ro%2Fvimconn_azure.py;h=fb3f43490ff1a8c0539d41a1d996609c6a8b1382;hb=refs%2Fchanges%2F94%2F7594%2F2;hp=cdc17916b6f7102b5698e787647bfdffd59c62f1;hpb=07ad136eac22e055b0d66eae60833e3258ae5a0a;p=osm%2FRO.git diff --git a/osm_ro/vimconn_azure.py b/osm_ro/vimconn_azure.py index cdc17916..fb3f4349 100755 --- a/osm_ro/vimconn_azure.py +++ b/osm_ro/vimconn_azure.py @@ -5,6 +5,7 @@ __date__ ='$18-apr-2019 23:59:59$' import vimconn import logging +import netaddr from os import getenv from uuid import uuid4 @@ -14,15 +15,24 @@ from azure.mgmt.resource import ResourceManagementClient from azure.mgmt.network import NetworkManagementClient from azure.mgmt.compute import ComputeManagementClient +from msrestazure.azure_exceptions import CloudError class vimconnector(vimconn.vimconnector): + provision_state2osm = { + "Deleting": "INACTIVE", + "Failed": "ERROR", + "Succeeded": "ACTIVE", + "Updating": "BUILD", + } + def __init__(self, uuid, name, tenant_id, tenant_name, url, url_admin=None, user=None, passwd=None, log_level=None, config={}, persistent_info={}): vimconn.vimconnector.__init__(self, uuid, name, tenant_id, tenant_name, url, url_admin, user, passwd, log_level, config, persistent_info) + self.vnet_address_space = None # LOGGER self.logger = logging.getLogger('openmano.vim.azure') if log_level: @@ -108,14 +118,28 @@ class vimconnector(vimconn.vimconnector): self.conn.resource_groups.create_or_update(self.resource_group, {'location': self.region}) def _check_or_create_vnet(self): + try: + vnet = self.conn_vnet.virtual_networks.get(self.resource_group, self.vnet_name) + self.vnet_address_space = vnet.address_space.address_prefixes[0] + self.vnet_id = vnet.id + return + except CloudError as e: + if e.error.error == "ResourceNotFound": + pass + else: + raise + # if not exist, creates it try: vnet_params = { 'location': self.region, 'address_space': { - 'address_prefixes': "10.0.0.0/8" + 'address_prefixes': ["10.0.0.0/8"] }, } + self.vnet_address_space = "10.0.0.0/8" self.conn_vnet.virtual_networks.create_or_update(self.resource_group, self.vnet_name, vnet_params) + vnet = self.conn_vnet.virtual_networks.get(self.resource_group, self.vnet_name) + self.vnet_id = vnet.id except Exception as e: self.format_vimconn_exception(e) @@ -155,24 +179,26 @@ class vimconnector(vimconn.vimconnector): self._reload_connection() if ip_profile is None: - # TODO get a non used vnet ip range /24 and allocate automatically - raise vimconn.vimconnException('Azure cannot create VNET with no CIDR') - + # get a non used vnet ip range /24 and allocate automatically inside the range self.vnet_address_space + used_subnets = self.get_network_list() + for ip_range in netaddr.IPNetwork(self.vnet_address_space).subnet(24): + for used_subnet in used_subnets: + subnet_range = netaddr.IPNetwork(used_subnet["cidr_block"]) + if subnet_range in ip_range or ip_range in subnet_range: + # this range overlaps with an existing subnet ip range. Breaks and look for another + break + else: + ip_profile = {"subnet_address": str(ip_range)} + break + else: + vimconn.vimconnException("Cannot find a non-used subnet range in {}".format(self.vnet_address_space)) try: - vnet_params= { - 'location': self.region, - 'address_space': { - 'address_prefixes': [ip_profile['subnet_address']] - }, - 'subnets': [ - { - 'name': "{}-{}".format(net_name[:24], uuid4()), - 'address_prefix': ip_profile['subnet_address'] - } - ] + subnet_name = "{}-{}".format(net_name[:24], uuid4()) + subnet_params= { + 'address_prefix': ip_profile['subnet_address'] } - self.conn_vnet.virtual_networks.create_or_update(self.resource_group, self.vnet_name, vnet_params) - # TODO return a tuple (subnet-ID, None) + self.conn_vnet.subnets.create_or_update(self.resource_group, self.vnet_name, subnet_name, subnet_params) + return "{}/subnet/{}".format(self.vnet_id, subnet_name), None except Exception as e: self.format_vimconn_exception(e) @@ -394,7 +420,6 @@ class vimconnector(vimconn.vimconnector): self._reload_connection() vnet = self.conn_vnet.virtual_networks.get(resGroup, resName) - return vnet def delete_network(self, net_id): @@ -425,24 +450,66 @@ class vimconnector(vimconn.vimconnector): for vm_size in self.conn_compute.virtual_machine_sizes.list(self.region): if vm_size.name == flavor_id : return vm_size - - def refresh_nets_status(self, net_id): - resGroup = self._get_resource_group_name_from_resource_id(net_id) - resName = self._get_resource_name_from_resource_id(net_id) - - self._reload_connection() - vnet = self.conn_vnet.virtual_networks.get(resGroup, resName) - - return vnet - - def refresh_vms_status(self, vm_id): - resGroup = self._get_resource_group_name_from_resource_id(net_id) - resName = self._get_resource_name_from_resource_id(net_id) - - self._reload_connection() - vm=self.conn_compute.virtual_machines.get(resGroup, resName) - return vm + def refresh_nets_status(self, net_list): + out_nets = {} + self._reload_connection() + for net_id in net_list: + try: + resGroup = self._get_resource_group_name_from_resource_id(net_id) + resName = self._get_resource_name_from_resource_id(net_id) + + vnet = self.conn_vnet.virtual_networks.get(resGroup, resName) + out_nets[net_id] ={ + "status": self.provision_state2osm[vnet.provisioning_state], + "vim_info": str(vnet) + } + except CloudError as e: + if e.error.error == "ResourceNotFound": + out_nets[net_id] = { + "status": "DELETED", + } + else: + raise + except Exception as e: + # TODO distinguish when it is deleted + out_nets[net_id] = { + "status": "VIM_ERROR", + "vim_info": str(vnet), + "error_msg": str(e) + } + + return out_nets + + def refresh_vms_status(self, vm_list): + out_vms = {} + self._reload_connection() + for vm_id in vm_list: + try: + resGroup = self._get_resource_group_name_from_resource_id(vm_id) + resName = self._get_resource_name_from_resource_id(vm_id) + + vm = self.conn_compute.virtual_machines.get(resGroup, resName) + out_vms[vm_id] ={ + "status": self.provision_state2osm[vm.provisioning_state], + "vim_info": str(vm) + } + except CloudError as e: + if e.error.error == "ResourceNotFound": + out_vms[vm_id] = { + "status": "DELETED", + } + else: + raise + except Exception as e: + # TODO distinguish when it is deleted + out_vms[vm_id] = { + "status": "VIM_ERROR", + "vim_info": str(vm), + "error_msg": str(e) + } + + return out_vms # TODO get_vminstance_console for getting console @@ -507,4 +574,9 @@ if __name__ == "__main__": # azure.new_vminstance(virtualMachine['name'], virtualMachine['description'], virtualMachine['status'], # virtualMachine['image'], virtualMachine['hardware_profile']['vm_size'], subnets) - azure.refresh_nets_status("/subscriptions/82f80cc1-876b-4591-9911-1fb5788384fd/resourceGroups/osmRG/providers/Microsoft.Network/virtualNetworks/test") \ No newline at end of file + azure.new_network("mynet", None) + net_id = "/subscriptions/82f80cc1-876b-4591-9911-1fb5788384fd/resourceGroups/osmRG/providers/Microsoft."\ + "Network/virtualNetworks/test" + net_id_not_found = "/subscriptions/82f80cc1-876b-4591-9911-1fb5788384fd/resourceGroups/osmRG/providers/"\ + "Microsoft.Network/virtualNetworks/testALF" + azure.refresh_nets_status([net_id, net_id_not_found])