rightresource 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,18 @@
1
+ commit d849c4772e4a66fff45a794d84832bcfab97cb50
2
+ Author: Satoshi Ohki <roothybrid7@gmail.com>
3
+ Date: Thu Oct 28 16:09:42 2010 +0900
4
+
5
+ modified: resource action methods support, add: new resource support
6
+
7
+ commit 57bc0d37597cee69f30ddba0bc064cb4f4075d49
8
+ Author: Satoshi Ohki <roothybrid7@gmail.com>
9
+ Date: Wed Oct 27 17:47:30 2010 +0900
10
+
11
+ modified: set fileformat
12
+
13
+ commit d57e3180e9d86604c08b3a2cf4b0cb925f2c7b1d
14
+ Author: Satoshi Ohki <roothybrid7@gmail.com>
15
+ Date: Mon Oct 25 15:45:29 2010 +0900
16
+
17
+ bug fix: centos5.4 older ruby version unsupported method
18
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2010 Satoshi Ohki
2
+ (The MIT License)
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ 'Software'), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
data/README.rdoc ADDED
@@ -0,0 +1,16 @@
1
+ = RightScale Resource API wrapper
2
+
3
+ == Lisence
4
+ Author:: Satoshi Ohki <_roothybrid7_@_gmail.com_>
5
+ Copyright:: Copyright (c) 2010 Satoshi Ohki
6
+ License:: The MIT License
7
+
8
+ == Require packages
9
+ json
10
+ rest_client
11
+ crack
12
+
13
+ == install
14
+ sudo gem install json rest-client crack
15
+
16
+ == example
@@ -0,0 +1,7 @@
1
+ class AlertSpec < RightResource::Base
2
+ class << self
3
+ def alert_specs_subject(id, params={})
4
+ connection.post(element_path(id, :alert_specs_subject, params))
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,319 @@
1
+ module RightResource
2
+ class Base
3
+ class << self # Define singleton methods
4
+ def logger=(logger)
5
+ @logger = logger
6
+ end
7
+
8
+ def logger
9
+ @logger ||= Logger.new(STDERR)
10
+ end
11
+
12
+ # Set RESTFul client with login authentication for HTTP Methods(Low level)
13
+ # === Examples
14
+ # conn = Connection.new do |c|
15
+ # c.login(:username => "user", :password => "pass", :account => "1")
16
+ # end
17
+ # Server.connection = conn
18
+ def connection=(conn)
19
+ @connection = conn
20
+ end
21
+
22
+ # Get RESTFul client for HTTP Methods(Low level)
23
+ # and use in resource api call
24
+ # === Examples
25
+ # conn = Server.connection
26
+ # conn.get("servers?filter=nickname=server1")
27
+ #
28
+ # ex. resource api call:
29
+ # Server.index
30
+ def connection
31
+ if defined?(@connection) || superclass == Object
32
+ raise ArgumentError, "Not set connection object!!" unless @connection
33
+ @connection
34
+ else
35
+ superclass.connection
36
+ end
37
+ end
38
+
39
+ # Get request and response format type object
40
+ def format
41
+ connection.format || RightResource::Formats::JsonFormat
42
+ end
43
+
44
+ # Get response headers via RESTFul client
45
+ def headers
46
+ connection.headers || {}
47
+ end
48
+
49
+ # Get response status code
50
+ def status
51
+ connection.status || nil
52
+ end
53
+
54
+ # Get resource id in response location header via RESTFul client(create only?)
55
+ def resource_id
56
+ connection.resource_id || nil
57
+ end
58
+
59
+ # Get resources by index method
60
+ # same resources support criteria like filtering.
61
+ #
62
+ # === Params
63
+ # params:: criteria[ex. :filter => "nickname=hoge"](Hash)
64
+ # === Return
65
+ # Resource list(Array)
66
+ #
67
+ # === Examples
68
+ # dep = Deployment.index(:filter => ["nickname=payment-dev", "nickname=payment-staging"])
69
+ #
70
+ # test = Server.index(:filter => "nickname<>test")
71
+ #
72
+ # Criteria unsupport
73
+ # array = ServerArray.index
74
+ #
75
+ # Get first 5 resources
76
+ # server = Server.index.first(5) # see Array class
77
+ # Get last resource
78
+ # server = Server.index.last # see Array class
79
+ #
80
+ # Get all operational server's nickname
81
+ # Server.index.each do |server|
82
+ # puts server.nickname if server.state = "operational"
83
+ # end
84
+ def index(params = {})
85
+ path = "#{resource_name}s.#{format.extension}#{query_string(params)}"
86
+ connection.clear
87
+ instantiate_collection(format.decode(connection.get(path || [])))
88
+ rescue RestClient::ResourceNotFound
89
+ nil
90
+ rescue => e
91
+ logger.error("#{e.class}: #{e.pretty_inspect}")
92
+ logger.debug {"Backtrace:\n#{e.backtrace.pretty_inspect}"}
93
+ ensure
94
+ logger.debug {"#{__FILE__} #{__LINE__}: #{self.class}\n#{self.pretty_inspect}\n"}
95
+ end
96
+
97
+ # Get resource
98
+ # === Params
99
+ # params:: Query Strings(Hash)
100
+ # === Return
101
+ # Resource(Object)
102
+ #
103
+ # === Example
104
+ # server_id = 1
105
+ # Server.show(server_id) #=> #<Server:0x1234...>
106
+ #
107
+ # Get deployment resource with server's subresource
108
+ # Deployment.show(1, :params => {:server_settings => "true"}) #=> #<Deployment:0x12314...>
109
+ def show(id, params = {})
110
+ path = element_path(id, nil, params)
111
+ connection.clear
112
+ instantiate_record(format.decode(connection.get(path)))
113
+ rescue RestClient::ResourceNotFound
114
+ nil
115
+ rescue => e
116
+ logger.error("#{e.class}: #{e.pretty_inspect}")
117
+ logger.debug {"Backtrace:\n#{e.backtrace.pretty_inspect}"}
118
+ ensure
119
+ logger.debug {"#{__FILE__} #{__LINE__}: #{self.class}\n#{self.pretty_inspect}\n"}
120
+ end
121
+
122
+ # Create new resource
123
+ # Example:
124
+ # params = {
125
+ # :nickname => "dev",
126
+ # :deployment_href => "https://my.rightscale.com/api/acct/22329/deployments/59855",
127
+ # :server_template_href => "https://my.rightscale.com/api/acct/22329/server_templates/76610",
128
+ # :ec2_availability_zone => "ap-northeast-1a"
129
+ # }
130
+ # Server.create(params)
131
+ def create(params={})
132
+ #TODO: refactor
133
+ self.new(params).tap do |resource|
134
+ resource.save
135
+ end
136
+ # path = collection_path
137
+ # connection.post(path, params)
138
+ end
139
+
140
+ # Update resource
141
+ def update(id, params={})
142
+ #TODO: refactor
143
+ path = element_path(id)
144
+ connection.put(path, params)
145
+ end
146
+
147
+ # Delete resource
148
+ # Example:
149
+ # Server.destory(1)
150
+ #
151
+ # server = Server.index(:filter => "aws_id=i-012345")
152
+ # Server.destory(server.id)
153
+ def destory(id)
154
+ path = element_path(id)
155
+ connection.delete(path)
156
+ end
157
+
158
+ # Get single resource
159
+ def element_path(id, prefix_options = nil, query_options = nil)
160
+ "#{resource_name}s/#{id}#{prefix(prefix_options)}.#{format.extension}#{query_string(query_options)}"
161
+ end
162
+
163
+ # Get resource collections
164
+ def collection_path(prefix_options = nil, query_options = nil)
165
+ "#{resource_name}s#{prefix(prefix_options)}.#{format.extension}#{query_string(query_options)}"
166
+ end
167
+
168
+ # Get resource name(equals plural of classname)
169
+ def resource_name
170
+ name = ""
171
+ self.name.to_s.split(/::/).last.scan(/([A-Z][^A-Z]*)/).flatten.each_with_index do |str,i|
172
+ if i > 0
173
+ name << "_#{str.downcase}"
174
+ else
175
+ name << str.downcase
176
+ end
177
+ end
178
+ name
179
+ end
180
+
181
+ def generate_attributes(attributes)
182
+ raise ArgumentError, "expected an attributes Hash, got #{attributes.pretty_inspect}" unless attributes.is_a?(Hash)
183
+ attrs = {}
184
+ attributes.each_pair {|key,value| attrs[key.to_s.gsub('-', '_').to_sym] = value}
185
+ attrs
186
+ end
187
+
188
+ protected
189
+ def prefix(options = nil)
190
+ default = ""
191
+ unless options.nil?
192
+ if options.is_a?(String) || options.is_a?(Symbol)
193
+ default = "/#{options}"
194
+ elsif options.is_a?(Hash)
195
+ options.each_pair do |key,value|
196
+ if value.nil? || value.empty?
197
+ default << "/#{key}"
198
+ else
199
+ default << "/#{key}/#{value}"
200
+ end
201
+ end
202
+ else
203
+ raise ArgumentError, "expected an Hash, String or Symbol, got #{options.pretty_inspect}"
204
+ end
205
+ end
206
+ default
207
+ end
208
+
209
+ # create querystring by crack to_params method
210
+ def query_string(options = {})
211
+ !options.is_a?(Hash) || options.empty? ? "" : '?' + options.to_params
212
+ end
213
+
214
+ # Get resource collection
215
+ def instantiate_collection(collection)
216
+ collection.collect! {|record| instantiate_record(record)}
217
+ end
218
+
219
+ # Get a resource and create object
220
+ def instantiate_record(record)
221
+ self.new(record)
222
+ end
223
+ end
224
+
225
+ def initialize(attributes={})
226
+ # sub-resource4json's key name contains '-'
227
+ # attrs = generate_attributes(attributes)
228
+ @attributes = {}
229
+ loads(attributes)
230
+ if @attributes
231
+ if self.class.resource_id.nil?
232
+ @id = @attributes[:href].match(/\d+$/).to_s if @attributes[:href]
233
+ else
234
+ @id = self.class.resource_id
235
+ end
236
+ load_accessor(@attributes)
237
+ end
238
+ yield self if block_given?
239
+ end
240
+ attr_accessor :id
241
+ attr_reader :attributes
242
+
243
+ def loads(attributes)
244
+ raise ArgumentError, "expected an attributes Hash, got #{attributes.pretty_inspect}" unless attributes.is_a?(Hash)
245
+ attributes.each_pair {|key,value| @attributes[key.to_s.gsub('-', '_').to_sym] = value}
246
+ self
247
+ end
248
+
249
+ def update_attributes(attributes)
250
+ loads(attributes) && load_accessor(attributes) && save
251
+ end
252
+
253
+ def load_accessor(attributes)
254
+ raise ArgumentError, "expected an attributes Hash, got #{attributes.pretty_inspect}" unless attributes.is_a?(Hash)
255
+ attributes.each_pair do |key, value|
256
+ instance_variable_set("@#{key}", value) # Initialize instance variables
257
+ self.class.class_eval do
258
+ define_method("#{key}=") do |new_value| # ex. obj.key = new_value
259
+ instance_variable_set("@#{key}", new_value)
260
+ end
261
+ define_method(key) do
262
+ instance_variable_get("@#{key}")
263
+ end
264
+ end
265
+ end
266
+ end
267
+
268
+ def new?
269
+ id.nil?
270
+ end
271
+ alias :new_record? :new?
272
+
273
+ def save
274
+ new? ? create : update
275
+ end
276
+
277
+ def destory
278
+ connection.delete(element_path)
279
+ end
280
+
281
+ protected
282
+ def connection
283
+ self.class.connection
284
+ end
285
+
286
+ def update
287
+ #TODO: refactor hard coding
288
+ attrs = self.attributes.reject {|key,value| key.to_s == "cloud_id"}
289
+ pair = URI.decode({resource_name.to_sym => attrs}.to_params).split('&').map {|l| l.split('=')}
290
+ headers = Hash[*pair.flatten]
291
+ headers["cloud_id"] = self.attributes[:cloud_id] if self.attributes.has_key?(:cloud_id)
292
+ connection.put(element_path, headers)
293
+ end
294
+
295
+ def create
296
+ #TODO: refactor hard coding
297
+ attrs = self.attributes.reject {|key,value| key.to_s == "cloud_id"}
298
+ puts attrs.pretty_inspect
299
+ pair = URI.decode({resource_name.to_sym => attrs}.to_params).split('&').map {|l| l.split('=')}
300
+ headers = Hash[*pair.flatten]
301
+ headers["cloud_id"] = self.attributes[:cloud_id] if self.attributes.has_key?(:cloud_id)
302
+ puts headers.pretty_inspect
303
+ connection.post(collection_path, headers)
304
+ self.id = self.class.resource_id
305
+ end
306
+
307
+ def resource_name
308
+ self.class.resource_name
309
+ end
310
+
311
+ def element_path(prefix_options=nil, query_options=nil)
312
+ self.class.element_path(self.id, prefix_options, query_options)
313
+ end
314
+
315
+ def collection_path(prefix_options=nil, query_options=nil)
316
+ self.class.collection_path(prefix_options, query_options)
317
+ end
318
+ end
319
+ end
@@ -0,0 +1,90 @@
1
+ module RightResource
2
+ class Connection
3
+ @reraise = false
4
+ RestClient.log = STDERR
5
+
6
+ attr_accessor :api_version, :log, :api, :format, :username, :password, :account, :reraise
7
+ attr_reader :headers, :resource_id, :response, :status
8
+
9
+ # Set RestFul Client Parameters
10
+ def initialize(params={})
11
+ @api_version = API_VERSION
12
+ @api = "https://my.rightscale.com/api/acct/"
13
+ @format = params[:format] || RightResource::Formats::JsonFormat
14
+ @logger = params[:logger] || Logger.new(STDERR)
15
+ yield self if block_given? # RightResource::Connection.new {|conn| ...}
16
+ end
17
+
18
+ def login(params={})
19
+ @username = params[:username] unless params[:username].nil? || params[:username].empty?
20
+ @password = params[:password] unless params[:password].nil? || params[:password].empty?
21
+ @account = params[:account] unless params[:account].nil? || params[:account].empty?
22
+ @api_object = RestClient::Resource.new("#{@api}#{@account}", @username, @password)
23
+ rescue => e
24
+ @logger.error("#{e.class}: #{e.pretty_inspect}")
25
+ @logger.debug {"Backtrace:\n#{e.backtrace.pretty_inspect}"}
26
+ raise if self.reraise
27
+ ensure
28
+ @logger.debug {"#{__FILE__} #{__LINE__}: #{self.class}\n#{self.pretty_inspect}\n"}
29
+ end
30
+
31
+ def login?
32
+ @api_object ? true : false
33
+ end
34
+
35
+ def request(path, method="get", headers={})
36
+ raise "Not Login!!" unless self.login?
37
+ # if /(.xml|.js)/ =~ path
38
+ # path = URI.encode(path)
39
+ # elsif /\?(.*)$/ =~ path
40
+ # path = URI.encode("#{path}&format=#{@format.extension}")
41
+ # else
42
+ # path = URI.encode("#{path}?format=#{@format.extension}")
43
+ # end
44
+ unless method.match(/(get|put|post|delete)/)
45
+ raise "Invalid Action: get|put|post|delete only"
46
+ end
47
+ api_version = {:x_api_version => @api_version, :api_version => @api_version}
48
+
49
+ @response = @api_object[path].send(method.to_sym, api_version.merge(headers))
50
+ @status = @response.code
51
+ @headers = @response.headers
52
+ @resource_id = @headers[:location].match(/\d+$/).to_s unless @headers[:location].nil?
53
+ @response.body
54
+ rescue => e
55
+ @status = e.http_code
56
+ @logger.error("#{e.class}: #{e.pretty_inspect}")
57
+ @logger.debug {"Backtrace:\n#{e.backtrace.pretty_inspect}"}
58
+ raise if self.reraise
59
+ ensure
60
+ @logger.debug {"#{__FILE__} #{__LINE__}: #{self.class}\n#{self.pretty_inspect}\n"}
61
+ end
62
+
63
+ def clear
64
+ @response = @headers = @resource_id = @status = nil
65
+ ensure
66
+ @logger.debug {"#{__FILE__} #{__LINE__}: #{self.class}\n#{self.pretty_inspect}\n"}
67
+ end
68
+
69
+ # HTTP methods
70
+ # show|index
71
+ def get(path, headers={})
72
+ self.request(path, "get", headers)
73
+ end
74
+
75
+ # create
76
+ def post(path, headers={})
77
+ self.request(path, "post", headers)
78
+ end
79
+
80
+ # update
81
+ def put(path, headers={})
82
+ self.request(path, "put", headers)
83
+ end
84
+
85
+ # destory
86
+ def delete(path, headers={})
87
+ self.request(path, "delete", headers)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,7 @@
1
+ # Ruby version < 1.9
2
+ class Object
3
+ def tap
4
+ yield self
5
+ self
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ if RUBY_VERSION < "1.9.0"
2
+ require 'right_resource/core_ext/object/tap.rb'
3
+ end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/core_ext/*.rb"].sort.each do |path|
2
+ require "right_resource/core_ext/#{File.basename(path, '.rb')}"
3
+ end
@@ -0,0 +1 @@
1
+ class Credential < RightResource::Base; end
@@ -0,0 +1,15 @@
1
+ class Deployment < RightResource::Base
2
+ class << self
3
+ def start_all(id)
4
+ connection.post(element_path(id, :start_all))
5
+ end
6
+
7
+ def stop_all(id)
8
+ connection.post(element_path(id, :stop_all))
9
+ end
10
+
11
+ def duplicate(id)
12
+ connection.post(element_path(id, :duplicate))
13
+ end
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+ class Ec2EbsSnapshot < RightResource::Base; end
@@ -0,0 +1,8 @@
1
+ class Ec2EbsVolume < RightResource::Base
2
+ class << self
3
+ def attach_to_server
4
+ name = "component_ec2_ebs_volumes"
5
+ raise NotImplementedError
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class Ec2ElasticIp < RightResource::Base
2
+ class << self
3
+ def update(id)
4
+ raise NotImplementedError
5
+ end
6
+ end
7
+
8
+ def update
9
+ raise NotImplementedError
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class Ec2SecurityGroup < RightResource::Base
2
+ class << self
3
+ def index(id)
4
+ raise NotImplementedError
5
+ end
6
+
7
+ def update(id)
8
+ raise NotImplementedError
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ class Ec2SshKey < RightResource::Base
2
+ class << self
3
+ def index(id)
4
+ raise NotImplementedError
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,26 @@
1
+ require 'json/pure'
2
+
3
+ module RightResource
4
+ module Formats
5
+ module JsonFormat
6
+ extend self
7
+
8
+ def extension
9
+ "js"
10
+ end
11
+
12
+ def mime_type
13
+ "application/json"
14
+ end
15
+
16
+ def encode(hash)
17
+ JSON.generate(hash)
18
+ end
19
+
20
+ def decode(json)
21
+ JSON.parse(json)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,26 @@
1
+ require 'crack/xml'
2
+
3
+ module RightResource
4
+ module Formats
5
+ module XmlFormat
6
+ extend self
7
+
8
+ def extension
9
+ "xml"
10
+ end
11
+
12
+ def mime_type
13
+ "application/xml"
14
+ end
15
+
16
+ def encode(hash)
17
+ raise NotImplementedError, "Not Implementated function #{self.class.name}::#{__method__.to_s}"
18
+ end
19
+
20
+ def decode(json)
21
+ Crack::XML.parse(json)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,7 @@
1
+ module RightResource
2
+ module Formats
3
+ autoload :XmlFormat, 'right_resource/formats/xml_format'
4
+ autoload :JsonFormat, 'right_resource/formats/json_format'
5
+ end
6
+ end
7
+
@@ -0,0 +1 @@
1
+ class Macro < RightResource::Base; end
@@ -0,0 +1,27 @@
1
+ class MultiCloudImage < RightResource::Base
2
+ class << self
3
+ def create
4
+ raise NotImplementedError
5
+ end
6
+
7
+ def update(id)
8
+ raise NotImplementedError
9
+ end
10
+
11
+ def destory(id)
12
+ raise NotImplementedError
13
+ end
14
+ end
15
+
16
+ def create
17
+ raise NotImplementedError
18
+ end
19
+
20
+ def update(id)
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def destory(id)
25
+ raise NotImplementedError
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ class RightScript < RightResource::Base
2
+ class << self
3
+ def create
4
+ raise NotImplementedError
5
+ end
6
+
7
+ def update(id)
8
+ raise NotImplementedError
9
+ end
10
+
11
+ def destory(id)
12
+ raise NotImplementedError
13
+ end
14
+ end
15
+
16
+ def create
17
+ raise NotImplementedError
18
+ end
19
+
20
+ def update(id)
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def destory(id)
25
+ raise NotImplementedError
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ class S3Bucket < RightResource::Base
2
+ class << self
3
+ def update(id)
4
+ raise NotImplementedError
5
+ end
6
+ end
7
+
8
+ def update
9
+ raise NotImplementedError
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ class Server < RightResource::Base
2
+ class << self
3
+ def action; end
4
+ def start(id)
5
+ connection.post(element_path(id, :start))
6
+ end
7
+
8
+ def stop(id)
9
+ connection.post(element_path(id, :stop))
10
+ end
11
+
12
+ def reboot(id)
13
+ connection.post(element_path(id, :reboot))
14
+ end
15
+
16
+ # Run rightscript
17
+ # location header is status href
18
+ def run_script(id, params={})
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def attach_volume(id, params={})
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def get_sketchy_data(id, params={})
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def settings(id)
31
+ path = element_path(id, :settings)
32
+ format.decode(connection.get(path))
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ class ServerArray < RightResource::Base
2
+ class << self
3
+ def launch(id)
4
+ connection.post(element_path(id, :launch))
5
+ end
6
+
7
+ def terminate_all(id)
8
+ connection.post(element_path(id, :terminate_all))
9
+ end
10
+
11
+ def run_script_on_all(id)
12
+ raise NotImplementedError
13
+ end
14
+
15
+ def instances(id)
16
+ path = element_path(id, :instances)
17
+ format.decode(connection.get(path))
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ class ServerTemplate < RightResource::Base
2
+ class << self
3
+ def executables(id, params={})
4
+ path = element_path(id, :executables, params)
5
+ instantiate_collection(format.decode(connection.get(path)))
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,31 @@
1
+ class Status < RightResource::Base
2
+ class << self
3
+ def index(id)
4
+ raise NotImplementedError
5
+ end
6
+
7
+ def create
8
+ raise NotImplementedError
9
+ end
10
+
11
+ def update(id)
12
+ raise NotImplementedError
13
+ end
14
+
15
+ def destory(id)
16
+ raise NotImplementedError
17
+ end
18
+ end
19
+
20
+ def create
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def update(id)
25
+ raise NotImplementedError
26
+ end
27
+
28
+ def destory(id)
29
+ raise NotImplementedError
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ require 'uri'
2
+ require 'rexml/document'
3
+ require 'logger'
4
+ require 'rubygems'
5
+
6
+ require 'json/pure'
7
+ require 'rest_client'
8
+ require 'crack'
9
+
10
+ $:.unshift(File.dirname(__FILE__))
11
+ # Ruby core extensions
12
+ require 'right_resource/core_ext'
13
+ # base class
14
+ require 'right_resource/connection'
15
+ require 'right_resource/base'
16
+ require 'right_resource/formats'
17
+ # Management API
18
+ require 'right_resource/deployment'
19
+ #require 'right_resource/status'
20
+ require 'right_resource/alert_spec'
21
+ require 'right_resource/server'
22
+ require 'right_resource/ec2_ebs_volume'
23
+ require 'right_resource/ec2_elastic_ip'
24
+ require 'right_resource/ec2_security_group'
25
+ require 'right_resource/ec2_ssh_key'
26
+ require 'right_resource/server_array'
27
+ require 'right_resource/ec2_ebs_snapshot'
28
+ require 'right_resource/s3_bucket'
29
+ #require 'right_resource/tag'
30
+ # Design API
31
+ require 'right_resource/server_template'
32
+ require 'right_resource/right_script'
33
+ require 'right_resource/multi_cloud_image'
34
+ require 'right_resource/macro'
35
+ require 'right_resource/credential'
36
+
37
+ module RightResource
38
+ API_VERSION = "1.0".freeze
39
+ end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rightresource
3
+ version: !ruby/object:Gem::Version
4
+ hash: 11
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 8
10
+ version: 0.1.8
11
+ platform: ruby
12
+ authors:
13
+ - Satoshi Ohki
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-08 00:00:00 +09:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: json
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rest-client
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: crack
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ description: |
64
+ RightScale Resource API wrapper.
65
+
66
+ email: roothybrid7@gmail.com
67
+ executables: []
68
+
69
+ extensions: []
70
+
71
+ extra_rdoc_files: []
72
+
73
+ files:
74
+ - CHANGELOG
75
+ - README.rdoc
76
+ - LICENSE
77
+ - lib/right_resource/alert_spec.rb
78
+ - lib/right_resource/base.rb
79
+ - lib/right_resource/connection.rb
80
+ - lib/right_resource/core_ext/object/tap.rb
81
+ - lib/right_resource/core_ext/object.rb
82
+ - lib/right_resource/core_ext.rb
83
+ - lib/right_resource/credential.rb
84
+ - lib/right_resource/deployment.rb
85
+ - lib/right_resource/ec2_ebs_snapshot.rb
86
+ - lib/right_resource/ec2_ebs_volume.rb
87
+ - lib/right_resource/ec2_elastic_ip.rb
88
+ - lib/right_resource/ec2_security_group.rb
89
+ - lib/right_resource/ec2_ssh_key.rb
90
+ - lib/right_resource/formats/json_format.rb
91
+ - lib/right_resource/formats/xml_format.rb
92
+ - lib/right_resource/formats.rb
93
+ - lib/right_resource/macro.rb
94
+ - lib/right_resource/multi_cloud_image.rb
95
+ - lib/right_resource/right_script.rb
96
+ - lib/right_resource/s3_bucket.rb
97
+ - lib/right_resource/server.rb
98
+ - lib/right_resource/server_array.rb
99
+ - lib/right_resource/server_template.rb
100
+ - lib/right_resource/status.rb
101
+ - lib/right_resource.rb
102
+ has_rdoc: true
103
+ homepage: https://github.com/satsv/rightresource
104
+ licenses: []
105
+
106
+ post_install_message:
107
+ rdoc_options: []
108
+
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ hash: 61
117
+ segments:
118
+ - 1
119
+ - 8
120
+ - 5
121
+ version: 1.8.5
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ requirements:
132
+ - none
133
+ rubyforge_project:
134
+ rubygems_version: 1.3.7
135
+ signing_key:
136
+ specification_version: 3
137
+ summary: "RightResource: RightScale Resource API wrapper"
138
+ test_files: []
139
+