Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
CLI tool for working with multiple CDNs
branch: master

README.md

CDNControl

CDNControl is a rubygem which provides an interface to Dyn's GSLB service. It's used by Etsy to control the balance of traffic between our CDN providers, and also to enable or disable individual CDNs.

Installation

Gem Install

cdncontrol is available on rubygems. Add the following to your Gemfile:

gem 'cdncontrol'

or install the gem manually:

gem install cdncontrol

The gem installs the cdncontrol binary at /usr/bin/cdncontrol

CDNControl Configuration

CDNControl requires a configuration file in order to function, which needs to be in /usr/local/etc/cdncontrol.conf

Below is a sample config file with all supported options included, followed by an explanation of each section.

organization: "myorganisation"
username: "username"
password: "password"
output_path: "/var/www"
cdncontrol_ui_hostname: "http://cdn.mydomain.com"


valid_providers:
    - provider1
    - provider2
    - provider3

targets:
    target1:
        zone: myzone.com
        nodes:
          - 1.myzone.com
          - 2.myzone.com
          - 3.myzone.com
          - 4.myzone.com
        graph_url: "<your_graphite_cdn_metric_url>"
        graph_color_key:
           provider1: "#FF7400"
           provider2: "#1240AB"
           provider3: "#00CC00"
           provider4: "#380470"

Organization

The organization directive specifies the customer name you use when logging into the DynECT portal

Username

The username directive specifies the username to use when authenticating to the Dyn API.

Password

The password directive specifies the password to use when authenticating to the Dyn API.

Output Path

The output_path directive specifies where cdncontrol should dump JSON containing the CDN balances.

CDNControl UI Hostname (Optional)

The cdncontrol_ui_hostname directive specifies the hostname where the CDNControlUI web application can be reached, if you're using it.

Valid Providers

The valid_providers section specifies the valid CDN providers which may be configured with this tool. This corresponds to the names of the global pools you have configured on the Dyn GSLB platform.

Targets

The targets section of the config file lists the different site configurations you want to use cdncontrol to manage. The following are the parameters which can be used to configure a target (in this case, we're looking at the parameters of target1 above:

  • zone: This is the name used to configure the site in Dyn's GSLB platform. In the DynECT web interface, this is the top-level site from which all of your nodes are configured
  • nodes: These are the nodes under the zone which are configured to use GSLB. For example, if your zone is mydomain.com, you might configure GSLB for img0.mydomain.com and img1.mydomain.com. These should all be specified here.
  • graph_url (optional): If you're using the CDNControlUI web interface to this tool, this option lets you specify a graph_url to be displayed on the page for this target.
  • graph_color_key (optional): If you're using the CDNControlUI web interface to this tool, this option lets you specify a color key to be displayed above the graph (to indicate which CDN is which color, for example).

CDNControl Usage

Supported Options

$> cdncontrol
Usage: cdncontrol [-tpwmcsav]
Please specify the command in one of the following formats:

cdncontrol -t TARGET --show
cdncontrol -t TARGET --write
cdncontrol -t TARGET -p PROVIDER -w WEIGHT
cdncontrol -t TARGET -p PROVIDER -m MODE

Specific options:
    -t, --target                     The configuration to work on (one of <targets specified in your config file>)
    -p, --provider                   Provider to modify (one of <providers specified in your config file>)
    -w, --weight                     Weight of traffic to send to provider (value between 1 and 15)
    -m, --mode                       Set the serve mode of the provider (one of always,obey,remove,no)
    -c, --cname                      Target CNAME for new provider
    -s, --show                       Show current provider ratios
    -v, --verbose                    Show me in excrutiating detail what is happening
        --write                      Dump all weights out to JSON files

Viewing target details

$> cdncontrol -t test --show

** connecting to dynect API
** fetching node details .......done!

NODE BALANCE
============
img0.mydomain.com
  provider1       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider1.com.
  provider2       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider2.com.
  provider3       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider3.com.

Writing target details as JSON

$ cdncontrol -t test --write
** connecting to dynect API
** fetching node details .......done!
** Updated details in /var/www/cdn_test.json

Setting the weight of a target's provider

$> cdncontrol -t test -p provider1 -w 5
** connecting to dynect API
** fetching node details .......done!

CURRENT LIVE WEIGHTS
====================
img0.mydomain.com
  provider1       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider1.com.
  provider2       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider2.com.
  provider3       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider3.com.

You're about to modify the weight of provider1 to 5 are you sure (Y|N)? Y

** setting weight = 5 on GSLBRegionPoolEntry/myorg-mydomain.com/img0.mydomain.com/global/cdn.provider1.com.

** fetching node details .......done!

NODE WEIGHTS AFTER CHANGE
=========================
img0.mydomain.com
  provider1       weight = 5 | serve_mode = always   | status = up   | address = cdn.provider1.com.
  provider2       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider2.com.
  provider3       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider3.com.

** Updated details in /var/www/cdn_test.json

Setting the mode of a target's provider

 cdncontrol -t test -p provider1 -m no
** connecting to dynect API
** fetching node details .......done!

CURRENT SERVE MODES AND WEIGHTS
===============================
img0.mydomain.com
  provider1       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider1.com.
  provider2       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider2.com.
  provider3       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider3.com.

You're about to change the serving mode for provider1 to 'no' are you sure (Y|N)? Y

** setting serve_mode = no on GSLBRegionPoolEntry/myorg-mydomain.com/img0.mydomain.com/global/cdn.provider1.com.
** fetching node details .......done!

NODE SERVE MODES AFTER CHANGE
=============================
img0.mydomain.com
  provider1       weight = 15 | serve_mode = no       | status = up   | address = cdn.provider1.com.
  provider2       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider2.com.
  provider3       weight = 15 | serve_mode = always   | status = up   | address = cdn.provider3.com.

** Updated details in /var/www/cdn_test.json
Something went wrong with that request. Please try again.