enstratus_helper 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/README.md +41 -0
  2. data/lib/enstratus_helper.rb +71 -0
  3. metadata +81 -0
@@ -0,0 +1,41 @@
1
+ # enstratus_helper
2
+ enstratus_helper is a simple ruby class that helps making request to enStratus web service easier. With enstratus_helper, you only have to specify the resource you want to request, and it will handle the signature generation & HTTP header initialization for you.
3
+
4
+
5
+ ## Usage
6
+
7
+ ```ruby
8
+ require 'enstratus_helper'
9
+ access_key = "my_access_key"
10
+ secret_key = "super_secret_key"
11
+
12
+ ehelper = EnstratusHelper.new(:access_key => access_key, :secret_key => secret_key)
13
+
14
+ # You can specify whether to use json or xml format
15
+ ehelper = EnstratusHelper.new(:access_key => access_key, :secret_key => secret_key, :accept => 'application/json')
16
+
17
+ # Example of doing GET requests
18
+ puts ehelper.request :get, 'http://api.enstratus.com/api/enstratus/2011-02-24/geography/Region'
19
+ puts ehelper.request :get, 'http://api.enstratus.com/api/enstratus/2011-02-24/infrastructure/MachineImage?regionId=my_region_id'
20
+ puts ehelper.request :get, 'http://api.enstratus.com/api/enstratus/2011-02-24/infrastructure/Server'
21
+
22
+ # You can explicitly define GET request header. Here, we're explicitly specifying the format to be JSON
23
+ #puts ehelper.request :get, 'http://api.enstratus.com/api/enstratus/2011-02-24/admin/BillingCode', :header => {'Accept' => 'application/json'}
24
+
25
+ # Example of doing POST requests
26
+ xml_data =<<EOF
27
+ <addBillingCode>
28
+ <billingCode>
29
+ <name>API Dev 1</name>
30
+ <financeCode>API 1</financeCode>
31
+ <description>API Development</description>
32
+ <softQuota>USD50.00</softQuota>
33
+ </billingCode>
34
+ </addBillingCode>
35
+ EOF
36
+ json_data = {:addBillingCode => {:billingCode => {:name => 'API 3', :financeCode => "API 3", :description => "description", :softQuota => 'USD11.01', :hardQuota => 'USD11.11'}}}.to_json
37
+
38
+ ehelper.request :post, 'http://api.enstratus.com/api/enstratus/2011-02-24/admin/BillingCode', :data => xml_data
39
+ ehelper.request :post, 'http://api.enstratus.com/api/enstratus/2011-02-24/admin/BillingCode', :data => xml_data, :header => {'Accept' => 'application/xml'}
40
+ ehelper.request :post, 'http://api.enstratus.com/api/enstratus/2011-02-24/admin/BillingCode', :data => json_data, :header => {'Accept' => 'application/json'}
41
+ ```
@@ -0,0 +1,71 @@
1
+ require 'rubygems'
2
+ require 'base64'
3
+ require 'rest_client'
4
+ require 'digest/sha2'
5
+ require 'openssl'
6
+ require 'uri'
7
+
8
+ class EnstratusHelper
9
+ CONFIGURABLE_ATTRIBUTES = [
10
+ :details,
11
+ :accept,
12
+ :secret_key,
13
+ :access_key
14
+ ]
15
+ attr_accessor *CONFIGURABLE_ATTRIBUTES
16
+
17
+ def initialize(options = {})
18
+ CONFIGURABLE_ATTRIBUTES.each do |attribute_name|
19
+ self.send("#{attribute_name}=", options[attribute_name]) if options.has_key?(attribute_name)
20
+ end
21
+ @accept ||= 'application/xml'
22
+ @details ||= 'extended'
23
+ end
24
+
25
+ # Generates the required headers for talking to enStratus API
26
+ # signature is of the following format:
27
+ # BASE64(SHA256(ACCESS_KEY:METHOD:URI:TIMESTAMP:USER_AGENT))
28
+ def generate_header(uri, http_method, options={})
29
+ http_method = http_method.to_s.upcase
30
+ path = URI.parse(uri).path
31
+ timestamp = Time.now.to_i * 1000
32
+ signature = "#{@access_key}:#{http_method}:#{path}:#{timestamp}:#{self.class}"
33
+ signature = EnstratusHelper::sign(@secret_key, signature)
34
+ {'x-esauth-access' => @access_key, 'x-esauth-signature' => signature,
35
+ 'x-esauth-timestamp' => timestamp, 'User-agent' => self.class,
36
+ 'x-es-details' => details, 'Accept' => accept}
37
+ end
38
+
39
+ # Sends the request to the given URI using the specified method (GET by default)
40
+ # Returns the response object (of the rest-client library)
41
+ def request(method, uri, options={})
42
+ response = nil
43
+ data = options[:data]
44
+ header = generate_header(uri, method)
45
+ header = header.merge(options[:header]) if options[:header]
46
+ begin
47
+ case method
48
+ when :get
49
+ response = RestClient.send(method, uri, header)
50
+ when :delete
51
+ response = RestClient.send(method, uri, header)
52
+ when :post
53
+ header[:content_type] = 'application/xml'
54
+ response = RestClient.send(method, uri, data, header)
55
+ when :put
56
+ response = RestClient.send(method, uri, data, header)
57
+ else
58
+ raise "HTTP method #{method} not supported"
59
+ end
60
+ rescue => e
61
+ puts e.inspect
62
+ end
63
+ response
64
+ end
65
+
66
+ # Generates the signature for talking to enStratus
67
+ def self.sign(key, str_to_sign)
68
+ digest = OpenSSL::Digest::Digest.new('sha256')
69
+ Base64.encode64(OpenSSL::HMAC.digest(digest, key, str_to_sign)).gsub("\n","")
70
+ end
71
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enstratus_helper
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Darren Dao
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-12-07 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rest-client
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description:
35
+ email: darrendao@gmail.com
36
+ executables: []
37
+
38
+ extensions: []
39
+
40
+ extra_rdoc_files: []
41
+
42
+ files:
43
+ - README.md
44
+ - lib/enstratus_helper.rb
45
+ homepage: http://github.com/darrendao/enstratus_helper
46
+ licenses: []
47
+
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --inline-source
51
+ - --charset=UTF-8
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.8.11
76
+ signing_key:
77
+ specification_version: 2
78
+ summary: Simple ruby wrapper to make it easier to talk to enStratus API
79
+ test_files: []
80
+
81
+ has_rdoc: true