rscalr 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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