rest_connection 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +43 -0
- data/README.rdoc +17 -10
- data/Rakefile +16 -16
- data/git_hooks/pre-commit +12 -0
- data/lib/rest_connection/rightscale/ec2_security_group.rb +22 -13
- data/lib/rest_connection/version.rb +4 -0
- data/rest_connection.gemspec +32 -0
- data/rest_connection.rconf +10 -0
- metadata +115 -41
- data/README.rdoc.starting.point +0 -202
- data/VERSION +0 -1
- data/login_to_connection_irb.rb +0 -22
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rest_connection (1.0.3)
|
5
|
+
activesupport (= 2.3.10)
|
6
|
+
highline
|
7
|
+
json
|
8
|
+
net-ssh (= 2.1.4)
|
9
|
+
nokogiri
|
10
|
+
rest-client
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: http://rubygems.org/
|
14
|
+
specs:
|
15
|
+
activesupport (2.3.10)
|
16
|
+
columnize (0.3.6)
|
17
|
+
highline (1.6.15)
|
18
|
+
json (1.7.5)
|
19
|
+
linecache (0.46)
|
20
|
+
rbx-require-relative (> 0.0.4)
|
21
|
+
mime-types (1.19)
|
22
|
+
net-ssh (2.1.4)
|
23
|
+
nokogiri (1.5.5)
|
24
|
+
rake (0.8.7)
|
25
|
+
rbx-require-relative (0.0.9)
|
26
|
+
rest-client (1.6.7)
|
27
|
+
mime-types (>= 1.16)
|
28
|
+
rspec (1.3.0)
|
29
|
+
ruby-debug (0.10.4)
|
30
|
+
columnize (>= 0.1)
|
31
|
+
ruby-debug-base (~> 0.10.4.0)
|
32
|
+
ruby-debug-base (0.10.4)
|
33
|
+
linecache (>= 0.3)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
bundler
|
40
|
+
rake (= 0.8.7)
|
41
|
+
rest_connection!
|
42
|
+
rspec (= 1.3.0)
|
43
|
+
ruby-debug
|
data/README.rdoc
CHANGED
@@ -4,10 +4,11 @@
|
|
4
4
|
"gem install rest_connection"
|
5
5
|
|
6
6
|
==== Installing from source
|
7
|
-
"git clone
|
8
|
-
"
|
9
|
-
"
|
10
|
-
"
|
7
|
+
"git clone git@github.com:rightscale/rest_connection.git"
|
8
|
+
"cd rest_connection"
|
9
|
+
"gem install rconf"
|
10
|
+
"rconf" <- follow any further instructions from rconf
|
11
|
+
"bundle install"
|
11
12
|
|
12
13
|
== Configuration
|
13
14
|
|
@@ -47,10 +48,16 @@ Copy the example from GEMHOME/rest_connection/config/rest_api_config.yaml.sample
|
|
47
48
|
|
48
49
|
puts my_array.instances.map { |i| i['ip-address'] }
|
49
50
|
|
50
|
-
=== To cut a new gem and push to
|
51
|
+
=== To cut a new gem and push to RubyGems.org
|
51
52
|
|
52
|
-
Edit
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
Edit lib/rest_connection/version.rb and bump the number according to http://semver.org
|
54
|
+
|
55
|
+
"bundle exec gem build rest_connection.gemspec"
|
56
|
+
"ls *.gem" <- verify that gem was built
|
57
|
+
"cd /tmp"
|
58
|
+
"bundle exec gem install /path/to/local/rest_connection-X.Y.Z.gem" <- replace X.Y.Z with your new version number
|
59
|
+
"bundle exec gem uninstall rest_connection"
|
60
|
+
"cd -"
|
61
|
+
"bundle exec gem push rest_connection-X.Y.Z.gem"
|
62
|
+
|
63
|
+
Check it out: https://rubygems.org/gems/rest_connection
|
data/Rakefile
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
1
|
+
require File.expand_path('../lib/rest_connection', __FILE__)
|
2
|
+
require 'rake'
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
|
5
|
+
task :build do
|
6
|
+
system "gem build rest_connection.gemspec"
|
7
|
+
end
|
8
|
+
|
9
|
+
task :release => :build do
|
10
|
+
system "gem push rest_connection-#{RestConnection::VERSION}.gem"
|
11
|
+
end
|
12
|
+
|
13
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
14
|
+
t.spec_files = Dir.glob('spec/*_spec.rb')
|
15
|
+
t.spec_opts << '--format nested'
|
16
|
+
t.spec_opts << '--colour'
|
16
17
|
end
|
17
|
-
Jeweler::GemcutterTasks.new
|
data/git_hooks/pre-commit
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
|
+
# Setup $stat_flag based on OS type
|
4
|
+
mac_unix_name=Darwin
|
5
|
+
uname_returned=`uname -a`
|
6
|
+
unix_name=${uname_returned:0:${#mac_unix_name}}
|
7
|
+
if [ "$unix_name" = "$mac_unix_name" ]; then
|
8
|
+
echo "MAC OS \"$mac_unix_name\" detected..."
|
9
|
+
stat_flag=-f
|
10
|
+
else
|
11
|
+
echo "non-MAC OS detected..."
|
12
|
+
stat_flag=-c
|
13
|
+
fi
|
14
|
+
|
3
15
|
echo "Checking for syntax errors..."
|
4
16
|
for FILE in `git diff-index --name-only HEAD --` ; do
|
5
17
|
if test -f $FILE; then
|
@@ -25,27 +25,36 @@ class Ec2SecurityGroup
|
|
25
25
|
include RightScale::Api::Base
|
26
26
|
extend RightScale::Api::BaseExtend
|
27
27
|
|
28
|
+
VALID_RULE_TYPES = [
|
29
|
+
[:group, :owner],
|
30
|
+
[:cidr_ips, :from_port, :protocol, :to_port],
|
31
|
+
[:from_port, :group, :owner, :protocol, :to_port],
|
32
|
+
]
|
33
|
+
|
28
34
|
# NOTE - Create, Destroy, and Update require "security_manager" permissions
|
29
35
|
# NOTE - Can't remove rules, can only add
|
30
36
|
def add_rule(opts={})
|
31
|
-
|
32
|
-
|
33
|
-
:name => [:owner, :group],
|
34
|
-
:cidr_ips => [:cidr_ip, :protocol, :from_port, :to_port],
|
35
|
-
:group => [:owner, :group, :protocol, :from_port, :to_port],
|
36
|
-
]
|
37
|
-
type = (opts[:protocol] ? (opts[:cidr_ip] ? :cidr_ips : :group) : :name)
|
38
|
-
unless update_types[type].reduce(true) { |b,field| b && opts[field] }
|
39
|
-
arg_expectation = update_types.values.pretty_inspect
|
40
|
-
raise ArgumentError.new("add_rule requires one of these groupings: #{arg_expectation}")
|
41
|
-
end
|
37
|
+
rule = {}
|
38
|
+
opts.each { |k,v| rule["#{k}".to_sym] = v }
|
42
39
|
|
43
|
-
|
44
|
-
|
40
|
+
unless validate_rule(rule)
|
41
|
+
raise ArgumentError.new("add_rule expects one of these valid rule types: #{VALID_RULE_TYPES.to_json}")
|
42
|
+
end
|
45
43
|
|
44
|
+
params = {:ec2_security_group => rule}
|
46
45
|
uri = URI.parse(self.href)
|
47
46
|
connection.put(uri.path, params)
|
48
47
|
|
49
48
|
self.reload
|
50
49
|
end
|
50
|
+
|
51
|
+
def validate_rule(rule)
|
52
|
+
VALID_RULE_TYPES.each do |valid_rule_type|
|
53
|
+
if rule.keys.sort_by {|sym| sym.to_s} == valid_rule_type.sort_by {|sym| sym.to_s}
|
54
|
+
return true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
false
|
59
|
+
end
|
51
60
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path('../lib/rest_connection/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'rest_connection'
|
5
|
+
s.version = RestConnection::VERSION
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
s.date = Time.now.utc.strftime("%Y-%m-%d")
|
8
|
+
s.require_path = 'lib'
|
9
|
+
s.authors = [ 'RightScale, Inc.' ]
|
10
|
+
s.email = [ 'rubygems@rightscale.com' ]
|
11
|
+
s.homepage = 'https://github.com/rightscale/rest_connection'
|
12
|
+
s.summary = 'A Modular RESTful API library.'
|
13
|
+
s.description = %{
|
14
|
+
The rest_connection gem simplifies the use of RESTful APIs.
|
15
|
+
It currently has support for RightScale API 1.0 and 1.5.
|
16
|
+
}
|
17
|
+
s.files = `git ls-files`.split(' ')
|
18
|
+
s.test_files = `git ls-files spec config`.split(' ')
|
19
|
+
s.rubygems_version = '1.8.24'
|
20
|
+
|
21
|
+
s.add_runtime_dependency 'activesupport', '2.3.10'
|
22
|
+
s.add_runtime_dependency 'net-ssh', '2.1.4'
|
23
|
+
s.add_runtime_dependency 'json'
|
24
|
+
s.add_runtime_dependency 'highline'
|
25
|
+
s.add_runtime_dependency 'rest-client'
|
26
|
+
s.add_runtime_dependency 'nokogiri'
|
27
|
+
|
28
|
+
s.add_development_dependency 'rake', '0.8.7'
|
29
|
+
s.add_development_dependency 'bundler'
|
30
|
+
s.add_development_dependency 'rspec', '1.3.0'
|
31
|
+
s.add_development_dependency 'ruby-debug'
|
32
|
+
end
|
metadata
CHANGED
@@ -1,28 +1,25 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest_connection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 17
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
|
-
-
|
14
|
-
- Timothy Rodriguez
|
13
|
+
- RightScale, Inc.
|
15
14
|
autorequire:
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date: 2012-
|
20
|
-
default_executable:
|
18
|
+
date: 2012-12-13 00:00:00 Z
|
21
19
|
dependencies:
|
22
20
|
- !ruby/object:Gem::Dependency
|
23
21
|
name: activesupport
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
23
|
none: false
|
27
24
|
requirements:
|
28
25
|
- - "="
|
@@ -34,11 +31,11 @@ dependencies:
|
|
34
31
|
- 10
|
35
32
|
version: 2.3.10
|
36
33
|
type: :runtime
|
37
|
-
|
34
|
+
requirement: *id001
|
35
|
+
prerelease: false
|
38
36
|
- !ruby/object:Gem::Dependency
|
39
37
|
name: net-ssh
|
40
|
-
|
41
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
42
39
|
none: false
|
43
40
|
requirements:
|
44
41
|
- - "="
|
@@ -50,11 +47,11 @@ dependencies:
|
|
50
47
|
- 4
|
51
48
|
version: 2.1.4
|
52
49
|
type: :runtime
|
53
|
-
|
50
|
+
requirement: *id002
|
51
|
+
prerelease: false
|
54
52
|
- !ruby/object:Gem::Dependency
|
55
53
|
name: json
|
56
|
-
|
57
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
58
55
|
none: false
|
59
56
|
requirements:
|
60
57
|
- - ">="
|
@@ -64,11 +61,11 @@ dependencies:
|
|
64
61
|
- 0
|
65
62
|
version: "0"
|
66
63
|
type: :runtime
|
67
|
-
|
64
|
+
requirement: *id003
|
65
|
+
prerelease: false
|
68
66
|
- !ruby/object:Gem::Dependency
|
69
67
|
name: highline
|
70
|
-
|
71
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
72
69
|
none: false
|
73
70
|
requirements:
|
74
71
|
- - ">="
|
@@ -78,11 +75,11 @@ dependencies:
|
|
78
75
|
- 0
|
79
76
|
version: "0"
|
80
77
|
type: :runtime
|
81
|
-
|
78
|
+
requirement: *id004
|
79
|
+
prerelease: false
|
82
80
|
- !ruby/object:Gem::Dependency
|
83
81
|
name: rest-client
|
84
|
-
|
85
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
82
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
86
83
|
none: false
|
87
84
|
requirements:
|
88
85
|
- - ">="
|
@@ -92,11 +89,11 @@ dependencies:
|
|
92
89
|
- 0
|
93
90
|
version: "0"
|
94
91
|
type: :runtime
|
95
|
-
|
92
|
+
requirement: *id005
|
93
|
+
prerelease: false
|
96
94
|
- !ruby/object:Gem::Dependency
|
97
95
|
name: nokogiri
|
98
|
-
|
99
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
96
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
100
97
|
none: false
|
101
98
|
requirements:
|
102
99
|
- - ">="
|
@@ -106,23 +103,86 @@ dependencies:
|
|
106
103
|
- 0
|
107
104
|
version: "0"
|
108
105
|
type: :runtime
|
109
|
-
|
110
|
-
|
106
|
+
requirement: *id006
|
107
|
+
prerelease: false
|
108
|
+
- !ruby/object:Gem::Dependency
|
109
|
+
name: rake
|
110
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - "="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 49
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
- 8
|
119
|
+
- 7
|
120
|
+
version: 0.8.7
|
121
|
+
type: :development
|
122
|
+
requirement: *id007
|
123
|
+
prerelease: false
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: bundler
|
126
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
hash: 3
|
132
|
+
segments:
|
133
|
+
- 0
|
134
|
+
version: "0"
|
135
|
+
type: :development
|
136
|
+
requirement: *id008
|
137
|
+
prerelease: false
|
138
|
+
- !ruby/object:Gem::Dependency
|
139
|
+
name: rspec
|
140
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
141
|
+
none: false
|
142
|
+
requirements:
|
143
|
+
- - "="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
hash: 27
|
146
|
+
segments:
|
147
|
+
- 1
|
148
|
+
- 3
|
149
|
+
- 0
|
150
|
+
version: 1.3.0
|
151
|
+
type: :development
|
152
|
+
requirement: *id009
|
153
|
+
prerelease: false
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: ruby-debug
|
156
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
157
|
+
none: false
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
hash: 3
|
162
|
+
segments:
|
163
|
+
- 0
|
164
|
+
version: "0"
|
165
|
+
type: :development
|
166
|
+
requirement: *id010
|
167
|
+
prerelease: false
|
168
|
+
description: "\n\
|
169
|
+
The rest_connection gem simplifies the use of RESTful APIs.\n\
|
170
|
+
It currently has support for RightScale API 1.0 and 1.5.\n "
|
111
171
|
email:
|
112
|
-
-
|
172
|
+
- rubygems@rightscale.com
|
113
173
|
executables: []
|
114
174
|
|
115
175
|
extensions: []
|
116
176
|
|
117
|
-
extra_rdoc_files:
|
118
|
-
|
119
|
-
- README.rdoc
|
120
|
-
- README.rdoc.starting.point
|
177
|
+
extra_rdoc_files: []
|
178
|
+
|
121
179
|
files:
|
180
|
+
- .gitignore
|
181
|
+
- Gemfile
|
182
|
+
- Gemfile.lock
|
122
183
|
- LICENSE
|
123
184
|
- README.rdoc
|
124
185
|
- Rakefile
|
125
|
-
- VERSION
|
126
186
|
- config/rest_api_config.yaml.sample
|
127
187
|
- examples/README.txt
|
128
188
|
- examples/console.rb
|
@@ -209,8 +269,10 @@ files:
|
|
209
269
|
- lib/rest_connection/rightscale/user.rb
|
210
270
|
- lib/rest_connection/rightscale/vpc_dhcp_option.rb
|
211
271
|
- lib/rest_connection/ssh_hax.rb
|
272
|
+
- lib/rest_connection/version.rb
|
212
273
|
- log_api_call_parser
|
213
|
-
-
|
274
|
+
- rest_connection.gemspec
|
275
|
+
- rest_connection.rconf
|
214
276
|
- spec/ec2_server_array_spec.rb
|
215
277
|
- spec/ec2_ssh_key_internal_spec.rb
|
216
278
|
- spec/image_jockey.rb
|
@@ -225,9 +287,7 @@ files:
|
|
225
287
|
- spec/server_template_internal.rb
|
226
288
|
- spec/spec_helper.rb
|
227
289
|
- spec/tag_spec.rb
|
228
|
-
|
229
|
-
has_rdoc: true
|
230
|
-
homepage: http://github.com/rightscale/rest_connection
|
290
|
+
homepage: https://github.com/rightscale/rest_connection
|
231
291
|
licenses: []
|
232
292
|
|
233
293
|
post_install_message:
|
@@ -256,9 +316,23 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
256
316
|
requirements: []
|
257
317
|
|
258
318
|
rubyforge_project:
|
259
|
-
rubygems_version: 1.
|
319
|
+
rubygems_version: 1.8.24
|
260
320
|
signing_key:
|
261
321
|
specification_version: 3
|
262
|
-
summary: Modular RESTful API library
|
263
|
-
test_files:
|
264
|
-
|
322
|
+
summary: A Modular RESTful API library.
|
323
|
+
test_files:
|
324
|
+
- config/rest_api_config.yaml.sample
|
325
|
+
- spec/ec2_server_array_spec.rb
|
326
|
+
- spec/ec2_ssh_key_internal_spec.rb
|
327
|
+
- spec/image_jockey.rb
|
328
|
+
- spec/mcserver_spec.rb
|
329
|
+
- spec/method_missing_spec.rb
|
330
|
+
- spec/multi.rb
|
331
|
+
- spec/right_script_internal.rb
|
332
|
+
- spec/rs_internal_spec.rb
|
333
|
+
- spec/runtests
|
334
|
+
- spec/server_internal_spec.rb
|
335
|
+
- spec/server_spec.rb
|
336
|
+
- spec/server_template_internal.rb
|
337
|
+
- spec/spec_helper.rb
|
338
|
+
- spec/tag_spec.rb
|
data/README.rdoc.starting.point
DELETED
@@ -1,202 +0,0 @@
|
|
1
|
-
= Rest Connection
|
2
|
-
|
3
|
-
The rest_connection gem simplifies the use of RightScale's MultiCloud API. It provides
|
4
|
-
a simple object model of the API resources, and handles all of the fine details involved
|
5
|
-
in making HTTP calls and translating their responses.
|
6
|
-
It is assumed that users are already familiar with the RightScale API:
|
7
|
-
- API Documentation: http://support.rightscale.com/12-Guides/RightScale_API_1.5
|
8
|
-
- API Reference Docs: http://support.rightscale.com/api1.5
|
9
|
-
|
10
|
-
== Installation
|
11
|
-
Ruby 1.8.7 or higher is required.
|
12
|
-
gem install rest_connection
|
13
|
-
|
14
|
-
== Versioning
|
15
|
-
The rest_connection gem is versioned using the usual X.Y.Z notation, where X.Y is the
|
16
|
-
RightScale API version, and Z is the client version. For example, if you want to use
|
17
|
-
RightScale API 1.5, you should use the latest version of the 1.5 gem. This will ensure
|
18
|
-
that you get the latest bug fixes for the client that is compatible with that API version.
|
19
|
-
|
20
|
-
== Usage Instructions
|
21
|
-
New users can start with the following few lines of code and navigate their way around the API by following
|
22
|
-
the available methods. You can find your account id by logging into the RightScale dashboard (https://my.rightscale.com),
|
23
|
-
navigate to the Settings > Account Settings page. The account is is at the end of the browser address bar.
|
24
|
-
require 'rest_connection'
|
25
|
-
@client = RightApi::Client.new(:email => 'my@email.com', :password => 'my_password', :account_id => 'my_account_id')
|
26
|
-
puts "Available methods: #{@client.api_methods}"
|
27
|
-
|
28
|
-
The client makes working with and getting to know the API much easier. It spiders the API dynamically to
|
29
|
-
discover its resources on the fly. At every step, the user has the ability to query api_methods(), which
|
30
|
-
indicates the potential methods that can be called. The <tt>config/login.yml.example</tt> file provides
|
31
|
-
details of different login parameters.
|
32
|
-
|
33
|
-
=== Making API calls
|
34
|
-
Essentially, just follow the RightScale API documentation (available from http://support.rightscale.com)
|
35
|
-
and treat every resource in the paths as objects that can call other objects using the dot (.) operator:
|
36
|
-
|
37
|
-
Examples:
|
38
|
-
- Index: /api/clouds/:cloud_id/datacenters => @client.clouds(:id => :cloud_id).show.datacenters.index
|
39
|
-
- Show: /api/clouds/:cloud_id/datacenters/:id => @client.clouds(:id => :cloud_id).show.datacenters(:id => :datacenter_id).show
|
40
|
-
- Create: /api/deployments/:deployment_id/servers => @client.deployments(:id => :deployment_id).show.servers.create
|
41
|
-
- Update: /api/deployments/:deployment_id/servers/:id => @client.deployments(:id => :deployment_id).show.servers(:id => :server_id).update
|
42
|
-
- Destroy: /api/deployments/:deployment_id/servers/:id => @client.deployments(:id => :deployment_id).show.servers(:id => :server_id).destroy
|
43
|
-
- An action: /api/servers/:server_id/launch => @client.servers(:id => :server_id).show.launch
|
44
|
-
|
45
|
-
As seen above, whenever you need to chain methods, you must call .show before specifying the next method.
|
46
|
-
|
47
|
-
=== Parameters
|
48
|
-
Pass-in parameters to the method that they belong to. Lets say you want to filter on the index for deployments:
|
49
|
-
@client.deployments.index(:filter => ['name==my_deployment'])
|
50
|
-
The filter is the parameter for the index call and not the deployment call.
|
51
|
-
|
52
|
-
=== Logging HTTP Requests
|
53
|
-
The HTTP calls made by rest_connection can be logged in two ways:
|
54
|
-
1. Log to a file
|
55
|
-
@client.log('~/rest_connection.log')
|
56
|
-
2. Log to SDTOUT
|
57
|
-
@client.log(STDOUT)
|
58
|
-
|
59
|
-
== Examples
|
60
|
-
Get a list of all servers (aka doing an Index call)
|
61
|
-
@client.servers.index
|
62
|
-
|
63
|
-
Get a list of all servers in a deployment
|
64
|
-
@client.deployments(:id => 'my_deployment_id').show.servers.index
|
65
|
-
|
66
|
-
Get a particular server (aka doing a Show call)
|
67
|
-
@client.servers(:id => 'my_server_id').show
|
68
|
-
|
69
|
-
Creating a server involves setting up the required parameters, then calling the create method
|
70
|
-
server_template_href = @client.server_templates.index(:filter => ['name==Base ServerTemplate']).first.href
|
71
|
-
cloud = @client.clouds(:id => 'my_cloud_id').show
|
72
|
-
params = { :server => {
|
73
|
-
:name => 'Test Server',
|
74
|
-
:deployment_href => @client.deployments(:id => 'my_deployment_id').show.href,
|
75
|
-
:instance => {
|
76
|
-
:server_template_href => server_template_href,
|
77
|
-
:cloud_href => cloud.href,
|
78
|
-
:security_group_hrefs => [cloud.security_groups.index(:filter => ['name==default']).first.href],
|
79
|
-
:ssh_key_href => cloud.ssh_keys.index.first.href,
|
80
|
-
:datacenter_href => cloud.datacenters.index.first.href
|
81
|
-
}}}
|
82
|
-
new_server = @client.servers.create(params)
|
83
|
-
new_server.api_methods
|
84
|
-
|
85
|
-
Launch the newly created server. Inputs are a bit tricky so they have to be set in a long string
|
86
|
-
inputs = "inputs[][name]=NAME1&inputs[][value]=text:VALUE1&inputs[][name]=NAME2&inputs[][value]=text:VALUE2"
|
87
|
-
new_server.show.launch(inputs)
|
88
|
-
|
89
|
-
Run a script on the server. The API does not currently expose right_scripts, hence, the script href has
|
90
|
-
to be retrieved from the dashboard and put in the following href format.
|
91
|
-
script_href = "right_script_href=/api/right_scripts/382371"
|
92
|
-
task = new_server.show.current_instance.show.run_executable(script_href + "&inputs[][name]=TEST_NAME&inputs[][value]=text:VALUE1")
|
93
|
-
task.show.api_methods
|
94
|
-
|
95
|
-
Update the server's name
|
96
|
-
params = { :server => {:name => 'New Server Name'}}
|
97
|
-
@client.servers(:id => 'my_server_id').update(params)
|
98
|
-
|
99
|
-
Terminate the server (i.e. shutdown its current_instance)
|
100
|
-
@client.servers(:id => 'my_server_id').show.terminate
|
101
|
-
|
102
|
-
Destroy the server (i.e. delete it)
|
103
|
-
@client.servers(:id => 'my_server_id').destroy
|
104
|
-
|
105
|
-
== Object Types
|
106
|
-
The client returns 3 types of objects:
|
107
|
-
- <b>Resources</b>: returned when you are querying a collection of resources, e.g.: <tt>client.deployments</tt>
|
108
|
-
- <b>Resource</b>: returned when you specify an id and therefore a specific resource, e.g.: <tt>@client.deployments(:id => :deployment_id)</tt>
|
109
|
-
- When the content-type is type=collection then an array of Resource objects will be returned, e.g.: <tt>@client.deployments.index</tt>
|
110
|
-
- When the content-type is not a collection then a Resource object will be returned, e.g.: <tt>@client.deployments(:id => deployment_id).show</tt>
|
111
|
-
- <b>ResourceDetail</b>: returned when you do a .show on a Resource, e.g.: <tt>client.deployments(:id => deployment_id).show</tt>
|
112
|
-
<b>On all 3 types of objects you can query <tt>.api_methods</tt> to see a list of available methods, e.g.: <tt>client.deployments.api_methods</tt></b>
|
113
|
-
|
114
|
-
=== Exceptions:
|
115
|
-
- <tt>inputs.index</tt> will return an array of ResourceDetail objects since you cannot do a .show on an input
|
116
|
-
- <tt>session.index</tt> will return a ResourceDetail object since you cannot do a .show on a session
|
117
|
-
- <tt>tags.by_resource, tags.by_tag</tt> will return an array of ResourceDetail objects since you cannot do a .show on a resource_tag
|
118
|
-
- <tt>monitoring_metrics(:id => :m_m_id).show.data</tt> will return a ResourceDetail object since you cannot do
|
119
|
-
a .show on a monitoring_metric_data
|
120
|
-
|
121
|
-
== Instance Facing Calls:
|
122
|
-
The client also supports 'instance facing calls', which use the instance_token to login.
|
123
|
-
Unlike regular email-password logins, instance-facing-calls are limited in the amount of allowable calls.
|
124
|
-
Since in most of the cases, the calls are scoped to the instance's cloud (or the instance itself), the cloud_id and
|
125
|
-
the instance_id will be automatically recorded by the client, so that the user does not need to specify it.
|
126
|
-
|
127
|
-
=== Examples
|
128
|
-
@instance_client = RightApi::Client.new(:instance_token => 'my_token', :account_id => 'my_account_id')
|
129
|
-
@instance_client.volume_attachments links to /api/clouds/:cloud_id/volume_attachments
|
130
|
-
@instance_client.volumes_snapshots links to /api/clouds/:cloud_id/volumes_snapshots
|
131
|
-
@instance_client.volumes_types links to /api/clouds/:cloud_id/volumes_types
|
132
|
-
@instance_client.volumes links to /api/clouds/:cloud_id/volumes
|
133
|
-
@instance_client.backups links to /api/backups
|
134
|
-
@instance_client.live_tasks(:id) links to /api/clouds/:cloud_id/instances/:instance_id/live/tasks/:id
|
135
|
-
|
136
|
-
=== Notes
|
137
|
-
For volume_attachments and volumes_snapshots you can also go through the volume:
|
138
|
-
@instance_client.volumes(:id => :volume_id).show.volume_attachments
|
139
|
-
which maps to:
|
140
|
-
/api/clouds/:cloud_id/volumes/:volume_id/volume_attachment
|
141
|
-
The instance's volume_attachments can be accessed using:
|
142
|
-
@instance_client.get_instance.volume_attachments
|
143
|
-
which maps to:
|
144
|
-
/api/clouds/:cloud_id/instances/:instance_id/volume_attachments
|
145
|
-
|
146
|
-
Because the cloud_id and the instance_id are automatically added by the client, scripts that work for regular
|
147
|
-
email-password logins will have to be modified for instance-facing calls. The main reason behind this is the
|
148
|
-
inability for instance-facing calls to access the clouds resource (i.e.: <tt>@instance_client.clouds(:id=> :cloud_id).show</tt> will fail)
|
149
|
-
|
150
|
-
When you query <tt>api_methods</tt>, it will list all of the methods that one sees with regular email-password logins.
|
151
|
-
Due to the limiting scope of the instance-facing calls, only a subset of these methods can be called
|
152
|
-
(see the API Reference Docs for valid methods). If you call a method that instance's are not authorized to access,
|
153
|
-
you will get a 403 Permission Denied error.
|
154
|
-
|
155
|
-
|
156
|
-
= Design Decisions
|
157
|
-
In the code, we only hard-code CRUD operations for resources. We use the .show and .index methods to make the client
|
158
|
-
more efficient. Since it dynamically creates methods it needs to query the API at times. The .show and the .index make
|
159
|
-
it explicit that querying needs to take place. Without them a GET would have to be queried every step of the way
|
160
|
-
(i.e.: the index call would be client.deployments, and the create call would be client.deployments.create which would
|
161
|
-
first do an index call).
|
162
|
-
|
163
|
-
<b>In general, when a new API resource is added, you need to indicate in the client whether index, show, create, update
|
164
|
-
and delete methods are allowed for that resource.</b>
|
165
|
-
|
166
|
-
== Special Cases
|
167
|
-
=== Returning resource_types that are not actual API resources:
|
168
|
-
- tags:
|
169
|
-
- by_resource, by_tag: both return a COLLECTION of resource_type = RESOURCE_TAG
|
170
|
-
- no show or index is defined for that resource_type, therefore return a collection of ResourceDetail objects
|
171
|
-
- data:
|
172
|
-
- querying .data for monitoring_metrics:
|
173
|
-
- no show is defined for that resource_type, therefore return a ResourceDetail object
|
174
|
-
|
175
|
-
=== Index call does not act like an index call
|
176
|
-
- session:
|
177
|
-
- session.index should act like a show call and not like an index call (since you cannot query show).
|
178
|
-
Therefore it should return a ResourceDetail object
|
179
|
-
- inputs
|
180
|
-
- inputs.index cannot return a collection of Resource objects since .show is not allowed. Therefore it should
|
181
|
-
return a collection of ResourceDetail objects
|
182
|
-
|
183
|
-
=== Having a resource_type that cannot be accurately determined from the URL:
|
184
|
-
- In server_arrays.show: resource_type = current_instance(s) (although it should be instance(s))
|
185
|
-
- In multi_cloud_images.show: resource_type = setting(s) (although it should be multi_cloud_image_setting)
|
186
|
-
Put these special cases in the <tt>RightApi::Helper::INCONSISTENT_RESOURCE_TYPES</tt> hash.
|
187
|
-
|
188
|
-
=== Method defined on the generic resource_type itself
|
189
|
-
- 'instances' => {:multi_terminate => 'do_post', :multi_run_executable => 'do_post'},
|
190
|
-
- 'inputs' => {:multi_update => 'do_put'},
|
191
|
-
- 'tags' => {:by_tag => 'do_post', :by_resource => 'do_post', :multi_add => 'do_post', :multi_delete =>'do_post'},
|
192
|
-
- 'backups' => {:cleanup => 'do_post'}
|
193
|
-
Put these special cases in the <tt>RightApi::Helper::RESOURCE_TYPE_SPECIAL_ACTIONS</tt> hash.
|
194
|
-
|
195
|
-
=== Resources are not linked together
|
196
|
-
- In ResourceDetail, resource_type = Instance, need live_tasks as a method.
|
197
|
-
|
198
|
-
= Troubleshooting
|
199
|
-
|
200
|
-
== Wrong ruby version
|
201
|
-
|
202
|
-
Ruby 1.8.7 or higher is required.
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.0.2
|
data/login_to_connection_irb.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# A quick way to login to the API and jump into IRB so you can experiment with the connection.
|
2
|
-
# Add this to your bash profile to make it simpler:
|
3
|
-
# alias connection='bundle exec ruby login_to_connection_irb.rb'
|
4
|
-
|
5
|
-
require File.expand_path('../lib/rest_connection', __FILE__)
|
6
|
-
require 'yaml'
|
7
|
-
require 'irb'
|
8
|
-
|
9
|
-
begin
|
10
|
-
@connection = RestConnection::Connection.new()
|
11
|
-
puts "logged-in to the API, use the '@connection' variable to use the connection"
|
12
|
-
end
|
13
|
-
|
14
|
-
IRB.start
|
15
|
-
|
16
|
-
#
|
17
|
-
#require 'rubygems'
|
18
|
-
#require 'rest_connection'
|
19
|
-
#require 'ruby-debug'
|
20
|
-
#
|
21
|
-
#debugger
|
22
|
-
#puts "done!"
|