right_api_client 1.5.19 → 1.5.21
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/.travis.yml +9 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +21 -5
- data/Gemfile.lock +45 -12
- data/README.md +1 -0
- data/Rakefile +32 -11
- data/VERSION +1 -0
- data/lib/right_api_client/client.rb +1 -1
- data/lib/right_api_client/version.rb +3 -3
- metadata +18 -51
- data/.gitignore +0 -13
- data/.rspec +0 -4
- data/config/login.yml.example +0 -35
- data/right_api_client.gemspec +0 -32
- data/spec/functional/audit_entries_spec.rb +0 -64
- data/spec/functional/client_spec.rb +0 -175
- data/spec/spec_helper.rb +0 -24
- data/spec/support/mock_spec_helper.rb +0 -36
- data/spec/unit/helper_spec.rb +0 -78
- data/spec/unit/instance_facing_spec.rb +0 -24
- data/spec/unit/resource_detail_spec.rb +0 -53
- data/spec/unit/resource_spec.rb +0 -24
- data/spec/unit/resources_spec.rb +0 -27
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# CHANGELOG.md
|
2
2
|
|
3
|
+
## 1.5.21
|
4
|
+
- \#71 Stop locking rest-client to 1.6.x and return to locking it to 1.x
|
5
|
+
|
6
|
+
## 1.5.20
|
7
|
+
- \#67 Fix bug preventing configuration from setting nil for :timeout.
|
8
|
+
- \#67 Lock rest-client to 1.6.x due to requirement for Ruby 1.8.7 support.
|
9
|
+
- \#66 Add [TravisCI support](https://travis-ci.org/rightscale/right_api_client).
|
10
|
+
- \#64 Jewelerize the project to make maintenance easier.
|
11
|
+
|
3
12
|
## 1.5.19
|
4
13
|
- \#38 Specify `:allow_nan => true` in calls to `JSON.parse` so we don't choke on NAN values.
|
5
14
|
- \#60 Make exception [namespace change](https://github.com/rightscale/right_api_client/commit/84f477907eef0a583ee5bec0ee5336309d933c75) fully backwards compatible.
|
data/Gemfile
CHANGED
@@ -1,8 +1,24 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gemspec
|
3
|
+
# Runtime dependencies that should appear in the gemspec.
|
4
|
+
gem 'json', '~> 1.0'
|
5
|
+
gem 'mime-types', '~> 1.0'
|
6
|
+
gem 'rest-client', '~> 1.6'
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
gem '
|
8
|
-
|
8
|
+
# Development dependencies that should appear in the gemspec.
|
9
|
+
group :development do
|
10
|
+
gem 'rake', '0.8.7'
|
11
|
+
gem 'rspec', '2.9.0'
|
12
|
+
gem 'flexmock', '0.8.7'
|
13
|
+
gem 'simplecov', '0.4.2',
|
14
|
+
:platforms => [:ruby_19, :ruby_20, :ruby_21]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Gems used during test and development that should be OMITTED from the gemspec
|
18
|
+
group :test do
|
19
|
+
gem 'ruby-debug',
|
20
|
+
:platforms => [:ruby_18]
|
21
|
+
gem 'debugger',
|
22
|
+
:platforms => [:ruby_19, :ruby_20, :ruby_21]
|
23
|
+
gem 'jeweler', '~> 2.0'
|
24
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,8 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
right_api_client (1.5.19)
|
5
|
-
json (~> 1.0)
|
6
|
-
mime-types (~> 1.0)
|
7
|
-
rest-client (~> 1.6)
|
8
|
-
|
9
1
|
GEM
|
10
2
|
remote: https://rubygems.org/
|
11
3
|
specs:
|
4
|
+
addressable (2.3.6)
|
5
|
+
builder (3.2.2)
|
12
6
|
columnize (0.3.6)
|
13
7
|
debugger (1.6.6)
|
14
8
|
columnize (>= 0.3.1)
|
@@ -17,15 +11,52 @@ GEM
|
|
17
11
|
debugger-linecache (1.2.0)
|
18
12
|
debugger-ruby_core_source (1.3.2)
|
19
13
|
diff-lcs (1.1.3)
|
14
|
+
faraday (0.8.9)
|
15
|
+
multipart-post (~> 1.2.0)
|
20
16
|
flexmock (0.8.7)
|
17
|
+
git (1.2.6)
|
18
|
+
github_api (0.10.1)
|
19
|
+
addressable
|
20
|
+
faraday (~> 0.8.1)
|
21
|
+
hashie (>= 1.2)
|
22
|
+
multi_json (~> 1.4)
|
23
|
+
nokogiri (~> 1.5.2)
|
24
|
+
oauth2
|
25
|
+
hashie (3.0.0)
|
26
|
+
highline (1.6.21)
|
27
|
+
jeweler (2.0.1)
|
28
|
+
builder
|
29
|
+
bundler (>= 1.0)
|
30
|
+
git (>= 1.2.5)
|
31
|
+
github_api
|
32
|
+
highline (>= 1.6.15)
|
33
|
+
nokogiri (>= 1.5.10)
|
34
|
+
rake
|
35
|
+
rdoc
|
21
36
|
json (1.8.1)
|
37
|
+
jwt (0.1.11)
|
38
|
+
multi_json (>= 1.5)
|
22
39
|
linecache (0.46)
|
23
40
|
rbx-require-relative (> 0.0.4)
|
24
41
|
mime-types (1.25.1)
|
42
|
+
multi_json (1.10.1)
|
43
|
+
multi_xml (0.5.5)
|
44
|
+
multipart-post (1.2.0)
|
45
|
+
nokogiri (1.5.11)
|
46
|
+
oauth2 (0.9.3)
|
47
|
+
faraday (>= 0.8, < 0.10)
|
48
|
+
jwt (~> 0.1.8)
|
49
|
+
multi_json (~> 1.3)
|
50
|
+
multi_xml (~> 0.5)
|
51
|
+
rack (~> 1.2)
|
52
|
+
rack (1.5.2)
|
25
53
|
rake (0.8.7)
|
26
54
|
rbx-require-relative (0.0.9)
|
27
|
-
|
28
|
-
|
55
|
+
rdoc (4.1.1)
|
56
|
+
json (~> 1.4)
|
57
|
+
rest-client (1.6.8)
|
58
|
+
mime-types (~> 1.16)
|
59
|
+
rdoc (>= 2.4.2)
|
29
60
|
rspec (2.9.0)
|
30
61
|
rspec-core (~> 2.9.0)
|
31
62
|
rspec-expectations (~> 2.9.0)
|
@@ -47,11 +78,13 @@ PLATFORMS
|
|
47
78
|
ruby
|
48
79
|
|
49
80
|
DEPENDENCIES
|
50
|
-
bundler (~> 1.0)
|
51
81
|
debugger
|
52
82
|
flexmock (= 0.8.7)
|
83
|
+
jeweler (~> 2.0)
|
84
|
+
json (~> 1.0)
|
85
|
+
mime-types (~> 1.0)
|
53
86
|
rake (= 0.8.7)
|
54
|
-
|
87
|
+
rest-client (~> 1.6)
|
55
88
|
rspec (= 2.9.0)
|
56
89
|
ruby-debug
|
57
90
|
simplecov (= 0.4.2)
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# RightScale API Client
|
2
|
+
[](https://travis-ci.org/rightscale/right_api_client)
|
2
3
|
|
3
4
|
The right\_api\_client gem simplifies the use of RightScale's MultiCloud API. It provides
|
4
5
|
a simple object model of the API resources, and handles all of the fine details involved
|
data/Rakefile
CHANGED
@@ -1,17 +1,38 @@
|
|
1
|
-
require
|
2
|
-
require 'rubygems'
|
3
|
-
require 'rake'
|
1
|
+
require 'jeweler'
|
4
2
|
require 'rspec/core/rake_task'
|
5
3
|
|
6
|
-
|
7
|
-
|
4
|
+
RSpec::Core::RakeTask.new('spec') do |t|
|
5
|
+
t.pattern= 'spec/**/*_spec.rb'
|
8
6
|
end
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
tasks = Jeweler::Tasks.new do |gem|
|
9
|
+
# gem is a Gem::Specification; see http://docs.rubygems.org/read/chapter/20 for more options
|
10
|
+
gem.name = 'right_api_client'
|
11
|
+
gem.homepage = 'https://github.com/rightscale/right_api_client'
|
12
|
+
gem.license = 'MIT'
|
13
|
+
gem.summary = 'RightScale MultiCloud API HTTP Client'
|
14
|
+
gem.description = %{
|
15
|
+
The right_api_client gem simplifies the use of RightScale's MultiCloud API.
|
16
|
+
It provides a simple object model of the API resources, and handles all of the
|
17
|
+
fine details involved in making HTTP calls and translating their responses.
|
18
|
+
}
|
19
|
+
gem.email = 'rubygems@rightscale.com'
|
20
|
+
gem.authors = ['RightScale, Inc.']
|
13
21
|
|
14
|
-
|
15
|
-
|
16
|
-
|
22
|
+
# This gem is special; its own VERSION file needs to be shipped with the gem in order to
|
23
|
+
# initialize the VERSION constant living under RightApi::Client.
|
24
|
+
gem.files.include 'VERSION'
|
25
|
+
|
26
|
+
# Keep the gem nice and svelte
|
27
|
+
gem.files.exclude 'config'
|
28
|
+
gem.files.exclude 'cookies'
|
29
|
+
gem.files.exclude 'spec'
|
17
30
|
end
|
31
|
+
|
32
|
+
# Never auto-commit during operations that change the repository. Allows developers to decide on their own commit comment
|
33
|
+
# and/or aggregate version bumps into other fixes.
|
34
|
+
tasks.jeweler.commit = false
|
35
|
+
|
36
|
+
Jeweler::RubygemsDotOrgTasks.new
|
37
|
+
|
38
|
+
CLEAN.include('pkg')
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.5.21
|
@@ -45,7 +45,7 @@ module RightApi
|
|
45
45
|
|
46
46
|
# Initializing all instance variables from hash
|
47
47
|
args.each { |key,value|
|
48
|
-
instance_variable_set("@#{key}", value) if
|
48
|
+
instance_variable_set("@#{key}", value) if AUTH_PARAMS.include?(key.to_s)
|
49
49
|
} if args.is_a? Hash
|
50
50
|
|
51
51
|
raise 'This API client is only compatible with the RightScale API 1.5 and upwards.' if (Float(@api_version) < 1.5)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# This gem is versioned with the usual X.Y.Z notation, where X.Y is the API version, and Z is the client version.
|
2
2
|
module RightApi
|
3
3
|
class Client
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
VERSION = File.read(File.expand_path('../../../VERSION', __FILE__)).strip
|
5
|
+
API_VERSION = VERSION.split('.')[0..1].join('.')
|
6
|
+
CLIENT_VERSION = VERSION.split('.')[1..-1].join('.')
|
7
7
|
end
|
8
8
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_api_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 41
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 5
|
9
|
-
-
|
10
|
-
version: 1.5.
|
9
|
+
- 21
|
10
|
+
version: 1.5.21
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- RightScale, Inc.
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2014-
|
18
|
+
date: 2014-08-21 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|
@@ -126,43 +126,29 @@ dependencies:
|
|
126
126
|
version: 0.4.2
|
127
127
|
prerelease: false
|
128
128
|
requirement: *id007
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
hash: 15
|
138
|
-
segments:
|
139
|
-
- 1
|
140
|
-
- 0
|
141
|
-
version: "1.0"
|
142
|
-
prerelease: false
|
143
|
-
requirement: *id008
|
144
|
-
description: "\n\
|
145
|
-
The right_api_client gem simplifies the use of RightScale's MultiCloud API.\n\
|
146
|
-
It provides a simple object model of the API resources, and handles all of the\n\
|
147
|
-
fine details involved in making HTTP calls and translating their responses.\n "
|
148
|
-
email:
|
149
|
-
- rubygems@rightscale.com
|
129
|
+
description: |
|
130
|
+
|
131
|
+
The right_api_client gem simplifies the use of RightScale's MultiCloud API.
|
132
|
+
It provides a simple object model of the API resources, and handles all of the
|
133
|
+
fine details involved in making HTTP calls and translating their responses.
|
134
|
+
|
135
|
+
email: rubygems@rightscale.com
|
150
136
|
executables: []
|
151
137
|
|
152
138
|
extensions: []
|
153
139
|
|
154
|
-
extra_rdoc_files:
|
155
|
-
|
140
|
+
extra_rdoc_files:
|
141
|
+
- LICENSE.txt
|
142
|
+
- README.md
|
156
143
|
files:
|
157
|
-
- .
|
158
|
-
- .rspec
|
144
|
+
- .travis.yml
|
159
145
|
- CHANGELOG.md
|
160
146
|
- Gemfile
|
161
147
|
- Gemfile.lock
|
162
148
|
- LICENSE.txt
|
163
149
|
- README.md
|
164
150
|
- Rakefile
|
165
|
-
-
|
151
|
+
- VERSION
|
166
152
|
- lib/right_api_client.rb
|
167
153
|
- lib/right_api_client/client.rb
|
168
154
|
- lib/right_api_client/errors.rb
|
@@ -173,17 +159,7 @@ files:
|
|
173
159
|
- lib/right_api_client/resources.rb
|
174
160
|
- lib/right_api_client/version.rb
|
175
161
|
- login_to_client_irb.rb
|
176
|
-
- right_api_client.gemspec
|
177
162
|
- right_api_client.rconf
|
178
|
-
- spec/functional/audit_entries_spec.rb
|
179
|
-
- spec/functional/client_spec.rb
|
180
|
-
- spec/spec_helper.rb
|
181
|
-
- spec/support/mock_spec_helper.rb
|
182
|
-
- spec/unit/helper_spec.rb
|
183
|
-
- spec/unit/instance_facing_spec.rb
|
184
|
-
- spec/unit/resource_detail_spec.rb
|
185
|
-
- spec/unit/resource_spec.rb
|
186
|
-
- spec/unit/resources_spec.rb
|
187
163
|
homepage: https://github.com/rightscale/right_api_client
|
188
164
|
licenses:
|
189
165
|
- MIT
|
@@ -217,14 +193,5 @@ rubygems_version: 1.8.15
|
|
217
193
|
signing_key:
|
218
194
|
specification_version: 3
|
219
195
|
summary: RightScale MultiCloud API HTTP Client
|
220
|
-
test_files:
|
221
|
-
|
222
|
-
- spec/functional/audit_entries_spec.rb
|
223
|
-
- spec/functional/client_spec.rb
|
224
|
-
- spec/spec_helper.rb
|
225
|
-
- spec/support/mock_spec_helper.rb
|
226
|
-
- spec/unit/helper_spec.rb
|
227
|
-
- spec/unit/instance_facing_spec.rb
|
228
|
-
- spec/unit/resource_detail_spec.rb
|
229
|
-
- spec/unit/resource_spec.rb
|
230
|
-
- spec/unit/resources_spec.rb
|
196
|
+
test_files: []
|
197
|
+
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/config/login.yml.example
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# The API login details can be put in a YAML file. This is an example login.yml which
|
2
|
-
# will be needed for login_to_client_irb.rb quick login method.
|
3
|
-
|
4
|
-
# Account ID is a required parameter. You can find your account number by logging into the
|
5
|
-
# RightScale dashboard (https://my.rightscale.com), navigate to the Settings > Account Settings page.
|
6
|
-
# The account number is at the end of the browser address bar.
|
7
|
-
:account_id: my_account_id
|
8
|
-
|
9
|
-
# There are five login mechanisms:
|
10
|
-
|
11
|
-
# 0. Use the following parameters to login with your email and base64-encoded password:
|
12
|
-
# To encode your plaintext password, use 'base64' command or similar.
|
13
|
-
:email: my@email.com
|
14
|
-
:password_base64: my_password_encoded_as_base64
|
15
|
-
|
16
|
-
# 1. Use the following parameters to login with your email and plaintext password:
|
17
|
-
:email: my@email.com
|
18
|
-
:password: my_password
|
19
|
-
|
20
|
-
# 2. Use the following parameter to login with an instance_token:
|
21
|
-
# To find the instance_token, launch a server, navigate to the info page and under
|
22
|
-
# User Data box, you will see RS_API_TOKEN = your_account_id:the_instance_token
|
23
|
-
:instance_token: my_instance_token
|
24
|
-
|
25
|
-
# 3. Use the following parameter to send a pre-authenticated cookie with every request:
|
26
|
-
:cookies: my_cookie_string
|
27
|
-
|
28
|
-
# 4. Use the following parameter to send an existing OAuth access token with every request:
|
29
|
-
# To learn more about OAuth and how to obtain an access token, see
|
30
|
-
# http://support.rightscale.com/12-Guides/03-Rightscale_API/OAuth
|
31
|
-
:access_token: my_token_string
|
32
|
-
|
33
|
-
# The following are optional parameters:
|
34
|
-
:api_url: (this defaults to https://my.rightscale.com)
|
35
|
-
:api_version: (this defaults to 1.5)
|
data/right_api_client.gemspec
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require File.expand_path('../lib/right_api_client/version', __FILE__)
|
2
|
-
|
3
|
-
Gem::Specification.new do |s|
|
4
|
-
s.name = 'right_api_client'
|
5
|
-
s.version = RightApi::Client::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/right_api_client'
|
12
|
-
s.summary = 'RightScale MultiCloud API HTTP Client'
|
13
|
-
s.license = 'MIT'
|
14
|
-
s.description = %{
|
15
|
-
The right_api_client gem simplifies the use of RightScale's MultiCloud API.
|
16
|
-
It provides a simple object model of the API resources, and handles all of the
|
17
|
-
fine details involved in making HTTP calls and translating their responses.
|
18
|
-
}
|
19
|
-
s.files = `git ls-files`.split(' ')
|
20
|
-
s.test_files = `git ls-files spec config`.split(' ')
|
21
|
-
s.rubygems_version = '1.3.7'
|
22
|
-
|
23
|
-
s.add_runtime_dependency 'json', '~> 1.0'
|
24
|
-
s.add_runtime_dependency 'mime-types', '~> 1.0'
|
25
|
-
s.add_runtime_dependency 'rest-client', '~> 1.6'
|
26
|
-
|
27
|
-
s.add_development_dependency 'rake', '0.8.7'
|
28
|
-
s.add_development_dependency 'rspec', '2.9.0'
|
29
|
-
s.add_development_dependency 'flexmock', '0.8.7'
|
30
|
-
s.add_development_dependency 'simplecov', '0.4.2'
|
31
|
-
s.add_development_dependency 'bundler', '~> 1.0'
|
32
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe RightApi::Client do
|
4
|
-
|
5
|
-
before(:all) do
|
6
|
-
|
7
|
-
creds = File.expand_path('../../../config/login.yml', __FILE__)
|
8
|
-
|
9
|
-
begin
|
10
|
-
@client = RightApi::Client.new(YAML.load_file(creds))
|
11
|
-
rescue Exception => e
|
12
|
-
puts "=" * 80
|
13
|
-
puts "WARNING: please provide a valid config/login.yml file"
|
14
|
-
puts
|
15
|
-
puts e.message
|
16
|
-
puts "=" * 80
|
17
|
-
end
|
18
|
-
|
19
|
-
server_arrays =
|
20
|
-
@client.server_arrays.index
|
21
|
-
|
22
|
-
@server_array =
|
23
|
-
server_arrays.find { |sa| sa.name.match(/test/i) } ||
|
24
|
-
server_arrays.first
|
25
|
-
|
26
|
-
raise "sorry, can't test, no server arrays in your RS" unless @server_array
|
27
|
-
end
|
28
|
-
|
29
|
-
describe '#audit_entries' do
|
30
|
-
|
31
|
-
describe '#create' do
|
32
|
-
|
33
|
-
it 'creates audit entries' do
|
34
|
-
|
35
|
-
ae = @client.audit_entries.create(:audit_entry => {
|
36
|
-
'auditee_href' => @server_array.href,
|
37
|
-
'summary' => "right_api_client test #{$$}-#{Time.now.to_f}",
|
38
|
-
'detail' => 'sacrificing goats to make it work'
|
39
|
-
})
|
40
|
-
|
41
|
-
ae.class.should == RightApi::Resource
|
42
|
-
ae.show.href.should match(/^\/api\/audit_entries\/[a-z0-9]+$/)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe 'AuditEntry resource' do
|
48
|
-
|
49
|
-
describe '#detail' do
|
50
|
-
|
51
|
-
it 'returns the detail plain text' do
|
52
|
-
|
53
|
-
ae = @client.audit_entries.create(:audit_entry => {
|
54
|
-
'auditee_href' => @server_array.href,
|
55
|
-
'summary' => "right_api_client test #{$$}-#{Time.now.to_f}",
|
56
|
-
'detail' => "and it's 1984"
|
57
|
-
})
|
58
|
-
|
59
|
-
ae.show.detail.show.text.should == "and it's 1984"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
@@ -1,175 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe RightApi::Client do
|
4
|
-
|
5
|
-
context "given a valid set of credentials in the config/login.yml file" do
|
6
|
-
|
7
|
-
before(:all) do
|
8
|
-
@creds = '../../../config/login.yml'
|
9
|
-
begin
|
10
|
-
@client = RightApi::Client.new(YAML.load_file(File.expand_path(@creds, __FILE__)))
|
11
|
-
rescue => e
|
12
|
-
puts "WARNING: The following specs need a valid set of credentials as they are integration tests that can only be done by calling the API server"
|
13
|
-
puts e.message
|
14
|
-
puts e.backtrace
|
15
|
-
end
|
16
|
-
|
17
|
-
# Don't bother to run tests if the client didn't initialize
|
18
|
-
@client.should_not be_nil
|
19
|
-
end
|
20
|
-
|
21
|
-
it "logs in" do
|
22
|
-
@client.send(:headers)[:cookies].should_not be_nil
|
23
|
-
@client.session.index.message.should == 'You have successfully logged into the RightScale API.'
|
24
|
-
end
|
25
|
-
|
26
|
-
it "returns valid cookies" do
|
27
|
-
@client.cookies.class.should == Hash
|
28
|
-
@client.cookies['_session_id'].should_not be_nil
|
29
|
-
@client.cookies['domain'].should match /rightscale.com$/
|
30
|
-
@client.cookies.keys.sort.last.should match /^rs_gbl/ # HACK: not quite sane sanity check
|
31
|
-
end
|
32
|
-
|
33
|
-
it "accepts a cookie argument when creating a new client" do
|
34
|
-
my_hash = YAML.load_file(File.expand_path(@creds, __FILE__))
|
35
|
-
my_hash.delete(:email)
|
36
|
-
my_hash.delete(:password)
|
37
|
-
my_hash.delete(:cookies)
|
38
|
-
my_hash[:cookies] = @client.cookies
|
39
|
-
client1 = RightApi::Client.new(my_hash)
|
40
|
-
client1.cookies.should == @client.cookies
|
41
|
-
end
|
42
|
-
|
43
|
-
it "accepts an access_token argument when creating a new client" do
|
44
|
-
my_hash = YAML.load_file(File.expand_path(@creds, __FILE__))
|
45
|
-
my_hash.delete(:email)
|
46
|
-
my_hash.delete(:password)
|
47
|
-
my_hash.delete(:cookies)
|
48
|
-
|
49
|
-
access_token = @client.cookies.detect { |k, _| k =~ /^rs_gbl/ }.last
|
50
|
-
access_token.should_not be_nil
|
51
|
-
my_hash[:access_token] = access_token
|
52
|
-
|
53
|
-
client1 = RightApi::Client.new(my_hash)
|
54
|
-
client1.access_token.should == access_token
|
55
|
-
end
|
56
|
-
|
57
|
-
it "timestamps cookies" do
|
58
|
-
|
59
|
-
@client.cookies.timestamp.should_not == nil
|
60
|
-
end
|
61
|
-
|
62
|
-
it "keeps track of the cookies all the time" do
|
63
|
-
|
64
|
-
t0 = @client.cookies.timestamp
|
65
|
-
|
66
|
-
@client.deployments.index
|
67
|
-
t1 = @client.cookies.timestamp
|
68
|
-
|
69
|
-
t0.to_f.should < t1.to_f
|
70
|
-
end
|
71
|
-
|
72
|
-
it "accepts a YAML argument when creating a new client" do
|
73
|
-
client2 = RightApi::Client.new(YAML.load_file(File.expand_path(@creds, __FILE__)))
|
74
|
-
client2.cookies.should_not == @client.cookies
|
75
|
-
end
|
76
|
-
|
77
|
-
it "sends post/get/put/delete requests to the server correctly" do
|
78
|
-
deployment_name = "right_api_client functional test #{Time.now.to_s}"
|
79
|
-
# create a new deployment
|
80
|
-
new_deployment = @client.deployments.create(:deployment => {:name => deployment_name})
|
81
|
-
new_deployment.class.should == RightApi::Resource
|
82
|
-
new_deployment.show.name.should == deployment_name
|
83
|
-
|
84
|
-
# verify new deployment
|
85
|
-
deployment = @client.deployments(:id => new_deployment.show.href.split('/').last)
|
86
|
-
deployment.class.should == RightApi::Resource
|
87
|
-
deployment.show.class.should == RightApi::ResourceDetail
|
88
|
-
deployment.show.href.should == new_deployment.show.href
|
89
|
-
|
90
|
-
# update deployment
|
91
|
-
deployment.update(:deployment => {:name => "#{deployment_name} updated"}).should be_nil
|
92
|
-
deployment.show.name.should == "#{deployment_name} updated"
|
93
|
-
|
94
|
-
# delete deployment
|
95
|
-
deployment.destroy.should be_nil
|
96
|
-
end
|
97
|
-
|
98
|
-
# Tags are a bit special as they use POST and return content type so they need specific tests
|
99
|
-
it "adds tag to deployment" do
|
100
|
-
deployment_name = "right_api_client functional test #{Time.now.to_s}"
|
101
|
-
|
102
|
-
# create a new deployment
|
103
|
-
new_deployment = @client.deployments.create(:deployment => {:name => deployment_name})
|
104
|
-
|
105
|
-
# add a tag to deployment
|
106
|
-
@client.tags.multi_add("resource_hrefs[]=#{new_deployment.show.href}&tags[]=tag1").should == nil
|
107
|
-
|
108
|
-
# verify tag
|
109
|
-
tags = @client.tags.by_resource("resource_hrefs[]=#{new_deployment.show.href}")
|
110
|
-
tags.class.should == Array
|
111
|
-
tags.first.class.should == RightApi::ResourceDetail
|
112
|
-
tags.first.tags.first.should == {"name" => "tag1"}
|
113
|
-
tags.first.resource.show.name.should == deployment_name
|
114
|
-
|
115
|
-
# delete deployment
|
116
|
-
new_deployment.destroy.should be_nil
|
117
|
-
end
|
118
|
-
|
119
|
-
it "singularizes resource_types correctly" do
|
120
|
-
@client.get_singular('servers').should == 'server'
|
121
|
-
@client.get_singular('deployments').should == 'deployment'
|
122
|
-
@client.get_singular('audit_entries').should == 'audit_entry'
|
123
|
-
@client.get_singular('processes').should == 'process'
|
124
|
-
@client.get_singular('ip_addresses').should == 'ip_address'
|
125
|
-
end
|
126
|
-
|
127
|
-
it "returns the resource when calling #resource(href)" do
|
128
|
-
|
129
|
-
d0 = @client.deployments.index.first
|
130
|
-
|
131
|
-
d1 = @client.resource(d0.href)
|
132
|
-
|
133
|
-
d1.href.should == d0.href
|
134
|
-
end
|
135
|
-
|
136
|
-
it "raises meaningful errors" do
|
137
|
-
|
138
|
-
err = begin
|
139
|
-
@client.resource('/api/nada')
|
140
|
-
rescue => e
|
141
|
-
e
|
142
|
-
end
|
143
|
-
|
144
|
-
err.class.should ==
|
145
|
-
RightApi::UnknownRouteError
|
146
|
-
err.message.should ==
|
147
|
-
"Unknown action or route. HTTP Code: 404, Response body: " +
|
148
|
-
"NotFound: No route matches \"/api/nada\" with {:method=>:get}"
|
149
|
-
end
|
150
|
-
|
151
|
-
it "wraps errors with _details" do
|
152
|
-
|
153
|
-
err = begin
|
154
|
-
@client.deployments(:id => 'nada').show
|
155
|
-
rescue => e
|
156
|
-
e
|
157
|
-
end
|
158
|
-
|
159
|
-
#p err
|
160
|
-
#puts err.backtrace
|
161
|
-
|
162
|
-
err._details.method.should == :get
|
163
|
-
err._details.path.should == '/api/deployments/nada'
|
164
|
-
err._details.params.should == {}
|
165
|
-
|
166
|
-
err._details.request.class.should == RestClient::Request
|
167
|
-
|
168
|
-
err._details.response.code.should == 422
|
169
|
-
err._details.response.class.should == String
|
170
|
-
err._details.response.should == "ResourceNotFound: Couldn't find Deployment with ID=nada "
|
171
|
-
|
172
|
-
err._details.code.should == 422
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'pp'
|
3
|
-
require 'yaml'
|
4
|
-
|
5
|
-
require File.expand_path('../../lib/right_api_client', __FILE__)
|
6
|
-
|
7
|
-
|
8
|
-
RSpec.configure do |config|
|
9
|
-
|
10
|
-
#
|
11
|
-
# include helpers
|
12
|
-
|
13
|
-
$config = config
|
14
|
-
|
15
|
-
Dir[File.expand_path('../support/**/*.rb', __FILE__)].each do |path|
|
16
|
-
require(path)
|
17
|
-
end
|
18
|
-
|
19
|
-
#
|
20
|
-
# misc
|
21
|
-
|
22
|
-
config.mock_with :flexmock
|
23
|
-
end
|
24
|
-
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module MockSpecHelper
|
2
|
-
|
3
|
-
def mock_rest_client
|
4
|
-
@api_version = RightApi::Client::API_VERSION
|
5
|
-
@test_account_id = '1'
|
6
|
-
@rest_client = RestClient::Resource.new(RightApi::Client::DEFAULT_API_URL)
|
7
|
-
flexmock(RestClient::Resource).should_receive(:new).and_return(@rest_client)
|
8
|
-
@session = flexmock(:cookies => {})
|
9
|
-
@header = {'X-Api-Version' => @api_version, 'X-Account' => @test_account_id, :cookies => {}, :accept => :json}
|
10
|
-
end
|
11
|
-
|
12
|
-
def given_user_facing_client
|
13
|
-
mock_rest_client
|
14
|
-
flexmock(@rest_client).should_receive(:post).with(
|
15
|
-
{'email' => 'email', 'password' => 'password', 'account_href' => '/api/accounts/1'},
|
16
|
-
{'X-Api-Version' => @api_version}, Proc).and_return(@session)
|
17
|
-
flexmock(@rest_client).should_receive(:get).with(@header, Proc).and_return(['', '{}'])
|
18
|
-
@client = RightApi::Client.new(:email => 'email', :password => 'password', :account_id => @test_account_id)
|
19
|
-
end
|
20
|
-
|
21
|
-
def given_instance_facing_client
|
22
|
-
mock_rest_client
|
23
|
-
flexmock(@rest_client).should_receive(:post).with(
|
24
|
-
{'instance_token' => 'instance_token', 'account_href' => '/api/accounts/1'},
|
25
|
-
{'X-Api-Version' => @api_version}, Proc).and_return(@session)
|
26
|
-
flexmock(@rest_client).should_receive(:get).with(@header, Proc).and_return(['', '{"links": [
|
27
|
-
{
|
28
|
-
"href": "/api/clouds/1/instances/1",
|
29
|
-
"rel": "self"
|
30
|
-
}]}'])
|
31
|
-
@client = RightApi::Client.new(:instance_token => 'instance_token', :account_id => @test_account_id)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
$config.include MockSpecHelper
|
36
|
-
|
data/spec/unit/helper_spec.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
include RightApi::Helper
|
3
|
-
|
4
|
-
describe RightApi::Helper do
|
5
|
-
|
6
|
-
API_MEDIA_TYPES = %w{audit_entry ip_address process server}
|
7
|
-
|
8
|
-
context "#is_singular?" do
|
9
|
-
API_MEDIA_TYPES.each do |media_type|
|
10
|
-
it "should identify media type #{media_type} as singular" do
|
11
|
-
is_singular?(media_type).should == true
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
context "#fix_array_of_hashes" do
|
17
|
-
it "fixes all the keys that have the value as array of hashes" do
|
18
|
-
res = fix_array_of_hashes(
|
19
|
-
'a' => '1',
|
20
|
-
'b' => [1, 2, 3],
|
21
|
-
'c' => {1 => 2, 3 => 4},
|
22
|
-
'd' => [
|
23
|
-
{5 => 6, 7 => 8},
|
24
|
-
{9 => 10, 11 => 12}
|
25
|
-
]
|
26
|
-
)
|
27
|
-
|
28
|
-
res.should == {
|
29
|
-
'a' => '1',
|
30
|
-
'b' => [1, 2, 3],
|
31
|
-
'c' => {1 => 2, 3 => 4},
|
32
|
-
'd[]' => [
|
33
|
-
{5 => 6, 7 => 8},
|
34
|
-
{9 => 10, 11 => 12}
|
35
|
-
]
|
36
|
-
}
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
it "fixes key that have a top-level array of hashes as value" do
|
41
|
-
res = fix_array_of_hashes(
|
42
|
-
'a' => [
|
43
|
-
{1 => 2},
|
44
|
-
{3 => 4}
|
45
|
-
]
|
46
|
-
)
|
47
|
-
|
48
|
-
res.should == {
|
49
|
-
'a[]' => [
|
50
|
-
{1 => 2},
|
51
|
-
{3 => 4}
|
52
|
-
]
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
56
|
-
it "fixes key that have a nested array of hashes as value" do
|
57
|
-
res = fix_array_of_hashes(
|
58
|
-
'a' => {
|
59
|
-
'b' => [
|
60
|
-
{1 => 2},
|
61
|
-
{3 => 4}
|
62
|
-
]
|
63
|
-
}
|
64
|
-
)
|
65
|
-
|
66
|
-
res.should == {
|
67
|
-
'a' => {
|
68
|
-
'b' => {
|
69
|
-
'' => [
|
70
|
-
{1 => 2},
|
71
|
-
{3 => 4}
|
72
|
-
]
|
73
|
-
}
|
74
|
-
}
|
75
|
-
}
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe RightApi::Client do
|
4
|
-
context "given an instance-facing logged in RightScale user" do
|
5
|
-
before(:each) do
|
6
|
-
given_instance_facing_client
|
7
|
-
end
|
8
|
-
|
9
|
-
it "has the required methods for the client" do
|
10
|
-
@client.api_methods.sort.collect{|s| s.to_s}.should == ["backups", "get_instance", "live_tasks", "volume_attachments", "volume_snapshots", "volume_types", "volumes"]
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns an instance of the Resource class when user provides an id" do
|
14
|
-
@client.volumes(:id => 1).class.should == RightApi::Resource
|
15
|
-
@client.backups(:id => 1).class.should == RightApi::Resource
|
16
|
-
@client.live_tasks(:id => 1).class.should == RightApi::Resource
|
17
|
-
end
|
18
|
-
|
19
|
-
it "returns an instance of the Resources class when user does not provide an id" do
|
20
|
-
@client.volumes.class.should == RightApi::Resources
|
21
|
-
@client.backups.class.should == RightApi::Resources
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe RightApi::ResourceDetail do
|
4
|
-
context "given a logged in RightScale user" do
|
5
|
-
before(:each) do
|
6
|
-
given_user_facing_client
|
7
|
-
end
|
8
|
-
|
9
|
-
it "has the required methods for instances of the ResourceDetail class" do
|
10
|
-
resource = RightApi::ResourceDetail.new(@client, 'deployment', '/api/deployments/1', {})
|
11
|
-
resource.api_methods.sort.collect{|s| s.to_s}.should == ["destroy", "links", "show", "update"]
|
12
|
-
end
|
13
|
-
|
14
|
-
it "has resource-specific methods for instances of the ResourceDetail class" do
|
15
|
-
resource = RightApi::ResourceDetail.new(@client, 'deployment', '/api/deployments/1',
|
16
|
-
{:attribute1 => 'value1', :attribute2 => 'value2'})
|
17
|
-
resource.api_methods.sort.collect{|s| s.to_s}.should == ["attribute1", "attribute2", "destroy", "links", "show", "update"]
|
18
|
-
end
|
19
|
-
|
20
|
-
it "has the links for instances of the ResourceDetail class" do
|
21
|
-
resource = RightApi::ResourceDetail.new(@client, 'deployment', '/api/deployments/1',
|
22
|
-
{'links' => [{'rel' => 'link1', 'href' => 'link1_href'},
|
23
|
-
{'rel' => 'link2', 'href' => 'link2_href'}]})
|
24
|
-
resource.api_methods.sort.collect{|s| s.to_s}.should == ["destroy", "link1", "link2", "links", "show", "update"]
|
25
|
-
end
|
26
|
-
|
27
|
-
it "has the actions for instances of the ResourceDetail class" do
|
28
|
-
resource = RightApi::ResourceDetail.new(@client, 'deployment', '/api/deployments/1',
|
29
|
-
{'links' => [{'rel' => 'self', 'href' => 'self'}],
|
30
|
-
'actions' => [{'rel' => 'action1'}, {'rel' => 'action2'}]})
|
31
|
-
resource.api_methods.sort.collect{|s| s.to_s}.should == ["action1", "action2", "destroy", "href", "links", "show", "update"]
|
32
|
-
|
33
|
-
flexmock(@rest_client).should_receive(:post).with({}, @header, Proc).and_return('ok')
|
34
|
-
resource.action1.should == 'ok'
|
35
|
-
end
|
36
|
-
|
37
|
-
it "has live_tasks for the 'instance' resource" do
|
38
|
-
resource = RightApi::ResourceDetail.new(@client, 'instance', '/api/instances/1', {})
|
39
|
-
resource.api_methods.sort.collect{|s| s.to_s}.should == ["destroy", "links", "live_tasks", "show", "update"]
|
40
|
-
flexmock(RightApi::Resource).should_receive(:process).with(@client, 'live_task', '/api/instances/1/live/tasks/1').and_return('ok')
|
41
|
-
resource.live_tasks(:id => '1').should == 'ok'
|
42
|
-
end
|
43
|
-
|
44
|
-
it "adds methods for child resources from detailed views" do
|
45
|
-
resource = RightApi::ResourceDetail.new(@client, 'server', '/api/servers/1', {
|
46
|
-
'links' => [
|
47
|
-
{'href' => '/api/servers/1', 'rel' => 'self'},
|
48
|
-
{'href' => '/api/clouds/1/instances/1', 'rel' => 'current_instance'}],
|
49
|
-
'current_instance' => {'links' => [{'href' => '/api/clouds/1/instances/1', 'rel' => 'self'}]}})
|
50
|
-
resource.api_methods.collect{|s| s.to_s}.sort.should == ["current_instance", "destroy", "href", "links", "show", "update"]
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/spec/unit/resource_spec.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe RightApi::Resource do
|
4
|
-
context "given a logged in RightScale user" do
|
5
|
-
before(:each) do
|
6
|
-
given_user_facing_client
|
7
|
-
end
|
8
|
-
|
9
|
-
it "has the required methods for instances of the Resource class" do
|
10
|
-
resource = RightApi::Resource.process(@client, 'deployment', '/api/deployments/1')
|
11
|
-
resource.api_methods.sort.map(&:to_s).should == %w[ destroy show update ]
|
12
|
-
end
|
13
|
-
|
14
|
-
it "has destroy/show/update for all instances of the Resource class" do
|
15
|
-
resource = RightApi::Resource.process(@client, 'session', '/api/session')
|
16
|
-
resource.api_methods.sort.map(&:to_s).should == %w[ destroy show update ]
|
17
|
-
end
|
18
|
-
|
19
|
-
it "has an array of ResourceDetail instances for index calls" do
|
20
|
-
resources = RightApi::Resource.process(@client, 'deployment', '/api/deployments', [{}])
|
21
|
-
resources.first.class.should == RightApi::ResourceDetail
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/spec/unit/resources_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe RightApi::Resources do
|
4
|
-
context "given a logged in RightScale user" do
|
5
|
-
before(:each) do
|
6
|
-
given_user_facing_client
|
7
|
-
end
|
8
|
-
|
9
|
-
it "has the required methods for instances of the Resources class" do
|
10
|
-
resource = RightApi::Resources.new(@client, '/api/deployments', 'deployments')
|
11
|
-
resource.api_methods.sort.collect(&:to_s).should == %w[
|
12
|
-
create index ]
|
13
|
-
end
|
14
|
-
|
15
|
-
it "has index even for instances of the Resources class that do not support it" do
|
16
|
-
resource = RightApi::Resources.new(@client, '/api/tags', 'tags')
|
17
|
-
resource.api_methods.sort.collect(&:to_s).should == %w[
|
18
|
-
by_resource by_tag create index multi_add multi_delete ]
|
19
|
-
end
|
20
|
-
|
21
|
-
it "has resource-specific methods for instances of the Resources class" do
|
22
|
-
resource = RightApi::Resources.new(@client, '/api/backups', 'backups')
|
23
|
-
resource.api_methods.sort.collect(&:to_s).should == %w[
|
24
|
-
cleanup create index ]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|