You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by da...@apache.org on 2016/12/07 23:30:55 UTC

[2/6] incubator-trafficcontrol git commit: adds placeholder functionality for experimental TO UI

adds placeholder functionality for experimental TO UI


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/829ce404
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/829ce404
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/829ce404

Branch: refs/heads/master
Commit: 829ce404f6fbe0b69eb30ecbbf8a715756b4ca9d
Parents: 93385ab
Author: Jeremy Mitchell <mi...@gmail.com>
Authored: Wed Dec 7 12:37:08 2016 -0700
Committer: Dan Kirkwood <da...@gmail.com>
Committed: Wed Dec 7 16:29:28 2016 -0700

----------------------------------------------------------------------
 traffic_ops/experimental/ui/app/src/app.js      | 13 +++-
 .../src/common/api/ProfileParameterService.js   | 29 ++++++++
 .../ui/app/src/common/api/ServerService.js      |  4 +-
 .../experimental/ui/app/src/common/api/index.js |  1 +
 .../form/cacheGroup/FormCacheGroupController.js | 10 ++-
 .../form/cacheGroup/form.cacheGroup.tpl.html    | 17 ++++-
 .../modules/form/cdn/FormCDNController.js       | 22 +++++-
 .../common/modules/form/cdn/form.cdn.tpl.html   | 20 +++++-
 .../FormDeliveryServiceController.js            | 24 ++++++-
 .../form.deliveryService.tpl.html               | 20 +++++-
 .../form/division/FormDivisionController.js     |  8 ++-
 .../form/division/form.division.tpl.html        |  3 +
 .../form/profile/FormProfileController.js       |  8 +++
 .../modules/form/profile/form.profile.tpl.html  | 15 +++-
 .../modules/form/server/FormServerController.js | 30 ++++++--
 .../modules/form/server/form.server.tpl.html    | 18 ++++-
 .../modules/form/user/FormUserController.js     |  8 ++-
 .../common/modules/form/user/form.user.tpl.html |  3 +
 .../common/modules/header/HeaderController.js   |  4 ++
 .../src/common/modules/header/header.tpl.html   |  5 ++
 .../TableCacheGroupParametersController.js      | 46 ++++++++++++
 .../modules/table/cacheGroupParameters/index.js | 21 ++++++
 .../table.cacheGroupParameters.tpl.html         | 54 ++++++++++++++
 .../TableCacheGroupServersController.js         | 46 ++++++++++++
 .../modules/table/cacheGroupServers/index.js    | 21 ++++++
 .../table.cacheGroupServers.tpl.html            | 75 +++++++++++++++++++
 .../TableDeliveryServiceServersController.js    | 46 ++++++++++++
 .../table/deliveryServiceServers/index.js       | 21 ++++++
 .../table.deliveryServiceServers.tpl.html       | 75 +++++++++++++++++++
 .../TableDivisionRegionsController.js           | 46 ++++++++++++
 .../modules/table/divisionRegions/index.js      | 21 ++++++
 .../table.divisionRegions.tpl.html              | 52 ++++++++++++++
 .../TableProfileParametersController.js         | 46 ++++++++++++
 .../modules/table/profileParameters/index.js    | 21 ++++++
 .../table.profileParameters.tpl.html            | 54 ++++++++++++++
 .../table/profiles/TableProfilesController.js   |  8 +++
 .../table/profiles/table.profiles.tpl.html      |  3 +
 .../TableServerDeliveryServicesController.js    | 50 +++++++++++++
 .../table/serverDeliveryServices/index.js       | 21 ++++++
 .../table.serverDeliveryServices.tpl.html       | 76 ++++++++++++++++++++
 .../table/servers/TableServersController.js     |  4 ++
 .../table/servers/table.servers.tpl.html        |  9 ++-
 .../TableUserDeliveryServicesController.js      | 46 ++++++++++++
 .../modules/table/userDeliveryServices/index.js | 21 ++++++
 .../table.userDeliveryServices.tpl.html         | 53 ++++++++++++++
 .../modules/private/admin/asns/edit/index.js    |  2 +-
 .../modules/private/admin/cdns/edit/index.js    |  2 +-
 .../private/admin/divisions/edit/index.js       |  2 +-
 .../private/admin/divisions/regions/index.js    | 42 +++++++++++
 .../private/admin/locations/edit/index.js       |  2 +-
 .../private/admin/parameters/edit/index.js      |  2 +-
 .../private/admin/profiles/edit/index.js        |  2 +-
 .../private/admin/profiles/parameters/index.js  | 11 +--
 .../modules/private/admin/regions/edit/index.js |  2 +-
 .../private/admin/statuses/edit/index.js        |  2 +-
 .../modules/private/admin/tenants/edit/index.js |  2 +-
 .../modules/private/admin/types/edit/index.js   |  2 +-
 .../admin/users/deliveryServices/index.js       | 42 +++++++++++
 .../modules/private/admin/users/edit/index.js   |  2 +-
 .../private/configure/cacheGroups/edit/index.js |  2 +-
 .../configure/cacheGroups/parameters/index.js   |  7 +-
 .../configure/cacheGroups/servers/index.js      | 42 +++++++++++
 .../configure/deliveryServices/edit/index.js    |  2 +-
 .../configure/deliveryServices/servers/index.js | 42 +++++++++++
 .../configure/servers/deliveryServices/index.js | 42 +++++++++++
 .../private/configure/servers/edit/index.js     |  2 +-
 .../experimental/ui/app/src/styles/main.scss    |  6 +-
 67 files changed, 1414 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/app.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/app.js b/traffic_ops/experimental/ui/app/src/app.js
index d94cf81..9bbc457 100644
--- a/traffic_ops/experimental/ui/app/src/app.js
+++ b/traffic_ops/experimental/ui/app/src/app.js
@@ -65,6 +65,7 @@ var trafficOps = angular.module('trafficOps', [
         require('./modules/private/admin/divisions/edit').name,
         require('./modules/private/admin/divisions/list').name,
         require('./modules/private/admin/divisions/new').name,
+        require('./modules/private/admin/divisions/regions').name,
         require('./modules/private/admin/locations').name,
         require('./modules/private/admin/locations/edit').name,
         require('./modules/private/admin/locations/list').name,
@@ -95,6 +96,7 @@ var trafficOps = angular.module('trafficOps', [
         require('./modules/private/admin/types/list').name,
         require('./modules/private/admin/types/new').name,
         require('./modules/private/admin/users').name,
+        require('./modules/private/admin/users/deliveryServices').name,
         require('./modules/private/admin/users/edit').name,
         require('./modules/private/admin/users/list').name,
         require('./modules/private/admin/users/new').name,
@@ -106,11 +108,14 @@ var trafficOps = angular.module('trafficOps', [
         require('./modules/private/configure/cacheGroups/list').name,
         require('./modules/private/configure/cacheGroups/new').name,
         require('./modules/private/configure/cacheGroups/parameters').name,
+        require('./modules/private/configure/cacheGroups/servers').name,
         require('./modules/private/configure/deliveryServices').name,
         require('./modules/private/configure/deliveryServices/edit').name,
         require('./modules/private/configure/deliveryServices/list').name,
         require('./modules/private/configure/deliveryServices/new').name,
+        require('./modules/private/configure/deliveryServices/servers').name,
         require('./modules/private/configure/servers').name,
+        require('./modules/private/configure/servers/deliveryServices').name,
         require('./modules/private/configure/servers/edit').name,
         require('./modules/private/configure/servers/new').name,
         require('./modules/private/configure/servers/list').name,
@@ -179,19 +184,25 @@ var trafficOps = angular.module('trafficOps', [
 
         // tables
         require('./common/modules/table/cacheGroups').name,
+        require('./common/modules/table/cacheGroupParameters').name,
+        require('./common/modules/table/cacheGroupServers').name,
         require('./common/modules/table/asns').name,
         require('./common/modules/table/cdns').name,
         require('./common/modules/table/deliveryServices').name,
+        require('./common/modules/table/deliveryServiceServers').name,
         require('./common/modules/table/divisions').name,
+        require('./common/modules/table/divisionRegions').name,
         require('./common/modules/table/locations').name,
         require('./common/modules/table/parameters').name,
+        require('./common/modules/table/profileParameters').name,
         require('./common/modules/table/profiles').name,
         require('./common/modules/table/regions').name,
         require('./common/modules/table/servers').name,
-        require('./common/modules/table/servers').name,
+        require('./common/modules/table/serverDeliveryServices').name,
         require('./common/modules/table/statuses').name,
         require('./common/modules/table/types').name,
         require('./common/modules/table/users').name,
+        require('./common/modules/table/userDeliveryServices').name,
 
         // models
         require('./common/models').name,

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js b/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js
new file mode 100644
index 0000000..fdb4341
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js
@@ -0,0 +1,29 @@
+/*
+ * 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 ProfileParameterService = function(Restangular) {
+
+	this.getProfileParameters = function(profileId) {
+		return Restangular.one('profiles', profileId).getList('parameters')
+	};
+
+};
+
+ProfileParameterService.$inject = ['Restangular'];
+module.exports = ProfileParameterService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/api/ServerService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ServerService.js b/traffic_ops/experimental/ui/app/src/common/api/ServerService.js
index 1ec7ce6..831d835 100644
--- a/traffic_ops/experimental/ui/app/src/common/api/ServerService.js
+++ b/traffic_ops/experimental/ui/app/src/common/api/ServerService.js
@@ -19,8 +19,8 @@
 
 var ServerService = function(Restangular, locationUtils, messageModel) {
 
-    this.getServers = function() {
-        return Restangular.all('servers').getList();
+    this.getServers = function(dsId) {
+        return Restangular.all('servers').getList({ dsId: dsId });
     };
 
     this.getServer = function(id) {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/api/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/index.js b/traffic_ops/experimental/ui/app/src/common/api/index.js
index 857e598..79a6601 100644
--- a/traffic_ops/experimental/ui/app/src/common/api/index.js
+++ b/traffic_ops/experimental/ui/app/src/common/api/index.js
@@ -29,6 +29,7 @@ module.exports = angular.module('trafficOps.api', [])
     .service('locationService', require('./LocationService'))
     .service('parameterService', require('./ParameterService'))
     .service('profileService', require('./ProfileService'))
+    .service('profileParameterService', require('./ProfileParameterService'))
     .service('roleService', require('./RoleService'))
     .service('regionService', require('./RegionService'))
     .service('serverService', require('./ServerService'))

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
index 276e2f7..a26277d 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
@@ -36,13 +36,21 @@ var FormCacheGroupController = function(cacheGroup, $scope, $location, formUtils
     $scope.cacheGroup = cacheGroup;
 
     $scope.queueUpdates = function() {
-        alert('not implemented: queuing updates for all cachegroup servers');
+        alert('not hooked up yet: queuing updates for all cachegroup servers');
+    };
+
+    $scope.dequeueUpdates = function() {
+        alert('not hooked up yet: dequeuing updates for all cachegroup servers');
     };
 
     $scope.viewParams = function() {
         $location.path($location.path() + '/parameters');
     };
 
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
     $scope.navigateToPath = locationUtils.navigateToPath;
 
     $scope.hasError = formUtils.hasError;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
index 02ec33c..689287e 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
@@ -23,8 +23,21 @@ under the License.
             <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
             <li class="active">{{cacheGroupName}}</li>
         </ol>
-        <button class="btn btn-default pull-right" ng-show="!settings.isNew" ng-click="viewParams()">View Params</button>
-        <button class="btn btn-warning pull-right" ng-show="!settings.isNew" ng-click="queueUpdates()">Queue Server Updates</button>
+        <div class="btn-group pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" ng-click="viewServers()">Servers</button>
+            <button class="btn btn-default" ng-click="viewParams()">Parameters</button>
+
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="queueUpdates()">Queue Server Updates</a></li>
+                    <li role="menuitem"><a ng-click="dequeueUpdates()">Dequeue Server Updates</a></li>
+                </ul>
+            </div>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js
index 9166727..35ed8ee 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js
@@ -32,8 +32,28 @@ var FormCDNController = function(cdn, $scope, formUtils, stringUtils, locationUt
         { value: true, label: 'true' }
     ];
 
+    $scope.manageDNSSEC = function() {
+        alert('not hooked up yet: manageDNSSEC for CDN');
+    };
+
+    $scope.manageSSL = function() {
+        alert('not hooked up yet: manageSSL for cdn');
+    };
+
+    $scope.cachegroupHealth = function() {
+        alert('not hooked up yet: cachegroupHealth for CDN');
+    };
+
     $scope.queueUpdates = function() {
-        alert('not implemented: queuing updates for all cdn servers');
+        alert('not hooked up yet: queuing updates for all cdn servers');
+    };
+
+    $scope.dequeueUpdates = function() {
+        alert('not hooked up yet: dequeuing updates for all cdn servers');
+    };
+
+    $scope.manageSnapshots = function() {
+        alert('not hooked up yet: manageSnapshots for CDN');
     };
 
     $scope.navigateToPath = locationUtils.navigateToPath;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html
index 50d2b7d..23f356e 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html
@@ -23,7 +23,25 @@ under the License.
             <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
             <li class="active">{{cdnName}}</li>
         </ol>
-        <button class="btn btn-warning pull-right" ng-show="!settings.isNew" ng-click="queueUpdates()">Queue Server Updates</button>
+        <div class="btn-group pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" ng-click="manageSnapshots()">Snapshot</button>
+
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="manageDNSSEC()">Manage DNSSEC Keys</a></li>
+                    <li role="menuitem"><a ng-click="manageSSL()">Manage SSL Keys</a></li>
+                    <li class="divider"></li>
+                    <li role="menuitem"><a ng-click="queueUpdates()">Queue Server Updates</a></li>
+                    <li role="menuitem"><a ng-click="dequeueUpdates()">Dequeue Server Updates</a></li>
+                    <li class="divider"></li>
+                    <li role="menuitem"><a ng-click="cachegroupHealth()">View Cachegroup Health</a></li>
+                </ul>
+            </div>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
index 82c9a7c..32843ee 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-var FormDeliveryServiceController = function(deliveryService, $scope, formUtils, locationUtils, cdnService, profileService, typeService) {
+var FormDeliveryServiceController = function(deliveryService, $scope, $location, formUtils, locationUtils, cdnService, profileService, typeService) {
 
     var getTypes = function() {
         typeService.getTypes('deliveryservice')
@@ -122,6 +122,26 @@ var FormDeliveryServiceController = function(deliveryService, $scope, formUtils,
         { value: 4, label: "4 - Latch on Failover" }
     ];
 
+    $scope.assignServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.cachegroupHealth = function() {
+        alert('not hooked up yet: cachegroupHealth for DS');
+    };
+
+    $scope.invalidateContent = function() {
+        alert('not hooked up yet: invalidateContent for DS');
+    };
+
+    $scope.manageSslKeys = function() {
+        alert('not hooked up yet: manageSslKeys for DS');
+    };
+
+    $scope.manageUrlSigKeys = function() {
+        alert('not hooked up yet: manageUrlSigKeys for DS');
+    };
+
     $scope.navigateToPath = locationUtils.navigateToPath;
 
     $scope.hasError = formUtils.hasError;
@@ -137,5 +157,5 @@ var FormDeliveryServiceController = function(deliveryService, $scope, formUtils,
 
 };
 
-FormDeliveryServiceController.$inject = ['deliveryService', '$scope', 'formUtils', 'locationUtils', 'cdnService', 'profileService', 'typeService'];
+FormDeliveryServiceController.$inject = ['deliveryService', '$scope', '$location', 'formUtils', 'locationUtils', 'cdnService', 'profileService', 'typeService'];
 module.exports = FormDeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
index 277c44b..f195bad 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.tpl.html
@@ -19,10 +19,28 @@ under the License.
 
 <div class="x_panel">
     <div class="x_title">
-        <ol class="breadcrumb">
+        <ol class="breadcrumb pull-left">
             <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
             <li class="active">{{deliveryServiceName}}</li>
         </ol>
+        <div class="btn-group pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" ng-click="assignServers()">Servers</button>
+
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
+                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
+                    <li class="divider"></li>
+                    <li role="menuitem"><a ng-click="invalidateContent()">Invalidate Content</a></li>
+                    <li class="divider"></li>
+                    <li role="menuitem"><a ng-click="cachegroupHealth()">View Cachegroup Health</a></li>
+                </ul>
+            </div>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js
index 81d4031..b977a1b 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-var FormDivisionController = function(division, $scope, formUtils, stringUtils, locationUtils) {
+var FormDivisionController = function(division, $scope, $location, formUtils, stringUtils, locationUtils) {
 
     $scope.division = division;
 
@@ -27,6 +27,10 @@ var FormDivisionController = function(division, $scope, formUtils, stringUtils,
 
     $scope.labelize = stringUtils.labelize;
 
+    $scope.viewRegions = function() {
+        $location.path($location.path() + '/regions');
+    };
+
     $scope.navigateToPath = locationUtils.navigateToPath;
 
     $scope.hasError = formUtils.hasError;
@@ -35,5 +39,5 @@ var FormDivisionController = function(division, $scope, formUtils, stringUtils,
 
 };
 
-FormDivisionController.$inject = ['division', '$scope', 'formUtils', 'stringUtils', 'locationUtils'];
+FormDivisionController.$inject = ['division', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
 module.exports = FormDivisionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html
index 5139493..839deb9 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html
@@ -23,6 +23,9 @@ under the License.
             <li><a ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
             <li class="active">{{divisionName}}</li>
         </ol>
+        <div class="btn-group pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" ng-click="viewRegions()">Regions</button>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js
index 7afedbe..8bef869 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js
@@ -31,6 +31,14 @@ var FormProfileController = function(profile, $scope, $location, formUtils, stri
         $location.path($location.path() + '/parameters');
     };
 
+    $scope.cloneProfile = function() {
+        alert('not hooked up yet: cloneProfile');
+    };
+
+    $scope.exportProfile = function() {
+        alert('not hooked up yet: exportProfile');
+    };
+
     $scope.navigateToPath = locationUtils.navigateToPath;
 
     $scope.hasError = formUtils.hasError;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html
index d4b35db..735b8a2 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html
@@ -23,7 +23,20 @@ under the License.
             <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
             <li class="active">{{profileName}}</li>
         </ol>
-        <button class="btn btn-default pull-right" ng-show="!settings.isNew" ng-click="viewParams()">View Params</button>
+        <div class="btn-group pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" ng-click="viewParams()">Parameters</button>
+
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="clone()">Clone Profile</a></li>
+                    <li role="menuitem"><a ng-click="export()">Export Profile</a></li>
+                </ul>
+            </div>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js
index 60b0595..a6c22db 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-var FormServerController = function(server, $scope, formUtils, stringUtils, locationUtils, cacheGroupService, cdnService, locationService, profileService, statusService, typeService) {
+var FormServerController = function(server, $scope, $location, formUtils, stringUtils, locationUtils, cacheGroupService, cdnService, locationService, profileService, statusService, typeService) {
 
     var getLocations = function() {
         locationService.getLocations()
@@ -76,8 +76,8 @@ var FormServerController = function(server, $scope, formUtils, stringUtils, loca
         { name: 'ipAddress', type: 'text', required: true, maxLength: 45, pattern: ipRegex, invalidMsg: 'Invalid' },
         { name: 'ipNetmask', type: 'text', required: true, maxLength: 45, pattern: ipRegex, invalidMsg: 'Invalid' },
         { name: 'ipGateway', type: 'text', required: true, maxLength: 45, pattern: ipRegex, invalidMsg: 'Invalid' },
-        { name: 'ip6Address', type: 'text', required: false, maxLength: 50, pattern: ipRegex, invalidMsg: 'Invalid' },
-        { name: 'ip6Gateway', type: 'text', required: false, maxLength: 50, pattern: ipRegex, invalidMsg: 'Invalid' },
+        { name: 'ip6Address', type: 'text', required: false, maxLength: 50 },
+        { name: 'ip6Gateway', type: 'text', required: false, maxLength: 50 },
         { name: 'interfaceMtu', type: 'text', required: true, maxLength: 11, pattern: new RegExp(/(^1500$|^9000$)/), invalidMsg: '1500 or 9000' },
         { name: 'rack', type: 'text', required: false, maxLength: 64 },
         { name: 'offlineReason', type: 'text', required: false, maxLength: 256 },
@@ -102,7 +102,27 @@ var FormServerController = function(server, $scope, formUtils, stringUtils, loca
     ];
 
     $scope.queueUpdates = function() {
-        alert('not implemented: queuing updates for server');
+        alert('not hooked up yet: queuing updates for server');
+    };
+
+    $scope.dequeueUpdates = function() {
+        alert('not hooked up yet: dequeuing updates for server');
+    };
+
+    $scope.viewConfig = function() {
+        alert('not hooked up yet: view config files for server');
+    };
+
+    $scope.offlineServer = function() {
+        alert('not hooked up yet: offlineServer for server');
+    };
+
+    $scope.onlineServer = function() {
+        alert('not hooked up yet: onlineServer for server');
+    };
+
+    $scope.viewDeliveryServices = function() {
+        $location.path($location.path() + '/delivery-services');
     };
 
     $scope.navigateToPath = locationUtils.navigateToPath;
@@ -123,5 +143,5 @@ var FormServerController = function(server, $scope, formUtils, stringUtils, loca
 
 };
 
-FormServerController.$inject = ['server', '$scope', 'formUtils', 'stringUtils', 'locationUtils', 'cacheGroupService', 'cdnService', 'locationService', 'profileService', 'statusService', 'typeService'];
+FormServerController.$inject = ['server', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'cacheGroupService', 'cdnService', 'locationService', 'profileService', 'statusService', 'typeService'];
 module.exports = FormServerController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html
index 12ca2da..70afbfc 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html
@@ -23,7 +23,23 @@ under the License.
             <li><a ng-click="navigateToPath('/configure/servers')">Servers</a></li>
             <li class="active">{{serverName}}</li>
         </ol>
-        <button class="btn btn-warning pull-right" ng-show="!settings.isNew" ng-click="queueUpdates()">Queue Server Updates</button>
+        <div class="btn-group pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" ng-show="server.status == 'REPORTED'" ng-click="offlineServer()">Offline Server</button>
+            <button class="btn btn-default" ng-show="server.status != 'REPORTED'" ng-click="onlineServer()">Online Server</button>
+            <button class="btn btn-default" ng-show="!server.updPending" ng-click="queueUpdates()">Queue Updates</button>
+            <button class="btn btn-default" ng-show="server.updPending" ng-click="dequeueUpdates()">Dequeue Updates</button>
+
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li><a ng-click="viewDeliveryServices()">View Delivery Services</a></li>
+                    <li><a ng-click="viewConfig()">View Server Config Files</a></li>
+                </ul>
+            </div>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js
index 29e8b59..8ba1699 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-var FormUserController = function(user, $scope, formUtils, stringUtils, locationUtils, roleService) {
+var FormUserController = function(user, $scope, $location, formUtils, stringUtils, locationUtils, roleService) {
 
     var getRoles = function() {
         roleService.getRoles()
@@ -30,6 +30,10 @@ var FormUserController = function(user, $scope, formUtils, stringUtils, location
 
     $scope.labelize = stringUtils.labelize;
 
+    $scope.viewDeliveryServices = function() {
+        $location.path($location.path() + '/delivery-services');
+    };
+
     $scope.navigateToPath = locationUtils.navigateToPath;
 
     $scope.hasError = formUtils.hasError;
@@ -43,5 +47,5 @@ var FormUserController = function(user, $scope, formUtils, stringUtils, location
 
 };
 
-FormUserController.$inject = ['user', '$scope', 'formUtils', 'stringUtils', 'locationUtils', 'roleService'];
+FormUserController.$inject = ['user', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'roleService'];
 module.exports = FormUserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html
index 8faf59f..d9391b1 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html
@@ -24,6 +24,9 @@ under the License.
             <li><a ng-click="navigateToPath('/admin/users')">Users</a></li>
             <li class="active">{{userName}}</li>
         </ol>
+        <div class="btn-group pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" ng-click="viewDeliveryServices()">Assigned Delivery Services</button>
+        </div>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js b/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js
index 498ee9d..3b7e547 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js
@@ -36,6 +36,10 @@ var HeaderController = function($rootScope, $scope, $log, $state, $anchorScroll,
         authService.logout();
     };
 
+    $scope.downloadDB = function() {
+        alert('not hooked up yet: downloadDB');
+    };
+
     var scrollToTop = function() {
         $anchorScroll(); // hacky?
     };

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html
index feb5ff7..8172197 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html
@@ -62,6 +62,11 @@ under the License.
                     </ul>
                 </div>
             </li>
+            <li>
+                <div class="btn-group" title="Download DB">
+                    <button type="button" class="btn btn-link" ng-click="downloadDB()"><i class="fa fa-download"></i></button>
+                </div>
+            </li>
         </ul>
     </nav>
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
new file mode 100644
index 0000000..401e5a7
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
@@ -0,0 +1,46 @@
+/*
+ * 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 TableCacheGroupParametersController = function(cacheGroup, parameters, $scope, locationUtils) {
+
+	$scope.cacheGroup = cacheGroup;
+
+	$scope.parameters = parameters;
+
+	$scope.addParameter = function() {
+		alert('not hooked up yet: add parameter to cache group');
+	};
+
+	$scope.removeParameter = function() {
+		alert('not hooked up yet: remove Parameter from cache group');
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#parametersTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 100
+		});
+	});
+
+};
+
+TableCacheGroupParametersController.$inject = ['cacheGroup', 'parameters', '$scope', 'locationUtils'];
+module.exports = TableCacheGroupParametersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js
new file mode 100644
index 0000000..0509780
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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('trafficOps.table.cacheGroupParameters', [])
+	.controller('TableCacheGroupParametersController', require('./TableCacheGroupParametersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
new file mode 100644
index 0000000..6cdf36f
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
@@ -0,0 +1,54 @@
+<!--
+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('/configure/cache-groups')">Cache Groups</a></li>
+            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{cacheGroup.name}}</a></li>
+            <li class="active">Parameters</li>
+        </ol>
+        <button class="btn btn-primary pull-right" ng-click="addParameter()">Add</button>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="parametersTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>id</th>
+                <th>name</th>
+                <th>configFile</th>
+                <th>value</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="parameter in parameters">
+                <td>{{parameter.id}}</td>
+                <td>{{parameter.name}}</td>
+                <td>{{parameter.configFile}}</td>
+                <td>{{parameter.value}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove from Cache Group" ng-click="removeParameter()"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
new file mode 100644
index 0000000..d1a135c
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
@@ -0,0 +1,46 @@
+/*
+ * 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 TableCacheGroupsServersController = function(cacheGroup, servers, $scope, locationUtils) {
+
+	$scope.cacheGroup = cacheGroup;
+
+	$scope.servers = servers;
+
+	$scope.addServer = function() {
+		alert('not hooked up yet: addServer to cg');
+	};
+
+	$scope.removeServer = function() {
+		alert('not hooked up yet: removeServer from cg');
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 100
+		});
+	});
+
+};
+
+TableCacheGroupsServersController.$inject = ['cacheGroup', 'servers', '$scope', 'locationUtils'];
+module.exports = TableCacheGroupsServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js
new file mode 100644
index 0000000..081000c
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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('trafficOps.table.cacheGroupServers', [])
+	.controller('TableCacheGroupServersController', require('./TableCacheGroupServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
new file mode 100644
index 0000000..43c1b1d
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
@@ -0,0 +1,75 @@
+<!--
+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('/configure/cache-groups')">Cache Groups</a></li>
+            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{cacheGroup.name}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <button class="btn btn-primary pull-right" ng-click="addServer()">Add</button>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+                <th>type</th>
+                <th>location</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>profile</th>
+                <th>iloIpAddress</th>
+                <th>iloIpGateway</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="server in servers" ng-class="{'active': server.updPending}">
+                <td>{{server.updPending}}</td>
+                <td>{{server.hostName}}</td>
+                <td>{{server.domainName}}</td>
+                <td>{{server.cdnName}}</td>
+                <td>{{server.cachegroup}}</td>
+                <td>{{server.type}}</td>
+                <td>{{server.physLocation}}</td>
+                <td>{{server.ipAddress}}</td>
+                <td>{{server.ip6Address}}</td>
+                <td>{{server.status}}</td>
+                <td>{{server.profile}}</td>
+                <td>{{server.iloIpAddress}}</td>
+                <td>{{server.iloIpGateway}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove from Delivery Service" ng-click="removeServer()"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
new file mode 100644
index 0000000..dc9e3d9
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
@@ -0,0 +1,46 @@
+/*
+ * 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 TableDeliveryServiceServersController = function(deliveryService, servers, $scope, locationUtils) {
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.servers = servers;
+
+	$scope.addServer = function() {
+		alert('not hooked up yet: addServer to ds');
+	};
+
+	$scope.removeServer = function() {
+		alert('not hooked up yet: removeServer from ds');
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 100
+		});
+	});
+
+};
+
+TableDeliveryServiceServersController.$inject = ['deliveryService', 'servers', '$scope', 'locationUtils'];
+module.exports = TableDeliveryServiceServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js
new file mode 100644
index 0000000..b4f353c
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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('trafficOps.table.deliveryServiceServers', [])
+	.controller('TableDeliveryServiceServersController', require('./TableDeliveryServiceServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
new file mode 100644
index 0000000..cee878b
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
@@ -0,0 +1,75 @@
+<!--
+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('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id)">{{deliveryService.displayName}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <button class="btn btn-primary pull-right" ng-click="addServer()">Add</button>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+                <th>type</th>
+                <th>location</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>profile</th>
+                <th>iloIpAddress</th>
+                <th>iloIpGateway</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="server in servers" ng-class="{'active': server.updPending}">
+                <td>{{server.updPending}}</td>
+                <td>{{server.hostName}}</td>
+                <td>{{server.domainName}}</td>
+                <td>{{server.cdnName}}</td>
+                <td>{{server.cachegroup}}</td>
+                <td>{{server.type}}</td>
+                <td>{{server.physLocation}}</td>
+                <td>{{server.ipAddress}}</td>
+                <td>{{server.ip6Address}}</td>
+                <td>{{server.status}}</td>
+                <td>{{server.profile}}</td>
+                <td>{{server.iloIpAddress}}</td>
+                <td>{{server.iloIpGateway}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove from Delivery Service" ng-click="removeServer()"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
new file mode 100644
index 0000000..b39ebdc
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
@@ -0,0 +1,46 @@
+/*
+ * 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 TableDivisionRegionsController = function(division, divisionRegions, $scope, locationUtils) {
+
+	$scope.division = division;
+
+	$scope.divisionRegions = divisionRegions;
+
+	$scope.addRegion = function() {
+		alert('not hooked up yet: addRegion to div');
+	};
+
+	$scope.removeRegion = function() {
+		alert('not hooked up yet: removeRegion from div');
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#regionsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 100
+		});
+	});
+
+};
+
+TableDivisionRegionsController.$inject = ['division', 'divisionRegions', '$scope', 'locationUtils'];
+module.exports = TableDivisionRegionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js
new file mode 100644
index 0000000..144887b
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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('trafficOps.table.divisionRegions', [])
+	.controller('TableDivisionRegionsController', require('./TableDivisionRegionsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
new file mode 100644
index 0000000..05e0bee
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
@@ -0,0 +1,52 @@
+<!--
+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('/admin/divisions')">Divisions</a></li>
+            <li><a ng-click="navigateToPath('/admin/divisions/' + division.id)">{{division.name}}</a></li>
+            <li class="active">Regions</li>
+        </ol>
+        <button class="btn btn-primary pull-right" ng-click="addRegion()">Add</button>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="regionsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>division</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="region in divisionRegions">
+                <td>{{region.name}}</td>
+                <td>{{region.divisionName}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove from Division" ng-click="removeRegion()"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
new file mode 100644
index 0000000..8ae8018
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
@@ -0,0 +1,46 @@
+/*
+ * 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 TableProfileParametersController = function(profile, profileParameters, $scope, locationUtils) {
+
+	$scope.profile = profile;
+
+	$scope.profileParameters = profileParameters;
+
+	$scope.addParameter = function() {
+		alert('not hooked up yet: add parameter to profile');
+	};
+
+	$scope.removeParameter = function() {
+		alert('not hooked up yet: remove Parameter from profile');
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#parametersTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 100
+		});
+	});
+
+};
+
+TableProfileParametersController.$inject = ['profile', 'profileParameters', '$scope', 'locationUtils'];
+module.exports = TableProfileParametersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js
new file mode 100644
index 0000000..b5d6584
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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('trafficOps.table.profileParameters', [])
+	.controller('TableProfileParametersController', require('./TableProfileParametersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
new file mode 100644
index 0000000..4b8575a
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
@@ -0,0 +1,54 @@
+<!--
+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('/admin/profiles')">Profiles</a></li>
+            <li><a ng-click="navigateToPath('/admin/profiles/' + profile.id)">{{profile.name}}</a></li>
+            <li class="active">Parameters</li>
+        </ol>
+        <button class="btn btn-primary pull-right" ng-click="addParameter()">Add</button>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="parametersTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>id</th>
+                <th>name</th>
+                <th>configFile</th>
+                <th>value</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="parameter in profileParameters">
+                <td>{{parameter.id}}</td>
+                <td>{{parameter.name}}</td>
+                <td>{{parameter.configFile}}</td>
+                <td>{{parameter.value}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove from Profile" ng-click="removeParameter()"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js
index 1f267a1..507172c 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js
@@ -29,6 +29,14 @@ var TableProfilesController = function(profiles, $scope, locationUtils) {
         locationUtils.navigateToPath('/admin/profiles/new');
     };
 
+    $scope.importProfile = function() {
+        alert('not hooked up yet: importProfile');
+    };
+
+    $scope.compareProfiles = function() {
+        alert('not hooked up yet: compareProfiles');
+    };
+
     angular.element(document).ready(function () {
         $('#profilesTable').dataTable({
             "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html
index 4430a6a..2d79fb4 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html
@@ -22,7 +22,10 @@ under the License.
         <ol class="breadcrumb pull-left">
             <li class="active">Profiles</li>
         </ol>
+
         <button class="btn btn-primary pull-right" ng-click="createProfile()">New</button>
+        <button class="btn btn-default pull-right" ng-click="importProfile()">Import</button>
+        <button class="btn btn-default pull-right" ng-click="compareProfiles()">Compare</button>
         <div class="clearfix"></div>
     </div>
     <div class="x_content">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
new file mode 100644
index 0000000..e6f565f
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
@@ -0,0 +1,50 @@
+/*
+ * 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 TableServerDeliveryServicesController = function(server, serverDeliveryServices, $scope, locationUtils) {
+
+	$scope.server = server;
+
+	$scope.serverDeliveryServices = serverDeliveryServices;
+
+	$scope.cloneDsAssignments = function() {
+		alert('not hooked up yet: cloneDsAssignments');
+	};
+
+	$scope.addDeliveryService = function() {
+		alert('not hooked up yet: addDeliveryService to server');
+	};
+
+	$scope.removeDeliveryService = function() {
+		alert('not hooked up yet: removeDeliveryService from server');
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#deliveryServicesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 100
+		});
+	});
+
+};
+
+TableServerDeliveryServicesController.$inject = ['server', 'serverDeliveryServices', '$scope', 'locationUtils'];
+module.exports = TableServerDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js
new file mode 100644
index 0000000..4367c89
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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('trafficOps.table.serverDeliveryServices', [])
+	.controller('TableServerDeliveryServicesController', require('./TableServerDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
new file mode 100644
index 0000000..f8cde74
--- /dev/null
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
@@ -0,0 +1,76 @@
+<!--
+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('/configure/servers')">Servers</a></li>
+            <li><a ng-click="navigateToPath('/configure/servers/' + server.id)">{{server.hostName}}</a></li>
+            <li class="active">Delivery Services</li>
+        </ol>
+        <button class="btn btn-primary pull-right" ng-click="addDeliveryService()">Add</button>
+        <button class="btn btn-default pull-right" ng-click="cloneDsAssignments()">Clone Assignments</button>
+
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>xmlId</th>
+                <th>orgServerFqdn</th>
+                <th>cdn</th>
+                <th>profile</th>
+                <th>ccrDnsTtl</th>
+                <th>active</th>
+                <th>type</th>
+                <th>dscp</th>
+                <th>signed</th>
+                <th>qstringIgnore</th>
+                <th>geoLimit</th>
+                <th>protocol</th>
+                <th>ipv6RoutingEnabled</th>
+                <th>rangeRequestHandling</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="deliveryService in serverDeliveryServices">
+                <td>{{deliveryService.xmlId}}</td>
+                <td>{{deliveryService.orgServerFqdn}}</td>
+                <td>{{deliveryService.cdnName}}</td>
+                <td>{{deliveryService.profileName}}</td>
+                <td>{{deliveryService.ccrDnsTtl}}</td>
+                <td>{{deliveryService.active}}</td>
+                <td>{{deliveryService.type}}</td>
+                <td>{{deliveryService.dscp}}</td>
+                <td>{{deliveryService.signed}}</td>
+                <td>{{deliveryService.qstringIgnore}}</td>
+                <td>{{deliveryService.geoLimit}}</td>
+                <td>{{deliveryService.protocol}}</td>
+                <td>{{deliveryService.ipv6RoutingEnabled}}</td>
+                <td>{{deliveryService.rangeRequestHandling}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove from Server" ng-click="removeDeliveryService()"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/829ce404/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js
index 7c627b5..ff2129c 100644
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js
+++ b/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js
@@ -29,6 +29,10 @@ var TableServersController = function(servers, $scope, locationUtils) {
         locationUtils.navigateToPath('/configure/servers/new');
     };
 
+    $scope.uploadServerCSV = function() {
+        alert('not hooked up yet: uploadServerCSV');
+    };
+
     angular.element(document).ready(function () {
         $('#serversTable').dataTable({
             "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],