This is an automated email from the ASF dual-hosted git repository.

ocket8888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new ccfbaec  TP: adds ability to view all ds's that employ a topology / 
all cg's used by a topology (#4723)
ccfbaec is described below

commit ccfbaec76939a6a4041390f44efc66e77b2d1528
Author: Jeremy Mitchell <[email protected]>
AuthorDate: Mon Jun 8 11:26:05 2020 -0600

    TP: adds ability to view all ds's that employ a topology / all cg's used by 
a topology (#4723)
    
    * adds ability to view delivery services assigned to a topology
    
    * adds ability to view all cache groups used by a topology
    
    * adds change log entry
    
    * fixes button types
---
 CHANGELOG.md                                       |   4 +-
 traffic_portal/app/src/app.js                      |   3 +
 .../form/topology/FormTopologyController.js        |   8 +
 .../modules/form/topology/form.topology.tpl.html   |   4 +
 .../cacheGroups/TableCacheGroupsController.js      |   2 +
 .../TableTopologyCacheGroupsController.js          |  67 ++++++++
 .../modules/table/topologyCacheGroups/index.js     |   1 +
 .../table.topologyCacheGroups.tpl.html             |  69 ++++++++
 .../TableTopologyDeliveryServicesController.js     |  55 +++++++
 .../index.js                                       |   5 +-
 .../table.topologyDeliveryServices.tpl.html        | 173 +++++++++++++++++++++
 .../private/topologies/cacheGroups/index.js        |  42 +++++
 .../private/topologies/deliveryServices/index.js   |  42 +++++
 13 files changed, 472 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index abf6c10..572f3d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,9 +11,11 @@ The format is based on [Keep a 
Changelog](http://keepachangelog.com/en/1.0.0/).
     - Traffic Ops: Added an API 3.0 endpoint, /api/3.0/topologies, to create, 
read, update and delete flexible topologies.
     - Traffic Ops: Added new `topology` field to the /api/3.0/deliveryservices 
APIs
     - Traffic Ops: Added support for `topology` query parameter to `GET 
/api/3.0/cachegroups` to return all cachegroups used in the given topology.
+    - Traffic Ops: Added support for `topology` query parameter to `GET 
/api/3.0/deliveryservices` to return all delivery services that employ a given 
topology.
     - Traffic Ops: Added validation to prohibit assigning caches to 
topology-based delivery services
     - Traffic Portal: Added the ability to create, read, update and delete 
flexible topologies.
-    - Traffic Portal: Added the ability to assign topologies to delivery 
services
+    - Traffic Portal: Added the ability to assign topologies to delivery 
services.
+    - Traffic Portal: Added the ability to view all delivery services and 
cache groups associated with a topology.
 - Updated /servers/details to use multiple interfaces in API v3
 - Astats csv support - astats will now respond to `Accept: text/csv` and 
return a csv formatted stats list
 
diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js
index 1b2e477..ddf01c5 100644
--- a/traffic_portal/app/src/app.js
+++ b/traffic_portal/app/src/app.js
@@ -203,6 +203,8 @@ var trafficPortal = angular.module('trafficPortal', [
         require('./modules/private/tenants/users').name,
         require('./modules/private/types').name,
         require('./modules/private/topologies').name,
+        require('./modules/private/topologies/cacheGroups').name,
+        require('./modules/private/topologies/deliveryServices').name,
         require('./modules/private/topologies/edit').name,
         require('./modules/private/topologies/list').name,
         require('./modules/private/topologies/new').name,
@@ -396,6 +398,7 @@ var trafficPortal = angular.module('trafficPortal', [
         require('./common/modules/table/tenantDeliveryServices').name,
         require('./common/modules/table/tenantUsers').name,
         require('./common/modules/table/topologies').name,
+        require('./common/modules/table/topologyDeliveryServices').name,
         require('./common/modules/table/topologyCacheGroups').name,
         require('./common/modules/table/topologyCacheGroupServers').name,
         require('./common/modules/table/types').name,
diff --git 
a/traffic_portal/app/src/common/modules/form/topology/FormTopologyController.js 
b/traffic_portal/app/src/common/modules/form/topology/FormTopologyController.js
index 2087c65..a260a50 100644
--- 
a/traffic_portal/app/src/common/modules/form/topology/FormTopologyController.js
+++ 
b/traffic_portal/app/src/common/modules/form/topology/FormTopologyController.js
@@ -105,6 +105,14 @@ var FormTopologyController = function(topology, 
cacheGroups, $anchorScroll, $sco
 
        $scope.hasPropertyError = formUtils.hasPropertyError;
 
+       $scope.viewCacheGroups = function() {
+               $location.path('/topologies/cache-groups');
+       };
+
+       $scope.viewDeliveryServices = function() {
+               $location.path('/topologies/delivery-services');
+       };
+
        $scope.nodeLabel = function(node) {
                return node.cachegroup || 'TOPOLOGY';
        };
diff --git 
a/traffic_portal/app/src/common/modules/form/topology/form.topology.tpl.html 
b/traffic_portal/app/src/common/modules/form/topology/form.topology.tpl.html
index 5f020c8..13b24b7 100644
--- a/traffic_portal/app/src/common/modules/form/topology/form.topology.tpl.html
+++ b/traffic_portal/app/src/common/modules/form/topology/form.topology.tpl.html
@@ -23,6 +23,10 @@ under the License.
             <li><a ng-click="navigateToPath('/topologies')">Topologies</a></li>
             <li class="active">{{::topologyName}}</li>
         </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button type="button" class="btn btn-primary" title="View Cache 
Groups" ng-click="viewCacheGroups(topology)">View Cache Groups</button>
+            <button type="button" class="btn btn-primary" title="View Delivery 
Services" ng-click="viewDeliveryServices(topology)">View Delivery 
Services</button>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">
diff --git 
a/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
 
b/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
index 706dbb5..5e46a7b 100644
--- 
a/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
+++ 
b/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
@@ -112,6 +112,8 @@ var TableCacheGroupsController = function(cacheGroups, 
$location, $scope, $state
 
     $scope.cacheGroups = cacheGroups;
 
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
     $scope.columns = [
         { "name": "Name", "visible": true, "searchable": true },
         { "name": "Short Name", "visible": true, "searchable": true },
diff --git 
a/traffic_portal/app/src/common/modules/table/topologyCacheGroups/TableTopologyCacheGroupsController.js
 
b/traffic_portal/app/src/common/modules/table/topologyCacheGroups/TableTopologyCacheGroupsController.js
new file mode 100644
index 0000000..3752957
--- /dev/null
+++ 
b/traffic_portal/app/src/common/modules/table/topologyCacheGroups/TableTopologyCacheGroupsController.js
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var TableTopologyCacheGroupsController = function(topologies, cacheGroups, 
$controller, $scope) {
+
+       // extends the TableCacheGroupsController to inherit common methods
+       angular.extend(this, $controller('TableCacheGroupsController', { 
cacheGroups: cacheGroups, $scope: $scope }));
+
+       let topologyCGsTable;
+
+       $scope.topology = topologies[0];
+
+       /*
+        * The parent properties (primary/secondary parent) of a cache group 
are not
+        * respected in the context of a topology so they have been removed 
from view
+        */
+       $scope.columns = [
+               { "name": "Name", "visible": true, "searchable": true },
+               { "name": "Short Name", "visible": true, "searchable": true },
+               { "name": "Type", "visible": true, "searchable": true },
+               { "name": "Latitude", "visible": true, "searchable": true },
+               { "name": "Longitude", "visible": true, "searchable": true }
+       ];
+
+       $scope.toggleVisibility = function(colName) {
+               const col = topologyCGsTable.column(colName + ':name');
+               col.visible(!col.visible());
+               topologyCGsTable.rows().invalidate().draw();
+       };
+
+       angular.element(document).ready(function () {
+               topologyCGsTable = $('#topologyCGsTable').DataTable({
+                       "lengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+                       "iDisplayLength": 25,
+                       "aaSorting": [],
+                       "columns": $scope.columns,
+                       "initComplete": function(settings, json) {
+                               try {
+                                       // need to create the show/hide column 
checkboxes and bind to the current visibility
+                                       $scope.columns = 
JSON.parse(localStorage.getItem('DataTables_topologyCGsTable_/')).columns;
+                               } catch (e) {
+                                       console.error("Failure to retrieve 
required column info from localStorage (key=DataTables_topologyCGsTable_/):", 
e);
+                               }
+                       }
+               });
+       });
+
+};
+
+TableTopologyCacheGroupsController.$inject = ['topologies', 'cacheGroups', 
'$controller', '$scope'];
+module.exports = TableTopologyCacheGroupsController;
diff --git 
a/traffic_portal/app/src/common/modules/table/topologyCacheGroups/index.js 
b/traffic_portal/app/src/common/modules/table/topologyCacheGroups/index.js
index 023d755..20378b5 100644
--- a/traffic_portal/app/src/common/modules/table/topologyCacheGroups/index.js
+++ b/traffic_portal/app/src/common/modules/table/topologyCacheGroups/index.js
@@ -18,4 +18,5 @@
  */
 
 module.exports = angular.module('trafficPortal.table.topologyCacheGroups', [])
+       .controller('TableTopologyCacheGroupsController', 
require('./TableTopologyCacheGroupsController'))
        .controller('TableSelectTopologyCacheGroupsController', 
require('./TableSelectTopologyCacheGroupsController'));
diff --git 
a/traffic_portal/app/src/common/modules/table/topologyCacheGroups/table.topologyCacheGroups.tpl.html
 
b/traffic_portal/app/src/common/modules/table/topologyCacheGroups/table.topologyCacheGroups.tpl.html
new file mode 100644
index 0000000..048a804
--- /dev/null
+++ 
b/traffic_portal/app/src/common/modules/table/topologyCacheGroups/table.topologyCacheGroups.tpl.html
@@ -0,0 +1,69 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/topologies')">Topologies</a></li>
+            <li><a ng-click="navigateToPath('/topologies/edit?name=' + 
topology.name)">{{::topology.name}}</a></li>
+            <li class="active">Cache Groups</li>
+        </ol>
+        <div class="pull-right">
+            <button type="button" class="btn btn-default" title="Refresh" 
ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+            <div id="toggleColumns" class="btn-group" role="group" 
title="Select Table Columns" uib-dropdown is-open="columnSettings.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" 
uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    <i class="fa fa-columns"></i>&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <menu ng-click="$event.stopPropagation()" 
class="column-settings dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem" ng-repeat="c in columns | 
orderBy:'name'">
+                        <div class="checkbox">
+                            <label><input type="checkbox" ng-model="c.visible" 
ng-click="toggleVisibility(c.name)"> {{::c.name}}</label>
+                        </div>
+                    </li>
+                </menu>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="topologyCGsTable" class="table responsive-utilities 
jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Name</th>
+                <th>Short Name</th>
+                <th>Type</th>
+                <th>Latitude</th>
+                <th>Longitude</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editCacheGroup(cg.id)" ng-repeat="cg in 
::cacheGroups" context-menu="contextMenuItems">
+                <td data-search="^{{::cg.name}}$">{{::cg.name}}</td>
+                <td data-search="^{{::cg.shortName}}$">{{::cg.shortName}}</td>
+                <td data-search="^{{::cg.typeName}}$">{{::cg.typeName}}</td>
+                <td data-search="^{{::cg.latitude}}$">{{::cg.latitude}}</td>
+                <td data-search="^{{::cg.longitude}}$">{{::cg.longitude}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
diff --git 
a/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/TableTopologyDeliveryServicesController.js
 
b/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/TableTopologyDeliveryServicesController.js
new file mode 100644
index 0000000..f4166a8
--- /dev/null
+++ 
b/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/TableTopologyDeliveryServicesController.js
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+var TableTopologyDeliveryServicesController = function(topologies, 
deliveryServices, $controller, $scope) {
+
+       // extends the TableDeliveryServicesController to inherit common methods
+       angular.extend(this, $controller('TableDeliveryServicesController', { 
deliveryServices: deliveryServices, $scope: $scope }));
+
+       let topologyDSsTable;
+
+       $scope.topology = topologies[0];
+
+       $scope.toggleVisibility = function(colName) {
+               const col = topologyDSsTable.column(colName + ':name');
+               col.visible(!col.visible());
+               topologyDSsTable.rows().invalidate().draw();
+       };
+
+       angular.element(document).ready(function () {
+               topologyDSsTable = $('#topologyDSsTable').DataTable({
+                       "lengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+                       "iDisplayLength": 25,
+                       "aaSorting": [],
+                       "columns": $scope.columns,
+                       "initComplete": function(settings, json) {
+                               try {
+                                       // need to create the show/hide column 
checkboxes and bind to the current visibility
+                                       $scope.columns = 
JSON.parse(localStorage.getItem('DataTables_topologyDSsTable_/')).columns;
+                               } catch (e) {
+                                       console.error("Failure to retrieve 
required column info from localStorage (key=DataTables_topologyDSsTable_/):", 
e);
+                               }
+                       }
+               });
+       });
+
+};
+
+TableTopologyDeliveryServicesController.$inject = ['topologies', 
'deliveryServices', '$controller', '$scope'];
+module.exports = TableTopologyDeliveryServicesController;
diff --git 
a/traffic_portal/app/src/common/modules/table/topologyCacheGroups/index.js 
b/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/index.js
similarity index 80%
copy from 
traffic_portal/app/src/common/modules/table/topologyCacheGroups/index.js
copy to 
traffic_portal/app/src/common/modules/table/topologyDeliveryServices/index.js
index 023d755..6c97b1e 100644
--- a/traffic_portal/app/src/common/modules/table/topologyCacheGroups/index.js
+++ 
b/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/index.js
@@ -1,3 +1,4 @@
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,5 +18,5 @@
  * under the License.
  */
 
-module.exports = angular.module('trafficPortal.table.topologyCacheGroups', [])
-       .controller('TableSelectTopologyCacheGroupsController', 
require('./TableSelectTopologyCacheGroupsController'));
+module.exports = 
angular.module('trafficPortal.table.topologyDeliveryServices', [])
+       .controller('TableTopologyDeliveryServicesController', 
require('./TableTopologyDeliveryServicesController'));
diff --git 
a/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/table.topologyDeliveryServices.tpl.html
 
b/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/table.topologyDeliveryServices.tpl.html
new file mode 100644
index 0000000..efb91cb
--- /dev/null
+++ 
b/traffic_portal/app/src/common/modules/table/topologyDeliveryServices/table.topologyDeliveryServices.tpl.html
@@ -0,0 +1,173 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/topologies')">Topologies</a></li>
+            <li><a ng-click="navigateToPath('/topologies/edit?name=' + 
topology.name)">{{::topology.name}}</a></li>
+            <li class="active">Delivery Services</li>
+        </ol>
+        <div class="pull-right">
+            <button type="button" class="btn btn-default" title="Refresh" 
ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+            <div class="btn-group" role="group" title="Select Table Columns" 
uib-dropdown is-open="columnSettings.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" 
uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    <i class="fa fa-columns"></i>&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <menu ng-click="$event.stopPropagation()" 
class="column-settings dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem" ng-repeat="c in columns | 
orderBy:'name'">
+                        <div class="checkbox">
+                            <label><input type="checkbox" ng-model="c.visible" 
ng-click="toggleVisibility(c.name)"> {{::c.name}}</label>
+                        </div>
+                    </li>
+                </menu>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="topologyDSsTable" class="table responsive-utilities 
jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Active</th>
+                <th>Anonymous Blocking</th>
+                <th>CDN</th>
+                <th>Check Path</th>
+                <th>Consistent Hash Query Params</th>
+                <th>Consistent Hash Regex</th>
+                <th>Deep Caching Type</th>
+                <th>Display Name</th>
+                <th>DNS Bypass CNAME</th>
+                <th>DNS Bypass IP</th>
+                <th>DNS Bypass IPv6</th>
+                <th>DNS Bypass TTL</th>
+                <th>DNS TTL</th>
+                <th>DSCP</th>
+                <th>ECS Enabled</th>
+                <th>Edge Header Rewrite Rules</th>
+                <th>FQ Pacing Rate</th>
+                <th>Geo Limit</th>
+                <th>Geo Limit Countries</th>
+                <th>Geo Limit Redirect URL</th>
+                <th>Geolocation Provider</th>
+                <th>Geo Miss Latitude</th>
+                <th>Geo Miss Longitude</th>
+                <th>Global Max Mbps</th>
+                <th>Global Max TPS</th>
+                <th>HTTP Bypass FQDN</th>
+                <th>ID</th>
+                <th>Info URL</th>
+                <th>Initial Dispersion</th>
+                <th>IPv6 Routing</th>
+                <th>Last Updated</th>
+                <th>Long Desc 1</th>
+                <th>Long Desc 2</th>
+                <th>Long Desc 3</th>
+                <th>Max DNS Answers</th>
+                <th>Max Origin Connections</th>
+                <th>Mid Header Rewrite Rules</th>
+                <th>Multi-Site Origin</th>
+                <th>Origin Shield</th>
+                <th>Origin FQDN</th>
+                <th>Profile</th>
+                <th>Protocol</th>
+                <th>Qstring Handling</th>
+                <th>Range Request Handling</th>
+                <th>Regex Remap Expression</th>
+                <th>Regional Geoblocking</th>
+                <th>Raw Remap Text</th>
+                <th>Routing Name</th>
+                <th>Signed</th>
+                <th>Signing Algorithm</th>
+                <th>Range Slice Block Size</th>
+                <th>Tenant</th>
+                <th>Topology</th>
+                <th>TR Request Headers</th>
+                <th>TR Response Headers</th>
+                <th>Type</th>
+                <th>XML ID (Key)</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editDeliveryService(ds)" ng-repeat="ds in 
::deliveryServices" context-menu="contextMenuItems">
+                <td data-search="^{{::ds.active}}$">{{::ds.active}}</td>
+                <td 
data-search="^{{::ds.anonymousBlockingEnabled}}$">{{::ds.anonymousBlockingEnabled}}</td>
+                <td data-search="^{{::ds.cdnName}}$">{{::ds.cdnName}}</td>
+                <td data-search="^{{::ds.checkPath}}$">{{::ds.checkPath}}</td>
+                <td 
data-search="^{{::ds.consistentHashQueryParams}}$">{{::ds.consistentHashQueryParams.join(',
 ')}}</td>
+                <td 
data-search="^{{::ds.consistentHashRegex}}$">{{::ds.consistentHashRegex}}</td>
+                <td 
data-search="^{{::ds.deepCachingType}}$">{{::ds.deepCachingType}}</td>
+                <td 
data-search="^{{::ds.displayName}}$">{{::ds.displayName}}</td>
+                <td 
data-search="^{{::ds.dnsBypassCname}}$">{{::ds.dnsBypassCname}}</td>
+                <td 
data-search="^{{::ds.dnsBypassIp}}$">{{::ds.dnsBypassIp}}</td>
+                <td 
data-search="^{{::ds.dnsBypassIp6}}$">{{::ds.dnsBypassIp6}}</td>
+                <td 
data-search="^{{::ds.dnsBypassTtl}}$">{{::ds.dnsBypassTtl}}</td>
+                <td data-search="^{{::ds.ccrDnsTtl}}$">{{::ds.ccrDnsTtl}}</td>
+                <td data-search="^{{::ds.dscp}}$">{{::ds.dscp}}</td>
+                <td 
data-search="^{{::ds.ecsEnabled}}$">{{::ds.ecsEnabled}}</td>
+                <td 
data-search="^{{::ds.edgeHeaderRewrite}}$">{{::ds.edgeHeaderRewrite}}</td>
+                <td 
data-search="^{{::ds.fqPacingRate}}$">{{::ds.fqPacingRate}}</td>
+                <td data-search="^{{::geoLimit(ds)}}$">{{::geoLimit(ds)}}</td>
+                <td 
data-search="^{{::ds.geoLimitCountries}}$">{{::ds.geoLimitCountries}}</td>
+                <td 
data-search="^{{::ds.geoLimitRedirectURL}}$">{{::ds.geoLimitRedirectURL}}</td>
+                <td 
data-search="^{{::geoProvider(ds)}}$">{{::geoProvider(ds)}}</td>
+                <td data-search="^{{::ds.missLat}}$">{{::ds.missLat}}</td>
+                <td data-search="^{{::ds.missLong}}$">{{::ds.missLong}}</td>
+                <td 
data-search="^{{::ds.globalMaxMbps}}$">{{::ds.globalMaxMbps}}</td>
+                <td 
data-search="^{{::ds.globalMaxTps}}$">{{::ds.globalMaxTps}}</td>
+                <td 
data-search="^{{::ds.httpBypassFqdn}}$">{{::ds.httpBypassFqdn}}</td>
+                <td data-search="^{{::ds.id}}$">{{::ds.id}}</td>
+                <td data-search="^{{::ds.infoUrl}}$">{{::ds.infoUrl}}</td>
+                <td 
data-search="^{{::ds.initialDispersion}}$">{{::ds.initialDispersion}}</td>
+                <td 
data-search="^{{::ds.ipv6RoutingEnabled}}$">{{::ds.ipv6RoutingEnabled}}</td>
+                <td data-search="^{{::getRelativeTime(ds.lastUpdated)}}$" 
data-order="{{::ds.lastUpdated}}">{{::getRelativeTime(ds.lastUpdated)}}</td>
+                <td data-search="^{{::ds.longDesc}}$">{{::ds.longDesc}}</td>
+                <td data-search="^{{::ds.longDesc1}}$">{{::ds.longDesc1}}</td>
+                <td data-search="^{{::ds.longDesc2}}$">{{::ds.longDesc2}}</td>
+                <td 
data-search="^{{::ds.maxDnsAnswers}}$">{{::ds.maxDnsAnswers}}</td>
+                <td 
data-search="^{{::ds.maxOriginConnections}}$">{{::ds.maxOriginConnections}}</td>
+                <td 
data-search="^{{::ds.midHeaderRewrite}}$">{{::ds.midHeaderRewrite}}</td>
+                <td 
data-search="^{{::ds.multiSiteOrigin}}$">{{::ds.multiSiteOrigin}}</td>
+                <td 
data-search="^{{::ds.originShield}}$">{{::ds.originShield}}</td>
+                <td 
data-search="^{{::ds.orgServerFqdn}}$">{{::ds.orgServerFqdn}}</td>
+                <td 
data-search="^{{::ds.profileName}}$">{{::ds.profileName}}</td>
+                <td data-search="^{{::protocol(ds)}}$">{{::protocol(ds)}}</td>
+                <td data-search="^{{::qstring(ds)}}$">{{::qstring(ds)}}</td>
+                <td data-search="^{{::rrh(ds)}}$">{{::rrh(ds)}}</td>
+                <td 
data-search="^{{::ds.regexRemap}}$">{{::ds.regexRemap}}</td>
+                <td 
data-search="^{{::ds.regionalGeoBlocking}}$">{{::ds.regionalGeoBlocking}}</td>
+                <td data-search="^{{::ds.remapText}}$">{{::ds.remapText}}</td>
+                <td 
data-search="^{{::ds.routingName}}$">{{::ds.routingName}}</td>
+                <td data-search="^{{::ds.signed}}$">{{::ds.signed}}</td>
+                <td 
data-search="^{{::ds.signingAlgorithm}}$">{{::ds.signingAlgorithm}}</td>
+                <td 
data-search="^{{::ds.rangeSliceBlockSize}}$">{{::ds.rangeSliceBlockSize}}</td>
+                <td data-search="^{{::ds.tenant}}$">{{::ds.tenant}}</td>
+                <td data-search="^{{::ds.topology}}$">{{::ds.topology}}</td>
+                <td 
data-search="^{{::ds.trResponseHeaders}}$">{{::ds.trResponseHeaders}}</td>
+                <td 
data-search="^{{::ds.trRequestHeaders}}$">{{::ds.trRequestHeaders}}</td>
+                <td data-search="^{{::ds.type}}$">{{::ds.type}}</td>
+                <td name="xmlId" 
data-search="^{{::ds.xmlId}}$">{{::ds.xmlId}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
diff --git 
a/traffic_portal/app/src/modules/private/topologies/cacheGroups/index.js 
b/traffic_portal/app/src/modules/private/topologies/cacheGroups/index.js
new file mode 100644
index 0000000..0425aa8
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/topologies/cacheGroups/index.js
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = 
angular.module('trafficPortal.private.topologies.cacheGroups', [])
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       .state('trafficPortal.private.topologies.cacheGroups', {
+                               url: '/cache-groups?name',
+                               views: {
+                                       topologiesContent: {
+                                               templateUrl: 
'common/modules/table/topologyCacheGroups/table.topologyCacheGroups.tpl.html',
+                                               controller: 
'TableTopologyCacheGroupsController',
+                                               resolve: {
+                                                       topologies: 
function($stateParams, topologyService) {
+                                                               return 
topologyService.getTopologies({ name: $stateParams.name });
+                                                       },
+                                                       cacheGroups: 
function(topologies, cacheGroupService) {
+                                                               return 
cacheGroupService.getCacheGroups({ topology: topologies[0].name });
+                                                       }
+                                               }
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });
diff --git 
a/traffic_portal/app/src/modules/private/topologies/deliveryServices/index.js 
b/traffic_portal/app/src/modules/private/topologies/deliveryServices/index.js
new file mode 100644
index 0000000..80aa1a2
--- /dev/null
+++ 
b/traffic_portal/app/src/modules/private/topologies/deliveryServices/index.js
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+module.exports = 
angular.module('trafficPortal.private.topologies.deliveryServices', [])
+       .config(function($stateProvider, $urlRouterProvider) {
+               $stateProvider
+                       
.state('trafficPortal.private.topologies.deliveryServices', {
+                               url: '/delivery-services?name',
+                               views: {
+                                       topologiesContent: {
+                                               templateUrl: 
'common/modules/table/topologyDeliveryServices/table.topologyDeliveryServices.tpl.html',
+                                               controller: 
'TableTopologyDeliveryServicesController',
+                                               resolve: {
+                                                       topologies: 
function($stateParams, topologyService) {
+                                                               return 
topologyService.getTopologies({ name: $stateParams.name });
+                                                       },
+                                                       deliveryServices: 
function(topologies, deliveryServiceService) {
+                                                               return 
deliveryServiceService.getDeliveryServices({ topology: topologies[0].name });
+                                                       }
+                                               }
+                                       }
+                               }
+                       })
+               ;
+               $urlRouterProvider.otherwise('/');
+       });

Reply via email to