Nokia: Putting in support for metro network services within XOS for E-CORD

Change-Id: Idbc7e09ca53b0d9705d24bf1730fd9b05347a241
diff --git a/xos/synchronizer/providers/metronetworkrestprovider.py b/xos/synchronizer/providers/metronetworkrestprovider.py
new file mode 100644
index 0000000..fa9ef71
--- /dev/null
+++ b/xos/synchronizer/providers/metronetworkrestprovider.py
@@ -0,0 +1,232 @@
+from xos.logger import Logger, logging

+from core.models.netw import *

+from synchronizers.metronetwork.providers.metronetworkprovider import MetroNetworkProvider

+

+import requests, json

+from requests.auth import HTTPBasicAuth

+

+logger = Logger(level=logging.INFO)

+

+

+class MetroNetworkRestProvider(MetroNetworkProvider):

+    def __init__(self, networkdevice, **args):

+        MetroNetworkProvider.__init__(self, networkdevice, **args)

+

+    def get_network_ports(self):

+

+        objs = []

+

+        restCtrlUrl = self.networkdevice.restCtrlUrl

+        username = self.networkdevice.username

+        password = self.networkdevice.password

+

+        resp = requests.get("{}/mef-sca-api/SCA_ETH_FPP_UNI_N".format(restCtrlUrl),

+                            auth=HTTPBasicAuth(username, password))

+

+        if resp.status_code == 200:

+            for uni in resp.json():

+                hostname = uni['transportPort']['Hostname']

+                port = uni['transportPort']['Port']

+

+                # Default values

+                bwpCfgCbs = 0

+                bwpCfgEbs = 0

+                bwpCfgCir = 0

+                bwpCfgEir = 0

+

+                if 'interfaceCfgIngressBwp' in uni:

+                    bwpCfgCbs = uni['interfaceCfgIngressBwp']['bwpCfgCbs']

+                    bwpCfgEbs = uni['interfaceCfgIngressBwp']['bwpCfgEbs']

+                    bwpCfgCir = uni['interfaceCfgIngressBwp']['bwpCfgCir']

+                    bwpCfgEir = uni['interfaceCfgIngressBwp']['bwpCfgEir']

+

+                uniPort = NetworkEdgePort()

+                uniPort.element = self.networkdevice

+                uniPort.pid = "{}.{}/{}".format(self.networkdevice.id, hostname, port)

+                uniPort.bwpCfgCbs = bwpCfgCbs

+                uniPort.bwpCfgEbs = bwpCfgEbs

+                uniPort.bwpCfgCir = bwpCfgCir

+                uniPort.bwpCfgEir = bwpCfgEir

+

+                objs.append(uniPort)

+

+            return objs

+

+        else:

+            raise Exception("OnosApiError: get_network_ports()")

+

+    def get_network_links(self):

+

+        objs = []

+

+        restCtrlUrl = self.networkdevice.restCtrlUrl

+        username = self.networkdevice.username

+        password = self.networkdevice.password

+

+        resp = requests.get("{}/mef-sca-api/SCA_ETH_FDFr_EC/findByState?state=Active".format(restCtrlUrl),

+                            auth=HTTPBasicAuth(username, password))

+

+        if resp.status_code == 200:

+            for evc in resp.json():

+                id = evc['id']

+                evcServiceType = evc['evcServiceType']

+

+                if (evcServiceType == "Point_To_Point"):

+                    uni1 = evc['SCA_ETH_Flow_Points'][0]

+                    hostname = uni1['scaEthFppUniN']['transportPort']['Hostname']

+                    port = uni1['scaEthFppUniN']['transportPort']['Port']

+

+                    if 'interfaceCfgIngressBwp' in uni1['scaEthFppUniN']:

+                        bwpCfgCbs = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']

+                        bwpCfgEbs = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']

+                        bwpCfgCir = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']

+                        bwpCfgEir = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']

+

+                    edgePort1 = NetworkEdgePort()

+                    edgePort1.element = self.networkdevice

+                    edgePort1.pid = "{}.{}/{}".format(self.networkdevice.id, hostname, port)

+                    edgePort1.bwpCfgCbs = bwpCfgCbs

+                    edgePort1.bwpCfgEbs = bwpCfgEbs

+                    edgePort1.bwpCfgCir = bwpCfgCir

+                    edgePort1.bwpCfgEir = bwpCfgEir

+

+                    uni2 = evc['SCA_ETH_Flow_Points'][1]

+                    hostname = uni2['scaEthFppUniN']['transportPort']['Hostname']

+                    port = uni2['scaEthFppUniN']['transportPort']['Port']

+

+                    if 'interfaceCfgIngressBwp' in uni1['scaEthFppUniN']:

+                        bwpCfgCbs = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']

+                        bwpCfgEbs = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']

+                        bwpCfgCir = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']

+                        bwpCfgEir = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']

+

+                    edgePort2 = NetworkEdgePort()

+                    edgePort2.element = self.networkdevice

+                    edgePort2.pid = "{}.{}/{}".format(self.networkdevice.id, hostname, port)

+                    edgePort2.bwpCfgCbs = bwpCfgCbs

+                    edgePort2.bwpCfgEbs = bwpCfgEbs

+                    edgePort2.bwpCfgCir = bwpCfgCir

+                    edgePort2.bwpCfgEir = bwpCfgEir

+

+                edgeToEdgeConnectivity = NetworkEdgeToEdgePointConnection()

+                edgeToEdgeConnectivity.sid = id

+                edgeToEdgeConnectivity.type = evcServiceType

+                edgeToEdgeConnectivity.uni1 = edgePort1

+                edgeToEdgeConnectivity.uni2 = edgePort2

+                edgeToEdgeConnectivity.operstate = "active"

+                edgeToEdgeConnectivity.adminstate = "enabled"

+

+                objs.append(edgeToEdgeConnectivity)

+

+            return objs

+

+        else:

+            raise Exception("OnosApiError: get_network_links()")

+

+    def create_point_to_point_connectivity(self, obj):

+

+        restCtrlUrl = self.networkdevice.restCtrlUrl

+        username = self.networkdevice.username

+        password = self.networkdevice.password

+

+        evcServiceType = obj.type

+        # evcServiceType = "Point_To_Point"

+

+        uni1 = obj.uni1

+        uni1Id = uni1.pid

+        uni1IdToken = (uni1Id.split('.', 1))[1].split('/', 1)

+        uni1Hostname = uni1IdToken[0]

+        uni1Port = uni1IdToken[1]

+        uni1BwpCfgCbs = uni1.bwpCfgCbs

+        uni1BwpCfgEbs = uni1.bwpCfgEbs

+        uni1BwpCfgCir = uni1.bwpCfgCir

+        uni1BwpCfgEir = uni1.bwpCfgEir

+

+        uni2 = obj.uni2

+        uni2Id = uni2.pid

+        uni2IdToken = (uni2Id.split('.', 1))[1].split('/', 1)

+        uni2Hostname = uni2IdToken[0]

+        uni2Port = uni2IdToken[1]

+        uni2BwpCfgCbs = uni2.bwpCfgCbs

+        uni2BwpCfgEbs = uni2.bwpCfgEbs

+        uni2BwpCfgCir = uni2.bwpCfgCir

+        uni2BwpCfgEir = uni2.bwpCfgEir

+

+        data = {

+            "evcServiceType": evcServiceType,

+            "SCA_ETH_Flow_Points": [

+                {

+                    "scaEthFppUniN": {"transportPort": {"Hostname": uni1Hostname, "Port": uni1Port},

+                                      "interfaceCfgIngressBwp": {"bwpCfgCbs": uni1BwpCfgCbs,

+                                                                 "bwpCfgEbs": uni1BwpCfgEbs,

+                                                                 "bwpCfgCir": uni1BwpCfgCir,

+                                                                 "bwpCfgEir": uni1BwpCfgEir}}},

+                {

+                    "scaEthFppUniN": {"transportPort": {"Hostname": uni2Hostname, "Port": uni2Port},

+                                      "interfaceCfgIngressBwp": {"bwpCfgCbs": uni2BwpCfgCbs,

+                                                                 "bwpCfgEbs": uni2BwpCfgEbs,

+                                                                 "bwpCfgCir": uni2BwpCfgCir,

+                                                                 "bwpCfgEir": uni2BwpCfgEir}}}]

+        }

+

+        headers = {'Content-Type': 'application/json'}

+

+        resp = requests.post('{}/mef-sca-api/SCA_ETH_FDFr_EC'.format(restCtrlUrl),

+                             data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(username, password))

+

+        if resp.status_code == 201:

+            result = resp.json()

+            message = result['message']

+

+            msg_token = message.split()

+            for i, token in enumerate(msg_token):

+                if token == 'id':

+                    service_id = msg_token[i + 1]

+                    obj.sid = service_id

+                    obj.adminstate = "enabled"

+                    obj.operstate = "active"

+

+                    return True

+

+        elif resp.status_code == 204:

+            obj.adminstate = "invalid"  # what's the meaning?

+            obj.operstate = "inactive"

+            obj.backend_status = '204 - No network resource'

+            return False

+

+        elif resp.status_code == 500:

+            obj.adminstate = "enabled"

+            obj.operstate = "inactive"

+            obj.backend_status = '500 - Internal Server Error'

+            return False

+

+        else:

+            raise Exception("OnosApiError: create_point_to_point_connectivity()")

+

+    def delete_point_to_point_connectivity(self, obj):

+

+        restCtrlUrl = self.networkdevice.restCtrlUrl

+        username = self.networkdevice.username

+        password = self.networkdevice.password

+        evcId = obj.sid

+

+        resp = requests.delete("{}/mef-sca-api/SCA_ETH_FDFr_EC/{}".format(restCtrlUrl, evcId),

+                               auth=HTTPBasicAuth(username, password))

+

+        if resp.status_code == 200:

+            obj.adminstate = 'disabled'

+            obj.operstate = 'inactive'

+            return True

+

+        elif resp.status_code == 204:

+            obj.adminstate = "invalid"  # what's the meaning?

+            obj.backend_status = '204 - No such network resource: {}'.format(evcId)

+            return False

+

+        elif resp.status_code == 500:

+            obj.adminstate = "disabled"

+            obj.backend_status = '500 - Internal Server Error'

+            return False

+

+        else:

+            raise Exception("OnosApiError: delete_point_to_point_connectivity()")