change roadm app to support EDFA/ROADM/OPS devices, add OPS PowerConfig/LambdaQuery behaviour

Change-Id: Ieb6de727e766fdeb63740c0704f83fd11e44b935
diff --git a/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.html b/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.html
index a9a70e8..d2d32d2 100644
--- a/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.html
+++ b/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.html
@@ -16,7 +16,8 @@
             <div ng-class="{active: !!selId}"
                  icon icon-id="flowTable" icon-size="42"
                  tooltip tt-msg="flowTip"
-                 ng-click="nav('roadmFlow')"></div>
+                 ng-click="nav('roadmFlow')"
+                 ng-show="showFlowIcon"></div>
 
 
             <div ng-class="{active: !!selId}"
@@ -34,6 +35,7 @@
                     <td colId="name"sortable>Friendly Name</td>
                     <td colId="id" sortable>Device ID </td>
                     <td colId="master" sortable col-width="120px">Master </td>
+                    <td colId="type" sortable>Device Type </td>
                     <td colId="ports" sortable col-width="70px">Ports </td>
                     <td colId="vendor" sortable>Vendor </td>
                     <td colId="hwVersion" sortable>H/W Version </td>
@@ -53,10 +55,11 @@
 
                 <tr ng-repeat="item in tableData track by $index"
                     ng-class="{selected: item.id === selId}"
-                    ng-click="selectCallback($event, item)">
+                    ng-click="selectCallback($event, item);queryShowItems(item)">
                     <td>{{item.name}}</td>
                     <td>{{item.id}}</td>
                     <td>{{item.master}}</td>
+                    <td>{{item.type}}</td>
                     <td>{{item.ports}}</td>
                     <td>{{item.vendor}}</td>
                     <td>{{item.hwVersion}}</td>
diff --git a/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.js b/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.js
index 2537ed8..9080b12 100644
--- a/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.js
+++ b/apps/roadm/src/main/resources/app/view/roadmDevice/roadmDevice.js
@@ -7,7 +7,6 @@
 
     // constants
     var detailsReq = 'roadmDeviceDetailsRequest';
-
     angular.module('ovRoadmDevice', [])
         .controller('OvRoadmDeviceCtrl',
         ['$log', '$scope', '$location', 'TableBuilderService', 'WebSocketService',
@@ -19,6 +18,8 @@
                 $loc = _$loc_;
                 wss = _wss_;
                 ns = _ns_;
+                
+                $scope.showFlowIcon = true;
 
                 // query for if a certain device needs to be highlighted
                 var params = $loc.search();
@@ -32,6 +33,16 @@
                     tag: 'roadmDevice'
                 });
 
+                $scope.queryShowItems = function (tabRow) {
+                    // hide:OPTICAL_AMPLIFIER,FIBER_SWITCH, show:ROADM
+                    if (tabRow['type'] == 'ROADM') {
+                        $scope.showFlowIcon = true;
+                    } else {
+                        $scope.showFlowIcon = false;
+                    }
+                    $scope.$apply();
+                 }
+
                 $scope.nav = function (path) {
                     if ($scope.selId) {
                         ns.navTo(path, { devId: $scope.selId });
diff --git a/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.css b/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.css
index 81e5c16..885b1a3 100644
--- a/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.css
+++ b/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.css
@@ -84,7 +84,7 @@
     background-color: #ffffff;
     border: 1px solid #888888;
     width: 720px;
-    height: 270px;
+    height: 360px;
     padding: 20px;
     position: absolute;
     right: 15px;
diff --git a/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.html b/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.html
index 323eec5..95979f3 100644
--- a/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.html
+++ b/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.html
@@ -1,5 +1,5 @@
 <!-- partial HTML -->
-<div id="ov-roadm-flow" class="less-gap">
+<div id="ov-roadm-flow" class="less-gap" ng-init="queryShowItems()">
 
     <div class="tabular-header">
         <h2>Connections for Optical Device {{devId}} ({{tableData.length}} total)</h2>
@@ -45,10 +45,10 @@
                     <td colId="state" sortable>State </td>
                     <td colId="inPort" sortable>In Port </td>
                     <td colId="outPort" sortable>Out Port </td>
-                    <td colId="multiplier" sortable>Channel </td>
-                    <td colId="spacing">Spacing <span class="units">(GHz)</span> </td>
+                    <td colId="multiplier" ng-show="showChannel" sortable>Channel </td>
+                    <td colId="spacing" ng-show="showChannel">Spacing <span class="units">(GHz)</span> </td>
                     <td colId="currentPower" col-width="180px">Current Power <span class="units">(0.01dBm)</span></td>
-                    <td colId="attenuation" col-width="200px">Attenuation <span class="units">(0.01dB)</span></td>
+                    <td colId="attenuation" col-width="200px" ng-show="showAttenuation">Attenuation <span class="units">(0.01dB)</span></td>
                 </tr>
             </table>
         </div>
@@ -72,10 +72,10 @@
                     <td>{{flow.state}}</td>
                     <td>{{flow.inPort}}</td>
                     <td>{{flow.outPort}}</td>
-                    <td>{{flow.multiplier}} ({{flow.multiplier * 0.05 + 193.1 | number:2}} THz)</td>
-                    <td>{{flow.spacing}}</td>
+                    <td ng-show="showChannel">{{flow.multiplier}}{{flow.channdlFrequency}}</td>
+                    <td ng-show="showChannel">{{flow.spacing}}</td>
                     <td>{{flow.currentPower}}</td>
-                    <td class="editable" roadm-att="flow" roadm-set-att="setAttenuation(flow, targetVal, cb)"></td>
+                    <td class="editable" roadm-att="flow" roadm-set-att="setAttenuation(flow, targetVal, cb)" ng-show="showAttenuation"></td>
                 </tr>
             </table>
         </div>
@@ -100,16 +100,18 @@
             <span class="form-error" ng-show="form.outPortError">{{form.outPortMessage}}</span>
             <span class="form-error" ng-show="form.connectionError">{{form.connectionMessage}}</span><br />
 
-            <label>Channel Spacing</label><select ng-model="form.flow.spacing" ng-options="x.freq for x in form.spacings"></select>
+            <label>Include Channel</label><input type="checkbox" ng-model="showChannel" /><br />
+
+            <label>Channel Spacing</label><select ng-model="form.flow.spacing" ng-disabled="!showChannel" ng-options="x.freq for x in form.spacings"></select>
             <span class="form-error" ng-show="form.spacingError">{{form.spacingMessage}}</span><br />
 
-            <label>Spacing Multiplier</label><input type="number" ng-model="form.flow.multiplier" />
+            <label>Spacing Multiplier</label><input type="number" ng-model="form.flow.multiplier" ng-disabled="!showChannel"/>
             <span class="form-error" ng-show="form.multiplierError">{{form.multiplierMessage}}</span>
             <span class="form-error" ng-show="form.channelError">{{form.channelMessage}}</span><br />
 
-            <label>Include Attenuation</label><input type="checkbox" ng-model="form.flow.includeAttenuation" /><br />
+            <label>Include Attenuation</label><input type="checkbox" ng-model="showAttenuation" /><br />
 
-            <label>Attenuation</label><input type="number" ng-model="form.flow.attenuation" ng-disabled="!form.flow.includeAttenuation"/>
+            <label>Attenuation</label><input type="number" ng-model="form.flow.attenuation" ng-disabled="!showAttenuation"/>
             <span class="form-error" ng-show="form.attenuationError">{{form.attenuationMessage}}</span><br />
         </form>
         <button type="submit" class="submit" ng-click="form.createFlow(form.flow)">Create Connection</button>
diff --git a/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.js b/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.js
index ad9bf76e..b5d8baf 100644
--- a/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.js
+++ b/apps/roadm/src/main/resources/app/view/roadmFlow/roadmFlow.js
@@ -7,6 +7,8 @@
     var DELETE_FLOW_REQ = "roadmDeleteFlowRequest";
     var CREATE_FLOW_REQ = "roadmCreateFlowRequest";
     var CREATE_FLOW_RESP = "roadmCreateFlowResponse";
+    var SHOW_ITEMS_REQ = "roadmShowFlowItemsRequest";
+    var SHOW_ITEMS_RESP = "roadmShowFlowItemsResponse";
 
     // injected references
     var $log, $scope, $location, fs, tbs, wss, ns;
@@ -24,6 +26,19 @@
             });
     }
 
+    function queryShowItems() {
+        wss.sendEvent(SHOW_ITEMS_REQ,
+            {
+                devId: $scope.devId,
+            });
+    }
+    
+    function showItemsCb(data) {
+        $scope.showChannel = data.showChannel;
+        $scope.showAttenuation = data.showAttenuation;
+        $scope.$apply();
+    }
+
     function attenuationCb(data) {
         flowCbTable[data.flowId](data.valid, data.message);
     }
@@ -55,13 +70,13 @@
             $scope.addFlowTip = 'Create a flow';
             $scope.deviceTip = 'Show device table';
             $scope.flowTip = 'Show flow view for this device';
-            $scope.groupTip = 'Show group view for this device';
-            $scope.meterTip = 'Show meter view for selected device';
+            $scope.portTip = 'Show port view for this device';
 
             $scope.showFlowForm = false;
 
             var handlers = {};
             handlers[SET_ATT_RESP] = attenuationCb;
+            handlers[SHOW_ITEMS_RESP] = showItemsCb;
             wss.bindHandlers(handlers);
 
             params = $location.search();
@@ -83,6 +98,8 @@
                 $scope.showFlowForm = false;
             }
 
+            $scope.queryShowItems = queryShowItems;
+
             $scope.setAttenuation = setAttenuation;
 
             $scope.deleteFlow = function ($event, row) {
@@ -149,7 +166,7 @@
             controller: function($scope, $timeout) {
                 $scope.enableEdit = function() {
                     // connection must support attenuation to be editable
-                    if ($scope.editMode === false) {
+                    if ($scope.currItem.hasAttenuation === 'true' && $scope.editMode === false) {
                         // Ensure that the entry being edited remains the same even
                         // if the table entries are shifted around.
                         $scope.targetItem = $scope.currItem;
@@ -228,7 +245,7 @@
         //this.flow.outPort = 2;
         this.flow.spacing = this.spacings[1];
         //this.flow.multiplier = 0;
-        this.flow.includeAttenuation = true;
+        this.flow.channelFrequency = "";
         this.flow.attenuation = 0;
 
         var parent = this;
@@ -250,15 +267,18 @@
                 parent.spacingMessage = data.spacing.message;
                 parent.spacingError = true;
             }
-            if (!data.multiplier.valid) {
-                parent.multiplierMessage = data.multiplier.message;
-                parent.multiplierError = true;
+            if ($scope.includeChannel)
+            {
+                if (!data.multiplier.valid) {
+                    parent.multiplierMessage = data.multiplier.message;
+                    parent.multiplierError = true;
+                }
+                if (!data.channelAvailable.valid) {
+                    parent.channelMessage = data.channelAvailable.message;
+                    parent.channelError = true;
+                }
             }
-            if (!data.channelAvailable.valid) {
-                parent.channelMessage = data.channelAvailable.message;
-                parent.channelError = true;
-            }
-            if (data.includeAttenuation && !data.attenuation.valid) {
+            if ($scope.includeAttenuation && !data.attenuation.valid) {
                 parent.attenuationMessage = data.attenuation.message;
                 parent.attenuationError = true;
             }
@@ -270,7 +290,6 @@
         var handlers = {}
         handlers[CREATE_FLOW_RESP] = createFlowCb;
         wss.bindHandlers(handlers);
-
         this.createFlow = function(connection) {
             this.clearErrors();
 
@@ -295,12 +314,12 @@
                 this.outPortError = true;
                 error = true;
             }
-            if (!isInteger(connection.multiplier)) {
+            if ($scope.includeChannel && !isInteger(connection.multiplier)) {
                 this.multiplierMessage = notIntegerError;
                 this.multiplierError = true;
                 error = true;
             }
-            if (connection.includeAttenuation && !isInteger(connection.attenuation)) {
+            if ($scope.includeAttenuation && !isInteger(connection.attenuation)) {
                 this.attenuationMessage = notIntegerError;
                 this.attenuationError = true;
                 error = true;
diff --git a/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.css b/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.css
index 511b2fc..6be2601 100644
--- a/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.css
+++ b/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.css
@@ -67,3 +67,22 @@
     font-size: 10px;
     width: 180px;
 }
+
+#ov-roadm-port .mode-select .mode-title {
+    margin: 0;
+    font-weight:bold;
+    font-size: 16px;
+}
+
+#ov-roadm-port .mode-select .mode-fail {
+    color: red;
+    font-size: 10px;
+}
+
+#ov-roadm-port .mode-select select {
+    width: 150px;
+}
+
+#ov-roadm-port .mode-select button {
+    width: 100px;
+}
\ No newline at end of file
diff --git a/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.html b/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.html
index 1e2affd..9ef475b 100644
--- a/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.html
+++ b/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.html
@@ -1,5 +1,5 @@
 <!-- partial HTML -->
-<div id="ov-roadm-port" class="less-gap">
+<div id="ov-roadm-port" class="less-gap" ng-init="queryShowItems()">
 
     <div class="tabular-header">
         <h2>Ports for Optical Device {{devId}} ({{tableData.length}} total)</h2>
@@ -18,7 +18,7 @@
             <div class="active"
                  icon icon-id="flowTable" icon-size="42"
                  tooltip tt-msg="flowTip"
-                 ng-click="nav('roadmFlow')"></div>
+                 ng-click="nav('roadmFlow')" ng-show="showFlowIcon"></div>
 
             <div class="current-view"
                  icon icon-id="portTable" icon-size="42"
@@ -27,7 +27,6 @@
     </div>
 
     <div class="summary-list" onos-table-resize>
-
         <div class="table-header" onos-sortable-header>
             <table>
                 <tr>
@@ -40,7 +39,8 @@
                     <td colId="grid" sortable>Grid <span class="units">(GHz)</span> </td>
                     <td colId="portMac" sortable>Input Power Range </td>
                     <td colId="currentPower">Current Power <span class="units">(0.01dBm)</span> </td>
-                    <td colId="targetPower" col-width="200px">Target Power <span class="units">(0.01dBm)</span> </td>
+                    <td colId="serviceState" ng-show="showServiceState">Protection Status </td>
+                    <td colId="targetPower" col-width="200px" ng-show="showTargetPower">Target Power <span class="units">(0.01dBm)</span> </td>
                 </tr>
             </table>
         </div>
@@ -48,7 +48,7 @@
         <div class="table-body">
             <table>
                 <tr ng-if="!tableData.length" class="no-data">
-                    <td colspan="10">
+                    <td colspan="11">
                         {{annots.no_rows_msg}}
                     </td>
                 </tr>
@@ -64,10 +64,17 @@
                     <td>{{item.grid}}</td>
                     <td>{{item.inputPowerRange}}</td>
                     <td>{{item.currentPower}}</td>
-                    <td class="editable" roadm-power="item" roadm-set-power="setPortPower(port, targetVal, cb)"></td>
+                    <td ng-show="showServiceState">{{item.serviceState}}</td>
+                    <td ng-show="showTargetPower" class="editable" roadm-power="item" roadm-set-power="setPortPower(port, targetVal, cb)"></td>
                 </tr>
             </table>
+            <div class="mode-select" ng-show="showServiceState">
+                <hr/>
+                <label class="mode-title">Protection Mode:</label>
+                <select ng-model="opsModeType" ng-options="mode.type for mode in opsModeTypes"></select>
+                <button ng-click="changeOpsMode()" title="Click to apply selected protection mode">Apply</button>
+                <label class="mode-fail" ng-if="changeModeFail">{{changeModeFailMsg}}</label>
+            </div>
         </div>
-
     </div>
 </div>
diff --git a/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.js b/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.js
index 447ac7d..128b72c 100644
--- a/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.js
+++ b/apps/roadm/src/main/resources/app/view/roadmPort/roadmPort.js
@@ -4,6 +4,10 @@
 
     var SET_TARGET_POWER_REQ = "roadmSetTargetPowerRequest";
     var SET_TARGET_POWER_RESP = "roadmSetTargetPowerResponse";
+    var SHOW_ITEMS_REQ = "roadmShowPortItemsRequest";
+    var SHOW_ITEMS_RESP = "roadmShowPortItemsResponse";
+    var SET_OPS_MODE_REQ = "roadmSetOpsModeRequest";
+    var SET_OPS_MODE_RESP = "roadmSetOpsModeResponse";
 
     // injected references
     var $log, $scope, $location, fs, tbs, wss, ns;
@@ -13,7 +17,7 @@
     function setPortPower(port, targetVal, cb) {
         var id = port.id;
         portCbTable[id] = cb;
-        wss.sendEvent("roadmSetTargetPowerRequest",
+        wss.sendEvent(SET_TARGET_POWER_REQ,
             {
                 devId: $scope.devId,
                 id: port.id,
@@ -25,6 +29,36 @@
         portCbTable[data.id](data.valid, data.message);
     }
 
+    function queryShowItems() {
+        wss.sendEvent(SHOW_ITEMS_REQ,
+            {
+                devId: $scope.devId,
+            });
+    }
+
+    function showItemsCb(data) {
+        $scope.showTargetPower = data.showTargetPower;
+        $scope.showServiceState = data.showServiceState;
+        $scope.showFlowIcon = data.showFlowIcon;
+        $scope.$apply();
+    }
+
+    function changeOpsMode() {
+        wss.sendEvent(SET_OPS_MODE_REQ,
+            {
+                devId: $scope.devId,
+                index: $scope.opsModeType.index
+            });
+    }
+
+    function changeOpsModeCb(data) {
+        $scope.changeModeFail = !data.valid;
+        if ($scope.changeModeFail) {
+            $scope.changeModeFailMsg = data.message;
+        }
+        $scope.$apply();
+    }
+
     // check if value is an integer
     function isInteger(val) {
         var INTEGER_REGEXP = /^\-?\d+$/;
@@ -51,11 +85,18 @@
 
             $scope.deviceTip = 'Show device table';
             $scope.flowTip = 'Show flow view for this device';
-            $scope.groupTip = 'Show group view for this device';
-            $scope.meterTip = 'Show meter view for selected device';
+            $scope.portTip = 'Show port view for this device';
+            $scope.opsModeTypes = [
+                {index: 0, type: "Auto"},
+                {index: 1, type: "Primary"},
+                {index: 2, type: "Secondary"}
+            ];
+            $scope.opsModeType = $scope.opsModeTypes[0];//auto mode
 
             var handlers = {};
             handlers[SET_TARGET_POWER_RESP] = portPowerCb;
+            handlers[SHOW_ITEMS_RESP] = showItemsCb;
+            handlers[SET_OPS_MODE_RESP] = changeOpsModeCb;
             wss.bindHandlers(handlers);
 
             params = $location.search();
@@ -70,9 +111,11 @@
             });
 
             $scope.setPortPower = setPortPower;
+            $scope.queryShowItems = queryShowItems;
+            $scope.changeOpsMode = changeOpsMode;
 
             $scope.setTargetPower = function (port, targetVal) {
-                wss.sendEvent("roadmSetTargetPowerRequest",
+                wss.sendEvent(SET_TARGET_POWER_REQ,
                     {
                         devId: $scope.devId,
                         id: port.id,