rest_connection 0.0.23 → 0.1.0
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/README.rdoc +3 -3
- data/Rakefile +5 -4
- data/VERSION +1 -1
- data/git_hooks/post-commit.disabled +4 -0
- data/git_hooks/post-merge.disabled +4 -0
- data/git_hooks/pre-commit +53 -0
- data/lib/rest_connection.rb +75 -12
- data/lib/rest_connection/patches.rb +106 -0
- data/lib/rest_connection/rightscale/account.rb +27 -0
- data/lib/rest_connection/rightscale/alert_spec.rb +2 -2
- data/lib/rest_connection/rightscale/audit_entry.rb +5 -5
- data/lib/rest_connection/rightscale/child_account.rb +27 -0
- data/lib/rest_connection/rightscale/cloud.rb +26 -0
- data/lib/rest_connection/rightscale/credential.rb +1 -1
- data/lib/rest_connection/rightscale/deployment.rb +33 -7
- data/lib/rest_connection/rightscale/ec2_ebs_snapshot.rb +3 -1
- data/lib/rest_connection/rightscale/ec2_ebs_volume.rb +3 -1
- data/lib/rest_connection/rightscale/ec2_elastic_ip.rb +1 -1
- data/lib/rest_connection/rightscale/ec2_security_group.rb +2 -2
- data/lib/rest_connection/rightscale/ec2_server_array.rb +7 -5
- data/lib/rest_connection/rightscale/ec2_ssh_key.rb +11 -2
- data/lib/rest_connection/rightscale/ec2_ssh_key_internal.rb +2 -2
- data/lib/rest_connection/rightscale/executable.rb +4 -4
- data/lib/rest_connection/rightscale/instance.rb +5 -3
- data/lib/rest_connection/rightscale/instance_type.rb +31 -0
- data/lib/rest_connection/rightscale/macro.rb +19 -0
- data/lib/rest_connection/rightscale/mc_datacenter.rb +53 -0
- data/lib/rest_connection/rightscale/mc_deployment.rb +60 -0
- data/lib/rest_connection/rightscale/mc_image.rb +42 -0
- data/lib/rest_connection/rightscale/mc_instance.rb +170 -0
- data/lib/rest_connection/rightscale/mc_instance_type.rb +47 -0
- data/lib/rest_connection/rightscale/mc_multi_cloud_image.rb +58 -0
- data/lib/rest_connection/rightscale/mc_multi_cloud_image_setting.rb +46 -0
- data/lib/rest_connection/rightscale/mc_security_group.rb +42 -0
- data/lib/rest_connection/rightscale/mc_server.rb +250 -6
- data/lib/rest_connection/rightscale/mc_server_array.rb +44 -0
- data/lib/rest_connection/rightscale/mc_server_template.rb +53 -0
- data/lib/rest_connection/rightscale/mc_ssh_key.rb +50 -0
- data/lib/rest_connection/rightscale/mc_tag.rb +69 -0
- data/lib/rest_connection/rightscale/mc_volume.rb +53 -0
- data/lib/rest_connection/rightscale/mc_volume_attachment.rb +48 -0
- data/lib/rest_connection/rightscale/mc_volume_snapshot.rb +55 -0
- data/lib/rest_connection/rightscale/mc_volume_type.rb +47 -0
- data/lib/rest_connection/rightscale/monitoring_metric.rb +35 -0
- data/lib/rest_connection/rightscale/multi_cloud_image.rb +16 -2
- data/lib/rest_connection/rightscale/multi_cloud_image_cloud_setting_internal.rb +2 -2
- data/lib/rest_connection/rightscale/multi_cloud_image_internal.rb +25 -1
- data/lib/rest_connection/rightscale/permission.rb +27 -0
- data/lib/rest_connection/rightscale/right_script.rb +4 -4
- data/lib/rest_connection/rightscale/right_script_internal.rb +4 -4
- data/lib/rest_connection/rightscale/rightscale_api_base.rb +69 -20
- data/lib/rest_connection/rightscale/rightscale_api_gateway.rb +198 -13
- data/lib/rest_connection/rightscale/rightscale_api_internal.rb +3 -3
- data/lib/rest_connection/rightscale/rightscale_api_mc_input.rb +32 -0
- data/lib/rest_connection/rightscale/rightscale_api_mc_taggable.rb +57 -0
- data/lib/rest_connection/rightscale/rightscale_api_resources.rb +32 -2
- data/lib/rest_connection/rightscale/rightscale_api_taggable.rb +116 -0
- data/lib/rest_connection/rightscale/rs_internal.rb +6 -6
- data/lib/rest_connection/rightscale/s3_bucket.rb +36 -0
- data/lib/rest_connection/rightscale/server.rb +186 -37
- data/lib/rest_connection/rightscale/server_interface.rb +264 -0
- data/lib/rest_connection/rightscale/server_internal.rb +3 -3
- data/lib/rest_connection/rightscale/server_template.rb +15 -4
- data/lib/rest_connection/rightscale/server_template_internal.rb +4 -4
- data/lib/rest_connection/rightscale/status.rb +2 -2
- data/lib/rest_connection/rightscale/tag.rb +2 -2
- data/lib/rest_connection/rightscale/task.rb +47 -0
- data/lib/rest_connection/rightscale/user.rb +27 -0
- data/lib/rest_connection/ssh_hax.rb +42 -40
- data/rest_connection.gemspec +5 -5
- data/spec/mcserver_spec.rb +17 -0
- data/spec/multi.rb +16 -0
- metadata +65 -12
@@ -1,4 +1,4 @@
|
|
1
|
-
# This file is part of RestConnection
|
1
|
+
# This file is part of RestConnection
|
2
2
|
#
|
3
3
|
# RestConnection is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -13,7 +13,21 @@
|
|
13
13
|
# You should have received a copy of the GNU General Public License
|
14
14
|
# along with RestConnection. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
class MultiCloudImage
|
16
|
+
class MultiCloudImage
|
17
17
|
include RightScale::Api::Base
|
18
18
|
extend RightScale::Api::BaseExtend
|
19
|
+
|
20
|
+
def supported_cloud_ids
|
21
|
+
@params["multi_cloud_image_cloud_settings"].map { |mcics| mcics.cloud_id }
|
22
|
+
end
|
23
|
+
|
24
|
+
# You must have access to multiple APIs for this (0.1, and 1.5)
|
25
|
+
def find_and_flatten_settings()
|
26
|
+
some_settings = McMultiCloudImage.find(rs_id.to_i).get_settings
|
27
|
+
internal = MultiCloudImageInternal.new("href" => self.href)
|
28
|
+
internal.reload
|
29
|
+
more_settings = internal.settings
|
30
|
+
@params["multi_cloud_image_cloud_settings"] = some_settings + more_settings
|
31
|
+
end
|
32
|
+
|
19
33
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# This file is part of RestConnection
|
1
|
+
# This file is part of RestConnection
|
2
2
|
#
|
3
3
|
# RestConnection is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -40,5 +40,5 @@ class MultiCloudImageCloudSettingInternal
|
|
40
40
|
location = connection.post(self.resource_plural_name, self.resource_singular_name.to_sym => opts)
|
41
41
|
newrecord = self.new('href' => location)
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# This file is part of RestConnection
|
1
|
+
# This file is part of RestConnection
|
2
2
|
#
|
3
3
|
# RestConnection is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -45,4 +45,28 @@ class MultiCloudImageInternal
|
|
45
45
|
MultiCloudImage.new(:href => connection.post(t.path + "/clone"))
|
46
46
|
end
|
47
47
|
|
48
|
+
def transform_settings
|
49
|
+
if @params["multi_cloud_image_cloud_settings"] && @params["multi_cloud_image_cloud_settings"].first.is_a?(Hash)
|
50
|
+
@params["multi_cloud_image_cloud_settings"].map! { |setting|
|
51
|
+
# Have to reject because API0.1 returns all clouds
|
52
|
+
next if setting["fingerprint"] || setting["cloud_id"] > 10
|
53
|
+
MultiCloudImageCloudSettingInternal.new(setting)
|
54
|
+
}
|
55
|
+
@params["multi_cloud_image_cloud_settings"].compact!
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def initialize(params={})
|
60
|
+
@params = params
|
61
|
+
transform_settings
|
62
|
+
end
|
63
|
+
|
64
|
+
def settings
|
65
|
+
transform_settings
|
66
|
+
@params["multi_cloud_image_cloud_settings"]
|
67
|
+
end
|
68
|
+
|
69
|
+
def supported_cloud_ids
|
70
|
+
@params["multi_cloud_image_cloud_settings"].map { |mcics| mcics.cloud_id }
|
71
|
+
end
|
48
72
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# This file is part of RestConnection
|
2
|
+
#
|
3
|
+
# RestConnection is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# RestConnection is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with RestConnection. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
#
|
17
|
+
# You must have Beta v1.5 API access to use these internal API calls.
|
18
|
+
#
|
19
|
+
|
20
|
+
#
|
21
|
+
# Permission Resource requires "admin" role
|
22
|
+
#
|
23
|
+
|
24
|
+
class Permission
|
25
|
+
include RightScale::Api::Gateway
|
26
|
+
extend RightScale::Api::GatewayExtend
|
27
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# This file is part of RestConnection
|
1
|
+
# This file is part of RestConnection
|
2
2
|
#
|
3
3
|
# RestConnection is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# along with RestConnection. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
16
|
|
17
|
-
class RightScript
|
17
|
+
class RightScript
|
18
18
|
include RightScale::Api::Base
|
19
19
|
extend RightScale::Api::BaseExtend
|
20
20
|
def self.from_yaml(yaml)
|
@@ -23,7 +23,7 @@ class RightScript
|
|
23
23
|
x.keys.each do |script|
|
24
24
|
scripts << self.new('href' => "right_scripts/#{script}", 'name' => x[script].ivars['name'])
|
25
25
|
end
|
26
|
-
scripts
|
26
|
+
scripts
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.from_instance_info(file = "/var/spool/ec2/rs_cache/info.yml")
|
@@ -38,7 +38,7 @@ class RightScript
|
|
38
38
|
x.keys.each do |script|
|
39
39
|
scripts << self.new('href' => "right_scripts/#{script}", 'name' => x[script].ivars['name'])
|
40
40
|
end
|
41
|
-
scripts
|
41
|
+
scripts
|
42
42
|
end
|
43
43
|
|
44
44
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# This file is part of RestConnection
|
1
|
+
# This file is part of RestConnection
|
2
2
|
#
|
3
3
|
# RestConnection is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# along with RestConnection. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
16
|
|
17
|
-
class RightScriptInternal
|
17
|
+
class RightScriptInternal
|
18
18
|
include RightScale::Api::Base
|
19
19
|
extend RightScale::Api::BaseExtend
|
20
20
|
include RightScale::Api::Internal
|
@@ -41,11 +41,11 @@ class RightScriptInternal
|
|
41
41
|
t = URI.parse(self.href)
|
42
42
|
RightScript.new(:href => connection.post(t.path + "/commit", :commit_message => message))
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
# clones a RightScript and returns the new RightScript resource that's been created.
|
46
46
|
def clone
|
47
47
|
t = URI.parse(self.href)
|
48
48
|
RightScript.new(:href => connection.post(t.path + "/clone"))
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# This file is part of RestConnection
|
1
|
+
# This file is part of RestConnection
|
2
2
|
#
|
3
3
|
# RestConnection is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -21,7 +21,7 @@ module RightScale
|
|
21
21
|
def connection()
|
22
22
|
@@connection ||= RestConnection::Connection.new
|
23
23
|
settings = @@connection.settings
|
24
|
-
settings[:common_headers]["X_API_VERSION"] = "1.0"
|
24
|
+
settings[:common_headers]["X_API_VERSION"] = "1.0"
|
25
25
|
settings[:api_href] = settings[:api_url]
|
26
26
|
settings[:extension] = ".js"
|
27
27
|
@@connection
|
@@ -29,7 +29,7 @@ module RightScale
|
|
29
29
|
|
30
30
|
def resource_plural_name
|
31
31
|
self.to_s.underscore.pluralize
|
32
|
-
end
|
32
|
+
end
|
33
33
|
|
34
34
|
def resource_singular_name
|
35
35
|
self.to_s.underscore
|
@@ -37,7 +37,7 @@ module RightScale
|
|
37
37
|
# matches using result of block match expression
|
38
38
|
# ex: Server.find_by(:nickname) { |n| n =~ /production/ }
|
39
39
|
def find_by(attrib, &block)
|
40
|
-
self.find_all.select do |s|
|
40
|
+
self.find_all.select do |s|
|
41
41
|
yield(s[attrib.to_s])
|
42
42
|
end
|
43
43
|
end
|
@@ -63,8 +63,8 @@ module RightScale
|
|
63
63
|
self.find_by(:nickname) { |n| n == nickname }
|
64
64
|
end
|
65
65
|
|
66
|
-
# the argument can be
|
67
|
-
# 1) takes href (URI),
|
66
|
+
# the argument can be
|
67
|
+
# 1) takes href (URI),
|
68
68
|
# 2) or id (Integer)
|
69
69
|
# 3) or symbol :all, :first, :last
|
70
70
|
def find(href, additional_params={}, &block)
|
@@ -79,7 +79,7 @@ module RightScale
|
|
79
79
|
return results
|
80
80
|
elsif href == :first
|
81
81
|
return results.first
|
82
|
-
elsif href == :last
|
82
|
+
elsif href == :last
|
83
83
|
return results.last
|
84
84
|
end
|
85
85
|
elsif uri = URI.parse(href)
|
@@ -107,8 +107,8 @@ module RightScale
|
|
107
107
|
|
108
108
|
# filter is only implemented on some api endpoints
|
109
109
|
def find_with_filter(filter = {})
|
110
|
-
filter_params = []
|
111
|
-
filter.each { |key,val|
|
110
|
+
filter_params = []
|
111
|
+
filter.each { |key,val|
|
112
112
|
filter_params << "#{key}=#{val}"
|
113
113
|
}
|
114
114
|
a = Array.new
|
@@ -117,6 +117,42 @@ module RightScale
|
|
117
117
|
end
|
118
118
|
return a
|
119
119
|
end
|
120
|
+
|
121
|
+
def [](*args)
|
122
|
+
ret = []
|
123
|
+
args.each { |arg|
|
124
|
+
temp = []
|
125
|
+
begin
|
126
|
+
if arg.is_a?(Hash)
|
127
|
+
if arg.keys.first.to_s == "cloud_id"
|
128
|
+
temp << find_by_cloud_id(arg.values.first.to_i)
|
129
|
+
else
|
130
|
+
temp << find_with_filter(arg)
|
131
|
+
end
|
132
|
+
elsif arg.is_a?(Regexp)
|
133
|
+
temp << find_by(:nickname) { |n| n =~ arg }
|
134
|
+
else
|
135
|
+
temp << find(arg)
|
136
|
+
end
|
137
|
+
rescue
|
138
|
+
end
|
139
|
+
temp.flatten!
|
140
|
+
if temp.empty?
|
141
|
+
all = find_all
|
142
|
+
if arg.is_a?(Hash)
|
143
|
+
temp << all.select { |v| v.__send__(arg.keys.first.to_sym) =~ /#{arg.values.first}/ }
|
144
|
+
elsif arg.is_a?(Regexp)
|
145
|
+
temp += all.select { |n| n.name =~ arg }
|
146
|
+
temp += all.select { |n| n.nickname =~ arg } if temp.empty?
|
147
|
+
else
|
148
|
+
temp += all.select { |n| n.name =~ /#{arg}/ }
|
149
|
+
temp += all.select { |n| n.nickname =~ /#{arg}/ } if temp.empty?
|
150
|
+
end
|
151
|
+
end
|
152
|
+
ret += temp
|
153
|
+
}
|
154
|
+
return (args.empty? ? find_all : ret.flatten.uniq)
|
155
|
+
end
|
120
156
|
end
|
121
157
|
|
122
158
|
module Base
|
@@ -129,12 +165,12 @@ module RightScale
|
|
129
165
|
def connection()
|
130
166
|
@@connection ||= RestConnection::Connection.new
|
131
167
|
settings = @@connection.settings
|
132
|
-
settings[:common_headers]["X_API_VERSION"] = "1.0"
|
168
|
+
settings[:common_headers]["X_API_VERSION"] = "1.0"
|
133
169
|
settings[:api_href] = settings[:api_url]
|
134
170
|
settings[:extension] = ".js"
|
135
171
|
@@connection
|
136
172
|
end
|
137
|
-
|
173
|
+
|
138
174
|
def resource_plural_name
|
139
175
|
self.class.to_s.underscore.pluralize
|
140
176
|
end
|
@@ -168,34 +204,47 @@ module RightScale
|
|
168
204
|
@params[mn] = args[0]
|
169
205
|
@params[mn_dash] = args[0]
|
170
206
|
end
|
171
|
-
return @params[mn]
|
207
|
+
return @params[mn]
|
172
208
|
elsif @params[mn_dash]
|
173
209
|
if assignment
|
174
|
-
@params[mn_dash] = args[0]
|
210
|
+
@params[mn_dash] = args[0]
|
175
211
|
@params[mn] = args[0]
|
176
212
|
end
|
177
|
-
return @params[mn_dash]
|
213
|
+
return @params[mn_dash]
|
178
214
|
elsif @params[mn.to_sym]
|
179
215
|
return @params[mn.to_sym]
|
180
216
|
elsif assignment
|
181
217
|
@params[mn] = args[0]
|
182
218
|
@params[mn_dash] = args[0]
|
183
|
-
return @params[mn]
|
184
|
-
else
|
219
|
+
return @params[mn]
|
220
|
+
else
|
185
221
|
return nil
|
186
222
|
#raise "called unknown method #{method_name} with #{args.inspect}"
|
187
223
|
end
|
188
224
|
end
|
189
225
|
|
190
226
|
def [](name)
|
191
|
-
try_these = [name, name.to_s.gsub(/_/,'-'), name.to_sym]
|
227
|
+
try_these = [name.to_s, name.to_s.gsub(/_/,'-'), name.to_sym]
|
228
|
+
try_these.each do |t|
|
229
|
+
if @params[t]
|
230
|
+
return @params[t]
|
231
|
+
end
|
232
|
+
end
|
233
|
+
nil
|
234
|
+
end
|
235
|
+
|
236
|
+
def []=(name,val)
|
237
|
+
try_these = [name.to_s, name.to_s.gsub(/_/,'-'), name.to_sym]
|
192
238
|
try_these.each do |t|
|
193
239
|
if @params[t]
|
194
|
-
|
195
|
-
else
|
196
|
-
return nil
|
240
|
+
@params[t] = val
|
197
241
|
end
|
198
242
|
end
|
243
|
+
val
|
244
|
+
end
|
245
|
+
|
246
|
+
def rs_id
|
247
|
+
self.href.split(/\//).last
|
199
248
|
end
|
200
249
|
|
201
250
|
end
|
@@ -1,48 +1,233 @@
|
|
1
1
|
module RightScale
|
2
2
|
module Api
|
3
3
|
module Gateway
|
4
|
-
|
4
|
+
include RightScale::Api::Base
|
5
|
+
|
6
|
+
def initialize(params = {})
|
7
|
+
@params = parse_params(params)
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse_params(params = {})
|
11
|
+
params
|
12
|
+
end
|
13
|
+
|
14
|
+
def connection
|
5
15
|
@@gateway_connection ||= RestConnection::Connection.new
|
6
16
|
settings = @@gateway_connection.settings
|
7
|
-
settings[:common_headers]["X_API_VERSION"] = "1.5"
|
17
|
+
settings[:common_headers]["X_API_VERSION"] = "1.5"
|
8
18
|
settings[:api_href], account = settings[:api_url].split(/\/acct\//) if settings[:api_url].include?("acct")
|
9
|
-
settings[:extension] = ""
|
19
|
+
settings[:extension] = ".json"
|
10
20
|
unless @@gateway_connection.cookie
|
11
21
|
# login
|
12
22
|
params = { "email" => settings[:user], "password" => settings[:pass], "account_href" => "/api/accounts/#{account}" }
|
13
23
|
resp = @@gateway_connection.post("session", params)
|
14
24
|
raise "ERROR: Login failed. #{resp.message}. Code:#{resp.code}" unless resp.code == "302" || resp.code == "204"
|
15
25
|
@@gateway_connection.cookie = resp.response['set-cookie']
|
16
|
-
|
26
|
+
|
17
27
|
# test session
|
18
|
-
resp
|
19
|
-
raise "ERROR: Invalid session. #{resp
|
28
|
+
resp = @@gateway_connection.get("session")
|
29
|
+
raise "ERROR: Invalid session. #{resp["message"]}." unless resp.is_a?(Hash)
|
20
30
|
end
|
21
31
|
@@gateway_connection
|
22
32
|
end
|
33
|
+
|
34
|
+
def hash_of_links
|
35
|
+
ret = {}
|
36
|
+
unless @params['links']# and not (@params['nickname'] or @params['name'])
|
37
|
+
@params = Kernel.const_get(self.class.to_s).find_by(:name) { |n| n == self.nickname }.first.params
|
38
|
+
connection.logger("in hash_of_links: @params = #{@params.inspect}") if ENV['REST_CONNECT_DEBUG']
|
39
|
+
end
|
40
|
+
@params['links'].each { |link| ret[link['rel']] = link['href'] } if @params['links']
|
41
|
+
ret
|
42
|
+
end
|
43
|
+
|
44
|
+
def href
|
45
|
+
return @params['href'] if @params['href']
|
46
|
+
ret = nil
|
47
|
+
unless @params['links']
|
48
|
+
raise "Cannot find attribute 'nickname' or 'name' in #{self.inspect}. Aborting." unless self.nickname
|
49
|
+
@params = Kernel.const_get(self.class.to_s).find_by(:name) { |n| n == self.nickname }.first.params
|
50
|
+
connection.logger("in href: @params = #{@params.inspect}") if ENV['REST_CONNECT_DEBUG']
|
51
|
+
end
|
52
|
+
@params['links'].each { |link| ret = link['href'] if link['rel'] == 'self' }
|
53
|
+
ret
|
54
|
+
end
|
55
|
+
|
56
|
+
def actions
|
57
|
+
ret = []
|
58
|
+
unless @params['actions']
|
59
|
+
raise "Cannot find attribute 'nickname' or 'name' in #{self.inspect}. Aborting." unless self.nickname
|
60
|
+
@params = Kernel.const_get(self.class.to_s).find_by(:name) { |n| n == self.nickname }.first.params
|
61
|
+
connection.logger("in actions: @params = #{@params.inspect}") if ENV['REST_CONNECT_DEBUG']
|
62
|
+
end
|
63
|
+
@params['actions'].each { |action| ret << action['rel'] }
|
64
|
+
ret
|
65
|
+
end
|
66
|
+
|
67
|
+
def save
|
68
|
+
update
|
69
|
+
end
|
70
|
+
|
71
|
+
def method_missing(method_name, *args)
|
72
|
+
puts "DEBUG: method_missing in #{self.class.to_s}: #{method_name}" if ENV['REST_CONNECT_DEBUG']
|
73
|
+
mn = method_name.to_s
|
74
|
+
assignment = mn.gsub!(/=/,"")
|
75
|
+
mn_dash = mn.gsub(/_/,"-")
|
76
|
+
if self[mn]
|
77
|
+
if assignment
|
78
|
+
self[mn] = args[0]
|
79
|
+
self[mn_dash] = args[0]
|
80
|
+
end
|
81
|
+
return self[mn]
|
82
|
+
elsif self[mn_dash]
|
83
|
+
if assignment
|
84
|
+
self[mn_dash] = args[0]
|
85
|
+
self[mn] = args[0]
|
86
|
+
end
|
87
|
+
return self[mn_dash]
|
88
|
+
elsif self[mn.to_sym]
|
89
|
+
return self[mn.to_sym]
|
90
|
+
elsif assignment
|
91
|
+
self[mn] = args[0]
|
92
|
+
self[mn_dash] = args[0]
|
93
|
+
return self[mn]
|
94
|
+
else
|
95
|
+
return nil
|
96
|
+
#raise "called unknown method #{method_name} with #{args.inspect}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def [](name)
|
101
|
+
try_these = [name.to_s, name.to_s.gsub(/_/,'-'), name.to_sym]
|
102
|
+
if try_these.include?(:nickname)
|
103
|
+
try_these += ["name", :name]
|
104
|
+
end
|
105
|
+
try_these.each do |t|
|
106
|
+
if @params[t]
|
107
|
+
return @params[t]
|
108
|
+
elsif hash_of_links[t]
|
109
|
+
return hash_of_links[t]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
return nil
|
113
|
+
end
|
114
|
+
|
115
|
+
def []=(name,val)
|
116
|
+
try_these = [name.to_s, name.to_s.gsub(/_/,'-'), name.to_sym]
|
117
|
+
if try_these.include?(:nickname)
|
118
|
+
try_these += ["name", :name]
|
119
|
+
end
|
120
|
+
try_these.each do |t|
|
121
|
+
if @params[t]
|
122
|
+
@params[t] = val
|
123
|
+
elsif hash_of_links[t]
|
124
|
+
@params['links'].each { |link|
|
125
|
+
link['href'] = val if link['rel'] == t
|
126
|
+
}
|
127
|
+
end
|
128
|
+
end
|
129
|
+
val
|
130
|
+
end
|
131
|
+
|
132
|
+
def load(resource)
|
133
|
+
if resource.is_a?(Class)
|
134
|
+
param_string = resource.resource_singular_name
|
135
|
+
class_name = resource
|
136
|
+
elsif resource.is_a?(String) or resource.is_a?(Symbol)
|
137
|
+
param_string = resource
|
138
|
+
begin
|
139
|
+
class_name = Kernel.const_get(resource.singularize.camelize)
|
140
|
+
rescue
|
141
|
+
class_name = Kernel.const_get("Mc#{resource.singularize.camelize}")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
if self[param_string].nil?
|
145
|
+
return class_name.load_all(self[param_string.pluralize])
|
146
|
+
elsif param_string.pluralize == param_string
|
147
|
+
return class_name.load_all(self[param_string])
|
148
|
+
else
|
149
|
+
return class_name.load(self[param_string])
|
150
|
+
end
|
151
|
+
end
|
23
152
|
end
|
24
153
|
|
25
154
|
module GatewayExtend
|
26
|
-
|
155
|
+
include RightScale::Api::BaseExtend
|
156
|
+
def connection
|
27
157
|
@@gateway_connection ||= RestConnection::Connection.new
|
28
158
|
settings = @@gateway_connection.settings
|
29
|
-
settings[:common_headers]["X_API_VERSION"] = "1.5"
|
159
|
+
settings[:common_headers]["X_API_VERSION"] = "1.5"
|
30
160
|
settings[:api_href], account = settings[:api_url].split(/\/acct\//) if settings[:api_url].include?("acct")
|
31
|
-
settings[:extension] = ""
|
161
|
+
settings[:extension] = ".json"
|
32
162
|
unless @@gateway_connection.cookie
|
33
163
|
# login
|
34
164
|
params = { "email" => settings[:user], "password" => settings[:pass], "account_href" => "/api/accounts/#{account}" }
|
35
165
|
resp = @@gateway_connection.post("session", params)
|
36
166
|
raise "ERROR: Login failed. #{resp.message}. Code:#{resp.code}" unless resp.code == "302" || resp.code == "204"
|
37
167
|
@@gateway_connection.cookie = resp.response['set-cookie']
|
38
|
-
|
168
|
+
|
39
169
|
# test session
|
40
|
-
resp
|
41
|
-
raise "ERROR: Invalid session. #{resp
|
170
|
+
resp = @@gateway_connection.get("session")
|
171
|
+
raise "ERROR: Invalid session. #{resp["message"]}." unless resp.is_a?(Hash)
|
42
172
|
end
|
43
173
|
@@gateway_connection
|
44
174
|
end
|
175
|
+
|
176
|
+
def find_by(attrib, *args, &block)
|
177
|
+
attrib = :name if attrib == :nickname
|
178
|
+
self.find_all(*args).select do |s|
|
179
|
+
yield(s[attrib.to_s])
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def find_all(*args)
|
184
|
+
# self.find_with_filter(*args, {})
|
185
|
+
a = Array.new
|
186
|
+
url = "#{parse_args(*args)}#{self.resource_plural_name}"
|
187
|
+
connection.get(url).each do |object|
|
188
|
+
a << self.new(object)
|
189
|
+
end
|
190
|
+
return a
|
191
|
+
end
|
192
|
+
|
193
|
+
def find_with_filter(*args)
|
194
|
+
filter_params = []
|
195
|
+
filter = {}
|
196
|
+
filter = args.pop if args.last.is_a?(Hash)
|
197
|
+
filter.each { |key,val|
|
198
|
+
filter_params << "#{key}==#{val}"
|
199
|
+
}
|
200
|
+
a = Array.new
|
201
|
+
url = "#{parse_args(*args)}#{self.resource_plural_name}"
|
202
|
+
connection.get(url, :filter => filter_params).each do |object|
|
203
|
+
a << self.new(object)
|
204
|
+
end
|
205
|
+
return a
|
206
|
+
end
|
207
|
+
|
208
|
+
def load(url)
|
209
|
+
return self.new(connection.get(url))
|
210
|
+
end
|
211
|
+
|
212
|
+
def load_all(url)
|
213
|
+
a = Array.new
|
214
|
+
connection.get(url).each do |object|
|
215
|
+
a << self.new(object)
|
216
|
+
end
|
217
|
+
return a
|
218
|
+
end
|
219
|
+
|
220
|
+
def parse_args()
|
221
|
+
nil
|
222
|
+
end
|
223
|
+
|
224
|
+
def create(opts)
|
225
|
+
location = connection.post(self.resource_plural_name, self.resource_singular_name.to_sym => opts)
|
226
|
+
newrecord = self.new('links' => [ {'rel' => 'self', 'href' => location } ])
|
227
|
+
newrecord.reload
|
228
|
+
newrecord
|
229
|
+
end
|
45
230
|
end
|
46
231
|
end
|
47
232
|
end
|
48
|
-
|
233
|
+
|