mikamai / akamai_api

Akamai gem+CLI to work with CCU and ECCU interfaces
MIT License
43 stars 19 forks source link

AkamaiApi

Gem Version Build Status Code Climate Coverage Status Dependency Status

Now with CCU REST support!

AkamaiApi is a ruby library and command line utility to interact with Akamai CCU (Content Control Utility) and ECCU (Enhanced Content Control Utility) services.

Using the CLI

After gem installation you will have a CLI utility to execute operations on Akamai. Each method requires authentication. You can provide auth info using one of the following methods:

    auth:
      - user
      - pass
    openapi: # openapi credentials
        base_url: https://akab-abcdefghi-jklmnopq.purge.akamaiapis.net
        client_token: akab-abcdefghijklmnopqrstuv12345
        client_secret: abcedfhijklmnopqrstuv12345
        access_token: akab-12345abcedfghijklmnopqrstuv
    log: true # optional for enabling logging in ECCU requests. false by default

Tasks

When using the CLI you can work with both CCU and ECCU.

    akamai_api CCU          # CCU Interface
    akamai_api ECCU         # ECCU Interface
    akamai_api help [TASK]  # Describe available tasks or one specific task

Use akamai_api help to view the help of the CLI.

CCU

In the CCU interface you can work with CP Codes and ARLs.

    akamai_api CCU cpcode                 # CP Code CCU actions
    akamai_api CCU help [COMMAND]         # Describe subcommands or one specific subcommand
    akamai_api CCU arl                    # ARL CCU actions
    akamai_api CCU status [progress_uri]  # Show the CCU queue status if no progress_uri is given, or show a CCU Purge request status if a progress uri is given

CP Code

    akamai_api CCU cpcode help [COMMAND]                  # Describe subcommands or one specific subcommand
    akamai_api CCU cpcode invalidate CPCODE1 CPCODE2 ...  # Purge CP Code(s) marking their cache as expired
    akamai_api CCU cpcode remove CPCODE1 CPCODE2 ...      # Purge CP Code(s) removing them from the cache

When removing or invalidating a CP Code you can provide the following optional arguments:

ARL

  akamai_api CCU arl help [COMMAND]                                                   # Describe subcommands or one specific subcommand
  akamai_api CCU arl invalidate http://john.com/a.txt http://www.smith.com/b.txt ...  # Purge ARL(s) marking their cache as expired
  akamai_api CCU arl remove http://john.com/a.txt http://www.smith.com/b.txt ...      # Purge ARL(s) removing them from the cache

When removing or invalidating an ARL you can provide the following optional arguments:

Status

If you don't provide a progress_uri this command will print the CCU queue status. E.g.

$ akamai_api CCU status
------------
Status has been successfully received:
    * Result: 200 - The queue may take a minute to reflect new or removed requests.
    * Support ID: 12345678901234567890-123456789
    * Queue Length: 0
------------

When you provide a progress_uri or a purge_id this command will print the CCU request status. E.g.

$ akamai_api CCU status 12345678-1234-5678-1234-123456789012 # or you can pass /CCU/v2/purges/12345678-1234-5678-1234-123456789012
------------
Status has been successfully received:
    * Result: 200 - Done
    * Purge ID: 12345678-1234-5678-1234-123456789012 | Support ID: 12345678901234567890-123456789
    * Submitted by 'gawaine' on 2014-05-20 08:19:21 UTC
    * Completed on: 2014-05-20 08:22:20 UTC
------------

ECCU

In the ECCU interface you can see the requestes already published and publish your own requests.

    akamai_api ECCU help [COMMAND]                            # Describe subcommands or one specific subcommand
    akamai_api ECCU last_request                              # Print the last request made to ECCU
    akamai_api ECCU publish_xml path/to/request.xml john.com  # Publish a request made in XML for the specified Digital Property (usually the Host Header)
    akamai_api ECCU requests                                  # Print the list of the last requests made to ECCU
    akamai_api ECCU revalidate now jhon.com "*.png"           # Create an XML request based on querystring input (*.png) for the specified Digital Property (usually the Host Header)

Viewing Requests

You can see the requests published on ECCU using akamai_api ECCU requests For each request you will see all its details (code, status, etc.) except the file content. To view the file content add the --content (-c) option.

To see only the last request you can use akamai_api ECCU last_request.

Publishing Requests in XML

To publish requests made in XML (ECCU Request Format) you can use akamai_api ECCU publish_xml.

Usage:
  akamai_api publish_xml path/to/request.xml john.com

Options:
  -P, [--property-type=type]              # Type of enlisted properties
                                          # Default: hostheader
      [--no-exact-match]                  # Do not do an exact match on property names
  -e, [--emails=foo@foo.com bar@bar.com]  # Email(s) to use to send notification on status change
  -n, [--notes=NOTES]                     # Default: ECCU Request using AkamaiApi gem

The command takes two arguments:

Revalidate based on a query string

You con use akamai_api ECCU revalidate for generate an XML revalidation file base on a query string.

Usage:
  akamai_api revalidate now jhon.com "*.png"

Options:
  -f, [--force]                            # Force request without confirm
  -P, [--property-type=type]               # Type of enlisted properties
                                           # Default: hostheader
      [--no-exact-match]                   # Do not do an exact match on property names
  -e, [--emails=foo@foo.com bar@bar.com]   # Email(s) to use to send notification on status change
  -n, [--notes=NOTES]                      # Default: ECCU Request using AkamaiApi gem

The command produces the following result and ask you if you want to publish:

<?xml version="1.0"?><eccu><match:ext value="png"><revalidate>now</revalidate></match:ext></eccu>

The command takes two arguments:

Rules for the Querystring

Following the Akamai API docs there is a limitation:

Akamai recommends that you limit the number of matches to 250 or fewer. Submitting more than 250 invalidation requests at one time can result in a “global invalidation”

As a Library

Remember to init the AkamaiApi gem with your login credentials. You can set your credentials with the following statement:

AkamaiApi.config.merge! :auth => ['user', 'pass']

CCU

::status

When no argument is given, this command will return a AkamaiApi::CCU::Status::Response object describing the status of the Akamai CCU queue. E.g.

AkamaiApi::CCU.status
# => #<AkamaiApi::CCU::Status::Response:0x00000101167978 @raw={"supportId"=>"12345678901234567890-123456789", "httpStatus"=>200, "detail"=>"The queue may take a minute to reflect new or removed requests.", "queueLength"=>0}>

When you pass a progress_uri or a purge_id, this command will check the given Akamai CCU request. E.g.

AkamaiApi::CCU.status '/CCU/v2/purges/foobarbaz' # you can pass only 'foobarbaz' (the purge request id) as argument
# => #<AkamaiApi::CCU::PurgeStatus::SuccessfulResponse:0x000001014da088
#  @raw=
#   {"originalEstimatedSeconds"=>480,
#    "progressUri"=>"/CCU/v2/purges/12345678-1234-5678-1234-123456789012",
#    "originalQueueLength"=>6,
#    "purgeId"=>"12345678-1234-5678-1234-123456789012",
#    "supportId"=>"12345678901234567890-123456789",
#    "httpStatus"=>200,
#    "completionTime"=>"2014-02-19T22:16:20Z",
#    "submittedBy"=>"test1",
#    "purgeStatus"=>"In-Progress",
#    "submissionTime"=>"2014-02-19T21:16:20Z",
#    "pingAfterSeconds"=>60}>

It will return a AkamaiApi::CCU::PurgeStatus::SuccessfulResponse object when a purge request is found, or a Akamai::CCU::PurgeStatus::NotFoundResponse when no request can be found.

::purge

module AkamaiApi::CCU
  def purge action, type, items, args = {}
    ...
  end
end

It will return a AkamaiApi::CCU::Purge::Response object that you can use to retrieve the progress_uri (or the purge_id) of the request.

E.g.

AkamaiApi::CCU.purge :remove, :arl, ['http://www.foo.com/a.txt'], :domain => 'staging'
# => #<AkamaiApi::CCU::Purge::Response:0x00000101bf2848
#  @raw=
#   {"describedBy"=>"foo",
#    "title"=>"bar",
#    "pingAfterSeconds"=>100,
#    "purgeId"=>"1234",
#    "supportId"=>"130",
#    "detail"=>"baz",
#    "httpStatus"=>201,
#    "estimatedSeconds"=>90,
#    "progressUri"=>"/CCU/v2/purges/1234"}>

Purge Helpers

CCU = AkamaiApi::CCU

CCU.invalidate_cpcode cpcodes    # => wrapper to call .purge :invalidate, :cpcode
CCU.invalidate_arl arls          # => wrapper to call .purge :invalidate, :arl
CCU.invalidate :arl, arls        # => wrapper to call .purge :invalidate

CCU.remove_cpcodes cpcodes   # => wrapper to call .purge :remove, :cpcode
CCU.remove_arl arls          # => wrapper to call .purge :remove, :arl
CCU.remove :arl              # => wrapper to call .purge :remove

ECCURequest

An ECCURequest is an object representing an ECCU Request. To see all the published requests use the ::all method. To retrieve only the last request, you can use the ::last method. The following code should be self explaining about both class methods and instance methods:

    all_requests_ids = ECCURequest.all_ids                     # => Returns all available requests ids
    first_request    = ECCURequest.find all_requests_ids.first # => Return the ECCURequest model with the specified code

    all_requests = ECCURequest.all  # => Returns all available requests
    last_request = ECCURequest.last # => Return the last available request

    last_request.update_notes! 'My new note' # => Invoke the ECCU service to change the notes field
    last_request.update_email! 'foo@foo.com' # => Invoke the ECCU service to change the email to be notified on status change
    last_request.destroy                     # => Invoke the ECCU service to delete the request

Use the ::publish method to publish an ECCU Request:

    AkamaiApi::ECCURequest.publish 'example.com', my_content, args
    AkamaiApi::ECCURequest.publish_file 'example.com', 'path/to/file.xml', args

You can specify the following optional arguments in args: file_name, notes, version, emails, property_type, property_exact_match

Contributing