X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_ro%2Fwim%2Fwimconn_ietfl2vpn.py;h=321c320f32eee02e63e7fbf1a9a6bf29ea68e56e;hb=1d55a23c9cd32f17bb7a6f21e5b6c2b476c5804f;hp=b8886fbf3b2e54d8611b16580f05f8c5148c6b82;hpb=00f9c19cbba8767da56b1a7cdbd7526835d131f0;p=osm%2FRO.git diff --git a/osm_ro/wim/wimconn_ietfl2vpn.py b/osm_ro/wim/wimconn_ietfl2vpn.py index b8886fbf..321c320f 100644 --- a/osm_ro/wim/wimconn_ietfl2vpn.py +++ b/osm_ro/wim/wimconn_ietfl2vpn.py @@ -31,32 +31,32 @@ It receives the endpoints and the necessary details to request the Layer 2 service. """ import requests -import json import uuid -import time import logging from .wimconn import WimConnector, WimConnectorError """CHeck layer where we move it""" + class WimconnectorIETFL2VPN(WimConnector): - """IETF L2VPM WIM connector - Arguments: (To be completed) - wim (dict): WIM record, as stored in the database - wim_account (dict): WIM account record, as stored in the database - """ def __init__(self, wim, wim_account, config=None, logger=None): + """IETF L2VPM WIM connector + + Arguments: (To be completed) + wim (dict): WIM record, as stored in the database + wim_account (dict): WIM account record, as stored in the database + """ self.logger = logging.getLogger('openmano.wimconn.ietfl2vpn') super(WimconnectorIETFL2VPN, self).__init__(wim, wim_account, config, logger) - self.headers={'Content-Type': 'application/json'} + self.headers = {'Content-Type': 'application/json'} self.mappings = {m['wan_service_endpoint_id']: m for m in self.service_endpoint_mapping} self.user = wim_account.get("user") self.passwd = wim_account.get("passwd") - if self.user != None and self.passwd != None: + if self.user and self.passwd is not None: self.auth = (self.user, self.passwd) else: - self.auth=None + self.auth = None self.logger.info("IETFL2VPN Connector Initialized.") def check_credentials(self): @@ -71,7 +71,6 @@ class WimconnectorIETFL2VPN(WimConnector): raise WimConnectorError("Failed while authenticating", http_code=http_code) self.logger.info("Credentials checked") - def get_connectivity_service_status(self, service_uuid, conn_info=None): """Monitor the status of the connectivity service stablished @@ -87,26 +86,24 @@ class WimconnectorIETFL2VPN(WimConnector): """ try: self.logger.info("Sending get connectivity service stuatus") - servicepoint="{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services/vpn-service={}/".format(self.wim["wim_url"],service_uuid) - response=requests.get(servicepoint, auth=self.auth) - if response.status_code!= requests.codes.ok : - raise WimConnectorError("Unable to obtain connectivity servcice status",http_code=response.status_code) - service_status={'wim_status': 'ACTIVE'} + servicepoint = "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services/vpn-service={}/".format( + self.wim["wim_url"], service_uuid) + response = requests.get(servicepoint, auth=self.auth) + if response.status_code != requests.codes.ok: + raise WimConnectorError("Unable to obtain connectivity servcice status", http_code=response.status_code) + service_status = {'wim_status': 'ACTIVE'} return service_status except requests.exceptions.ConnectionError: - raise WimConnectorError("Request Timeout",http_code=408) + raise WimConnectorError("Request Timeout", http_code=408) - - def search_mapp(self,connection_point): + def search_mapp(self, connection_point): id = connection_point['service_endpoint_id'] if id not in self.mappings: raise WimConnectorError("Endpoint {} not located".format(str(id))) else: return self.mappings[id] - - def create_connectivity_service(self, service_type, connection_points, - **kwargs): + def create_connectivity_service(self, service_type, connection_points, **kwargs): """Stablish WAN connectivity between the endpoints Arguments: @@ -152,98 +149,110 @@ class WimconnectorIETFL2VPN(WimConnector): Raises: WimConnectorException: In case of error. """ - if service_type=="ELINE": - if len(connection_points)>2: - raise WimConnectorError('Connections between more than ' - '2 endpoints are not supported') - if len(connection_points)<2: - raise WimConnectorError('Connections must be of at least ' - '2 endpoints') + if service_type == "ELINE": + if len(connection_points) > 2: + raise WimConnectorError('Connections between more than 2 endpoints are not supported') + if len(connection_points) < 2: + raise WimConnectorError('Connections must be of at least 2 endpoints') """ First step, create the vpn service """ - uuid_l2vpn=str(uuid.uuid4()) - vpn_service={} - vpn_service["vpn-id"]= uuid_l2vpn - vpn_service["vpn-scv-type"]="vpws" - vpn_service["svc-topo"]= "any-to-any" - vpn_service["customer-name"]= "osm" - vpn_service_list=[] + uuid_l2vpn = str(uuid.uuid4()) + vpn_service = {} + vpn_service["vpn-id"] = uuid_l2vpn + vpn_service["vpn-scv-type"] = "vpws" + vpn_service["svc-topo"] = "any-to-any" + vpn_service["customer-name"] = "osm" + vpn_service_list = [] vpn_service_list.append(vpn_service) - vpn_service_l={"vpn-service":vpn_service_list} - response_service_creation=None - conn_info=[] + vpn_service_l = {"vpn-service": vpn_service_list} + response_service_creation = None + conn_info = [] self.logger.info("Sending vpn-service :{}".format(vpn_service_l)) try: - endpoint_service_creation="{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services".format(self.wim["wim_url"]) - response_service_creation=requests.post(endpoint_service_creation, headers=self.headers, json=vpn_service_l, auth=self.auth ) + endpoint_service_creation = "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services".format( + self.wim["wim_url"]) + response_service_creation = requests.post(endpoint_service_creation, headers=self.headers, + json=vpn_service_l, auth=self.auth) except requests.exceptions.ConnectionError: - raise WimConnectorError("Request to create service Timeout",http_code=408) + raise WimConnectorError("Request to create service Timeout", http_code=408) if response_service_creation.status_code == 409: - raise WimConnectorError("Service already exists",http_code=response_service_creation.status_code) - elif response_service_creation.status_code != requests.codes.created : - raise WimConnectorError("Request to create service not accepted",http_code=response_service_creation.status_code) + raise WimConnectorError("Service already exists", http_code=response_service_creation.status_code) + elif response_service_creation.status_code != requests.codes.created: + raise WimConnectorError("Request to create service not accepted", + http_code=response_service_creation.status_code) """ Second step, create the connections and vpn attachments """ for connection_point in connection_points: - connection_point_wan_info=self.search_mapp(connection_point) - site_network_access={} - connection={} - if connection_point["service_endpoint_encapsulation_type"]!="none": - if connection_point["service_endpoint_encapsulation_type"]=="dot1q": + connection_point_wan_info = self.search_mapp(connection_point) + site_network_access = {} + connection = {} + if connection_point["service_endpoint_encapsulation_type"] != "none": + if connection_point["service_endpoint_encapsulation_type"] == "dot1q": """ The connection is a VLAN """ - connection["encapsulation-type"]="dot1q-vlan-tagged" - tagged={} - tagged_interf={} - service_endpoint_encapsulation_info=connection_point["service_endpoint_encapsulation_info"] - if service_endpoint_encapsulation_info["vlan"]==None: + connection["encapsulation-type"] = "dot1q-vlan-tagged" + tagged = {} + tagged_interf = {} + service_endpoint_encapsulation_info = connection_point["service_endpoint_encapsulation_info"] + if service_endpoint_encapsulation_info["vlan"] is None: raise WimConnectorError("VLAN must be provided") - tagged_interf["cvlan-id"]= service_endpoint_encapsulation_info["vlan"] - tagged["dot1q-vlan-tagged"]=tagged_interf - connection["tagged-interface"]=tagged + tagged_interf["cvlan-id"] = service_endpoint_encapsulation_info["vlan"] + tagged["dot1q-vlan-tagged"] = tagged_interf + connection["tagged-interface"] = tagged else: raise NotImplementedError("Encapsulation type not implemented") - site_network_access["connection"]=connection + site_network_access["connection"] = connection self.logger.info("Sending connection:{}".format(connection)) - vpn_attach={} - vpn_attach["vpn-id"]=uuid_l2vpn - vpn_attach["site-role"]=vpn_service["svc-topo"]+"-role" - site_network_access["vpn-attachment"]=vpn_attach + vpn_attach = {} + vpn_attach["vpn-id"] = uuid_l2vpn + vpn_attach["site-role"] = vpn_service["svc-topo"]+"-role" + site_network_access["vpn-attachment"] = vpn_attach self.logger.info("Sending vpn-attachement :{}".format(vpn_attach)) - uuid_sna=str(uuid.uuid4()) - site_network_access["network-access-id"]=uuid_sna - site_network_accesses={} - site_network_access_list=[] + uuid_sna = str(uuid.uuid4()) + site_network_access["network-access-id"] = uuid_sna + site_network_access["bearer"] = connection_point_wan_info["wan_service_mapping_info"]["bearer"] + site_network_accesses = {} + site_network_access_list = [] site_network_access_list.append(site_network_access) - site_network_accesses["site-network-access"]=site_network_access_list - conn_info_d={} - conn_info_d["site"] = connection_point_wan_info["site-id"] + site_network_accesses["site-network-access"] = site_network_access_list + conn_info_d = {} + conn_info_d["site"] = connection_point_wan_info["wan_service_mapping_info"]["site-id"] conn_info_d["site-network-access-id"] = site_network_access["network-access-id"] conn_info_d["mapping"] = None conn_info.append(conn_info_d) try: - endpoint_site_network_access_creation="{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/sites/site={}/site-network-accesses/".format(self.wim["wim_url"],connection_point_wan_info["site-id"]) - response_endpoint_site_network_access_creation = requests.post(endpoint_site_network_access_creation, headers=self.headers, json=site_network_accesses, auth=self.auth ) + endpoint_site_network_access_creation = \ + "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/sites/site={}/site-network-accesses/".format( + self.wim["wim_url"], connection_point_wan_info["wan_service_mapping_info"]["site-id"]) + response_endpoint_site_network_access_creation = requests.post( + endpoint_site_network_access_creation, + headers=self.headers, + json=site_network_accesses, + auth=self.auth) if response_endpoint_site_network_access_creation.status_code == 409: self.delete_connectivity_service(vpn_service["vpn-id"]) - raise WimConnectorError("Site_Network_Access with ID '{}' already exists".format(site_network_access["network-access-id"]),http_code=response_endpoint_site_network_access_creation.status_code) + raise WimConnectorError("Site_Network_Access with ID '{}' already exists".format( + site_network_access["network-access-id"]), + http_code=response_endpoint_site_network_access_creation.status_code) elif response_endpoint_site_network_access_creation.status_code == 400: self.delete_connectivity_service(vpn_service["vpn-id"]) - raise WimConnectorError("Site {} does not exist".format(connection_point_wan_info["site-id"]),http_code=response_endpoint_site_network_access_creation.status_code) + raise WimConnectorError("Site {} does not exist".format( + connection_point_wan_info["wan_service_mapping_info"]["site-id"]), + http_code=response_endpoint_site_network_access_creation.status_code) - elif response_endpoint_site_network_access_creation.status_code!= requests.codes.created and response_endpoint_site_network_access_creation.status_code!= requests.codes.no_content: + elif response_endpoint_site_network_access_creation.status_code != requests.codes.created and \ + response_endpoint_site_network_access_creation.status_code != requests.codes.no_content: self.delete_connectivity_service(vpn_service["vpn-id"]) - raise WimConnectorError("Request no accepted",http_code=response_endpoint_site_network_access_creation.status_code) + raise WimConnectorError("Request no accepted", + http_code=response_endpoint_site_network_access_creation.status_code) except requests.exceptions.ConnectionError: self.delete_connectivity_service(vpn_service["vpn-id"]) - raise WimConnectorError("Request Timeout",http_code=408) + raise WimConnectorError("Request Timeout", http_code=408) return uuid_l2vpn, conn_info else: raise NotImplementedError - - def delete_connectivity_service(self, service_uuid, conn_info=None): """Disconnect multi-site endpoints previously connected @@ -252,70 +261,78 @@ class WimconnectorIETFL2VPN(WimConnector): """ try: self.logger.info("Sending delete") - servicepoint="{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services/vpn-service={}/".format(self.wim["wim_url"],service_uuid) - response=requests.delete(servicepoint, auth=self.auth) - if response.status_code!=requests.codes.no_content : - raise WimConnectorError("Error in the request",http_code=response.status_code) + servicepoint = "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services/vpn-service={}/".format( + self.wim["wim_url"], service_uuid) + response = requests.delete(servicepoint, auth=self.auth) + if response.status_code != requests.codes.no_content: + raise WimConnectorError("Error in the request", http_code=response.status_code) except requests.exceptions.ConnectionError: - raise WimConnectorError("Request Timeout",http_code=408) - - + raise WimConnectorError("Request Timeout", http_code=408) def edit_connectivity_service(self, service_uuid, conn_info=None, connection_points=None, **kwargs): """Change an existing connectivity service, see ``create_connectivity_service``""" - sites={"sites":{}} - site_list=[] - vpn_service={} - vpn_service["svc-topo"]= "any-to-any" + # sites = {"sites": {}} + # site_list = [] + vpn_service = {} + vpn_service["svc-topo"] = "any-to-any" counter = 0 for connection_point in connection_points: - site_network_access={} - connection_point_wan_info=self.search_mapp(connection_point) - params_site={} - params_site["site-id"]= connection_point_wan_info["site-id"] - params_site["site-vpn-flavor"]= "site-vpn-flavor-single" - device_site={} - device_site["device-id"]=connection_point_wan_info["device-id"] - params_site["devices"]=device_site - network_access={} - connection={} - if connection_point["service_endpoint_encapsulation_type"]!="none": - if connection_point["service_endpoint_encapsulation_type"]=="dot1q": + site_network_access = {} + connection_point_wan_info = self.search_mapp(connection_point) + params_site = {} + params_site["site-id"] = connection_point_wan_info["wan_service_mapping_info"]["site-id"] + params_site["site-vpn-flavor"] = "site-vpn-flavor-single" + device_site = {} + device_site["device-id"] = connection_point_wan_info["device-id"] + params_site["devices"] = device_site + # network_access = {} + connection = {} + if connection_point["service_endpoint_encapsulation_type"] != "none": + if connection_point["service_endpoint_encapsulation_type"] == "dot1q": """ The connection is a VLAN """ - connection["encapsulation-type"]="dot1q-vlan-tagged" - tagged={} - tagged_interf={} - service_endpoint_encapsulation_info=connection_point["service_endpoint_encapsulation_info"] - if service_endpoint_encapsulation_info["vlan"]==None: + connection["encapsulation-type"] = "dot1q-vlan-tagged" + tagged = {} + tagged_interf = {} + service_endpoint_encapsulation_info = connection_point["service_endpoint_encapsulation_info"] + if service_endpoint_encapsulation_info["vlan"] is None: raise WimConnectorError("VLAN must be provided") - tagged_interf["cvlan-id"]= service_endpoint_encapsulation_info["vlan"] - tagged["dot1q-vlan-tagged"]=tagged_interf - connection["tagged-interface"]=tagged + tagged_interf["cvlan-id"] = service_endpoint_encapsulation_info["vlan"] + tagged["dot1q-vlan-tagged"] = tagged_interf + connection["tagged-interface"] = tagged else: raise NotImplementedError("Encapsulation type not implemented") - site_network_access["connection"]=connection - vpn_attach={} - vpn_attach["vpn-id"]=service_uuid - vpn_attach["site-role"]=vpn_service["svc-topo"]+"-role" - site_network_access["vpn-attachment"]=vpn_attach - uuid_sna=conn_info[counter]["site-network-access-id"] - site_network_access["network-access-id"]=uuid_sna - site_network_accesses={} - site_network_access_list=[] + site_network_access["connection"] = connection + vpn_attach = {} + vpn_attach["vpn-id"] = service_uuid + vpn_attach["site-role"] = vpn_service["svc-topo"]+"-role" + site_network_access["vpn-attachment"] = vpn_attach + uuid_sna = conn_info[counter]["site-network-access-id"] + site_network_access["network-access-id"] = uuid_sna + site_network_access["bearer"] = connection_point_wan_info["wan_service_mapping_info"]["bearer"] + site_network_accesses = {} + site_network_access_list = [] site_network_access_list.append(site_network_access) - site_network_accesses["site-network-access"]=site_network_access_list + site_network_accesses["site-network-access"] = site_network_access_list try: - endpoint_site_network_access_edit="{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/sites/site={}/site-network-accesses/".format(self.wim["wim_url"],connection_point_wan_info["site-id"]) #MODIF - response_endpoint_site_network_access_creation = requests.put(endpoint_site_network_access_edit, headers=self.headers, json=site_network_accesses, auth=self.auth ) - if response_endpoint_site_network_access_creation.status_code==400: - raise WimConnectorError("Service does not exist",http_code=response_endpoint_site_network_access_creation.status_code) - elif response_endpoint_site_network_access_creation.status_code!=201 and response_endpoint_site_network_access_creation.status_code!=204: - raise WimConnectorError("Request no accepted",http_code=response_endpoint_site_network_access_creation.status_code) + endpoint_site_network_access_edit = \ + "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/sites/site={}/site-network-accesses/".format( + self.wim["wim_url"], connection_point_wan_info["wan_service_mapping_info"]["site-id"]) + response_endpoint_site_network_access_creation = requests.put(endpoint_site_network_access_edit, + headers=self.headers, + json=site_network_accesses, + auth=self.auth) + if response_endpoint_site_network_access_creation.status_code == 400: + raise WimConnectorError("Service does not exist", + http_code=response_endpoint_site_network_access_creation.status_code) + elif response_endpoint_site_network_access_creation.status_code != 201 and \ + response_endpoint_site_network_access_creation.status_code != 204: + raise WimConnectorError("Request no accepted", + http_code=response_endpoint_site_network_access_creation.status_code) except requests.exceptions.ConnectionError: - raise WimConnectorError("Request Timeout",http_code=408) + raise WimConnectorError("Request Timeout", http_code=408) counter += 1 return None @@ -323,12 +340,12 @@ class WimconnectorIETFL2VPN(WimConnector): """Delete all WAN Links corresponding to a WIM""" try: self.logger.info("Sending clear all connectivity services") - servicepoint="{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services".format(self.wim["wim_url"]) - response=requests.delete(servicepoint, auth=self.auth) - if response.status_code!=requests.codes.no_content : - raise WimConnectorError("Unable to clear all connectivity services",http_code=response.status_code) + servicepoint = "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services".format(self.wim["wim_url"]) + response = requests.delete(servicepoint, auth=self.auth) + if response.status_code != requests.codes.no_content: + raise WimConnectorError("Unable to clear all connectivity services", http_code=response.status_code) except requests.exceptions.ConnectionError: - raise WimConnectorError("Request Timeout",http_code=408) + raise WimConnectorError("Request Timeout", http_code=408) def get_all_active_connectivity_services(self): """Provide information about all active connections provisioned by a @@ -336,10 +353,10 @@ class WimconnectorIETFL2VPN(WimConnector): """ try: self.logger.info("Sending get all connectivity services") - servicepoint="{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services".format(self.wim["wim_url"]) - response=requests.get(servicepoint, auth=self.auth) - if response.status_code!= requests.codes.ok : - raise WimConnectorError("Unable to get all connectivity services",http_code=response.status_code) + servicepoint = "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services".format(self.wim["wim_url"]) + response = requests.get(servicepoint, auth=self.auth) + if response.status_code != requests.codes.ok: + raise WimConnectorError("Unable to get all connectivity services", http_code=response.status_code) return response except requests.exceptions.ConnectionError: - raise WimConnectorError("Request Timeout",http_code=408) + raise WimConnectorError("Request Timeout", http_code=408)