rscalr 0.0.1 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,6 @@
1
+ # Global
2
+ **/.DS_Store
3
+
1
4
  *.gem
2
5
  *.rbc
3
6
  .bundle
@@ -16,3 +19,5 @@ tmp
16
19
  .yardoc
17
20
  _yardoc
18
21
  doc/
22
+
23
+
data/README.md CHANGED
@@ -1,4 +1,51 @@
1
- rscalr
1
+ Rscalr
2
2
  ======
3
3
 
4
- Ruby Scalr API implementation
4
+ Ruby Scalr API implementation.
5
+
6
+ Desciption
7
+ ----------
8
+
9
+ Rscalr allows your Ops team to build on top of the Scalr API using Ruby. This is particularly beneficial due to the popularity of Chef, a cloud management software suite also written in Ruby.
10
+
11
+ Rscalr provides both a low-level client implementation, as well as a more user-friendly domain object layer. Here are some brief examples of how to interact with each API mode.
12
+
13
+ Installation
14
+ ------------
15
+
16
+ Rscalr is available on RubyGems so installing it is simply:
17
+
18
+ ```bash
19
+ gem install rscalr
20
+ ```
21
+
22
+ Client Usage
23
+ ------------
24
+
25
+ ```ruby
26
+ require 'rscalr'
27
+ scalr = Scalr.new { :key_id => 'your-key-id', :key_secret => 'your-key-secret' }
28
+ # list all farms
29
+ api_response = scalr.farms_list
30
+ # Response objects exted REXML::Document, so you can work with them easily
31
+ api_repsonse.write($stdout, 1)
32
+ ```
33
+
34
+ Domain Model Usage
35
+ ------------------
36
+
37
+ ```ruby
38
+ require 'rscalr'
39
+ scalr = Scalr.new { :key_id => 'your-key-id', :key_secret => 'your-key-secret' }
40
+ dashboard = Dashboard.new scalr
41
+ farm = dashboard.get_farm 'my-farm-name'
42
+ script = dashboard.get_script 'my-script-name'
43
+ # execute the script on all instances in the farm (see Script.rb for all options)
44
+ script.execute farm.id
45
+ ```
46
+
47
+
48
+ Caveats
49
+ -------
50
+
51
+ This client library is a work in progress and is not yet complete. Feel free to submit pull requests and/or suggestions. I am not an experienced Rubyist, so if you see anything in the source that makes you cringe, by all means let me know!
@@ -22,10 +22,14 @@ class Scalr
22
22
  [[hexdigest].pack("H*")].pack("m0")
23
23
  end
24
24
 
25
+ def generate_timestamp(time)
26
+ time.strftime("%Y-%m-%dT%H:%M:%SZ")
27
+ end
28
+
25
29
  def execute_api_call(action, action_params=nil)
26
30
 
27
31
  begin
28
- params = { :Action => action, :TimeStamp => Time.now.strftime("%Y-%m-%dT%H:%M:%SZ") }
32
+ params = { :Action => action, :TimeStamp => generate_timestamp(Time.now) }
29
33
  params.merge!(action_params) unless action_params.nil?
30
34
 
31
35
  params[:Signature] = generate_sig(action, params[:TimeStamp])
@@ -58,7 +62,7 @@ class Scalr
58
62
  result = ScalrResponse.new "<?xml version='1.0?>"
59
63
  result.add_element("Error")
60
64
  ele = REXML::Element.new "TransactionID"
61
- ele.text = generate_sig(message, Time.now.strftime("%Y-%m-%dT%H:%M:%SZ"))
65
+ ele.text = generate_sig(message, generate_timestamp(Time.now))
62
66
  result.root.elements << ele
63
67
  ele = REXML::Element.new "Message"
64
68
  ele.text = message
@@ -74,10 +78,149 @@ class Scalr
74
78
 
75
79
  #=================== API Section ===================================
76
80
 
81
+ def apache_vhost_create(domain_name, farm_id, farm_role_id, document_root_dir, enable_ssl, ssl_private_key=nil, ssl_certificate=nil)
82
+ params = {
83
+ :DomainName => domain_name,
84
+ :FarmID => farm_id,
85
+ :FarmRoleID => farm_role_id,
86
+ :DocumentRootDir => document_root_dir,
87
+ :EnableSSL => enable_ssl
88
+ }
89
+ params[:SSLPrivateKey] = ssl_private_key unless ssl_private_key.nil?
90
+ params[:SSLCertificate] = ssl_certificate unless ssl_certificate.nil?
91
+
92
+ execute_api_call('ApacheVhostCreate', params)
93
+ end
94
+
95
+ def apache_vhosts_list
96
+ execute_api_call('ApacheVhostsList')
97
+ end
98
+
99
+ def bundle_task_get_status(bundle_task_id)
100
+ params = { :BundleTaskID => bundle_task_id }
101
+
102
+ execute_api_call('BundleTaskGetStatus', params)
103
+ end
104
+
105
+ def dm_application_deploy(application_id, farm_role_id, remote_path)
106
+ params = { :ApplicationID => application_id, :FarmRoleID => farm_role_id, :RemotePath => remote_path }
107
+
108
+ execute_api_call('DmApplicationDeploy', params)
109
+ end
110
+
111
+ def dm_applications_list
112
+ execute_api_call('DmApplicationsList')
113
+ end
114
+
115
+ def dm_sources_list
116
+ execute_api_call('DmSourcesList')
117
+ end
118
+
119
+ def dns_zone_create(domain_name, farm_id=nil, farm_role_id=nil)
120
+ params = { :DomainName => domain_name }
121
+ params[:FarmID] = farm_id unless farm_id.nil?
122
+ params[:FarmRoleID] = farm_role_id unless farm_role_id.nil?
123
+
124
+ execute_api_call('DNSZoneCreate', params)
125
+ end
126
+
127
+ def dns_zone_record_add(zone_name, type, ttl, name, value, priority=nil, weight=nil, port=nil)
128
+ params = {
129
+ :ZoneName => zone_name,
130
+ :Type => type,
131
+ :TTL => ttl,
132
+ :Name => name,
133
+ :Value => value
134
+ }
135
+ params[:Priority] = priority unless priority.nil?
136
+ params[:Weight] = weight unless weight.nil?
137
+ params[:Port] = port unless port.nil?
138
+
139
+ execute_api_call('DNSZoneRecordAdd', params)
140
+ end
141
+
142
+ def dns_zone_record_remove(zone_name, record_id)
143
+ params = { :ZoneName => zone_name, :RecordID => record_id }
144
+
145
+ execute_api_call('DNSZoneRecordRemove', params)
146
+ end
147
+
148
+ def dns_zone_records_list(zone_name)
149
+ params = { :ZoneName => zone_name }
150
+
151
+ execute_api_call('DNSZoneRecordsList', params)
152
+ end
153
+
154
+ def dns_zones_list
155
+ execute_api_call('DNSZonesList')
156
+ end
157
+
158
+ def environments_list
159
+ execute_api_call('EnvironmentsList')
160
+ end
161
+
162
+ def events_list(farm_id, start=nil, limit=nil)
163
+ params = { :FarmID => farm_id }
164
+ params[:StartFrom] = start unless start.nil?
165
+ params[:RecordsLimit] = limit unless limit.nil?
166
+
167
+ execute_api_call('EventsList', params)
168
+ end
169
+
170
+ def farm_clone(farm_id)
171
+ params = { :FarmID => farm_id }
172
+
173
+ execute_api_call('FarmClone', params)
174
+ end
175
+
176
+ def farm_get_stats(farm_id, date)
177
+ params = { :FarmID => farm_id }
178
+ params[:Date] = date.strftime("%m-%Y") unless date.nil?
179
+
180
+ execute_api_call('FarmGetStats', params)
181
+ end
182
+
183
+ def farm_launch(farm_id)
184
+ params = { :FarmID => farm_id }
185
+
186
+ execute_api_call('FarmLaunch', params)
187
+ end
188
+
77
189
  def farms_list
190
+
78
191
  execute_api_call('FarmsList')
79
192
  end
80
193
 
194
+ def farm_terminate(farm_id, keep_ebs, keep_eip, keep_dns_zone)
195
+ params = {
196
+ :FarmID => farm_id,
197
+ :KeepEBS => (keep_ebs ? 1 : 0),
198
+ :KeepEIP => (keep_eip ? 1 : 0),
199
+ :KeepDNSZone => (keep_dns_zone ? 1 : 0)
200
+ }
201
+
202
+ execute_api_call('FarmTerminate', params)
203
+ end
204
+
205
+ def logs_list(farm_id, server_id=nil, start=nil, limit=nil)
206
+ params = { :FarmID => farm_id }
207
+ params[:ServerID] = server_id unless server_id.nil?
208
+ params[:StartFrom] = start unless start.nil?
209
+ params[:RecordsLimit] = limit unless limit.nil?
210
+
211
+ execute_api_call('LogsList', params)
212
+ end
213
+
214
+ def roles_list(platform=nil, name=nil, prefix=nil, image_id=nil)
215
+ params = {}
216
+ params[:Platform] = platform unless platform.nil?
217
+ params[:Name] = name unless name.nil?
218
+ params[:Prefix] = prefix unless prefix.nil?
219
+ params[:ImageID] = image_id unless image_id.nil?
220
+
221
+ execute_api_call('RolesList', params)
222
+ end
223
+
81
224
  def scripts_list
82
225
  execute_api_call('ScriptsList')
83
226
  end
@@ -107,6 +250,32 @@ class Scalr
107
250
  execute_api_call('ScriptGetDetails', { :ScriptID => script_id })
108
251
  end
109
252
 
253
+ def server_image_create(server_id, role_name)
254
+ params = { :ServerID => server_id, :RoleName => role_name }
255
+
256
+ execute_api_call('ServerImageCreate', params)
257
+ end
258
+
259
+ def server_launch(farm_role_id, increase_max_instances=nil)
260
+ params = { :FarmRoleID => farm_role_id }
261
+ params[:IncreaseMaxInstances] = (increase_max_instances ? 1 : 0) unless increase_max_instances.nil?
262
+
263
+ execute_api_call('ServerLaunch', params)
264
+ end
265
+
266
+ def server_reboot(server_id)
267
+ params = { :ServerID => server_id }
268
+
269
+ execute_api_call('ServerReboot', params)
270
+ end
271
+
272
+ def server_terminate(server_id, decrease_min_instances=nil)
273
+ params = { :ServerID => server_id }
274
+ params[:DecreaseMinInstancesSetting] = (decrease_min_instances ? 1 : 0) unless decrease_min_instances.nil?
275
+
276
+ execute_api_call('ServerTerminate', params)
277
+ end
278
+
110
279
  def farm_role_parameters_list(farm_role_id)
111
280
  execute_api_call('FarmRoleParametersList', { :FarmRoleID => farm_role_id })
112
281
  end
@@ -123,6 +292,17 @@ class Scalr
123
292
 
124
293
  execute_api_call('ScriptingLogsList', params)
125
294
  end
295
+
296
+ def statistics_get_graph_url(object_type, object_id, watcher_name, graph_type)
297
+ params = {
298
+ :ObjectType => object_type,
299
+ :ObjectID => object_id,
300
+ :WatcherName => watcher_name,
301
+ :GraphType => graph_type
302
+ }
303
+
304
+ execute_api_call('StatisticsGetGraphURL', params)
305
+ end
126
306
  end
127
307
 
128
308
  class ScalrResponse < REXML::Document
@@ -1,3 +1,3 @@
1
1
  module Rscalr
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.4"
3
3
  end
data/rscalr.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.summary = %q{Ruby implementation of the Scalr API}
11
11
  s.description = %q{Rscalr is a Ruby implementation of the Scalr API, written to interface cleanly with Chef and other internal release management tasks.}
12
12
  s.files = `git ls-files`.split("\n")
13
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
13
+ s.test_files = `git ls-files -- {test,test_integration}/*`.split("\n")
14
14
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
15
  s.require_paths = ["lib"]
16
16
  end
data/test/test_sig.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'rscalr'
2
+ require 'test/unit'
3
+
4
+ class TestSig < Test::Unit::TestCase
5
+
6
+ def test_generate_timestamp
7
+ scalr = Scalr.new({ :key_id => '123', :key_secret => '123abc' })
8
+ time = Time.new(2013, "feb", 3, 22, 36, 01)
9
+ timestamp = scalr.generate_timestamp time
10
+ assert_equal '2013-02-03T22:36:01Z', timestamp
11
+ end
12
+
13
+ def test_generate_sig
14
+ scalr = Scalr.new({ :key_id => '123', :key_secret => '123abc' })
15
+ time = Time.new(2013, "feb", 3, 22, 36, 01)
16
+ timestamp = scalr.generate_timestamp time
17
+ action = 'FarmsList'
18
+ assert_equal 'XBwijDqKLfCuatAG33SreuL1ftA10L5DZqdTf7mmuII=', scalr.generate_sig(action, timestamp)
19
+ end
20
+
21
+ end
@@ -0,0 +1,41 @@
1
+ require 'rscalr'
2
+ require 'test/unit'
3
+
4
+ class TestClientFarms < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @scalr = Scalr.new({ :key_id => ENV['SCALR_TEST_API_KEY'], :key_secret => ENV['SCALR_TEST_API_SECRET'] })
8
+ @farm_test1_name = 'test1'
9
+ end
10
+
11
+ def test_list_launch_details_terminate
12
+ farm_test1_id = nil
13
+
14
+ # List
15
+ api_result = @scalr.farms_list
16
+ assert(api_result.success?, "FarmsList failed with message #{api_result.error_message}")
17
+ api_result.root.each_element('FarmSet/Item') do |ele|
18
+ if ele.elements['Name'].text == @farm_test1_name
19
+ farm_test1_id = ele.elements['ID'].text.to_i
20
+ assert ele.elements['Status'].text == '0', "Test Farm 1 is not currently down! Please stop it manually and rerun tests."
21
+ end
22
+ end
23
+
24
+ assert_not_nil farm_test1_id, "Test Farm 1 not found!"
25
+
26
+ # Launch
27
+ api_result = @scalr.farm_launch farm_test1_id
28
+ assert api_result.success?, "FarmLaunch failed with message #{api_result.error_message}"
29
+
30
+ # GetDetails
31
+ api_result = @scalr.farm_get_details farm_test1_id
32
+ assert api_result.success?, "FarmGetDetails failed with message #{api_result.error_message}"
33
+
34
+ sleep(5)
35
+
36
+ # Terminate
37
+ api_result = @scalr.farm_terminate farm_test1_id, false, false, false
38
+ assert api_result.success?, "FarmTerminate failed with message #{api_result.error_message}"
39
+ end
40
+
41
+ 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.1
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -31,6 +31,8 @@ files:
31
31
  - lib/rscalr/model/server.rb
32
32
  - lib/rscalr/version.rb
33
33
  - rscalr.gemspec
34
+ - test/test_sig.rb
35
+ - test_integration/test_client_farms.rb
34
36
  homepage:
35
37
  licenses: []
36
38
  post_install_message:
@@ -51,8 +53,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
53
  version: '0'
52
54
  requirements: []
53
55
  rubyforge_project:
54
- rubygems_version: 1.8.24
56
+ rubygems_version: 1.8.25
55
57
  signing_key:
56
58
  specification_version: 3
57
59
  summary: Ruby implementation of the Scalr API
58
- test_files: []
60
+ test_files:
61
+ - test/test_sig.rb
62
+ - test_integration/test_client_farms.rb