Merge branch WIM: Connector using IETF L2VPN Service model
[osm/RO.git] / osm_ro / wim / wimconn_ietfl2vpn.py
index b8886fb..ee58f2f 100644 (file)
@@ -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,108 @@ 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_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={}
+                site_network_accesses["site-network-access"] = site_network_access_list
+                conn_info_d = {}
                 conn_info_d["site"] = connection_point_wan_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["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["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 +259,77 @@ 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["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_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["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)
             except requests.exceptions.ConnectionError:
-                raise WimConnectorError("Request Timeout",http_code=408)
+                raise WimConnectorError("Request Timeout", http_code=408)
             counter += 1
         return None
 
@@ -323,12 +337,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 +350,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)