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>
+ <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>
+ <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('/');
+ });