rscalr 0.0.4 → 0.0.5

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.
@@ -3,6 +3,12 @@ require 'net/http'
3
3
  require 'cgi'
4
4
  require 'rexml/document'
5
5
 
6
+ # Low-level Scalr API client. Instantiated with a hash containing config parameters (:key_id and :key_secret).
7
+ # All API methods are implemented as methods that return a ScalrResponse object. This object inherits from
8
+ # REXML::Document, making accessing the results pretty straightforward.
9
+ #
10
+ # Unexpected errors (network, etc.) are also wrapped in an ad hoc ScalrResponse, with the transacation ID
11
+ # equal to 'sig:' + [signature used to sign the request] and the message equal to the error message.
6
12
  class Scalr
7
13
  attr_accessor :config
8
14
 
@@ -16,66 +22,6 @@ class Scalr
16
22
  @config[:auth_version] = $DEFAULT_AUTH_VERSION if @config[:auth_version].nil?
17
23
  end
18
24
 
19
- def generate_sig(action, timestamp)
20
- message = action + ':' + @config[:key_id] + ':' + timestamp
21
- hexdigest = OpenSSL::HMAC.hexdigest('sha256', @config[:key_secret], message)
22
- [[hexdigest].pack("H*")].pack("m0")
23
- end
24
-
25
- def generate_timestamp(time)
26
- time.strftime("%Y-%m-%dT%H:%M:%SZ")
27
- end
28
-
29
- def execute_api_call(action, action_params=nil)
30
-
31
- begin
32
- params = { :Action => action, :TimeStamp => generate_timestamp(Time.now) }
33
- params.merge!(action_params) unless action_params.nil?
34
-
35
- params[:Signature] = generate_sig(action, params[:TimeStamp])
36
- params[:Version] = @config[:version]
37
- params[:AuthVersion] = @config[:auth_version]
38
- params[:KeyID] = @config[:key_id]
39
-
40
- uri = URI("https://api.scalr.net/?" + hash_to_querystring(params))
41
-
42
- response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
43
- request = Net::HTTP::Get.new uri.request_uri
44
- http.request request # Net::HTTPResponse object
45
- end
46
-
47
- case response
48
- when Net::HTTPSuccess then
49
- result = ScalrResponse.new response.body
50
- else
51
- result = build_error_response(response)
52
- end
53
-
54
- rescue => ex
55
- result = build_error_response(ex.message)
56
- end
57
-
58
- result
59
- end
60
-
61
- def build_error_response(message)
62
- result = ScalrResponse.new "<?xml version='1.0?>"
63
- result.add_element("Error")
64
- ele = REXML::Element.new "TransactionID"
65
- ele.text = generate_sig(message, generate_timestamp(Time.now))
66
- result.root.elements << ele
67
- ele = REXML::Element.new "Message"
68
- ele.text = message
69
- result.root.elements << ele
70
-
71
- result
72
- end
73
-
74
- def hash_to_querystring(h)
75
- h.map{|k,v| "#{k.to_s}=#{CGI::escape(v.to_s)}"}.join('&')
76
- end
77
-
78
-
79
25
  #=================== API Section ===================================
80
26
 
81
27
  def apache_vhost_create(domain_name, farm_id, farm_role_id, document_root_dir, enable_ssl, ssl_private_key=nil, ssl_certificate=nil)
@@ -303,6 +249,67 @@ class Scalr
303
249
 
304
250
  execute_api_call('StatisticsGetGraphURL', params)
305
251
  end
252
+
253
+ #=============== Helper methods ==================================
254
+
255
+ def generate_sig(action, timestamp)
256
+ message = action + ':' + @config[:key_id] + ':' + timestamp
257
+ hexdigest = OpenSSL::HMAC.hexdigest('sha256', @config[:key_secret], message)
258
+ [[hexdigest].pack("H*")].pack("m0")
259
+ end
260
+
261
+ def generate_timestamp(time)
262
+ time.strftime("%Y-%m-%dT%H:%M:%SZ")
263
+ end
264
+
265
+ def execute_api_call(action, action_params=nil)
266
+
267
+ begin
268
+ params = { :Action => action, :TimeStamp => generate_timestamp(Time.now) }
269
+ params.merge!(action_params) unless action_params.nil?
270
+
271
+ params[:Signature] = generate_sig(action, params[:TimeStamp])
272
+ params[:Version] = @config[:version]
273
+ params[:AuthVersion] = @config[:auth_version]
274
+ params[:KeyID] = @config[:key_id]
275
+
276
+ uri = URI("https://api.scalr.net/?" + hash_to_querystring(params))
277
+
278
+ response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
279
+ request = Net::HTTP::Get.new uri.request_uri
280
+ http.request request # Net::HTTPResponse object
281
+ end
282
+
283
+ case response
284
+ when Net::HTTPSuccess then
285
+ result = ScalrResponse.new response.body
286
+ else
287
+ result = build_error_response(response, params[:Signature])
288
+ end
289
+
290
+ rescue => ex
291
+ result = build_error_response(ex.message, params[:Signature])
292
+ end
293
+
294
+ result
295
+ end
296
+
297
+ def build_error_response(message, transaction_id)
298
+ result = ScalrResponse.new "<?xml version='1.0?>"
299
+ result.add_element("Error")
300
+ ele = REXML::Element.new "TransactionID"
301
+ ele.text = transaction_id
302
+ result.root.elements << ele
303
+ ele = REXML::Element.new "Message"
304
+ ele.text = message
305
+ result.root.elements << ele
306
+
307
+ result
308
+ end
309
+
310
+ def hash_to_querystring(h)
311
+ h.map{|k,v| "#{k.to_s}=#{CGI::escape(v.to_s)}"}.join('&')
312
+ end
306
313
  end
307
314
 
308
315
  class ScalrResponse < REXML::Document
@@ -1,3 +1,3 @@
1
1
  module Rscalr
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscalr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: