Rackspace CDNV2 ↑

This document explains how to get started using CDNV2 with Fog. It assumes you have read the Getting Started with Fog and the Rackspace Open Cloud document.

Starting irb console ↑

Start by executing the following command:

    irb

Once irb has launched you need to require the Fog library.

If using Ruby 1.8.x execute:

    require 'rubygems'
    require 'fog'

If using Ruby 1.9.x execute:

    require 'fog'

Create Service ↑

Next, create a connection to Rackspace's CDNV2 API:

Using a US-based account:

    service = Fog::Rackspace::CDNV2.new({
            :rackspace_username  => RACKSPACE_USER_NAME, # Your Rackspace Username
            :rackspace_api_key       => RACKSPACE_API,       # Your Rackspace API key
            :rackspace_region        => :ord,                # Defaults to :dfw
    })

Using a UK-based account:

    service = Fog::Compute.new({
            :rackspace_username  => RACKSPACE_USER_NAME,        # Your Rackspace Username
            :rackspace_api_key   => RACKSPACE_API,              # Your Rackspace API key
            :rackspace_auth_url  => Fog::Rackspace::UK_AUTH_ENDPOINT,
            :rackspace_region    => :lon,
    })

To learn more about obtaining cloud credentials refer to the Getting Started with Fog and the Rackspace Open Cloud document.

By default Fog::Rackspace::CDNV2 will authenticate against the US authentication endpoint and connect to the DFW region. You can specify alternative authentication endpoints using the key :rackspace_auth_url. Please refer to Alternate Authentication Endpoints for a list of alternative Rackspace authentication endpoints.

Alternative regions are specified using the key :rackspace_region. A list of regions available for Cloud Servers can be found by executing the following:

    identity_service = Fog::Identity({
            :provider            => 'Rackspace',                     # Rackspace Fog provider
            :rackspace_username  => RACKSPACE_USER_NAME,             # Your Rackspace Username
            :rackspace_api_key   => RACKSPACE_API,                   # Your Rackspace API key
            :rackspace_auth_url  => Fog::Rackspace::UK_AUTH_ENDPOINT # Not specified for US Cloud
    })

    identity_service.service_catalog.display_service_regions :cloudServersOpenStack

Optional Connection Parameters ↑

Fog supports passing additional connection parameters to its underlying HTTP library (Excon) using the :connection_options parameter.

Key Description
:connect_timeout Connection timeout (default: 60 seconds)
:read_timeout Read timeout for connection (default: 60 seconds)
:write_timeout Write timeout for connection (default: 60 seconds)
:proxy Proxy for HTTP and HTTPS connections
:ssl_ca_path Path to SSL certificate authorities
:ssl_ca_file SSL certificate authority file
:ssl_verify_peer SSL verify peer (default: true)

Fog Abstractions ↑

Fog provides both a model and request abstraction. The request abstraction provides the most efficient interface and the model abstraction wraps the request abstraction to provide a convenient ActiveModel like interface.

Request Layer ↑

The request abstraction maps directly to the CDNV2 API. It provides the most efficient interface to the Rackspace CDNV2

To see a list of requests supported by the service:

    service.requests

This returns:

    [:create_service, :delete_assets, :delete_service, :get_flavor, :get_home_document, :get_ping, :get_service, :list_flavors, :list_services, :update_service]

Example Request ↑

To request a list of services:

    response = service.list_services

This returns in the following Excon::Response:

    #<Excon::Response:0x007ff0ea6b4c88 @data={:body=>{"services"=>[{"name"=>"SomethingDifferent.net", "domains"=>[{"domain"=>"google.com", "protocol"=>"http"}], "origins"=>[{"origin"=>"google.com", "port"=>80, "ssl"=>false, "rules"=>[]}], "restrictions"=>[], "caching"=>[], "status"=>"create_in_progress", "flavor_id"=>"cdn", "errors"=>[]

To view the status of the response:

    response.status

Note: Fog is aware of valid HTTP response statuses for each request type. If an unexpected HTTP response status occurs, Fog will raise an exception.

To view response body:

    response.body

This will return:

    {"services"=>[{"name"=>"SomethingDifferent.net", "domains"=>[{"domain"=>"google.com",...

To learn more about CDNV2 request methods refer to rdoc. To learn more about Excon refer to Excon GitHub repo.

Model Layer ↑

Fog models behave in a manner similar to ActiveModel. Models will generally respond to create, save, persisted?, destroy, reload and attributes methods. Additionally, fog will automatically create attribute accessors.

Here is a summary of common model methods:

Method Description
create Accepts hash of attributes and creates object.
Note: creation is a non-blocking call and you will be required to wait for a valid state before using resulting object.
save Saves object.
Note: not all objects support updating object.
persisted? Returns true if the object has been persisted.
destroy Destroys object.
Note: this is a non-blocking call and object deletion might not be instantaneous.
reload Updates object with latest state from service.
ready? Returns true if object is in a ready state and able to perform actions. This method will raise an exception if object is in an error state.
attributes Returns a hash containing the list of model attributes and values.
identity Returns the identity of the object.
Note: This might not always be equal to object.id.
wait_for This method periodically reloads model and then yields to specified block until block returns true or a timeout occurs.

The remainder of this document details the model abstraction.

List Services ↑

To retrieve a list of available services:

    service.services

This returns a collection of Fog::Rackspace::CDNV2::Service models:

    <Fog::Rackspace::CDNV2::Services
  [
    <Fog::Rackspace::CDNV2::Service
      id="087ffeb0-462d-4f44-b24a-2914fbfb1d42",
      name="SomethingDifferent.net",
      domains=[{"domain"=>"google.com", "protocol"=>"http"}],
      origins=[{"origin"=>"google.com", "port"=>80, "ssl"=>false, "rules"=>[]}],
      caching=[],
      restrictions=[],
      flavor_id="cdn",
      status="create_in_progress",
      links=[{"href"=>"", "rel"=>"self"}, {"href"=>"...", "rel"=>"flavor"}]
      ...

Create Service ↑

Create a service:

      s = service.services.new
      s.name = "work.com"
      s.flavor_id = "cdn"
      s.add_domain "google.com"
      s.add_origin "google.com"
      s.save

Update Service ↑

You may add, remove, or update. – DOCS NEEDED –

      s = service.services.first
      s.add_operation({
    op: "add",
    path: "/domains/0",
    value: {
      origin: "cdn.somewhere.org",
      port: 80,
      ssl: false,
      rules: [
        {
          name: "Something",
          request_url: "google.com"
        }
      ]
    }
  })

  s.save

Get Service ↑

To retrieve individual service:

      service.services.get "087ffeb0-462d-4f44-b24a-2914fbfb1d42"

This returns an Fog::Rackspace::CDNV2::Service instance:

<Fog::Rackspace::CDNV2::Service
  id="087ffeb0-462d-4f44-b24a-2914fbfb1d42"
  name="work.com",
  domains=[{"domain"=>"google.com", "protocol"=>"http"}],
  origins=[{"origin"=>"google.com", "port"=>80, "ssl"=>false, "rules"=>[]}],
  caching=[],
  restrictions=[],
  flavor_id="cdn",
  status="create_in_progress",
  links=[{"href"=>"", "rel"=>"self"}, {"href"=>"...", "rel"=>"flavor"}]

Delete Service ↑

To delete a service:

service.destroy

Note: The service is not immediately destroyed, but it does occur shortly there after.

Delete Service Assets ↑

To delete a service's assets (or any owned asset via url):

service.destroy_assets(url: "/")

Note: The service's asset is not immediately destroyed, but it does occur shortly there after.

List Flavors ↑

To retrieve a list of available flavors:

    service.flavors

This returns a collection of Fog::Rackspace::CDNV2::Flavor models:

      <Fog::Rackspace::CDNV2::Flavors
        [
          <Fog::Rackspace::CDNV2::Flavor
            id="cdn",
            providers=[{"provider"=>"akamai", "links"=>[{"href"=>"http://www.akamai.com", "rel"=>"provider_url"}]}],
            links=[{"href"=>"...", "rel"=>"self"}]
          >
        ]
      >

Get Flavor ↑

To retrieve individual flavor:

      service.flavors.get "cdn"

This returns an Fog::Rackspace::CDNV2::Flavor instance:

      <Fog::Rackspace::CDNV2::Flavor
        id="cdn",
        providers=[{"provider"=>"akamai", "links"=>[{"href"=>"http://www.akamai.com", "rel"=>"provider_url"}]}],
        links=[{"href"=>"...", "rel"=>"self"}]
      >

Ping ↑

To ping the CDN:

      service.ping

This returns an boolean based on successful ping.

Get Home Document ↑

To retrieve the home document:

service.home_document

This returns a JSON blob that describes the home document.

Additional Resources ↑

Support and Feedback ↑

Your feedback is appreciated! If you have specific issues with the fog SDK, you should file an issue via Github.

For general feedback and support requests, send an email to: sdk-support@rackspace.com.