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

mitchell852 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 2ccfa3e  Deprecate users/{userId}/deliveryServices (#4528)
2ccfa3e is described below

commit 2ccfa3e09977ec4466d0187347a7d2a6c42dc59a
Author: Steve Hamrick <[email protected]>
AuthorDate: Fri Mar 27 13:11:51 2020 -0600

    Deprecate users/{userId}/deliveryServices (#4528)
    
    * Deprecate users/{userId}/deliveryservices
    
    * Add another test
    
    * Forgot changelog
    
    * Remove page and fix tests
    
    * removes unused user delivery services table
    
    * Goto the clicked user instead
    
    Co-authored-by: Jeremy Mitchell <[email protected]>
---
 CHANGELOG.md                                       |   1 +
 docs/source/api/v1/users_id_deliveryservices.rst   |   8 +-
 docs/source/api/v2/deliveryservices.rst            |  56 +++---
 docs/source/api/v2/users_id_deliveryservices.rst   | 213 ---------------------
 traffic_ops/client/deliveryservice.go              |   8 +
 traffic_ops/client/dsuser.go                       |  11 --
 .../testing/api/v2/deliveryservices_test.go        |  58 ++++++
 .../deliveryservice/deliveryservices.go            |  15 ++
 traffic_ops/traffic_ops_golang/routing/routes.go   |   1 -
 .../traffic_ops_golang/user/deliveryservices.go    |  10 +-
 traffic_portal/app/src/app.js                      |   2 -
 .../common/modules/form/user/FormUserController.js |   2 +-
 .../TableUserDeliveryServicesController.js         |  55 ------
 .../modules/table/userDeliveryServices/index.js    |  21 --
 .../table.userDeliveryServices.tpl.html            | 171 -----------------
 .../private/tenants/deliveryServices/index.js      |   2 +-
 .../private/users/deliveryServices/index.js        |  42 ----
 17 files changed, 126 insertions(+), 550 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 554a07f..44113e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -114,6 +114,7 @@ The format is based on [Keep a 
Changelog](http://keepachangelog.com/en/1.0.0/).
   - /types/trimmed
   - /types/{{ID}} (GET)
   - /user/current/jobs
+  - /users/:id/deliveryservices
   - /servers/checks
   - /user/{{user ID}}/deliveryservices/available
 
diff --git a/docs/source/api/v1/users_id_deliveryservices.rst 
b/docs/source/api/v1/users_id_deliveryservices.rst
index ce37e04..847f73e 100644
--- a/docs/source/api/v1/users_id_deliveryservices.rst
+++ b/docs/source/api/v1/users_id_deliveryservices.rst
@@ -20,6 +20,9 @@
 *********************************
 .. caution:: This endpoint has several issues related to tenancy and newer 
:term:`Delivery Service` fields. For these and other reasons, the assigning of 
:term:`Delivery Services` to users is strongly discouraged.
 
+.. deprecated:: ATCv4
+       Use the ``GET`` method of :ref:`to-api-deliveryservices` with the 
`accessibleTo` parameter instead.
+
 ``GET``
 =======
 Retrieves all :term:`Delivery Services` assigned to the user.
@@ -173,7 +176,10 @@ Response Structure
        Date: Mon, 10 Jun 2019 16:50:25 GMT
        Content-Length: 1348
 
-       {"response": [{
+       {"alerts": [{
+               "text": "This endpoint is deprecated, please use GET 
deliveryservices?accessibleTo={{tenantId}} instead",
+               "level": "warning"
+       }], "response": [{
                "active": true,
                "anonymousBlockingEnabled": false,
                "cacheurl": null,
diff --git a/docs/source/api/v2/deliveryservices.rst 
b/docs/source/api/v2/deliveryservices.rst
index bea2667..b5e4f77 100644
--- a/docs/source/api/v2/deliveryservices.rst
+++ b/docs/source/api/v2/deliveryservices.rst
@@ -31,33 +31,35 @@ Request Structure
 -----------------
 .. table:: Request Query Parameters
 
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | Name        | Required | Description                                  
                                                                                
        |
-       
+=============+==========+======================================================================================================================================+
-       | cdn         | no       | Show only the :term:`Delivery Services` 
belonging to the :ref:`ds-cdn` identified by this integral, unique identifier   
             |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | id          | no       | Show only the :term:`Delivery Service` that 
has this integral, unique identifier                                            
         |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | logsEnabled | no       | Show only the :term:`Delivery Services` that 
have :ref:`ds-logs-enabled` set or not based on this boolean                    
        |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | profile     | no       | Return only :term:`Delivery Services` using 
the :term:`Profile` that has this :ref:`profile-id`                             
         |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | tenant      | no       | Show only the :term:`Delivery Services` 
belonging to the :term:`Tenant` identified by this integral, unique identifier  
             |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | type        | no       | Return only :term:`Delivery Services` of the 
:term:`Delivery Service` :ref:`ds-types` identified by this integral, unique 
identifier |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | orderby     | no       | Choose the ordering of the results - must be 
the name of one of the fields of the objects in the ``response``                
        |
-       |             |          | array                                        
                                                                                
        |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | sortOrder   | no       | Changes the order of sorting. Either 
ascending (default or "asc") or descending ("desc")                             
                |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | limit       | no       | Choose the maximum number of results to 
return                                                                          
             |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | offset      | no       | The number of results to skip before 
beginning to return results. Must use in conjunction with limit                 
                |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
-       | page        | no       | Return the n\ :sup:`th` page of results, 
where "n" is the value of this parameter, pages are ``limit`` long and the 
first page is 1. |
-       |             |          | If ``offset`` was defined, this query 
parameter has no effect. ``limit`` must be defined to make use of ``page``.     
               |
-       
+-------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | Name         | Required | Description                                 
                                                                                
            |
+       
+==============+==========+=========================================================================================================================================+
+       | cdn          | no       | Show only the :term:`Delivery Services` 
belonging to the :ref:`ds-cdn` identified by this integral, unique identifier   
                |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | id           | no       | Show only the :term:`Delivery Service` that 
has this integral, unique identifier                                            
            |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | logsEnabled  | no       | Show only the :term:`Delivery Services` 
that have :ref:`ds-logs-enabled` set or not based on this boolean               
                |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | profile      | no       | Return only :term:`Delivery Services` using 
the :term:`Profile` that has this :ref:`profile-id`                             
            |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | tenant       | no       | Show only the :term:`Delivery Services` 
belonging to the :term:`Tenant` identified by this integral, unique identifier  
                |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | type         | no       | Return only :term:`Delivery Services` of 
the :term:`Delivery Service` :ref:`ds-types` identified by this integral, 
unique identifier    |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | accessibleTo | no       | Return the :term:`Delivery Services` 
accessible from a :term:`Tenant` *or it's children* identified by this 
integral, unique identifier |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | orderby      | no       | Choose the ordering of the results - must 
be the name of one of the fields of the objects in the ``response``             
              |
+       |              |          | array                                       
                                                                                
            |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | sortOrder    | no       | Changes the order of sorting. Either 
ascending (default or "asc") or descending ("desc")                             
                   |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | limit        | no       | Choose the maximum number of results to 
return                                                                          
                |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | offset       | no       | The number of results to skip before 
beginning to return results. Must use in conjunction with limit                 
                   |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
+       | page         | no       | Return the n\ :sup:`th` page of results, 
where "n" is the value of this parameter, pages are ``limit`` long and the 
first page is 1.    |
+       |              |          | If ``offset`` was defined, this query 
parameter has no effect. ``limit`` must be defined to make use of ``page``.     
                  |
+       
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
 
 Response Structure
 ------------------
diff --git a/docs/source/api/v2/users_id_deliveryservices.rst 
b/docs/source/api/v2/users_id_deliveryservices.rst
deleted file mode 100644
index f377848..0000000
--- a/docs/source/api/v2/users_id_deliveryservices.rst
+++ /dev/null
@@ -1,213 +0,0 @@
-..
-..
-.. Licensed under the Apache License, Version 2.0 (the "License");
-.. you may not use this file except in compliance with the License.
-.. You may obtain a copy of the License at
-..
-..     http://www.apache.org/licenses/LICENSE-2.0
-..
-.. Unless required by applicable law or agreed to in writing, software
-.. distributed under the License is distributed on an "AS IS" BASIS,
-.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-.. See the License for the specific language governing permissions and
-.. limitations under the License.
-..
-
-.. _to-api-users-id-deliveryservices:
-
-*********************************
-``users/{{ID}}/deliveryservices``
-*********************************
-.. caution:: This endpoint has several issues related to tenancy and newer 
:term:`Delivery Service` fields. For these and other reasons, the assigning of 
:term:`Delivery Services` to users is strongly discouraged.
-
-``GET``
-=======
-Retrieves all :term:`Delivery Services` assigned to the user.
-
-:Auth. Required: Yes
-:Roles Required: None\ [#tenancy]_
-:Response Type:  Array
-
-Request Structure
------------------
-.. table:: Request Path Parameters
-
-       
+------+-------------------------------------------------------------------------------------------------+
-       | Name | Description                                                    
                                 |
-       
+======+=================================================================================================+
-       |  ID  | The integral, unique identifier of the users whose 
:term:`Delivery Services` shall be retrieved |
-       
+------+-------------------------------------------------------------------------------------------------+
-
-.. code-block:: http
-       :caption: Request Example
-
-       GET /api/2.0/users/2/deliveryservices HTTP/1.1
-       Host: trafficops.infra.ciab.test
-       User-Agent: curl/7.47.0
-       Accept: */*
-       Cookie: mojolicious=...
-
-Response Structure
-------------------
-:active:                   A boolean that defines :ref:`ds-active`.
-:anonymousBlockingEnabled: A boolean that defines :ref:`ds-anonymous-blocking`
-:cacheurl:                 A :ref:`ds-cacheurl`
-
-       .. deprecated:: ATCv3.0
-               This field has been deprecated in Traffic Control 3.x and is 
subject to removal in Traffic Control 4.x or later
-
-:ccrDnsTtl:                 The :ref:`ds-dns-ttl` - named "ccrDnsTtl" for 
legacy reasons
-:cdnId:                     The integral, unique identifier of the 
:ref:`ds-cdn` to which the :term:`Delivery Service` belongs
-:cdnName:                   Name of the :ref:`ds-cdn` to which the 
:term:`Delivery Service` belongs
-:checkPath:                 A :ref:`ds-check-path`
-:consistentHashRegex:       A :ref:`ds-consistent-hashing-regex`
-:consistentHashQueryParams: An array of :ref:`ds-consistent-hashing-qparams`
-
-       .. caution:: This field will always appear to be ``null`` - even when 
the :term:`Delivery Service` in question has 
:ref:`ds-consistent-hashing-qparams` assigned to it.
-
-:deepCachingType:     The :ref:`ds-deep-caching` setting for this 
:term:`Delivery Service`
-:displayName:         The :ref:`ds-display-name`
-:dnsBypassCname:      A :ref:`ds-dns-bypass-cname`
-:dnsBypassIp:         A :ref:`ds-dns-bypass-ip`
-:dnsBypassIp6:        A :ref:`ds-dns-bypass-ipv6`
-:dnsBypassTtl:        The :ref:`ds-dns-bypass-ttl`
-:dscp:                A :ref:`ds-dscp` to be used within the :term:`Delivery 
Service`
-:ecsEnabled:          A boolean that defines the :ref:`ds-ecs` setting on this 
:term:`Delivery Service`
-:edgeHeaderRewrite:   A set of :ref:`ds-edge-header-rw-rules`
-:exampleURLs:         An array of :ref:`ds-example-urls`
-:fqPacingRate:        The :ref:`ds-fqpr`
-:geoLimit:            An integer that defines the :ref:`ds-geo-limit`
-:geoLimitCountries:   A string containing a comma-separated list defining the 
:ref:`ds-geo-limit-countries`
-:geoLimitRedirectUrl: A :ref:`ds-geo-limit-redirect-url`
-:geoProvider:         The :ref:`ds-geo-provider`
-:globalMaxMbps:       The :ref:`ds-global-max-mbps`
-:globalMaxTps:        The :ref:`ds-global-max-tps`
-:httpBypassFqdn:      A :ref:`ds-http-bypass-fqdn`
-:id:                  An integral, unique identifier for this :term:`Delivery 
Service`
-:infoUrl:             An :ref:`ds-info-url`
-:initialDispersion:   The :ref:`ds-initial-dispersion`
-:ipv6RoutingEnabled:  A boolean that defines the :ref:`ds-ipv6-routing` 
setting on this :term:`Delivery Service`
-:lastUpdated:         The date and time at which this :term:`Delivery Service` 
was last updated, in :rfc:`3339` format
-:logsEnabled:         A boolean that defines the :ref:`ds-logs-enabled` 
setting on this :term:`Delivery Service`
-:longDesc:            The :ref:`ds-longdesc` of this :term:`Delivery Service`
-:longDesc1:           The :ref:`ds-longdesc2` of this :term:`Delivery Service`
-:longDesc2:           The :ref:`ds-longdesc3` of this :term:`Delivery Service`
-:matchList:           The :term:`Delivery Service`'s :ref:`ds-matchlist`
-
-       :pattern:   A regular expression - the use of this pattern is dependent 
on the ``type`` field (backslashes are escaped)
-       :setNumber: An integer that provides explicit ordering of 
:ref:`ds-matchlist` items - this is used as a priority ranking by Traffic 
Router, and is not guaranteed to correspond to the ordering of items in the 
array.
-       :type:      The type of match performed using ``pattern``.
-
-:maxDnsAnswers:        The :ref:`ds-max-dns-answers` allowed for this 
:term:`Delivery Service`
-:maxOriginConnections: The :ref:`ds-max-origin-connections`
-:midHeaderRewrite:     A set of :ref:`ds-mid-header-rw-rules`
-:missLat:              The :ref:`ds-geo-miss-default-latitude` used by this 
:term:`Delivery Service`
-:missLong:             The :ref:`ds-geo-miss-default-longitude` used by this 
:term:`Delivery Service`
-:multiSiteOrigin:      A boolean that defines the use of 
:ref:`ds-multi-site-origin` by this :term:`Delivery Service`
-:orgServerFqdn:        The :ref:`ds-origin-url`
-:originShield:         A :ref:`ds-origin-shield` string
-:profileDescription:   The :ref:`profile-description` of the :ref:`ds-profile` 
with which this :term:`Delivery Service` is associated
-:profileId:            The :ref:`profile-id` of the :ref:`ds-profile` with 
which this :term:`Delivery Service` is associated
-:profileName:          The :ref:`profile-name` of the :ref:`ds-profile` with 
which this :term:`Delivery Service` is associated
-:protocol:             An integral, unique identifier that corresponds to the 
:ref:`ds-protocol` used by this :term:`Delivery Service`
-:qstringIgnore:        An integral, unique identifier that corresponds to the 
:ref:`ds-qstring-handling` setting on this :term:`Delivery Service`
-:rangeRequestHandling: An integral, unique identifier that corresponds to the 
:ref:`ds-range-request-handling` setting on this :term:`Delivery Service`
-:regexRemap:           A :ref:`ds-regex-remap`
-:regionalGeoBlocking:  A boolean defining the :ref:`ds-regionalgeo` setting on 
this :term:`Delivery Service`
-:remapText:            :ref:`ds-raw-remap`
-:signed:               ``true`` if  and only if ``signingAlgorithm`` is not 
``null``, ``false`` otherwise
-:signingAlgorithm:     Either a :ref:`ds-signing-algorithm` or ``null`` to 
indicate URL/URI signing is not implemented on this :term:`Delivery Service`
-:rangeSliceBlockSize: An integer that defines the byte block size for the ATS 
Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 
3.
-:sslKeyVersion:        This integer indicates the :ref:`ds-ssl-key-version`
-:tenantId:             The integral, unique identifier of the :ref:`ds-tenant` 
who owns this :term:`Delivery Service`
-:trRequestHeaders:     If defined, this defines the :ref:`ds-tr-req-headers` 
used by Traffic Router for this :term:`Delivery Service`
-:trResponseHeaders:    If defined, this defines the :ref:`ds-tr-resp-headers` 
used by Traffic Router for this :term:`Delivery Service`
-:type:                 The :ref:`ds-types` of this :term:`Delivery Service`
-:typeId:               The integral, unique identifier of the :ref:`ds-types` 
of this :term:`Delivery Service`
-:xmlId:                This :term:`Delivery Service`'s :ref:`ds-xmlid`
-
-.. code-block:: http
-       :caption: Response Example
-
-       HTTP/1.1 200 OK
-       Access-Control-Allow-Credentials: true
-       Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, 
Accept, Set-Cookie, Cookie
-       Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
-       Access-Control-Allow-Origin: *
-       Content-Type: application/json
-       Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 
GMT; Max-Age=3600; HttpOnly
-       Whole-Content-Sha512: 
/YG9PdSw9PAkVLfbTcOfEUbJe14UTkWQp2P9x632RbmsbbAQvbluT5QIMLJ4OatmEGwWKs47NUaRLUc8z0/qSA==
-       X-Server-Name: traffic_ops_golang/
-       Date: Mon, 10 Jun 2019 16:50:25 GMT
-       Content-Length: 1348
-
-       {"response": [{
-               "active": true,
-               "anonymousBlockingEnabled": false,
-               "cacheurl": null,
-               "ccrDnsTtl": null,
-               "cdnId": 2,
-               "cdnName": "CDN-in-a-Box",
-               "checkPath": null,
-               "displayName": "Demo 1",
-               "dnsBypassCname": null,
-               "dnsBypassIp": null,
-               "dnsBypassIp6": null,
-               "dnsBypassTtl": null,
-               "dscp": 0,
-               "edgeHeaderRewrite": null,
-               "geoLimit": 0,
-               "geoLimitCountries": null,
-               "geoLimitRedirectURL": null,
-               "geoProvider": 0,
-               "globalMaxMbps": null,
-               "globalMaxTps": null,
-               "httpBypassFqdn": null,
-               "id": 1,
-               "infoUrl": null,
-               "initialDispersion": 1,
-               "ipv6RoutingEnabled": true,
-               "lastUpdated": "2019-06-10 15:14:29+00",
-               "logsEnabled": true,
-               "longDesc": "Apachecon North America 2018",
-               "longDesc1": null,
-               "longDesc2": null,
-               "matchList": null,
-               "maxDnsAnswers": null,
-               "midHeaderRewrite": null,
-               "missLat": 42,
-               "missLong": -88,
-               "multiSiteOrigin": false,
-               "originShield": null,
-               "orgServerFqdn": "http://origin.infra.ciab.test";,
-               "profileDescription": null,
-               "profileId": null,
-               "profileName": null,
-               "protocol": 2,
-               "qstringIgnore": 0,
-               "rangeRequestHandling": 0,
-               "regexRemap": null,
-               "regionalGeoBlocking": false,
-               "remapText": null,
-               "routingName": "video",
-               "signed": false,
-               "sslKeyVersion": 1,
-               "tenantId": 1,
-               "type": "HTTP",
-               "typeId": 1,
-               "xmlId": "demo1",
-               "exampleURLs": null,
-               "deepCachingType": "NEVER",
-               "fqPacingRate": null,
-               "signingAlgorithm": null,
-               "tenant": "root",
-               "trResponseHeaders": null,
-               "trRequestHeaders": null,
-               "consistentHashRegex": null,
-               "consistentHashQueryParams": null,
-               "maxOriginConnections": null,
-               "ecsEnabled": false,
-               "rangeSliceBlockSize": null
-       }]}
-
-.. [#tenancy] While it is totally possible to assign a :term:`Delivery 
Service` to a user who's :term:`Tenant` does not have permission to own said 
:term:`Delivery Service`, users that request this endpoint will only see 
:term:`Delivery Services` that their :term:`Tenant` has permission to see. This 
means that there's no real guarantee that the output of this endpoint shows all 
of the :term:`Delivery Services` assigned to the user requested, even if the 
user is requesting their own assig [...]
diff --git a/traffic_ops/client/deliveryservice.go 
b/traffic_ops/client/deliveryservice.go
index 449a20a..48d5159 100644
--- a/traffic_ops/client/deliveryservice.go
+++ b/traffic_ops/client/deliveryservice.go
@@ -474,3 +474,11 @@ func (to *Session) UpdateDeliveryServiceSafe(id int, ds 
tc.DeliveryServiceSafeUp
        }
        return resp.Response, reqInf, err
 }
+
+// GetAccessibleDeliveryServicesByTenant gets all delivery services associated 
with the given tenant, and all of
+// it's children.
+func (to *Session) GetAccessibleDeliveryServicesByTenant(tenantId int) 
([]tc.DeliveryService, ReqInf, error) {
+       data := tc.DeliveryServicesResponse{}
+       reqInf, err := get(to, fmt.Sprintf("%v?accessibleTo=%v", 
API_DELIVERY_SERVICES, tenantId), &data)
+       return data.Response, reqInf, err
+}
diff --git a/traffic_ops/client/dsuser.go b/traffic_ops/client/dsuser.go
index f6f7b67..587af06 100644
--- a/traffic_ops/client/dsuser.go
+++ b/traffic_ops/client/dsuser.go
@@ -22,17 +22,6 @@ import (
        tc "github.com/apache/trafficcontrol/lib/go-tc"
 )
 
-// GetUserDeliveryServices gets the delivery services associated with the 
given user.
-func (to *Session) GetUserDeliveryServices(userID int) 
(*tc.UserDeliveryServicesNullableResponse, ReqInf, error) {
-       uri := apiBase + `/users/` + strconv.Itoa(userID) + `/deliveryservices`
-       resp := tc.UserDeliveryServicesNullableResponse{}
-       reqInf, err := get(to, uri, &resp)
-       if err != nil {
-               return nil, reqInf, err
-       }
-       return &resp, reqInf, nil
-}
-
 // SetUserDeliveryService associates the given delivery services with the 
given user.
 func (to *Session) SetDeliveryServiceUser(userID int, dses []int, replace 
bool) (*tc.UserDeliveryServicePostResponse, error) {
        uri := apiBase + `/deliveryservice_user`
diff --git a/traffic_ops/testing/api/v2/deliveryservices_test.go 
b/traffic_ops/testing/api/v2/deliveryservices_test.go
index 8a521d5..8f7040a 100644
--- a/traffic_ops/testing/api/v2/deliveryservices_test.go
+++ b/traffic_ops/testing/api/v2/deliveryservices_test.go
@@ -17,6 +17,7 @@ package v2
 
 import (
        "encoding/json"
+       "errors"
        "fmt"
        "io"
        "io/ioutil"
@@ -33,6 +34,7 @@ import (
 
 func TestDeliveryServices(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Tenants, Users, Parameters, Profiles, 
Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, 
DeliveryServices}, func() {
+               GetAccessibleToTest(t)
                UpdateTestDeliveryServices(t)
                UpdateNullableTestDeliveryServices(t)
                UpdateDeliveryServiceWithInvalidRemapText(t)
@@ -296,6 +298,62 @@ func UpdateDeliveryServiceWithInvalidSliceRangeRequest(t 
*testing.T) {
 
 }
 
+func GetAccessibleToTest(t *testing.T) {
+       //Every delivery service is associated with the root tenant
+       err := getByTenants(1, len(testData.DeliveryServices))
+       if err != nil {
+               t.Fatal(err.Error())
+       }
+
+       tenant := &tc.Tenant{
+               Active:     true,
+               Name:       "the strongest",
+               ParentID:   1,
+               ParentName: "root",
+       }
+
+       resp, err := TOSession.CreateTenant(tenant)
+       if err != nil {
+               t.Fatal(err.Error())
+       }
+       if resp == nil {
+               t.Fatal("unexpected null response when creating tenant")
+       }
+       tenant = &resp.Response
+
+       //No delivery services are associated with this new tenant
+       err = getByTenants(tenant.ID, 0)
+       if err != nil {
+               t.Fatal(err.Error())
+       }
+
+       //First and only child tenant, no access to root
+       childTenant, _, err := TOSession.TenantByName("tenant1")
+       if err != nil {
+               t.Fatal("unable to get tenant " + err.Error())
+       }
+       err = getByTenants(childTenant.ID, len(testData.DeliveryServices) - 1)
+       if err != nil {
+               t.Fatal(err.Error())
+       }
+
+       _, err = TOSession.DeleteTenant(strconv.Itoa(tenant.ID))
+       if err != nil {
+               t.Fatalf("unable to clean up tenant %v", err.Error())
+       }
+}
+
+func getByTenants(tenantID int, expectedCount int) error {
+       deliveryServices, _, err := 
TOSession.GetAccessibleDeliveryServicesByTenant(tenantID)
+       if err != nil {
+               return err
+       }
+       if len(deliveryServices) != expectedCount {
+               return errors.New(fmt.Sprintf("expected %v delivery service, 
got %v", expectedCount, len(deliveryServices)))
+       }
+       return nil
+}
+
 func DeleteTestDeliveryServices(t *testing.T) {
        dses, _, err := TOSession.GetDeliveryServices()
        if err != nil {
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go 
b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go
index 0722a5a..4264fb2 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservices.go
@@ -920,6 +920,21 @@ func readGetDeliveryServices(params map[string]string, tx 
*sqlx.Tx, user *auth.C
 
        where, queryValues = dbhelpers.AddTenancyCheck(where, queryValues, 
"ds.tenant_id", tenantIDs)
 
+       if accessibleTo, ok := params["accessibleTo"]; ok {
+               if err := api.IsInt(accessibleTo); err != nil {
+                       log.Errorln("unknown parameter value: " + err.Error())
+                       return nil, nil, tc.DBError, 
http.StatusInternalServerError
+               }
+               accessibleTo, _ := strconv.Atoi(accessibleTo)
+               accessibleTenants, err := tenant.GetUserTenantIDListTx(tx.Tx, 
accessibleTo)
+               if err != nil {
+                       log.Errorln("unable to get teanants: " + err.Error())
+                       return nil, nil, tc.DBError, 
http.StatusInternalServerError
+               }
+               where += " AND ds.tenant_id = ANY(CAST(:accessibleTo AS 
bigint[])) "
+               queryValues["accessibleTo"] = pq.Array(accessibleTenants)
+       }
+
        query := selectQuery() + where + orderBy + pagination
 
        log.Debugln("generated deliveryServices query: " + query)
diff --git a/traffic_ops/traffic_ops_golang/routing/routes.go 
b/traffic_ops/traffic_ops_golang/routing/routes.go
index e922bda..dc45a36 100644
--- a/traffic_ops/traffic_ops_golang/routing/routes.go
+++ b/traffic_ops/traffic_ops_golang/routing/routes.go
@@ -224,7 +224,6 @@ func Routes(d ServerData) ([]Route, []RawRoute, 
http.Handler, error) {
                {api.Version{2, 0}, http.MethodPost, `jobs/?`, 
invalidationjobs.Create, auth.PrivLevelPortal, Authenticated, nil, 20450955, 
noPerlBypass},
 
                //Login
-               {api.Version{2, 0}, http.MethodGet, 
`users/{id}/deliveryservices/?$`, user.GetDSes, auth.PrivLevelReadOnly, 
Authenticated, nil, 288787789, noPerlBypass},
                {api.Version{2, 0}, http.MethodPost, `user/login/?$`, 
login.LoginHandler(d.DB, d.Config), 0, NoAuth, nil, 2392670821, noPerlBypass},
                {api.Version{2, 0}, http.MethodPost, `user/logout/?$`, 
login.LogoutHandler(d.Config.Secrets[0]), 0, Authenticated, nil, 243434825, 
noPerlBypass},
                {api.Version{2, 0}, http.MethodPost, `user/login/oauth/?$`, 
login.OauthLoginHandler(d.DB, d.Config), 0, NoAuth, nil, 2415886009, 
noPerlBypass},
diff --git a/traffic_ops/traffic_ops_golang/user/deliveryservices.go 
b/traffic_ops/traffic_ops_golang/user/deliveryservices.go
index c4fc98f..2970f5a 100644
--- a/traffic_ops/traffic_ops_golang/user/deliveryservices.go
+++ b/traffic_ops/traffic_ops_golang/user/deliveryservices.go
@@ -26,15 +26,17 @@ import (
        "net/http"
 
        "github.com/apache/trafficcontrol/lib/go-tc"
+       "github.com/apache/trafficcontrol/lib/go-util"
        "github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/api"
        "github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/auth"
        "github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/tenant"
 )
 
 func GetDSes(w http.ResponseWriter, r *http.Request) {
+       alt := util.StrPtr("GET deliveryservices?accessibleTo={{tenantId}")
        inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, 
[]string{"id"})
        if userErr != nil || sysErr != nil {
-               api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+               api.HandleDeprecatedErr(w, r, inf.Tx.Tx, errCode, userErr, 
sysErr, alt)
                return
        }
        defer inf.Close()
@@ -42,16 +44,16 @@ func GetDSes(w http.ResponseWriter, r *http.Request) {
        dsUserID := inf.IntParams["id"]
        dses, err := getUserDSes(inf.Tx.Tx, dsUserID)
        if err != nil {
-               api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, 
nil, errors.New("getting user delivery services: "+err.Error()))
+               api.HandleDeprecatedErr(w, r, inf.Tx.Tx, 
http.StatusInternalServerError, nil, errors.New("getting user delivery 
services: "+err.Error()), alt)
                return
        }
 
        dses, err = filterAuthorized(inf.Tx.Tx, dses, inf.User)
        if err != nil {
-               api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, 
nil, errors.New("filtering user-authorized delivery services: "+err.Error()))
+               api.HandleDeprecatedErr(w, r, inf.Tx.Tx, 
http.StatusInternalServerError, nil, errors.New("filtering user-authorized 
delivery services: "+err.Error()), alt)
                return
        }
-       api.WriteResp(w, r, dses)
+       api.WriteAlertsObj(w, r, http.StatusOK, 
api.CreateDeprecationAlerts(alt), dses)
 }
 
 func GetAvailableDSes(w http.ResponseWriter, r *http.Request) {
diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js
index ced7152..3e1d0fd 100644
--- a/traffic_portal/app/src/app.js
+++ b/traffic_portal/app/src/app.js
@@ -209,7 +209,6 @@ var trafficPortal = angular.module('trafficPortal', [
         require('./modules/private/types/deliveryServices').name,
         require('./modules/private/types/staticDnsEntries').name,
         require('./modules/private/users').name,
-        require('./modules/private/users/deliveryServices').name,
         require('./modules/private/users/edit').name,
         require('./modules/private/users/list').name,
         require('./modules/private/users/new').name,
@@ -394,7 +393,6 @@ var trafficPortal = angular.module('trafficPortal', [
         require('./common/modules/table/typeServers').name,
         require('./common/modules/table/typeStaticDnsEntries').name,
         require('./common/modules/table/users').name,
-        require('./common/modules/table/userDeliveryServices').name,
 
         // widgets
         require('./common/modules/widget/cacheGroups').name,
diff --git 
a/traffic_portal/app/src/common/modules/form/user/FormUserController.js 
b/traffic_portal/app/src/common/modules/form/user/FormUserController.js
index e54bfee..a805b07 100644
--- a/traffic_portal/app/src/common/modules/form/user/FormUserController.js
+++ b/traffic_portal/app/src/common/modules/form/user/FormUserController.js
@@ -50,7 +50,7 @@ var FormUserController = function(user, $scope, $location, 
formUtils, stringUtil
     $scope.labelize = stringUtils.labelize;
 
     $scope.viewDeliveryServices = function() {
-        $location.path($location.path() + '/delivery-services');
+        $location.path('/tenants/' + user.tenantId + '/delivery-services');
     };
 
     $scope.navigateToPath = locationUtils.navigateToPath;
diff --git 
a/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
 
b/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
deleted file mode 100644
index 3315bd1..0000000
--- 
a/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 TableUserDeliveryServicesController = function (user, deliveryServices, 
$controller, $scope) {
-
-       // extends the TableDeliveryServicesController to inherit common methods
-       angular.extend(this, $controller('TableDeliveryServicesController', { 
deliveryServices: deliveryServices, $scope: $scope }));
-
-       let userDeliveryServicesTable;
-
-       $scope.user = user;
-
-       $scope.toggleVisibility = function(colName) {
-               const col = userDeliveryServicesTable.column(colName + ':name');
-               col.visible(!col.visible());
-               userDeliveryServicesTable.rows().invalidate().draw();
-       };
-
-       angular.element(document).ready(function () {
-               userDeliveryServicesTable = 
$('#userDeliveryServicesTable').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_userDeliveryServicesTable_/')).columns;
-                               } catch (e) {
-                                       console.error("Failure to retrieve 
required column info from localStorage 
(key=DataTables_userDeliveryServicesTable_/):", e);
-                               }
-                       }
-               });
-       });
-
-};
-
-TableUserDeliveryServicesController.$inject = ['user', 'deliveryServices', 
'$controller', '$scope'];
-module.exports = TableUserDeliveryServicesController;
diff --git 
a/traffic_portal/app/src/common/modules/table/userDeliveryServices/index.js 
b/traffic_portal/app/src/common/modules/table/userDeliveryServices/index.js
deleted file mode 100644
index eaa7b34..0000000
--- a/traffic_portal/app/src/common/modules/table/userDeliveryServices/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.table.userDeliveryServices', [])
-       .controller('TableUserDeliveryServicesController', 
require('./TableUserDeliveryServicesController'));
diff --git 
a/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
 
b/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
deleted file mode 100644
index bf133dd..0000000
--- 
a/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
+++ /dev/null
@@ -1,171 +0,0 @@
-<!--
-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('/users')">Users</a></li>
-            <li><a ng-click="navigateToPath('/users/' + 
user.id)">{{::user.username}}</a></li>
-            <li class="active">Delivery Services</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" 
ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-            <div class="btn-group" role="group" title="Select Table Columns" 
uib-dropdown is-open="columnSettings.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" 
uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    <i class="fa fa-columns"></i>&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <menu ng-click="$event.stopPropagation()" 
class="column-settings dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem" ng-repeat="c in columns | 
orderBy:'name'">
-                        <div class="checkbox">
-                            <label><input type="checkbox" ng-model="c.visible" 
ng-click="toggleVisibility(c.name)"> {{::c.name}}</label>
-                        </div>
-                    </li>
-                </menu>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="userDeliveryServicesTable" 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>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.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/tenants/deliveryServices/index.js 
b/traffic_portal/app/src/modules/private/tenants/deliveryServices/index.js
index d514e02..f17edf2 100644
--- a/traffic_portal/app/src/modules/private/tenants/deliveryServices/index.js
+++ b/traffic_portal/app/src/modules/private/tenants/deliveryServices/index.js
@@ -31,7 +31,7 @@ module.exports = 
angular.module('trafficPortal.private.tenants.deliveryServices'
                                                                return 
tenantService.getTenant($stateParams.tenantId);
                                                        },
                                                        deliveryServices: 
function(tenant, deliveryServiceService) {
-                                                               return 
deliveryServiceService.getDeliveryServices({ tenant: tenant.id });
+                                                               return 
deliveryServiceService.getDeliveryServices({ accessibleTo: tenant.id });
                                                        }
                                                }
                                        }
diff --git 
a/traffic_portal/app/src/modules/private/users/deliveryServices/index.js 
b/traffic_portal/app/src/modules/private/users/deliveryServices/index.js
deleted file mode 100644
index 63c6240..0000000
--- a/traffic_portal/app/src/modules/private/users/deliveryServices/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.users.deliveryServices', [])
-       .config(function ($stateProvider, $urlRouterProvider) {
-               $stateProvider
-                       .state('trafficPortal.private.users.deliveryServices', {
-                               url: '/{userId}/delivery-services',
-                               views: {
-                                       usersContent: {
-                                               templateUrl: 
'common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html',
-                                               controller: 
'TableUserDeliveryServicesController',
-                                               resolve: {
-                                                       user: function 
($stateParams, userService) {
-                                                               return 
userService.getUser($stateParams.userId);
-                                                       },
-                                                       deliveryServices: 
function ($stateParams, deliveryServiceService) {
-                                                               return 
deliveryServiceService.getUserDeliveryServices($stateParams.userId);
-                                                       }
-                                               }
-                                       }
-                               }
-                       })
-               ;
-               $urlRouterProvider.otherwise('/');
-       });

Reply via email to