..
..
.. 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.
..

.. _rl-steering-qht:

***********************************
Configure Delivery Service Steering
***********************************

1)  Create two target delivery services in Traffic Ops.  They must both be HTTP delivery services that are part of the same CDN.

.. image:: steering01.png
	:scale: 100%
	:align: center

2) Create a delivery service with type STEERING in Traffic Ops.

.. image:: steering02.png
	:scale: 100%
	:align: center

3) Click the 'Manage Steering Assignments' button on the delivery service screen to assign targets.

.. image:: steering03.png
	:scale: 100%
	:align: center

4) Create a user with the role of Steering.

.. image:: steering04.png
	:scale: 100%
	:align: center

5) As the steering user, assign weights to target delivery services.  This will require logging in to Traffic Ops first via ``http://to.kabletown.net/api/1.2/user/login`` and storing the mojolicious cookie.

	Sample cURL: ``curl -H "Cookie: mojolicious=xxxyyy" -XPUT "https://to.kabletown.net/internal/api/1.2/steering/steering-ds" -d @/tmp/steering.json``

	Sample JSON body:

::

   {
    "targets": [
     {
       "weight": "1000",
       "deliveryService": "target-deliveryservice-1"
     },
     {
       "weight": "9000",
       "deliveryService": "target-deliveryservice-2"
     }
    ]
   }

6) If desired, the steering user can create filters for the target delivery services.

	Sample cURL: ``curl -H "Cookie: mojolicious=xxxyyy" -XPUT "https://to.kabletown.net/internal/api/1.2/steering/steering-ds" -d @/tmp/steering.json``

	Sample JSON body:

::

   {
    "filters": [
     {
       "pattern": ".*\\gototarget1\\..*",
       "deliveryService": "target-deliveryservice-1"
     }
    ],
    "targets": [
     {
       "weight": "1000",
       "deliveryService": "target-deliveryservice-1"
     },
     {
       "weight": "9000",
       "deliveryService": "target-deliveryservice-2"
     }
    ]
   }

7) Any requests to Traffic Router for the steering delivery service should now be routed to target delivery services based on configured weight.  Example: ``curl -Lvs http://tr.steering-ds.cdn.kabletown.net/foo``

