right_api_client 1.5.19 → 1.5.21
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/rightscale/right_api_client.svg?branch=master)](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
|