rscalr 0.0.12 → 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +18 -0
- data/lib/rscalr.rb +3 -0
- data/lib/rscalr/api/scalr.rb +25 -4
- data/lib/rscalr/model/dashboard.rb +67 -3
- data/lib/rscalr/model/farm.rb +90 -16
- data/lib/rscalr/model/log.rb +2 -2
- data/lib/rscalr/model/log_list.rb +6 -0
- data/lib/rscalr/model/script.rb +19 -1
- data/lib/rscalr/model/script_execution.rb +45 -0
- data/lib/rscalr/model/script_log.rb +7 -0
- data/lib/rscalr/model/server_log.rb +7 -0
- data/lib/rscalr/version.rb +1 -1
- data/test_integration/test_obj_logs.rb +1 -3
- metadata +32 -24
data/README.md
CHANGED
@@ -43,6 +43,24 @@ script = dashboard.get_script 'my-script-name'
|
|
43
43
|
script.execute farm.id
|
44
44
|
```
|
45
45
|
|
46
|
+
Configuration
|
47
|
+
-------------
|
48
|
+
|
49
|
+
If you use this tool a lot from the command line, you can set environment variables that will automagically configure your Scalr or Dashboard instance. The following code sets the relevant parameters:
|
50
|
+
```bash
|
51
|
+
export SCALR_API_KEY=your-api-key
|
52
|
+
export SCALR_API_SECRET=your-api-secret
|
53
|
+
export SCALR_ENV_ID=id-of-desired-environment # optional
|
54
|
+
export SCALR_CLIENT_VERBOSE=true # Print API calls/responses to stdout, optional, default=false
|
55
|
+
```
|
56
|
+
|
57
|
+
Then just instaniate your client:
|
58
|
+
```ruby
|
59
|
+
scalr = Scalr.new
|
60
|
+
# or
|
61
|
+
dash = Dashboard.new
|
62
|
+
```
|
63
|
+
|
46
64
|
|
47
65
|
Caveats
|
48
66
|
-------
|
data/lib/rscalr.rb
CHANGED
@@ -7,4 +7,7 @@ require 'rscalr/model/log'
|
|
7
7
|
require 'rscalr/model/log_list'
|
8
8
|
require 'rscalr/model/role'
|
9
9
|
require 'rscalr/model/script'
|
10
|
+
require 'rscalr/model/script_log'
|
11
|
+
require 'rscalr/model/script_execution'
|
10
12
|
require 'rscalr/model/server'
|
13
|
+
require 'rscalr/model/server_log'
|
data/lib/rscalr/api/scalr.rb
CHANGED
@@ -16,8 +16,13 @@ class Scalr
|
|
16
16
|
$DEFAULT_VERSION = '2.3.0'
|
17
17
|
$DEFAULT_AUTH_VERSION = '3'
|
18
18
|
|
19
|
-
def initialize(config)
|
20
|
-
|
19
|
+
def initialize(config=nil)
|
20
|
+
if (config.nil?)
|
21
|
+
@config = load_config_from_environment
|
22
|
+
else
|
23
|
+
@config = config
|
24
|
+
end
|
25
|
+
|
21
26
|
@config[:version] = $DEFAULT_VERSION if @config[:version].nil?
|
22
27
|
@config[:auth_version] = $DEFAULT_AUTH_VERSION if @config[:auth_version].nil?
|
23
28
|
end
|
@@ -164,7 +169,7 @@ class Scalr
|
|
164
169
|
params[:Prefix] = prefix unless prefix.nil?
|
165
170
|
params[:ImageID] = image_id unless image_id.nil?
|
166
171
|
|
167
|
-
|
172
|
+
execute_api_call('RolesList', params)
|
168
173
|
end
|
169
174
|
|
170
175
|
def scripts_list
|
@@ -253,6 +258,18 @@ class Scalr
|
|
253
258
|
|
254
259
|
#=============== Helper methods ==================================
|
255
260
|
|
261
|
+
# Loads config hash based on environment variables
|
262
|
+
def load_config_from_environment
|
263
|
+
config = {}
|
264
|
+
config[:key_id] = ENV['SCALR_API_KEY'] unless ENV['SCALR_API_KEY'].nil?
|
265
|
+
config[:key_secret] = ENV['SCALR_API_SECRET'] unless ENV['SCALR_API_SECRET'].nil?
|
266
|
+
config[:env_id] = ENV['SCALR_ENV_ID'] unless ENV['SCALR_ENV_ID'].nil?
|
267
|
+
config[:version] = ENV['SCALR_API_VERSION'] unless ENV['SCALR_API_VERSION'].nil?
|
268
|
+
config[:auth_version] = ENV['SCALR_API_AUTH_VERSION'] unless ENV['SCALR_API_AUTH_VERSION'].nil?
|
269
|
+
config[:verbose] = true if (ENV['SCALR_CLIENT_VERBOSE'] == "true" || ENV['SCALR_CLIENT_VERBOSE'] == "1")
|
270
|
+
config
|
271
|
+
end
|
272
|
+
|
256
273
|
# Generates request signature based on config, action, timestamp
|
257
274
|
def generate_sig(action, timestamp)
|
258
275
|
message = action + ':' + @config[:key_id] + ':' + timestamp
|
@@ -297,6 +314,8 @@ class Scalr
|
|
297
314
|
result = build_error_response(ex.message, params[:Signature])
|
298
315
|
end
|
299
316
|
|
317
|
+
$stdout.puts(result.pretty_print) if @config[:verbose]
|
318
|
+
|
300
319
|
result
|
301
320
|
end
|
302
321
|
|
@@ -362,7 +381,9 @@ class ScalrResponse < REXML::Document
|
|
362
381
|
|
363
382
|
# Convenience method to output a repsonse to a stream in a human readable format
|
364
383
|
def pretty_print(dest=$stdout)
|
365
|
-
|
384
|
+
formatter = REXML::Formatters::Pretty.new
|
385
|
+
formatter.compact = true
|
386
|
+
formatter.write(root,dest)
|
366
387
|
end
|
367
388
|
end
|
368
389
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class Dashboard
|
2
2
|
|
3
|
-
def initialize
|
3
|
+
def initialize(config=nil)
|
4
4
|
if config.is_a?(Scalr)
|
5
5
|
@client = config
|
6
|
-
elsif config.is_a?(Hash)
|
6
|
+
elsif config.nil? || config.is_a?(Hash)
|
7
7
|
@client = Scalr.new(config)
|
8
8
|
else
|
9
|
-
raise 'Dashboard may only be initialized with a config Hash or
|
9
|
+
raise 'Dashboard may only be initialized with a config Hash, Scalr object, or nil (load config from environment)'
|
10
10
|
end
|
11
11
|
|
12
12
|
@env_id = @client.env_id
|
@@ -19,6 +19,17 @@ class Dashboard
|
|
19
19
|
@farms[name]
|
20
20
|
end
|
21
21
|
|
22
|
+
def get_farm_by_id(farm_id)
|
23
|
+
if @farms.nil?
|
24
|
+
load_farms
|
25
|
+
end
|
26
|
+
@farms.each { |name,farm|
|
27
|
+
return farm if farm.id == farm_id
|
28
|
+
}
|
29
|
+
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
22
33
|
def load_farms
|
23
34
|
@farms = {}
|
24
35
|
|
@@ -98,4 +109,57 @@ class Dashboard
|
|
98
109
|
|
99
110
|
@environments
|
100
111
|
end
|
112
|
+
|
113
|
+
# Blocks up to timeout seconds waiting on log response(s) of script execution. Returns true iff
|
114
|
+
# script executed successfully (returned) exit_value on all servers.
|
115
|
+
def verify_script_success(script_execution, exit_value=0, timeout_sec=60)
|
116
|
+
return false unless script_execution.success?
|
117
|
+
|
118
|
+
sleep_time = 5
|
119
|
+
|
120
|
+
start_time = Time.now.to_i
|
121
|
+
|
122
|
+
# 1. get list of servers that this execution should run on
|
123
|
+
farm = get_farm_by_id(script_execution.farm_id)
|
124
|
+
if !script_execution.server_id.nil?
|
125
|
+
server = farm.get_server(script_execution.server_id)
|
126
|
+
script_execution.add_server(server.server_id)
|
127
|
+
elsif !script_execution.farm_role_id.nil?
|
128
|
+
role_servers = farm.get_servers_for_role_id(script_execution.farm_role_id)
|
129
|
+
role_servers.each { |server|
|
130
|
+
script_execution.add_server(server.server_id)
|
131
|
+
}
|
132
|
+
else
|
133
|
+
farm_servers = farm.get_all_servers
|
134
|
+
farm_servers.each { |server|
|
135
|
+
script_execution.add_server(server.server_id)
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
# 2. Call logs list and match results to server IDs
|
140
|
+
success = false
|
141
|
+
finished = false
|
142
|
+
begin
|
143
|
+
start = 0
|
144
|
+
begin
|
145
|
+
loglist = farm.load_script_logs(script_execution.server_id, script_execution.event_id, start, 20)
|
146
|
+
total_records = loglist.total_records
|
147
|
+
|
148
|
+
loglist.each { |log|
|
149
|
+
script_execution.set_server_result(log)
|
150
|
+
start += 1
|
151
|
+
}
|
152
|
+
end while start < total_records
|
153
|
+
|
154
|
+
# 3. If not all servers have responses logged, repeat Step 2 until done or timeout_sec seconds have expired
|
155
|
+
success = true
|
156
|
+
finished = true
|
157
|
+
script_execution.server_results.each { |server_id, result|
|
158
|
+
success &&= (!result.nil? && result.exec_exit_code == exit_value)
|
159
|
+
finished &&= !result.nil?
|
160
|
+
}
|
161
|
+
end while !finished && (Time.now.to_i - start_time) < (timeout_sec + sleep_time) && sleep(sleep_time)
|
162
|
+
|
163
|
+
success
|
164
|
+
end
|
101
165
|
end
|
data/lib/rscalr/model/farm.rb
CHANGED
@@ -12,8 +12,40 @@ class Farm
|
|
12
12
|
@farm_roles[name]
|
13
13
|
end
|
14
14
|
|
15
|
+
def get_server(name)
|
16
|
+
if @farm_servers.nil?
|
17
|
+
load_details
|
18
|
+
end
|
19
|
+
@farm_servers[name]
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_servers_for_role_id(farm_role_id)
|
23
|
+
if @farm_roles.nil?
|
24
|
+
load_details
|
25
|
+
end
|
26
|
+
result = []
|
27
|
+
@farm_roles.each { |name,role|
|
28
|
+
result = role.servers.dup if role.farm_role_id == farm_role_id
|
29
|
+
}
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_all_servers
|
34
|
+
if @farm_roles.nil?
|
35
|
+
load_details
|
36
|
+
end
|
37
|
+
result = []
|
38
|
+
@farm_roles.each { |name,role|
|
39
|
+
role.servers.each { |server|
|
40
|
+
result << server
|
41
|
+
}
|
42
|
+
}
|
43
|
+
result
|
44
|
+
end
|
45
|
+
|
15
46
|
def load_details
|
16
47
|
@farm_roles = {}
|
48
|
+
@farm_servers = {}
|
17
49
|
|
18
50
|
scalr_response = @client.farm_get_details @id
|
19
51
|
scalr_response.root.each_element('FarmRoleSet/Item') { |row|
|
@@ -21,9 +53,9 @@ class Farm
|
|
21
53
|
|
22
54
|
row.each_element { |prop|
|
23
55
|
if "ID" == prop.name
|
24
|
-
role.farm_role_id = prop.text
|
56
|
+
role.farm_role_id = prop.text.to_i
|
25
57
|
elsif "RoleID" == prop.name
|
26
|
-
role.role_id = prop.text
|
58
|
+
role.role_id = prop.text.to_i
|
27
59
|
elsif "Name" == prop.name
|
28
60
|
role.name = prop.text
|
29
61
|
elsif "ServerSet" == prop.name
|
@@ -32,21 +64,22 @@ class Farm
|
|
32
64
|
server.role = role
|
33
65
|
|
34
66
|
server_element.each_element { |server_prop|
|
35
|
-
if "ServerID" ==
|
36
|
-
server.server_id =
|
37
|
-
elsif "ExternalIP" ==
|
38
|
-
server.external_ip =
|
39
|
-
elsif "InternalIP" ==
|
40
|
-
server.external_ip =
|
41
|
-
elsif "Status" ==
|
42
|
-
server.status =
|
43
|
-
elsif "Index" ==
|
44
|
-
server.index =
|
45
|
-
elsif "Uptime" ==
|
46
|
-
server.uptime =
|
67
|
+
if "ServerID" == server_prop.name
|
68
|
+
server.server_id = server_prop.text
|
69
|
+
elsif "ExternalIP" == server_prop.name
|
70
|
+
server.external_ip = server_prop.text
|
71
|
+
elsif "InternalIP" == server_prop.name
|
72
|
+
server.external_ip = server_prop.text
|
73
|
+
elsif "Status" == server_prop.name
|
74
|
+
server.status = server_prop.text
|
75
|
+
elsif "Index" == server_prop.name
|
76
|
+
server.index = server_prop.text.to_i
|
77
|
+
elsif "Uptime" == server_prop.name
|
78
|
+
server.uptime = server_prop.text.to_f
|
47
79
|
end
|
48
80
|
}
|
49
81
|
role.servers << server
|
82
|
+
@farm_servers[server.server_id] = server
|
50
83
|
}
|
51
84
|
end
|
52
85
|
}
|
@@ -71,7 +104,7 @@ class Farm
|
|
71
104
|
loglist.limit = element.text.to_i
|
72
105
|
elsif "LogSet" == element.name
|
73
106
|
element.each_element do |item|
|
74
|
-
log =
|
107
|
+
log = ServerLog.new
|
75
108
|
|
76
109
|
item.each_element do |prop|
|
77
110
|
if "ServerID" == prop.name
|
@@ -83,7 +116,48 @@ class Farm
|
|
83
116
|
elsif "Timestamp" == prop.name
|
84
117
|
log.timestamp = prop.text.to_i
|
85
118
|
elsif "Source" == prop.name
|
86
|
-
|
119
|
+
log.source = prop.text
|
120
|
+
end
|
121
|
+
end
|
122
|
+
loglist << log
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
loglist
|
128
|
+
end
|
129
|
+
|
130
|
+
# Loads script execution logs for the farm, or a particular server in the farm, optionally relating to a particular script execution.
|
131
|
+
def load_script_logs(server_id=nil, event_id=nil, start=nil, limit=nil)
|
132
|
+
scalr_response = @client.scripting_logs_list(@id, server_id, event_id, start, limit)
|
133
|
+
loglist = LogList.new
|
134
|
+
|
135
|
+
scalr_response.root.each_element do |element|
|
136
|
+
if "TotalRecords" == element.name
|
137
|
+
loglist.total_records = element.text.to_i
|
138
|
+
elsif "StartFrom" == element.name
|
139
|
+
loglist.start = element.text.to_i
|
140
|
+
elsif "RecordsLimit" == element.name
|
141
|
+
loglist.limit = element.text.to_i
|
142
|
+
elsif "LogSet" == element.name
|
143
|
+
element.each_element do |item|
|
144
|
+
log = ScriptLog.new
|
145
|
+
|
146
|
+
item.each_element do |prop|
|
147
|
+
if "ServerID" == prop.name
|
148
|
+
log.server_id = prop.text
|
149
|
+
elsif "Message" == prop.name
|
150
|
+
log.message = prop.text
|
151
|
+
elsif "ScriptName" == prop.name
|
152
|
+
log.script_name = prop.text
|
153
|
+
elsif "Timestamp" == prop.name
|
154
|
+
log.timestamp = prop.text.to_i
|
155
|
+
elsif "ExecTime" == prop.name
|
156
|
+
log.exec_time = prop.text.to_i
|
157
|
+
elsif "ExecExitCode" == prop.name
|
158
|
+
log.exec_exit_code = prop.text.to_i
|
159
|
+
elsif "Event" == prop.name
|
160
|
+
log.event = prop.text
|
87
161
|
end
|
88
162
|
end
|
89
163
|
loglist << log
|
data/lib/rscalr/model/log.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Log
|
2
|
-
attr_accessor :server_id, :message, :
|
2
|
+
attr_accessor :server_id, :message, :timestamp
|
3
3
|
|
4
4
|
def to_s
|
5
|
-
"{ type: \"log\", server_id: \"#{@server_id}\", message: \"#{@message}\",
|
5
|
+
"{ type: \"log\", server_id: \"#{@server_id}\", message: \"#{@message}\", timestamp: #{@timestamp} }"
|
6
6
|
end
|
7
7
|
end
|
@@ -10,6 +10,12 @@ class LogList
|
|
10
10
|
@logs << log if log.is_a? Log
|
11
11
|
end
|
12
12
|
|
13
|
+
def each
|
14
|
+
@logs.each { |log|
|
15
|
+
yield log
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
13
19
|
def to_s
|
14
20
|
"{ type: \"loglist\", total_records: #{@total_records}, start: \"#{@message}\", limit: #{@severity}, logs: [ #{@logs.each do |log| log.to_s + ',' end} ] }"
|
15
21
|
end
|
data/lib/rscalr/model/script.rb
CHANGED
@@ -9,7 +9,8 @@ class Script
|
|
9
9
|
|
10
10
|
def execute(farm_id, timeout=30, async=:no_async, farm_role_id=nil, server_id=nil, revision=nil, config_vars=nil)
|
11
11
|
set_revision(revision) # Side effect!
|
12
|
-
@client.script_execute farm_id, @id, timeout, async, farm_role_id, server_id, @revision, config_vars
|
12
|
+
api_response = @client.script_execute farm_id, @id, timeout, async, farm_role_id, server_id, @revision, config_vars
|
13
|
+
parse_script_execution_response(api_response, farm_id, farm_role_id, server_id)
|
13
14
|
end
|
14
15
|
|
15
16
|
def load_details
|
@@ -57,6 +58,23 @@ class Script
|
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
61
|
+
def parse_script_execution_response(api_response, farm_id, farm_role_id=nil, server_id=nil)
|
62
|
+
if api_response.success?
|
63
|
+
result = nil
|
64
|
+
event_id = nil
|
65
|
+
api_response.root.each_element { |field|
|
66
|
+
if "TransactionID" == field.name
|
67
|
+
event_id = field.text
|
68
|
+
elsif "Result" == field.name
|
69
|
+
result = field.text.to_i
|
70
|
+
end
|
71
|
+
}
|
72
|
+
ScriptExecution.new(@id, result, event_id, farm_id, farm_role_id, server_id)
|
73
|
+
elsif
|
74
|
+
ScriptExecution.new(@id, 0, nil, farm_id)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
60
78
|
def to_s
|
61
79
|
"{ type: \"script\", id: #{@id}, name: \"#{@name}\" }"
|
62
80
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class ScriptExecution
|
2
|
+
attr_reader :script_id, :result, :event_id, :farm_id, :farm_role_id, :server_id, :server_results
|
3
|
+
|
4
|
+
def initialize(script_id, result, event_id, farm_id, farm_role_id=nil, server_id=nil)
|
5
|
+
@script_id = script_id
|
6
|
+
@result = result
|
7
|
+
@result = 0 if @result != 1
|
8
|
+
@event_id = event_id
|
9
|
+
@farm_id = farm_id
|
10
|
+
@farm_role_id = farm_role_id
|
11
|
+
@server_id = server_id
|
12
|
+
|
13
|
+
# instance field to store execution results
|
14
|
+
@server_results = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def success?
|
18
|
+
@result == 1
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_server(server_id)
|
22
|
+
@server_results[server_id] = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_server_result(log)
|
26
|
+
@server_results[log.server_id] = log if @server_results.has_key?(log.server_id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
"{ type: \"script_execution\", script_id: #{@script_id}, result: #{@result}, event_id: \"#{@event_id}\"}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class ScriptExecutionServerResult
|
35
|
+
attr_accessor :script_id, :server_id, :log
|
36
|
+
|
37
|
+
def initialize(script_id, server_id)
|
38
|
+
@script_id = script_id
|
39
|
+
@server_id = server_id
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
"{ type: \"script_execution_server_result\", script_id: #{@script_id}, server_id: \"#{@server_id}\", result: #{@log} }"
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class ScriptLog < Log
|
2
|
+
attr_accessor :script_name, :exec_time, :exec_exit_code, :event
|
3
|
+
|
4
|
+
def to_s
|
5
|
+
"{ type: \"script_log\", server_id: \"#{@server_id}\", script_name: \"#{@script_name}\", message: \"#{@message}\", timestamp: #{@timestamp}, exec_exit_code: #{@exec_exit_code} }"
|
6
|
+
end
|
7
|
+
end
|
data/lib/rscalr/version.rb
CHANGED
@@ -22,9 +22,7 @@ class TestObjLogs < Test::Unit::TestCase
|
|
22
22
|
|
23
23
|
loglist = farm.load_logs
|
24
24
|
|
25
|
-
assert_not_nil(loglist, "Log list could not be loaded")
|
26
|
-
assert_equal(0, loglist.total_records, "Test farm 1 should not have any logs associated with it")
|
27
|
-
|
25
|
+
assert_not_nil(loglist, "Log list could not be loaded")
|
28
26
|
end
|
29
27
|
|
30
28
|
end
|
metadata
CHANGED
@@ -1,25 +1,28 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rscalr
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.12
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.15
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Nathan Smith
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
date: 2013-03-14 00:00:00 Z
|
14
14
|
dependencies: []
|
15
|
-
|
16
|
-
|
17
|
-
email:
|
15
|
+
|
16
|
+
description: Rscalr is a Ruby implementation of the Scalr API, written to interface cleanly with Chef and other internal release management tasks.
|
17
|
+
email:
|
18
18
|
- nate@branchout.com
|
19
19
|
executables: []
|
20
|
+
|
20
21
|
extensions: []
|
22
|
+
|
21
23
|
extra_rdoc_files: []
|
22
|
-
|
24
|
+
|
25
|
+
files:
|
23
26
|
- .gitignore
|
24
27
|
- README.md
|
25
28
|
- lib/rscalr.rb
|
@@ -32,7 +35,10 @@ files:
|
|
32
35
|
- lib/rscalr/model/log_list.rb
|
33
36
|
- lib/rscalr/model/role.rb
|
34
37
|
- lib/rscalr/model/script.rb
|
38
|
+
- lib/rscalr/model/script_execution.rb
|
39
|
+
- lib/rscalr/model/script_log.rb
|
35
40
|
- lib/rscalr/model/server.rb
|
41
|
+
- lib/rscalr/model/server_log.rb
|
36
42
|
- lib/rscalr/version.rb
|
37
43
|
- rscalr.gemspec
|
38
44
|
- test/test_env_id.rb
|
@@ -40,32 +46,34 @@ files:
|
|
40
46
|
- test_integration/test_client_farms.rb
|
41
47
|
- test_integration/test_obj_environments.rb
|
42
48
|
- test_integration/test_obj_logs.rb
|
43
|
-
has_rdoc: true
|
44
49
|
homepage:
|
45
50
|
licenses: []
|
51
|
+
|
46
52
|
post_install_message:
|
47
53
|
rdoc_options: []
|
48
|
-
|
54
|
+
|
55
|
+
require_paths:
|
49
56
|
- lib
|
50
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
58
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version:
|
56
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
64
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version:
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
62
69
|
requirements: []
|
70
|
+
|
63
71
|
rubyforge_project:
|
64
|
-
rubygems_version: 1.
|
72
|
+
rubygems_version: 1.8.25
|
65
73
|
signing_key:
|
66
74
|
specification_version: 3
|
67
75
|
summary: Ruby implementation of the Scalr API
|
68
|
-
test_files:
|
76
|
+
test_files:
|
69
77
|
- test/test_env_id.rb
|
70
78
|
- test/test_sig.rb
|
71
79
|
- test_integration/test_client_farms.rb
|