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

*****************************
Traffic Server Administration
*****************************
Installing Traffic Server
=========================

#.  Get the Traffic Server RPM and the astats RPM.

    Sample command: ::

        wget http://traffic-control-cdn.net/downloads/1.7.0/RELEASE-1.7.0/trafficserver-5.3.2-759.ee14bbe.el6.x86_64.rpm
        wget http://traffic-control-cdn.net/downloads/1.6.1/RELEASE-1.6.1/astats_over_http-1.2-8.el6.x86_64.rpm

    (astats was not released as part of 1.7, so in this examples 1.6.1 was used)
#.  Install Traffic Server and astats: ::

        sudo yum -y install trafficserver-*.rpm astats_over_http*.rpm

#.  Add the server using the Traffic Ops web interface:

    #. Select **Servers**.
    #. Scroll to the bottom of the page and click **Add Server**.
    #. Complete the "Required Info:" section:
        * Set 'Interface Name' to the name of the interface from which traffic server delivers content. 
        * Set 'Type' to 'MID' or 'EDGE'.

    #. Click **Submit**.
    #. Click **Save**.
    #. Click **Online Server**. 
    #. Verify that the server status is now listed as **Reported**

#.  Install the ORT script and run it in 'badass' mode to create the initial configuration, see :ref:`reference-traffic-ops-ort` 

#.  Start the service: ``sudo service trafficserver start``

#.  Configure traffic server to start automatically: ``sudo chkconfig trafficserver on``

#.  Verify that the installation is good:

    #. Make sure that the service is running: ``sudo service trafficserver status``

    #. Assuming a traffic monitor is already installed, browse to it, and verify that the traffic server appears in the "Cahce States" table, in white.


.. _reference-traffic-ops-ort:

Configuring Traffic Server
==========================
All of the Traffic Server application configuration files are generated by Traffic Ops and installed by way of the traffic_ops_ort.pl script. 
The traffic_ops_ort.pl should be installed on all caches (by puppet or other non Traffic Ops means), usually in /opt/ort. It is used to do the initial install of the config files when the cache is being deployed, and to keep the config files up to date when the cache is already in service.  The usage message of the script is shown below: ::

    $ sudo /opt/ort/traffic_ops_ort.pl
    Thu May 26 15:52:11 UTC 2016
    ====-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-====
    Usage: ./traffic_ops_ort.pl <Mode> <Log_Level> <Traffic_Ops_URL> <Traffic_Ops_Login> [optional flags]
      <Mode> = interactive - asks questions during config process.
      <Mode> = report - prints config differences and exits.
      <Mode> = badass - attempts to fix all config differences that it can.
      <Mode> = syncds - syncs delivery services with what is configured in Traffic Ops.

      <Log_Level> => ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, NONE

      <Traffic_Ops_URL> = URL to Traffic Ops host. Example: https://trafficops.company.net

      <Traffic_Ops_Login> => Example: 'username:password'

      [optional flags]:
        dispersion=<time>      => wait a random number between 0 and <time> before starting. Default = 300.
        retries=<number>       => retry connection to Traffic Ops URL <number> times. Default = 3.
        wait_for_parents=<0|1> => do not update if parent_pending = 1 in the update json. Default = 1, wait for parents.
    ====-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-====
    $

Installing the ORT script
--------------------------

#.  The ORT script is not a part of the traffic server distribution. In this sample session, we get it manually from github: ::

        sudo mkdir /opt/ort
        sudo wget -P /opt/ort https://raw.githubusercontent.com/apache/incubator-trafficcontrol/1.7.x/traffic_ops/bin/traffic_ops_ort.pl
        sudo chmod +x /opt/ort/traffic_ops_ort.pl

#.  Install modules required by ORT: ``sudo yum -y install perl-JSON perl-Crypt-SSLeay``

#.  For initial configuration or when major changes (like a Profile change) need to be made, run the script in "badass mode". All required rpm packages 
    will be installed, all Traffic Server config files will be fetched and installed, and (if needed) the Traffic Server application will be restarted.  

    Example run below: ::

        $ sudo /opt/ort/traffic_ops_ort.pl --dispersion=0 badass warn https://ops.$tcDomain admin:admin123

    .. Note:: First run gives a lot of state errors that are expected. The "badass" mode fixes these issue s. Run it a second time, this should be cleaner.
       Also, note that many ERROR messages emitted by ORT are actually information messages. Do not panic.

#.  Create a cron entry for running ort in 'syncds' mode every 15 minutes. 
    This makes traffic control check periodically if 'Queue Updates' was run on Traffic Ops, and it so, get the updated configuration.

    Run ``sudo crontab -e`` and add the following line :: 

  	  	*/15 * * * * /opt/ort/traffic_ops_ort.pl syncds warn https://traffops.kabletown.net admin:password --login_dispersion=30 --dispersion=180 > /tmp/ort/syncds.log 2>&1

    Changing ``https://traffops.kabletown.net``, ``admin``, and ``password`` to your CDN URL and credentials.

    .. Note:: By default, running ort on an edge traffic server waits for it's parent (mid) servers to download their configuration before 
       it downloads it's own configuration. Because of this, scheduling ort for running every 15 minutes (with 5 minutes default dispersion) means 
       that it might take up to ~35 minutes for a "Queue Updates" operation to affect all traffic servers.  To customize this dispersion time, use 
       the command line option --dispersion=x where x is the number of seconds for the dispersion period.  Servers will select a random number from
       within this dispersion period to being pulling down configuration files from Traffic Ops.  Another option, --login_dispersion=x can be used.
       This option creates a dispersion period after the job begins during which ORT will wait before logging in and checking Traffic Ops for updates
       to the server.  This defaults to 0.  If use_reval_pending, a.k.a. Rapid Revalidate is enabled, edges will NOT wait for their parents to download
       their configuration before downloading their own.

    .. Note:: In 'syncds' mode, the ort script updates only configurations that might be changed as part of normal operations, such as:

        * Delivery Services
        * SSL certificates
        * Traffic Monitor IP addresses
        * Logging configuration
        * Revalidation requests (By default. If Rapid Revalidate is enabled, this will only be checked by using a separate revalidate command in ORT.)


#.  If Rapid Revalidate is enabled in Traffic Ops, create a second cron job for revalidation checks.  ORT will not check revalidation files if Rapid Revalidate
    is enabled. This setting allows for a separate check to be performed every 60 seconds to verify if a revalidation update has been made.

    Run ``sudo crontab -e`` and add the following line :: 

        */1 * * * * /opt/ort/traffic_ops_ort.pl revalidate warn https://traffops.kabletown.net admin:password --login_dispersion=30 > /tmp/ort/syncds.log 2>&1

