Overlay VPN page correction

IssueId : CLIENT-202

Change-Id: Iea28a285d86a3ee28f9ec453c9f6e0681776f2a0
Signed-off-by: seshukm <seshu.kumar.m@huawei.com>
diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/css/style.css b/lifecyclemgr/src/main/webapp/lifecyclemgr/css/style.css
index 954ad09..aeab876 100644
--- a/lifecyclemgr/src/main/webapp/lifecyclemgr/css/style.css
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/css/style.css
@@ -12,7 +12,12 @@
  * See the License for the specific language governing permissions and

  * limitations under the License.

  */

- 

+

+.containerh{

+    background-color:white !important;

+    min-height:900px !important;

+}

+

 .lcmanager{

     padding: 0 50px;

 }

@@ -74,7 +79,7 @@
     text-align: left;

 }

 

-.detailinfo, .topo, .inputdata {

+.detailinfo, .topo, .inputdata, .vpnConnections, .vpnGateway, .siteList, .vpcList {

     border-right: 1px solid #ddd;

 }

 

@@ -194,4 +199,13 @@
 	background-color:white !important;

 	min-height:500px;

 

-}
\ No newline at end of file
+}

+

+.rowSelected td{

+    background-color:#e8f8fe !important;

+}

+

+#overlaytabArea{

+    margin-top: 50px;

+    text-align: center;

+}

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/index.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/index.html
index 15cf035..c9f1931 100644
--- a/lifecyclemgr/src/main/webapp/lifecyclemgr/index.html
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/index.html
@@ -44,7 +44,7 @@
 

 </head>

 

-<body  ng-app="lcApp">

+<body  ng-app="lcApp" class="containerh">

 

 

 <div class="homecontent center lcmanager containerh">

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/js/DataService.js b/lifecyclemgr/src/main/webapp/lifecyclemgr/js/DataService.js
index 04394a2..a792de8 100644
--- a/lifecyclemgr/src/main/webapp/lifecyclemgr/js/DataService.js
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/js/DataService.js
@@ -18,10 +18,12 @@
 

 app.factory("DataService", function($http, $log){

     var lcData = null;

+    var overLayData = null;

     var createParamJsonObj = {

         templateId:'',

         parameters: {}

     };

+    var url = "";

     var tableDataLoaded = false;

     

     return {

@@ -38,9 +40,10 @@
 

             //load main Table

             return $http({

-                url: '/openoapi/servicegateway/v1/services',

+                url: url+'/openoapi/servicegateway/v1/services',

                 //url: 'http://localhost:5000/api/getLCData',

                 method: 'GET',

+                data: null,

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

 

                 /*url: '/openoapi/inventory/v1/services',

@@ -73,9 +76,37 @@
         },

         getOverlayData : function() {

             return $http({

-                url: '/openoapi/sdnooverlayvpn/v1/site2dc-vpn',

+                url: url+'/openoapi/sdnooverlayvpn/v1/site2dc-vpn',

                 //url: 'http://localhost:5000/api/getOverlayVPNData',

                 method: 'GET',

+                data: null,

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

+            }).then(function(response){

+                //$log.info(response);

+                overLayData = response.data.overlayData;

+                return response.data;

+            });

+        },

+        getOverlayVPNConnData : function(id, type){

+            var returnData = null;

+            if(overLayData) {

+                for (var i = 0; i < overLayData.length; i++) {

+                    if(overLayData[i].id == id) {

+                        returnData = overLayData[i][type];

+                        break;

+                    }

+                }

+                return returnData;

+            }

+            else

+                return null;

+        },

+        getSiteListData : function() {

+            return $http({

+                url: url+'/openoapi/sdnobrs/v1/sites',

+                //url: 'http://localhost:5000/api/getOverlayVPNData',

+                method: 'GET',

+                data: null,

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

             }).then(function(response){

                 //$log.info(response);

@@ -84,20 +115,37 @@
         },

         getUnderlayData : function() {

             return $http({

-                url: '/openoapi/sdnol3vpn/v1/l3vpns',

+                url: url+'/openoapi/sdnol3vpn/v1/l3vpns',

                 //url: 'http://localhost:5000/api/getUnderlayVPNData',

                 method: 'GET',

+                data: null,

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

             }).then(function(response){

                 //$log.info(response);

+                underlayData = response.data.data.underlayVPN;

                 return response.data;

             });

         },

+	getTPLinkData : function(id){

+            var returnData = null;

+            if(underlayData) {

+                for (var i = 0; i < underlayData.length; i++) {

+                    if(underlayData[i].id == id) {

+                        returnData = underlayData[i].tp_details;

+                        break;

+                    }

+                }

+                return returnData;

+            }

+            else

+                return null;

+        },

         loadServiceTopoSequence : function(id) {

             return $http({

-                url: '/openoapi/gso/v1/services/toposequence/' + id,

+                url: url+'/openoapi/gso/v1/services/toposequence/' + id,

                 //url: 'http://localhost:5000/api/getOverlayVPNData',

                 method: 'GET',

+                data: null,

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

             }).then(function(response){

                 //$log.info(response);

@@ -118,9 +166,10 @@
         generateTemplatesComponent : function() {

             //dropdown data

             return $http({

-                url: '/openoapi/catalog/v1/servicetemplates',

+                url: url+'/openoapi/catalog/v1/servicetemplates',

                 //url: 'http://localhost:5000/api/getTemplateData',

                 method: 'GET',

+                data: null,

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

             }).then(function(response){

                 //$log.info(response);

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/js/app.js b/lifecyclemgr/src/main/webapp/lifecyclemgr/js/app.js
index e1dbdbe..a6fe604 100644
--- a/lifecyclemgr/src/main/webapp/lifecyclemgr/js/app.js
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/js/app.js
@@ -128,9 +128,35 @@
             })

             .state("home.lcTabs.detailInfo.vpnManager.underlayVPN", {

                 url: "/underlayVPN",

-                templateUrl : "templates/underlayVPN.html",

+                templateUrl : "templates/underlayVPN_L3.html",

                 controller : "underlayVPNCtrl"

             })

+

+            .state("home.lcTabs.detailInfo.vpnManager.overlayVPN.overlayTabs", {

+                url: "/overlayTabs/:overlayId",

+                templateUrl : "templates/overlayTabs.html",

+                controller : "overlayTabsCtrl"

+            })

+            .state("home.lcTabs.detailInfo.vpnManager.overlayVPN.overlayTabs.vpnConnections", {

+                url: "/vpnConnections",

+                templateUrl : "templates/vpnConnections.html",

+                controller : "vpnConnectionsCtrl"

+            })

+            .state("home.lcTabs.detailInfo.vpnManager.overlayVPN.overlayTabs.vpnGateway", {

+                url: "/vpnGateway",

+                templateUrl : "templates/vpnGateway.html",

+                controller : "vpnGatewayCtrl"

+            })

+            .state("home.lcTabs.detailInfo.vpnManager.overlayVPN.overlayTabs.siteList", {

+                url: "/siteList",

+                templateUrl : "templates/siteList.html",

+                controller : "siteListCtrl"

+            })

+            .state("home.lcTabs.detailInfo.vpnManager.overlayVPN.overlayTabs.vpcList", {

+                url: "/vpcList",

+                templateUrl : "templates/vpcList.html",

+                controller : "vpcListCtrl"

+            })

         /*modalStateProvider.state("home.lcTabs1", {

             url: '/lcTabs',

             templateUrl: 'templates/lctabs.html'

@@ -149,10 +175,10 @@
             });

             if(!DataService.getTableDataLoaded()) {

                 DataService.loadGetServiceData()

-                    .then(function (data) {

-                        if (data) {

-                            $scope.tableData = data.data;

-                            var tableData = data.data;

+                    .then(function (response) {

+                        if (response.data) {

+                            $scope.tableData = response.data;

+                            var tableData = response.data;

                             loadTableData();

                             //$timeout(loadTableData, 0);

                         }

@@ -645,7 +671,7 @@
             var deletehtml = Mustache.to_html(def_button_tpl, delete_data);

             $('div.overlayAction').html($compile(deletehtml)($scope));*/

 

-            $scope.tableParams = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

+            $scope.tableParams = new NgTableParams({count: 3, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

             }, { counts:[], dataset: $scope.overlayData});

 

             $scope.checkboxes = { 'checked': false, items: {} };

@@ -665,18 +691,25 @@
                 $scope.checkboxes.items[user.id]

             });

         };

+

+        $scope.rowHighilited=function(row)

+        {

+            $scope.selectedRow = row;

+        }

+

     })

 

     /*-------------------------------------------------------------------------------UnderlayVPN---------------------------------------------------------------------*/

 

     .controller("underlayVPNCtrl", function($scope, $rootScope, $compile, DataService, NgTableParams){

         $scope.message = "Underlay VPN";

+        $scope.tpTableShowing = false;

 

         $scope.init = function() {

             //console.log("Underlay VPN... ng-init + " +  $rootScope.lcmModelTemplate);

             DataService.getUnderlayData()

-                .then(function(data){

-                    $scope.underlayVPN = data.underlayVPN;

+                .then(function(response){

+                    $scope.underlayVPN = response.data.underlayVPN;

                     console.log("Data: ");

                     loadButtons();

                 }, function(reason){

@@ -692,7 +725,7 @@
             $('div.underlayAction').html($compile(deletehtml)($scope));*/

 

             $scope.tableParams = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

-            }, { counts:[5, 10], dataset: $scope.underlayVPN.underlayData});

+            }, { counts:[5, 10], dataset: $scope.underlayVPN});

 

             $scope.checkboxes = { 'checked': false, items: {} };

 

@@ -705,8 +738,8 @@
                 });

             });

 

-            $scope.tableParams_tpDetails = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

-            }, { counts:[5, 10], dataset: $scope.underlayVPN.tp_details});

+            /*$scope.tableParams_tpDetails = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

+            }, { counts:[5, 10], dataset: $scope.underlayVPN.tp_details});*/

         }

         $scope.checkAll = function() {

             console.log("Checked ..");

@@ -714,6 +747,21 @@
                 $scope.checkboxes.items[data.id]

             });

         };

+

+        $scope.loadTPLinkData = function(id, row){

+            $scope.selectedRow = row;

+            $scope.tpTableShowing = true;

+            console.log("Underlay table row click");

+            var tp_detData = DataService.getTPLinkData(id);

+            $scope.tableParams_tpDetails = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

+            }, { counts:[5, 10], dataset: tp_detData});

+        }

+

+        $scope.rowHighilited=function(row)

+        {

+            $scope.selectedRow = row;

+        }

+

     })

 

     .controller('inputDataCtrl', function($scope, $stateParams, $log, DataService) {

@@ -767,6 +815,46 @@
 

     })

 

+    .controller('overlayTabsCtrl', function($scope, $state) {

+        $state.go('home.lcTabs.detailInfo.vpnManager.overlayVPN.overlayTabs.vpnConnections');

+    })

+

+    .controller('vpnConnectionsCtrl', function($scope, $stateParams, NgTableParams, DataService) {

+        $scope.message = "VPN Connections";

+        var rowData = DataService.getOverlayVPNConnData($stateParams.overlayId, "vpnConnections");

+        $scope.vpnConnTable = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

+        }, { counts:[5, 10], dataset: rowData});

+    })

+

+    .controller('vpnGatewayCtrl', function($scope, $stateParams, NgTableParams, DataService) {

+        $scope.message = "VPN Gateway";

+        var rowData = DataService.getOverlayVPNConnData($stateParams.overlayId, "vpnGateways");

+        $scope.vpnGateTable = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

+        }, { counts:[5, 10], dataset: rowData});

+    })

+

+    .controller('siteListCtrl', function($scope, $stateParams, NgTableParams, DataService) {

+        $scope.message = "Site List";

+        //var rowData = DataService.getSiteListData();

+        DataService.getSiteListData()

+            .then(function (response) {

+                $scope.siteListData = response.sites;

+                $scope.siteTable = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

+                }, { counts:[5, 10], dataset: $scope.siteListData});

+            }, function (reason) {

+                $scope.message = "Error is :" + JSON.stringify(reason);

+            });

+    })

+

+    .controller('vpcListCtrl', function($scope, $stateParams, NgTableParams, DataService) {

+        $scope.message = "VPN List";

+        var rowData = DataService.getOverlayVPNConnData($stateParams.overlayId, "vpcList");

+        $scope.vpcListTable = new NgTableParams({count: 5, sorting: {id: 'asc'}    //{page: 1,count: 10,filter: {name: 'M'},sorting: {name: 'desc'}

+        }, { counts:[5, 10], dataset: rowData});

+    })

+

+

+

 

 

 var lcmModelTemplate = "";

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/overlayTabs.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/overlayTabs.html
new file mode 100644
index 0000000..c2e04eb
--- /dev/null
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/overlayTabs.html
@@ -0,0 +1,36 @@
+<!--

+

+    Copyright 2017, Huawei Technologies Co., Ltd.

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+

+<!--<div id="lctabArea" ng-init="init()"></div>-->

+

+

+<div id="overlaytabArea">

+

+    <ul class="nav nav-tabs">

+        <li class="col-md-3 col-sm-3 col-xs-3 nopadding vpnConnections"><a ui-sref=".vpnConnections" ui-sref-active="link_active" class="nomargin">VPN Connections</a></li>

+        <!--<li class="col-md-4 col-sm-4 col-xs-4 nopadding topo"><a  ui-sref=".topo" ui-sref-active="link_active" class="nomargin" >Topo</a></li>-->

+        <li class="col-md-3 col-sm-3 col-xs-3 nopadding vpnGateway"><a  ui-sref=".vpnGateway" ui-sref-active="link_active" class="nomargin" >VPN Gateway</a></li>

+        <li class="col-md-3 col-sm-3 col-xs-3 nopadding siteList"><a  ui-sref=".siteList" ui-sref-active="link_active" class="nomargin" >Site List</a></li>

+        <li class="col-md-3 col-sm-3 col-xs-3 nopadding vpcList"><a  ui-sref=".vpcList" ui-sref-active="link_active" class="nomargin" >VPC List</a></li>

+    </ul>

+

+    <div class="tab-content"></div>

+    <ui-view></ui-view>

+

+

+</div>

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/overlayVPN.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/overlayVPN.html
index 1671983..d7ca3ba 100644
--- a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/overlayVPN.html
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/overlayVPN.html
@@ -18,46 +18,44 @@
 

 <div class="headerTitle">{{message}}</div>

 <br>

-

+<div class="col-md-12 col-sm-12 col-lg-12">

 <div class="overlayAction" ng-init="init()">

     <!--<button ng-click="showAddModal()" class="btnDefault pull-left">Add</button>-->

     <!--<button ng-click="deleteData()" class="btnDefault pull-left prvdel">Delete Selected</button>-->

 </div>

 <br>

 <div class="panel panel-default">

-<table ng-table="tableParams" class="table table table-striped table-hover table-bordered lctable" show-filter="true">

-    <tr ng-repeat="overlayData in $data">

+<table id="overlayTable" ng-table="tableParams" class="table table table-striped table-hover table-bordered lctable"  show-filter="true">

+    <tr ng-repeat="overlayData in $data" ui-sref=".overlayTabs({overlayId: overlayData.id})" ui-sref-active="selected-row">

         <!--<td header="'ng-table/headers/checkbox.html'">

             <input type="checkbox" ng-model="checkboxes.items[overlayData.id]" />

         </td>-->

+        <td title="'Id'" filter="{ id: 'text'}" sortable="'id'">

+            {{overlayData.id}}

+        </td>

         <td title="'Name'" filter="{ name: 'text'}" sortable="'name'">

             {{overlayData.name}}

         </td>

         <td title="'Description'" filter="{ desc: 'text'}" sortable="'desc'">

-            {{overlayData.desc}}

+            {{overlayData.description}}

         </td>

-        <td title="'Thin CPE'" filter="{ thinCPE: 'text'}" sortable="'thinCPE'">

-            {{overlayData.thinCPE}}

+        <td title="'Action State'" filter="{ actionState: 'text'}" sortable="'actionState'">

+            {{overlayData.actionState}}

         </td>

-        <td title="'Port : Vlan ID'" filter="{ portVlan: 'number'}" sortable="'portVlan'">

-            {{overlayData.portVlan}}

+        <td title="'Port : VPN Descriptor'" filter="{ vpnDescriptor: 'number'}" sortable="'vpnDescriptor'">

+            {{overlayData.vpnDescriptor}}

         </td>

-        <td title="'DC Name'" filter="{ dcName: 'text'}" sortable="'dcName'">

-            {{overlayData.dcName}}

-        </td>

-        <td title="'VPC'" filter="{ vpc: 'text'}" sortable="'vpc'">

-            {{overlayData.vpc}}

-        </td>

-        <td title="'VPC CIDR'" filter="{ vpcCIDR: 'text'}" sortable="'vpcCIDR'">

-            {{overlayData.vpcCIDR}}

-        </td>

-        <td title="'Action'">

-            <!--<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(overlayData.id)" style="cursor: pointer;margin: 0 5px"></span>-->

+

+        <!--<td title="'Action'">

+            &lt;!&ndash;<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(overlayData.id)" style="cursor: pointer;margin: 0 5px"></span>&ndash;&gt;

            <span  ng-click="deleteIndividualData(overlayData.id)" style="cursor: pointer;margin: 0 5px"><img src="/openoui/framework/browser/thirdparty/images/delete.png" height="15" align="middle"/></span>

-        </td>

+        </td>-->

+        

     </tr>

 </table>

 </div>

+<ui-view></ui-view>

+</div>

 

 <script type="text/ng-template" id="ng-table/headers/checkbox.html">

     <input type="checkbox" ng-model="checkboxes.checked" name="filter-checkbox" value="" />

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/siteList.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/siteList.html
new file mode 100644
index 0000000..0a4339b
--- /dev/null
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/siteList.html
@@ -0,0 +1,45 @@
+<!--

+

+    Copyright 2017, Huawei Technologies Co., Ltd.

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+

+<div class="headerTitle">{{message}}</div>

+<br>

+<br>

+<div class="panel panel-default">

+    <table ng-table="siteTable" class="table table table-striped table-hover table-bordered lctable "  show-filter="true">

+        <tr ng-repeat="siteData in $data">

+            <!--<td header="'ng-table/headers/checkbox.html'">

+                <input type="checkbox" ng-model="checkboxes.items[overlayData.id]" />

+            </td>-->

+            <td title="'Id'" filter="{ id: 'text'}" sortable="'id'">

+                {{siteData.id}}

+            </td>

+            <td title="'Name'" filter="{ name: 'text'}" sortable="'name'">

+                {{siteData.name}}

+            </td>

+

+            <!--<td title="'Action'">

+                &lt;!&ndash;<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(overlayData.id)" style="cursor: pointer;margin: 0 5px"></span>&ndash;&gt;

+               <span  ng-click="deleteIndividualData(overlayData.id)" style="cursor: pointer;margin: 0 5px"><img src="/openoui/framework/browser/thirdparty/images/delete.png" height="15" align="middle"/></span>

+            </td>-->

+        </tr>

+    </table>

+</div>

+

+<script type="text/ng-template" id="ng-table/headers/checkbox.html">

+    <input type="checkbox" ng-model="checkboxes.checked" name="filter-checkbox" value="" />

+</script>

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/underlayVPN_L2.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/underlayVPN_L2.html
new file mode 100644
index 0000000..4b8eedb
--- /dev/null
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/underlayVPN_L2.html
@@ -0,0 +1,78 @@
+<!--

+

+    Copyright 2017, Huawei Technologies Co., Ltd.

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+

+<div class="headerTitle">{{message}}</div>

+<br>

+

+<div class="underlayAction" ng-init="init()">

+    <!--<button ng-click="showAddModal()" class="btnDefault pull-left">Add</button>-->

+    <!--<button ng-click="deleteData()" class="btnDefault pull-left prvdel">Delete Selected</button>-->

+</div>

+<br>

+<div class="panel panel-default">

+    <table id="underlayTable" ng-table="tableParams" class="table table table-striped table-hover table-bordered lctable"   show-filter="true">

+        <tr ng-repeat="underlayData in $data" ng-class="{rowSelected:$index==selectedRow}" ng-click="loadTPLinkData(underlayData.id, $index)">

+            <!--<td header="'ng-table/headers/checkbox.html'">

+                <input type="checkbox" ng-model="checkboxes.items[underlayData.id]" />

+            </td>-->

+            <td title="'Name'" filter="{ name: 'text'}" sortable="'name'">

+                {{underlayData.name}}

+            </td>

+            <td title="'State'" filter="{ thinCPE: 'text'}" sortable="'thinCPE'">

+                {{underlayData.thinCPE}}

+            </td>

+            <td title="'Description'" filter="{ desc: 'text'}" sortable="'desc'">

+                {{underlayData.desc}}

+            </td>

+            <td title="'Action'">

+                <!--<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(underlayData.id)" style="cursor: pointer;margin: 0 5px"></span>-->

+                <span ng-click="deleteIndividualData(underlayData.id)" style="cursor: pointer;margin: 0 5px"><img src="/openoui/framework/browser/thirdparty/images/delete.png" height="15" align="middle"/></span>

+            </td>

+        </tr>

+    </table>

+</div>

+

+<script type="text/ng-template" id="ng-table/headers/checkbox.html">

+    <input type="checkbox" ng-model="checkboxes.checked" name="filter-checkbox" value="" />

+</script>

+

+<br>

+<div id="tpLinkBlock" ng-show="tpTableShowing">

+    <div class="headerTitle">TP Details</div>

+    <div class="panel panel-default">

+        <table ng-table="tableParams_tpDetails" class="table table table-striped table-hover table-bordered lctable" show-filter="true">

+            <tr ng-repeat="tpDetailsData in $data" ng-class="{rowSelected:$index==selectedRow}" ng-click="rowHighilited($index)">

+                <td title="'TP Name'" filter="{ tp_name: 'text'}" sortable="'tp_name'">

+                    {{tpDetailsData.tp_name}}

+                </td>

+                <td title="'PE Name'" filter="{ pe_name: 'text'}" sortable="'pe_name'">

+                    {{tpDetailsData.pe_name}}

+                </td>

+                <td title="'VLAN ID'" filter="{ vlanId: 'text'}" sortable="'vlanId'">

+                    {{tpDetailsData.vlanId}}

+                </td>

+                <td title="'Site CIDR'" filter="{ site_cidr: 'text'}" sortable="'site_cidr'">

+                    {{tpDetailsData.site_cidr}}

+                </td>

+                <td title="'IP'" filter="{ ip: 'text'}" sortable="'ip'">

+                    {{tpDetailsData.ip}}

+                </td>

+            </tr>

+        </table>

+    </div>

+</div>
\ No newline at end of file
diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/underlayVPN_L3.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/underlayVPN_L3.html
new file mode 100644
index 0000000..b91ec32
--- /dev/null
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/underlayVPN_L3.html
@@ -0,0 +1,78 @@
+<!--

+

+    Copyright 2017, Huawei Technologies Co., Ltd.

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+

+<div class="headerTitle">{{message}}</div>

+<br>

+

+<div class="underlayAction" ng-init="init()">

+    <!--<button ng-click="showAddModal()" class="btnDefault pull-left">Add</button>-->

+    <!--<button ng-click="deleteData()" class="btnDefault pull-left prvdel">Delete Selected</button>-->

+</div>

+<br>

+<div class="panel panel-default">

+<table id="underlayTable" ng-table="tableParams" class="table table table-striped table-hover table-bordered lctable"   show-filter="true">

+    <tr ng-repeat="underlayData in $data" ng-class="{rowSelected:$index==selectedRow}" ng-click="loadTPLinkData(underlayData.id, $index)">

+        <!--<td header="'ng-table/headers/checkbox.html'">

+            <input type="checkbox" ng-model="checkboxes.items[underlayData.id]" />

+        </td>-->

+        <td title="'Name'" filter="{ name: 'text'}" sortable="'name'">

+            {{underlayData.name}}

+        </td>

+        <td title="'State'" filter="{ thinCPE: 'text'}" sortable="'thinCPE'">

+            {{underlayData.thinCPE}}

+        </td>

+        <td title="'Description'" filter="{ desc: 'text'}" sortable="'desc'">

+            {{underlayData.desc}}

+        </td>

+        <td title="'Action'">

+            <!--<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(underlayData.id)" style="cursor: pointer;margin: 0 5px"></span>-->

+        <span ng-click="deleteIndividualData(underlayData.id)" style="cursor: pointer;margin: 0 5px"><img src="/openoui/framework/browser/thirdparty/images/delete.png" height="15" align="middle"/></span>

+        </td>

+    </tr>

+</table>

+</div>

+

+<script type="text/ng-template" id="ng-table/headers/checkbox.html">

+    <input type="checkbox" ng-model="checkboxes.checked" name="filter-checkbox" value="" />

+</script>

+

+<br>

+<div id="tpLinkBlock" ng-show="tpTableShowing">

+    <div class="headerTitle">TP Details</div>

+    <div class="panel panel-default">

+    <table ng-table="tableParams_tpDetails" class="table table table-striped table-hover table-bordered lctable" show-filter="true">

+        <tr ng-repeat="tpDetailsData in $data" ng-class="{rowSelected:$index==selectedRow}" ng-click="rowHighilited($index)">

+            <td title="'TP Name'" filter="{ tp_name: 'text'}" sortable="'tp_name'">

+                {{tpDetailsData.tp_name}}

+            </td>

+            <td title="'PE Name'" filter="{ pe_name: 'text'}" sortable="'pe_name'">

+                {{tpDetailsData.pe_name}}

+            </td>

+            <td title="'VLAN ID'" filter="{ vlanId: 'text'}" sortable="'vlanId'">

+                {{tpDetailsData.vlanId}}

+            </td>

+            <td title="'Site CIDR'" filter="{ site_cidr: 'text'}" sortable="'site_cidr'">

+                {{tpDetailsData.site_cidr}}

+            </td>

+            <td title="'IP'" filter="{ ip: 'text'}" sortable="'ip'">

+                {{tpDetailsData.ip}}

+            </td>

+        </tr>

+    </table>

+    </div>

+</div>
\ No newline at end of file
diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpcList.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpcList.html
new file mode 100644
index 0000000..1412a4c
--- /dev/null
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpcList.html
@@ -0,0 +1,45 @@
+<!--

+

+    Copyright 2017, Huawei Technologies Co., Ltd.

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+

+<div class="headerTitle">{{message}}</div>

+<br>

+<br>

+<div class="panel panel-default">

+    <table ng-table="vpcListTable" class="table table table-striped table-hover table-bordered lctable"  show-filter="true">

+        <tr ng-repeat="vpcListData in $data">

+            <!--<td header="'ng-table/headers/checkbox.html'">

+                <input type="checkbox" ng-model="checkboxes.items[overlayData.id]" />

+            </td>-->

+            <td title="'Id'" filter="{ id: 'text'}" sortable="'id'">

+                {{vpcListData.id}}

+            </td>

+            <td title="'Name'" filter="{ name: 'text'}" sortable="'name'">

+                {{vpcListData.name}}

+            </td>

+

+            <!--<td title="'Action'">

+                &lt;!&ndash;<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(overlayData.id)" style="cursor: pointer;margin: 0 5px"></span>&ndash;&gt;

+               <span  ng-click="deleteIndividualData(overlayData.id)" style="cursor: pointer;margin: 0 5px"><img src="/openoui/framework/browser/thirdparty/images/delete.png" height="15" align="middle"/></span>

+            </td>-->

+        </tr>

+    </table>

+</div>

+

+<script type="text/ng-template" id="ng-table/headers/checkbox.html">

+    <input type="checkbox" ng-model="checkboxes.checked" name="filter-checkbox" value="" />

+</script>

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpnConnections.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpnConnections.html
new file mode 100644
index 0000000..f57c073
--- /dev/null
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpnConnections.html
@@ -0,0 +1,60 @@
+<!--

+

+    Copyright 2017, Huawei Technologies Co., Ltd.

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+

+<div class="headerTitle">{{message}}</div>

+<br>

+<br>

+<div class="panel panel-default">

+    <table ng-table="vpnConnTable" class="table table table-striped table-hover table-bordered lctable"  show-filter="true">

+        <tr ng-repeat="vpnConnData in $data">

+            <!--<td header="'ng-table/headers/checkbox.html'">

+                <input type="checkbox" ng-model="checkboxes.items[overlayData.id]" />

+            </td>-->

+            <td title="'Id'" filter="{ id: 'text'}" sortable="'id'">

+                {{vpnConnData.id}}

+            </td>

+            <td title="'Name'" filter="{ name: 'text'}" sortable="'name'">

+                {{vpnConnData.name}}

+            </td>

+            <td title="'Description'" filter="{ description: 'text'}" sortable="'description'">

+                {{vpnConnData.description}}

+            </td>

+            <td title="'Port : Deploy Status'" filter="{ deployStatus: 'number'}" sortable="'deployStatus'">

+                {{vpnConnData.deployStatus}}

+            </td>

+            <td title="'Action State'" filter="{ actionState: 'text'}" sortable="'actionState'">

+                {{vpnConnData.actionState}}

+            </td>

+            <td title="'Port : Running Status'" filter="{ runningStatus: 'number'}" sortable="'runningStatus'">

+                {{vpnConnData.runningStatus}}

+            </td>

+            <td title="'Port : Route Type'" filter="{ routeType: 'number'}" sortable="'routeType'">

+                {{vpnConnData.routeType}}

+            </td>

+

+            <!--<td title="'Action'">

+                &lt;!&ndash;<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(overlayData.id)" style="cursor: pointer;margin: 0 5px"></span>&ndash;&gt;

+               <span  ng-click="deleteIndividualData(overlayData.id)" style="cursor: pointer;margin: 0 5px"><img src="/openoui/framework/browser/thirdparty/images/delete.png" height="15" align="middle"/></span>

+            </td>-->

+        </tr>

+    </table>

+</div>

+

+<script type="text/ng-template" id="ng-table/headers/checkbox.html">

+    <input type="checkbox" ng-model="checkboxes.checked" name="filter-checkbox" value="" />

+</script>

diff --git a/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpnGateway.html b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpnGateway.html
new file mode 100644
index 0000000..44d4c8d
--- /dev/null
+++ b/lifecyclemgr/src/main/webapp/lifecyclemgr/templates/vpnGateway.html
@@ -0,0 +1,58 @@
+<!--

+

+    Copyright 2017, Huawei Technologies Co., Ltd.

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+

+<div class="headerTitle">{{message}}</div>

+<br>

+<br>

+<div class="panel panel-default">

+    <table ng-table="vpnGateTable" class="table table table-striped table-hover table-bordered lctable"  show-filter="true">

+        <tr ng-repeat="vpnGateData in $data">

+            <!--<td header="'ng-table/headers/checkbox.html'">

+                <input type="checkbox" ng-model="checkboxes.items[overlayData.id]" />

+            </td>-->

+            <td title="'Id'" filter="{ id: 'text'}" sortable="'id'">

+                {{vpnGateData.id}}

+            </td>

+            <td title="'Name'" filter="{ name: 'text'}" sortable="'name'">

+                {{vpnGateData.name}}

+            </td>

+            <td title="'Description'" filter="{ description: 'text'}" sortable="'description'">

+                {{vpnGateData.description}}

+            </td>

+

+            <td title="'Action State'" filter="{ actionState: 'text'}" sortable="'actionState'">

+                {{vpnGateData.actionState}}

+            </td>

+

+            <td title="'VPC Id'" filter="{ vpcid: 'text'}" sortable="'vpcid'">

+                {{vpnGateData.vpcId}}

+            </td>

+

+

+

+            <!--<td title="'Action'">

+                &lt;!&ndash;<span class="pull-right glyphicon glyphicon-edit" ng-click="editData(overlayData.id)" style="cursor: pointer;margin: 0 5px"></span>&ndash;&gt;

+               <span  ng-click="deleteIndividualData(overlayData.id)" style="cursor: pointer;margin: 0 5px"><img src="/openoui/framework/browser/thirdparty/images/delete.png" height="15" align="middle"/></span>

+            </td>-->

+        </tr>

+    </table>

+</div>

+

+<script type="text/ng-template" id="ng-table/headers/checkbox.html">

+    <input type="checkbox" ng-model="checkboxes.checked" name="filter-checkbox" value="" />

+</script>