.. 
.. Copyright 2015 Comcast Cable Communications Management, LLC
.. 
.. 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.
.. 

Running a Traffic Control CDN
*****************************


Why is my CRConfig.json rejected?
=================================
	Especially in version 1.1.0, there's a number of manual steps that need to be done after the initial install. Make sure that after the initial install, you perform these steps in order:

	.. Note:: Even though Traffic Ops allows you to enter the servers with no IPv6 address information, the CRConfig will not be accepted by Traffic Router without IPv6 address information for at least Traffic Router and Traffic Monitor. Traffic Control assumes in a lot of places that all servers have at least an IPv4 and an IPv6 address. If you are not using IPv6, it is best to enter dummy addresses for all server types, and turn IPv6 off in all delivery services. (https://github.com/Comcast/traffic_control/issues/44).


	* Add users
		Not necessarily needed for getting your CRConfig accepted, but always a good idea.

	* Add Divisions
		You will need at least one.

	* Add Regions
		You will need at least one.

	* Add Physical Locations
		You will need at least one.

	* Add Mid tier Cache Groups
		You will need at least one.

	* Add Edge tier Cache Groups
		You will need at least one. After creating the edge cache group, go to **Parameters > All Profiles**, type CDN_Name in the search box, and click "Edit" for any row of this parameter. Then in the Parameter detail view, click the **Add Cachegroup** button, select your newly created cachegroup, and click **Save**.

	   add CDN_Name parameter

	* Add Traffic Monitors
		You will need to enter at least one Traffic Monitor - make sure to change the server status to *ONLINE*.

	* Add Traffic Routers
		You will need to enter at least one Traffic Router - make sure to change the server status to *ONLINE*.

	* Add Edges
		You will need at least one edge cache to make Traffic Router accept the CRConfig. 

	* Add Mid
		Technically you don't need a mid tier, but if you have one, best to enter the info before continuing.

	* Change the ``polling.url`` parameters to reflect your CDN
		Set where to get the coverage zone map, and the geo IP database.

	* Create at least one delivery service, and assign at least one edge cache in REPORTED state to it.
		Even if it is a dummy DS, without a single DS, the CRConfig will not be accepted by Traffic Router.

	* Snapshot CRConfig
		**Tools > Snapshot CRConfig** diff, and write.

	Now you are ready to install the sw on Traffic Monitor and then Traffic Router.
