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.
- data/lib/rscalr/api/scalr.rb +67 -60
- data/lib/rscalr/version.rb +1 -1
- metadata +1 -1
data/lib/rscalr/api/scalr.rb
CHANGED
@@ -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
|
data/lib/rscalr/version.rb
CHANGED