Update resources and App.js to support line side connectivity service for photonic media layer

Change-Id: Id3c52af5821a04981f23adc76c3b5ce071fe2006
diff --git a/odtn-phase1-demo/src/resources/dcs.js b/odtn-phase1-demo/src/resources/dcs.js
index c3dd27c..1e17c40 100644
--- a/odtn-phase1-demo/src/resources/dcs.js
+++ b/odtn-phase1-demo/src/resources/dcs.js
@@ -66,7 +66,7 @@
 }
 
 
-export function createConnectivityService(sip1, sip2) {
+export function createClientSideConnectivityService( sip1, sip2) {
 
   return new Promise((resolve, reject) => {
     fetch(`/dcs/operations/tapi-connectivity:create-connectivity-service`, {
@@ -74,7 +74,7 @@
       headers: {
         "Content-Type": "application/json",
       },
-      body: getCreateRequestBody(sip1, sip2)
+      body: getCreateClientSideRequestBody(sip1, sip2)
     })
       .then(res => {
         console.log(res)
@@ -90,6 +90,29 @@
   })
 }
 
+export function createLineSideConnectivityService( sip1, sip2) {
+
+  return new Promise((resolve, reject) => {
+    fetch(`/dcs/operations/tapi-connectivity:create-connectivity-service`, {
+      method: 'POST',
+      headers: {
+        "Content-Type": "application/json",
+      },
+      body: getCreateLineSideRequestBody(sip1, sip2)
+    })
+      .then(res => {
+        console.log(res)
+        if (res.ok) {
+          res.json().then(data => resolve(data["tapi-connectivity:output"]["service"]))
+        } else {
+          reject(res.text())
+        }
+      })
+      .catch(err => {
+        console.error(err)
+      })
+  })
+}
 
 export function deleteConnectivityServices(uuid) {
 
@@ -116,7 +139,7 @@
 }
 
 
-function getCreateRequestBody(sip1, sip2){
+function getCreateLineSideRequestBody(sip1, sip2){
   return `{
     "tapi-connectivity:input":
     {
@@ -125,14 +148,47 @@
                 "local-id": "id1",
                 "service-interface-point": {
                     "service-interface-point-uuid" : "${sip1}"
-                }
+                },
+                "layer-protocol-qualifier" : "tapi-photonic-media:PHOTONIC_LAYER_QUALIFIER_NMC",
+                "direction": "BIDIRECTIONAL",
+                "protection-role": "WORK",
+                "layer-protocol-name": "PHOTONIC_MEDIA"
             }
             ,
             {
                 "local-id": "id2",
                 "service-interface-point": {
                     "service-interface-point-uuid" : "${sip2}"
-                }
+                },
+                "layer-protocol-qualifier" : "tapi-photonic-media:PHOTONIC_LAYER_QUALIFIER_NMC",
+                "direction": "BIDIRECTIONAL",
+                "protection-role": "WORK",
+                "layer-protocol-name": "PHOTONIC_MEDIA"
+            }
+        ]
+    }
+}`
+}
+
+function getCreateClientSideRequestBody(sip1, sip2){
+  return `{
+    "tapi-connectivity:input":
+    {
+        "end-point" : [
+            {
+                "local-id": "id1",
+                "service-interface-point": {
+                    "service-interface-point-uuid" : "${sip1}"
+                },
+                "layer-protocol-name": "DSR"
+            }
+            ,
+            {
+                "local-id": "id2",
+                "service-interface-point": {
+                    "service-interface-point-uuid" : "${sip2}"
+                },
+                "layer-protocol-name": "DSR"
             }
         ]
     }
diff --git a/odtn-phase1-demo/src/resources/getResources.js b/odtn-phase1-demo/src/resources/getResources.js
index c555a66..aa35f0e 100644
--- a/odtn-phase1-demo/src/resources/getResources.js
+++ b/odtn-phase1-demo/src/resources/getResources.js
@@ -30,20 +30,40 @@
     })
     .then(([deviceDetails, sipDetails, connectivityService]) => {
 
-      const sipIdMap = sipDetails
-        .filter(filterOnlyDsrSips)
+      const dsrSipIdMap = sipDetails
+        .filter(filterSipsByLayer.bind(null, "DSR"))
         .reduce((_sipIdMap, sipDetail) => {
-        _sipIdMap[sipDetail.name.filter(kv => kv["value-name"] === "onos-cp")[0].value] = sipDetail.uuid
-        return _sipIdMap
-      }, {})
-      console.log(sipIdMap)
+          _sipIdMap[sipDetail.name.filter(kv => kv["value-name"] === "onos-cp")[0].value] = sipDetail.uuid
+          return _sipIdMap
+        }, {})
+      const mediaSipIdMap = sipDetails
+        .filter(filterSipsByLayer.bind(null, "PHOTONIC_MEDIA"))
+        .reduce((_sipIdMap, sipDetail) => {
+          _sipIdMap[sipDetail.name.filter(kv => kv["value-name"] === "onos-cp")[0].value] = sipDetail.uuid
+          return _sipIdMap
+        }, {})
+      const portMap = {}
+
+      console.log('DSR SIP ID Map', dsrSipIdMap)
+      console.log('PhotinicMedia SIP ID Map', mediaSipIdMap)
 
       deviceDetails.forEach(deviceDetail => {
         deviceDetail.ports.forEach(port => {
           const key = `${port.element}/${port.port}`
-          if(sipIdMap[key]) {
-            port.sipId = sipIdMap[key]
+          if(dsrSipIdMap[key]) {
+            port.sipId = dsrSipIdMap[key]
           }
+          if(mediaSipIdMap[key]) {
+            port.mediaSipId = mediaSipIdMap[key]
+          }
+          portMap[key] = port
+        })
+      })
+
+      deviceDetails.forEach(deviceDetail => {
+        deviceDetail.ports.filter(filterClientSidePort).forEach(cliPort => {
+          const linePortKey = `${cliPort.element}/${parseInt(cliPort.port) + 100}`
+          cliPort.associatedLinePort = portMap[linePortKey]
         })
       })
 
@@ -55,6 +75,10 @@
 
 }
 
-function filterOnlyDsrSips(sipDetail) {
-  return sipDetail["layer-protocol-name"] === 'DSR'
+function filterClientSidePort(port) {
+  return Math.floor( parseInt(port.port) / 100 ) === 1
+}
+
+function filterSipsByLayer(layerProtocolName, sipDetail) {
+  return sipDetail["layer-protocol-name"] === layerProtocolName
 }
\ No newline at end of file