rscalr 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: