cfoundry 2.4.0 → 2.4.1.rc1
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/lib/cfoundry/baseclient.rb +1 -1
- data/lib/cfoundry/uaaclient.rb +7 -1
- data/lib/cfoundry/v2/client.rb +1 -1
- data/lib/cfoundry/v2/service_instance.rb +1 -1
- data/lib/cfoundry/v2/user.rb +22 -1
- data/lib/cfoundry/version.rb +1 -1
- data/spec/cc_api_stub/organizations_spec.rb +1 -1
- data/spec/cfoundry/baseclient_spec.rb +4 -3
- data/spec/cfoundry/errors_spec.rb +1 -1
- data/spec/cfoundry/rest_client_spec.rb +14 -14
- data/spec/cfoundry/trace_helpers_spec.rb +4 -4
- data/spec/cfoundry/uaaclient_spec.rb +1 -1
- data/spec/cfoundry/v2/base_spec.rb +14 -14
- data/spec/cfoundry/v2/client_spec.rb +4 -4
- data/spec/cfoundry/v2/service_instance_spec.rb +66 -0
- data/spec/cfoundry/v2/user_spec.rb +171 -0
- data/spec/factories/clients_factory.rb +3 -1
- data/spec/factories/service_instances_factory.rb +10 -0
- data/spec/factories/service_plans_factory.rb +10 -0
- data/spec/fixtures/fake_cc_space_summary.json +6 -6
- data/spec/integration/client_spec.rb +2 -2
- data/spec/support/shared_examples/client_login_examples.rb +2 -2
- metadata +12 -9
data/lib/cfoundry/baseclient.rb
CHANGED
@@ -15,7 +15,7 @@ module CFoundry
|
|
15
15
|
:trace, :backtrace, :backtrace=, :log, :log=,
|
16
16
|
:http_proxy, :http_proxy=, :https_proxy, :https_proxy=
|
17
17
|
|
18
|
-
def initialize(target
|
18
|
+
def initialize(target, token = nil)
|
19
19
|
@rest_client = CFoundry::RestClient.new(target, token)
|
20
20
|
self.trace = false
|
21
21
|
self.backtrace = false
|
data/lib/cfoundry/uaaclient.rb
CHANGED
@@ -5,7 +5,7 @@ module CFoundry
|
|
5
5
|
class UAAClient
|
6
6
|
attr_accessor :target, :client_id, :token, :trace
|
7
7
|
|
8
|
-
def initialize(target
|
8
|
+
def initialize(target, client_id = "cf")
|
9
9
|
@target = target
|
10
10
|
@client_id = client_id
|
11
11
|
CF::UAA::Misc.symbolize_keys = true
|
@@ -24,6 +24,12 @@ module CFoundry
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
def user(guid)
|
28
|
+
wrap_uaa_errors do
|
29
|
+
scim.get(:user, guid)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
27
33
|
def users
|
28
34
|
wrap_uaa_errors do
|
29
35
|
scim.query(:user)
|
data/lib/cfoundry/v2/client.rb
CHANGED
@@ -24,7 +24,7 @@ module CFoundry::V2
|
|
24
24
|
# Create a new Client for interfacing with the given target.
|
25
25
|
#
|
26
26
|
# A token may also be provided to skip the login step.
|
27
|
-
def initialize(target
|
27
|
+
def initialize(target, token = nil)
|
28
28
|
@base = Base.new(target, token)
|
29
29
|
end
|
30
30
|
|
data/lib/cfoundry/v2/user.rb
CHANGED
@@ -40,16 +40,23 @@ module CFoundry
|
|
40
40
|
attr_accessor :emails, :name
|
41
41
|
|
42
42
|
def email
|
43
|
+
# if the email collection is nil or empty? collect from UAA
|
44
|
+
get_meta_from_uaa if @emails.nil?
|
45
|
+
|
43
46
|
return unless @emails && @emails.first
|
44
|
-
@emails.first[
|
47
|
+
@emails.first["value"]
|
45
48
|
end
|
46
49
|
|
47
50
|
def given_name
|
51
|
+
get_meta_from_uaa if @name.nil?
|
52
|
+
|
48
53
|
return unless @name && @name[:givenName] != email
|
49
54
|
@name[:givenName]
|
50
55
|
end
|
51
56
|
|
52
57
|
def family_name
|
58
|
+
get_meta_from_uaa if @name.nil?
|
59
|
+
|
53
60
|
return unless @name && @name[:familyName] != email
|
54
61
|
@name[:familyName]
|
55
62
|
end
|
@@ -67,6 +74,20 @@ module CFoundry
|
|
67
74
|
@client.base.uaa.delete_user(guid)
|
68
75
|
true
|
69
76
|
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def get_meta_from_uaa
|
81
|
+
user = @client.base.uaa.user(guid)
|
82
|
+
return if user.nil?
|
83
|
+
return if not user['error'].nil?
|
84
|
+
|
85
|
+
@emails = user["emails"]
|
86
|
+
@name ||= {}
|
87
|
+
@name[:familyName] = user["name"]["familyname"]
|
88
|
+
@name[:givenName] = user["name"]["givenname"]
|
89
|
+
end
|
90
|
+
|
70
91
|
end
|
71
92
|
end
|
72
93
|
end
|
data/lib/cfoundry/version.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe CFoundry::BaseClient do
|
4
|
+
subject(:client) { CFoundry::BaseClient.new("http://api.example.com") }
|
4
5
|
describe "#request" do
|
5
6
|
before do
|
6
7
|
subject.stub(:handle_response).with(anything, anything, anything)
|
@@ -256,15 +257,15 @@ describe CFoundry::BaseClient do
|
|
256
257
|
end
|
257
258
|
|
258
259
|
describe "#target=" do
|
259
|
-
let(:base_client) { CFoundry::BaseClient.new }
|
260
|
+
let(:base_client) { CFoundry::BaseClient.new("https://api.example.com") }
|
260
261
|
let(:new_target) { "some-target-url.com"}
|
261
262
|
|
262
263
|
it "sets a new target" do
|
263
|
-
expect{base_client.target = new_target}.to change {base_client.target}.from("https://api.
|
264
|
+
expect{base_client.target = new_target}.to change {base_client.target}.from("https://api.example.com").to(new_target)
|
264
265
|
end
|
265
266
|
|
266
267
|
it "sets a new target on the rest client" do
|
267
|
-
expect{base_client.target = new_target}.to change{base_client.rest_client.target}.from("https://api.
|
268
|
+
expect{base_client.target = new_target}.to change{base_client.rest_client.target}.from("https://api.example.com").to(new_target)
|
268
269
|
end
|
269
270
|
end
|
270
271
|
end
|
@@ -21,7 +21,7 @@ describe 'Errors' do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
describe CFoundry::APIError do
|
24
|
-
let(:request) { { :method => "GET", :url => "http://api.
|
24
|
+
let(:request) { { :method => "GET", :url => "http://api.example.com/foo", :headers => {} } }
|
25
25
|
let(:response_body) { "NOT FOUND" }
|
26
26
|
let(:response) { { :status => 404, :headers => {}, :body => response_body } }
|
27
27
|
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe CFoundry::RestClient do
|
4
4
|
let(:token) { nil }
|
5
|
-
let(:target) { "https://api.
|
5
|
+
let(:target) { "https://api.example.com" }
|
6
6
|
let(:rest_client) { CFoundry::RestClient.new(target, token) }
|
7
7
|
|
8
8
|
describe '#request' do
|
@@ -81,7 +81,7 @@ describe CFoundry::RestClient do
|
|
81
81
|
let(:options) { {:params => {}} }
|
82
82
|
|
83
83
|
it "does not add a query string delimiter (the question mark)" do
|
84
|
-
request_stub = stub_request(:get, "https://api.
|
84
|
+
request_stub = stub_request(:get, "https://api.example.com/some-path")
|
85
85
|
subject
|
86
86
|
expect(request_stub).to have_been_requested
|
87
87
|
end
|
@@ -91,7 +91,7 @@ describe CFoundry::RestClient do
|
|
91
91
|
let(:options) { {:params => {"key" => "value"}} }
|
92
92
|
|
93
93
|
it "appends a query string and delimiter" do
|
94
|
-
request_stub = stub_request(:get, "https://api.
|
94
|
+
request_stub = stub_request(:get, "https://api.example.com/some-path?key=value")
|
95
95
|
subject
|
96
96
|
expect(request_stub).to have_been_requested
|
97
97
|
end
|
@@ -217,7 +217,7 @@ describe CFoundry::RestClient do
|
|
217
217
|
let(:path) { "/some-path/some-segment" }
|
218
218
|
|
219
219
|
it "doesn't add a double slash" do
|
220
|
-
stub = stub_request(:get, "https://api.
|
220
|
+
stub = stub_request(:get, "https://api.example.com/some-path/some-segment")
|
221
221
|
subject
|
222
222
|
expect(stub).to have_been_requested
|
223
223
|
end
|
@@ -227,7 +227,7 @@ describe CFoundry::RestClient do
|
|
227
227
|
let(:path) { "some-path/some-segment" }
|
228
228
|
|
229
229
|
it "doesn't add a double slash" do
|
230
|
-
stub = stub_request(:get, "https://api.
|
230
|
+
stub = stub_request(:get, "https://api.example.com/some-path/some-segment")
|
231
231
|
subject
|
232
232
|
expect(stub).to have_been_requested
|
233
233
|
end
|
@@ -258,7 +258,7 @@ describe CFoundry::RestClient do
|
|
258
258
|
end
|
259
259
|
|
260
260
|
it "prints the request and the response" do
|
261
|
-
rest_client.should_receive(:print_request).with({:headers => {"Content-Length" => 0}, :url => "https://api.
|
261
|
+
rest_client.should_receive(:print_request).with({:headers => {"Content-Length" => 0}, :url => "https://api.example.com/some-path", :method => "GET", :body => nil})
|
262
262
|
rest_client.should_receive(:print_response).with({:status => "200", :headers => {"content-type" => "application/json"}, :body => '{"some": "json"}'})
|
263
263
|
subject
|
264
264
|
end
|
@@ -266,11 +266,11 @@ describe CFoundry::RestClient do
|
|
266
266
|
|
267
267
|
describe "following redirects" do
|
268
268
|
before do
|
269
|
-
stub_request(:post, "https://api.
|
269
|
+
stub_request(:post, "https://api.example.com/apps").to_return(
|
270
270
|
:status => 301,
|
271
|
-
:headers => {"location" => "https://api.
|
271
|
+
:headers => {"location" => "https://api.example.com/apps/some-guid"}
|
272
272
|
)
|
273
|
-
stub_request(:get, "https://api.
|
273
|
+
stub_request(:get, "https://api.example.com/apps/some-guid").to_return(
|
274
274
|
:status => 200,
|
275
275
|
:body => '{"some": "json"}'
|
276
276
|
)
|
@@ -291,7 +291,7 @@ describe CFoundry::RestClient do
|
|
291
291
|
describe ".create" do
|
292
292
|
let(:http_proxy) { '' }
|
293
293
|
let(:https_proxy) { '' }
|
294
|
-
let(:target_uri) { "http://
|
294
|
+
let(:target_uri) { "http://api.example.com" }
|
295
295
|
|
296
296
|
subject { CFoundry::RestClient::HTTPFactory.create(URI.parse(target_uri), http_proxy, https_proxy) }
|
297
297
|
|
@@ -304,7 +304,7 @@ describe CFoundry::RestClient do
|
|
304
304
|
end
|
305
305
|
|
306
306
|
context "when the target is an https URI" do
|
307
|
-
let(:target_uri) { "https://
|
307
|
+
let(:target_uri) { "https://example.com" }
|
308
308
|
it "should return an instance of the plain Net:HTTP class with use_ssl" do
|
309
309
|
expect(subject).to be_instance_of(Net::HTTP)
|
310
310
|
expect(subject.use_ssl?).to be_true
|
@@ -333,7 +333,7 @@ describe CFoundry::RestClient do
|
|
333
333
|
end
|
334
334
|
|
335
335
|
context "when a https proxy URI is set and the target is an https URI" do
|
336
|
-
let(:target_uri) { "https://
|
336
|
+
let(:target_uri) { "https://example.com" }
|
337
337
|
let(:https_proxy) { "http://exapmle.com:8080" }
|
338
338
|
|
339
339
|
it "should return an instance of the proxy class" do
|
@@ -342,7 +342,7 @@ describe CFoundry::RestClient do
|
|
342
342
|
end
|
343
343
|
|
344
344
|
context "when a https proxy URI is set and the target is an http URI" do
|
345
|
-
let(:target_uri) { "http://
|
345
|
+
let(:target_uri) { "http://example.com" }
|
346
346
|
let(:https_proxy) { "http://exapmle.com:8080" }
|
347
347
|
|
348
348
|
it "should return an instance of the plain Net:HTTP class" do
|
@@ -351,7 +351,7 @@ describe CFoundry::RestClient do
|
|
351
351
|
end
|
352
352
|
|
353
353
|
context "when a http proxy URI is set and the target is an https URI" do
|
354
|
-
let(:target_uri) { "https://
|
354
|
+
let(:target_uri) { "https://example.com" }
|
355
355
|
let(:http_proxy) { "http://exapmle.com:8080" }
|
356
356
|
|
357
357
|
it "should return an instance of the plain Net:HTTP class" do
|
@@ -5,7 +5,7 @@ describe CFoundry::TraceHelpers do
|
|
5
5
|
let(:request) do
|
6
6
|
{
|
7
7
|
:method => "GET",
|
8
|
-
:url => "http://api.
|
8
|
+
:url => "http://api.example.com/foo",
|
9
9
|
:headers => { "bb-foo" => "bar", "accept" => "*/*" }
|
10
10
|
}
|
11
11
|
end
|
@@ -26,7 +26,7 @@ describe CFoundry::TraceHelpers do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
describe "#request_trace" do
|
29
|
-
let(:request_trace) { "REQUEST: GET http://api.
|
29
|
+
let(:request_trace) { "REQUEST: GET http://api.example.com/foo" }
|
30
30
|
let(:header_trace) { "REQUEST_HEADERS:\n accept : */*\n bb-foo : bar" }
|
31
31
|
let(:body_trace) { "" }
|
32
32
|
|
@@ -53,7 +53,7 @@ describe CFoundry::TraceHelpers do
|
|
53
53
|
let(:request) do
|
54
54
|
{
|
55
55
|
:method => "GET",
|
56
|
-
:url => "http://api.
|
56
|
+
:url => "http://api.example.com/foo",
|
57
57
|
:headers => { 'Authorization' => "SECRET STUFF" }
|
58
58
|
}
|
59
59
|
end
|
@@ -71,7 +71,7 @@ describe CFoundry::TraceHelpers do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
context "with a JSON response body" do
|
74
|
-
let(:response_body) { "{\"name\": \"vcap\",\"build\": 2222,\"support\": \"http://support.
|
74
|
+
let(:response_body) { "{\"name\": \"vcap\",\"build\": 2222,\"support\": \"http://support.example.com\"}" }
|
75
75
|
let(:response_trace) { "RESPONSE: [404]\nRESPONSE_HEADERS:\n\nRESPONSE_BODY:\n#{MultiJson.dump(MultiJson.load(response_body), :pretty => true)}" }
|
76
76
|
|
77
77
|
include_examples "response_trace tests"
|
@@ -68,7 +68,7 @@ EOF
|
|
68
68
|
let(:password) { "test" }
|
69
69
|
let(:creds) { {:username => username, :password => password} }
|
70
70
|
let(:state) { 'somestate' }
|
71
|
-
let(:redirect_uri) { 'https://uaa.
|
71
|
+
let(:redirect_uri) { 'https://uaa.example.com/redirect/cf' }
|
72
72
|
let(:auth) { Object.new }
|
73
73
|
let(:issuer) { Object.new }
|
74
74
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe CFoundry::V2::Base do
|
4
|
-
let(:target) { "https://api.
|
4
|
+
let(:target) { "https://api.example.com" }
|
5
5
|
let(:base) { CFoundry::V2::Base.new(target) }
|
6
6
|
|
7
7
|
describe "helper methods for HTTP verbs" do
|
@@ -17,7 +17,7 @@ describe CFoundry::V2::Base do
|
|
17
17
|
let(:options) { {:accept => :json} }
|
18
18
|
|
19
19
|
it 'returns the parsed JSON' do
|
20
|
-
stub_request(:any, 'https://api.
|
20
|
+
stub_request(:any, 'https://api.example.com/some-path').to_return(:status => 200, :body => "{\"hello\": \"there\"}")
|
21
21
|
expect(subject).to eq(:hello => "there")
|
22
22
|
end
|
23
23
|
end
|
@@ -26,7 +26,7 @@ describe CFoundry::V2::Base do
|
|
26
26
|
let(:options) { {:accept => :form} }
|
27
27
|
|
28
28
|
it 'returns the body' do
|
29
|
-
stub_request(:any, 'https://api.
|
29
|
+
stub_request(:any, 'https://api.example.com/some-path').to_return :status => 200, :body => "body"
|
30
30
|
expect(subject).to eq "body"
|
31
31
|
end
|
32
32
|
end
|
@@ -36,7 +36,7 @@ describe CFoundry::V2::Base do
|
|
36
36
|
let(:response_code) { 404 }
|
37
37
|
|
38
38
|
it 'raises the correct error if JSON is parsed successfully' do
|
39
|
-
stub_request(:any, 'https://api.
|
39
|
+
stub_request(:any, 'https://api.example.com/some-path').to_return(
|
40
40
|
:status => response_code,
|
41
41
|
:body => "{\"code\": 111, \"description\": \"Something bad happened\"}"
|
42
42
|
)
|
@@ -44,7 +44,7 @@ describe CFoundry::V2::Base do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'raises the correct error if code is missing from response' do
|
47
|
-
stub_request(:any, 'https://api.
|
47
|
+
stub_request(:any, 'https://api.example.com/some-path').to_return(
|
48
48
|
:status => response_code,
|
49
49
|
:body => "{\"description\": \"Something bad happened\"}"
|
50
50
|
)
|
@@ -52,7 +52,7 @@ describe CFoundry::V2::Base do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'raises the correct error if response body is not JSON' do
|
55
|
-
stub_request(:any, 'https://api.
|
55
|
+
stub_request(:any, 'https://api.example.com/some-path').to_return(
|
56
56
|
:status => response_code,
|
57
57
|
:body => "Error happened"
|
58
58
|
)
|
@@ -60,7 +60,7 @@ describe CFoundry::V2::Base do
|
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'raises a generic APIError if code is not recognized' do
|
63
|
-
stub_request(:any, 'https://api.
|
63
|
+
stub_request(:any, 'https://api.example.com/some-path').to_return :status => response_code,
|
64
64
|
:body => "{\"code\": 6932, \"description\": \"Something bad happened\"}"
|
65
65
|
expect {subject}.to raise_error CFoundry::APIError, "6932: Something bad happened"
|
66
66
|
end
|
@@ -120,7 +120,7 @@ describe CFoundry::V2::Base do
|
|
120
120
|
:headers => { "Content-Length" => 0 },
|
121
121
|
:method => verb,
|
122
122
|
:body => nil,
|
123
|
-
:url => "https://api.
|
123
|
+
:url => "https://api.example.com/some-path"
|
124
124
|
})
|
125
125
|
end
|
126
126
|
end
|
@@ -175,7 +175,7 @@ describe CFoundry::V2::Base do
|
|
175
175
|
let(:request) do
|
176
176
|
{
|
177
177
|
:method => "GET",
|
178
|
-
:url => "http://api.
|
178
|
+
:url => "http://api.example.com/some-path",
|
179
179
|
:headers => { "some-header-key" => "some-header-value" },
|
180
180
|
:body => "some-body"
|
181
181
|
}
|
@@ -234,7 +234,7 @@ describe CFoundry::V2::Base do
|
|
234
234
|
let(:fingerprints) { "some-fingerprints" }
|
235
235
|
|
236
236
|
it "makes a PUT request to the resource_match endpoint with the correct payload" do
|
237
|
-
stub = stub_request(:put, "https://api.
|
237
|
+
stub = stub_request(:put, "https://api.example.com/v2/resource_match").
|
238
238
|
with(:body => fingerprints).
|
239
239
|
to_return(:body => "{}")
|
240
240
|
base.resource_match(fingerprints)
|
@@ -248,7 +248,7 @@ describe CFoundry::V2::Base do
|
|
248
248
|
let(:fake_zipfile) { File.new("#{SPEC_ROOT}/fixtures/empty_file") }
|
249
249
|
|
250
250
|
it "makes a PUT request to the app bits endpoint with the correct payload" do
|
251
|
-
stub = stub_request(:put, "https://api.
|
251
|
+
stub = stub_request(:put, "https://api.example.com/v2/apps/#{guid}/bits").to_return(:body => "{}")
|
252
252
|
base.upload_app(guid, fake_zipfile)
|
253
253
|
expect(stub).to have_been_requested
|
254
254
|
end
|
@@ -258,7 +258,7 @@ describe CFoundry::V2::Base do
|
|
258
258
|
stub =
|
259
259
|
stub_request(
|
260
260
|
:put,
|
261
|
-
"https://api.
|
261
|
+
"https://api.example.com/v2/apps/#{guid}/bits"
|
262
262
|
).with { |request|
|
263
263
|
request.body =~ /name="resources"/ &&
|
264
264
|
request.body !~ /name="application"/
|
@@ -274,8 +274,8 @@ describe CFoundry::V2::Base do
|
|
274
274
|
describe "#stream_file" do
|
275
275
|
let(:app_guid) { "1234" }
|
276
276
|
let(:instance_guid) { "3456" }
|
277
|
-
let(:api_url) { "https://api.
|
278
|
-
let(:file_url) { "http://api.
|
277
|
+
let(:api_url) { "https://api.example.com/v2/apps/#{app_guid}/instances/#{instance_guid}/files/some/path/segments" }
|
278
|
+
let(:file_url) { "http://api.example.com/static/path/to/some/file" }
|
279
279
|
|
280
280
|
before do
|
281
281
|
base.stub(:token) { CFoundry::AuthToken.new("bearer foo") }
|
@@ -3,10 +3,10 @@ require "spec_helper"
|
|
3
3
|
module CFoundry
|
4
4
|
module V2
|
5
5
|
describe Client do
|
6
|
-
|
6
|
+
subject(:client) { build(:client) }
|
7
7
|
|
8
8
|
describe "#register" do
|
9
|
-
let(:uaa) { UAAClient.new }
|
9
|
+
let(:uaa) { UAAClient.new('http://uaa.example.com') }
|
10
10
|
let(:email) { "test@test.com" }
|
11
11
|
let(:password) { "secret" }
|
12
12
|
|
@@ -77,11 +77,11 @@ module CFoundry
|
|
77
77
|
let(:new_target) { "some-target-url.com"}
|
78
78
|
|
79
79
|
it "sets a new target" do
|
80
|
-
expect{client.target = new_target}.to change {client.target}.from("http://api.
|
80
|
+
expect{client.target = new_target}.to change {client.target}.from("http://api.example.com").to(new_target)
|
81
81
|
end
|
82
82
|
|
83
83
|
it "sets a new target on the base client" do
|
84
|
-
expect{client.target = new_target}.to change{client.base.target}.from("http://api.
|
84
|
+
expect{client.target = new_target}.to change{client.base.target}.from("http://api.example.com").to(new_target)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module CFoundry
|
4
|
+
module V2
|
5
|
+
describe ServiceInstance do
|
6
|
+
let(:client) { build(:client) }
|
7
|
+
subject { build(:service_instance, :client => client) }
|
8
|
+
|
9
|
+
describe "space" do
|
10
|
+
let(:space) { build(:space) }
|
11
|
+
|
12
|
+
it "has a space" do
|
13
|
+
subject.space = space
|
14
|
+
expect(subject.space).to eq(space)
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when an invalid value is assigned" do
|
18
|
+
it "raises a Mismatch exception" do
|
19
|
+
expect {
|
20
|
+
subject.space = [build(:organization)]
|
21
|
+
}.to raise_error(CFoundry::Mismatch)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "service_plan" do
|
27
|
+
let(:service_plan) { build(:service_plan) }
|
28
|
+
|
29
|
+
it "has a service plan" do
|
30
|
+
subject.service_plan = service_plan
|
31
|
+
expect(subject.service_plan).to eq(service_plan)
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when an invalid value is assigned" do
|
35
|
+
it "raises a Mismatch exception" do
|
36
|
+
expect {
|
37
|
+
subject.space = [build(:organization)]
|
38
|
+
}.to raise_error(CFoundry::Mismatch)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'query params' do
|
44
|
+
it 'allows query by name' do
|
45
|
+
client.should respond_to(:service_instance_by_name)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'allows query by space_guid' do
|
49
|
+
client.should respond_to(:service_instance_by_space_guid)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'allows query by gateway_name' do
|
53
|
+
client.should respond_to(:service_instance_by_gateway_name)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'allows query by service_plan_guid' do
|
57
|
+
client.should respond_to(:service_instance_by_service_plan_guid)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'allows query by service_binding_guid' do
|
61
|
+
client.should respond_to(:service_instance_by_service_binding_guid)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -30,6 +30,177 @@ module CFoundry
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
+
|
34
|
+
describe '#get_meta_from_uaa' do
|
35
|
+
|
36
|
+
let(:api_target) { 'http://api.example.com' }
|
37
|
+
let(:login_target) { 'https://login.example.com' }
|
38
|
+
let(:uaa_target) { 'https://uaa.example.com' }
|
39
|
+
let(:user_email) { 'test-user@example.com' }
|
40
|
+
let(:given_name) { 'John' }
|
41
|
+
let(:family_name) { 'Doe' }
|
42
|
+
|
43
|
+
before do
|
44
|
+
|
45
|
+
stub_request(:get, "#{api_target}/info").to_return :status => 200,
|
46
|
+
:headers => {'Content-Type' => 'application/json'},
|
47
|
+
:body => <<EOF
|
48
|
+
{
|
49
|
+
"name": "vcap",
|
50
|
+
"build": "2222",
|
51
|
+
"support": "http://support.example.com",
|
52
|
+
"version": 2,
|
53
|
+
"description": "Cloud Foundry sponsored by Pivotal",
|
54
|
+
"authorization_endpoint": "https://login.example.com",
|
55
|
+
"token_endpoint": "https://uaa.example.com",
|
56
|
+
"allow_debug": true,
|
57
|
+
"user": "00000000-0000-0000-0000-000000000000",
|
58
|
+
"limits": {
|
59
|
+
"memory": 2048,
|
60
|
+
"app_uris": 4,
|
61
|
+
"services": 16,
|
62
|
+
"apps": 20
|
63
|
+
},
|
64
|
+
"usage": {
|
65
|
+
"memory": 896,
|
66
|
+
"apps": 4,
|
67
|
+
"services": 6
|
68
|
+
}
|
69
|
+
}
|
70
|
+
EOF
|
71
|
+
|
72
|
+
stub_request(:get, "#{login_target}/login").to_return :status => 200,
|
73
|
+
:headers => {'Content-Type' => 'application/json'},
|
74
|
+
:body => <<EOF
|
75
|
+
{
|
76
|
+
"timestamp": "2013-06-12T22:32:57-0700",
|
77
|
+
"app": {
|
78
|
+
"artifact": "cloudfoundry-login-server",
|
79
|
+
"description": "Cloud Foundry Login App",
|
80
|
+
"name": "Cloud Foundry Login",
|
81
|
+
"version": "1.2.3"
|
82
|
+
},
|
83
|
+
"links": {
|
84
|
+
"register": "https://console.example.com/register",
|
85
|
+
"passwd": "https://console.example.com/password_resets/new",
|
86
|
+
"home": "https://console.example.com",
|
87
|
+
"login": "https://login.example.com",
|
88
|
+
"uaa": "https://uaa.example.com"
|
89
|
+
},
|
90
|
+
"analytics": {
|
91
|
+
"code": "UA-00000000-00",
|
92
|
+
"domain": "example.com"
|
93
|
+
},
|
94
|
+
"commit_id": "0000000",
|
95
|
+
"prompts": {
|
96
|
+
"username": [
|
97
|
+
"text",
|
98
|
+
"Email"
|
99
|
+
],
|
100
|
+
"password": [
|
101
|
+
"password",
|
102
|
+
"Password"
|
103
|
+
]
|
104
|
+
}
|
105
|
+
}
|
106
|
+
EOF
|
107
|
+
|
108
|
+
stub_request(:get, /#{uaa_target}\/Users\/user-guid-\d{1,2}/).to_return :status => 200,
|
109
|
+
:headers => {'Content-Type' => 'application/json'},
|
110
|
+
:body => <<EOF
|
111
|
+
{
|
112
|
+
"id": "00000000-0000-0000-0000-000000000000",
|
113
|
+
"meta": {
|
114
|
+
"version": 0,
|
115
|
+
"created": "2013-06-24T13:44:38.000Z",
|
116
|
+
"lastModified": "2013-06-24T13:44:38.000Z"
|
117
|
+
},
|
118
|
+
"userName": "#{user_email}",
|
119
|
+
"name": {
|
120
|
+
"familyName": "#{family_name}",
|
121
|
+
"givenName": "#{given_name}"
|
122
|
+
},
|
123
|
+
"emails": [
|
124
|
+
{
|
125
|
+
"value": "#{user_email}"
|
126
|
+
}
|
127
|
+
],
|
128
|
+
"groups": [
|
129
|
+
{
|
130
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
131
|
+
"display": "password.write",
|
132
|
+
"type": "DIRECT"
|
133
|
+
},
|
134
|
+
{
|
135
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
136
|
+
"display": "openid",
|
137
|
+
"type": "DIRECT"
|
138
|
+
},
|
139
|
+
{
|
140
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
141
|
+
"display": "uaa.user",
|
142
|
+
"type": "DIRECT"
|
143
|
+
},
|
144
|
+
{
|
145
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
146
|
+
"display": "scim.userids",
|
147
|
+
"type": "DIRECT"
|
148
|
+
},
|
149
|
+
{
|
150
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
151
|
+
"display": "approvals.me",
|
152
|
+
"type": "DIRECT"
|
153
|
+
},
|
154
|
+
{
|
155
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
156
|
+
"display": "cloud_controller.write",
|
157
|
+
"type": "DIRECT"
|
158
|
+
},
|
159
|
+
{
|
160
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
161
|
+
"display": "scim.me",
|
162
|
+
"type": "DIRECT"
|
163
|
+
},
|
164
|
+
{
|
165
|
+
"value": "00000000-0000-0000-0000-000000000000",
|
166
|
+
"display": "cloud_controller.read",
|
167
|
+
"type": "DIRECT"
|
168
|
+
}
|
169
|
+
],
|
170
|
+
"approvals": [
|
171
|
+
|
172
|
+
],
|
173
|
+
"active": true,
|
174
|
+
"schemas": [
|
175
|
+
"urn:scim:schemas:core:1.0"
|
176
|
+
]
|
177
|
+
}
|
178
|
+
EOF
|
179
|
+
end
|
180
|
+
|
181
|
+
it "retrieves metadata from the UAA" do
|
182
|
+
subject.email.should == user_email
|
183
|
+
subject.given_name.should == given_name
|
184
|
+
subject.family_name.should == family_name
|
185
|
+
subject.full_name.should == "#{given_name} #{family_name}"
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should be nil if user doesn't have permission to query uaa" do
|
189
|
+
|
190
|
+
stub_request(:get, /#{uaa_target}\/Users\/user-guid-\d{1,2}/).to_return :status => 200,
|
191
|
+
:headers => {'Content-Type' => 'application/json'},
|
192
|
+
:body => <<EOF
|
193
|
+
{
|
194
|
+
"error": "access_denied",
|
195
|
+
"error_description": "Access is denied"
|
196
|
+
}
|
197
|
+
EOF
|
198
|
+
subject.email.should == nil
|
199
|
+
subject.given_name.should == nil
|
200
|
+
subject.family_name.should == nil
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
33
204
|
end
|
34
205
|
end
|
35
206
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :service_instance, :class => CFoundry::V2::ServiceInstance do
|
3
|
+
sequence(:guid) { |n| "service-instance-guid-#{n}" }
|
4
|
+
ignore do
|
5
|
+
client { FactoryGirl.build(:client) }
|
6
|
+
end
|
7
|
+
|
8
|
+
initialize_with { new(guid, client) }
|
9
|
+
end
|
10
|
+
end
|
@@ -6,10 +6,10 @@
|
|
6
6
|
"guid":"application-id-1",
|
7
7
|
"name":"application-name-1",
|
8
8
|
"routes":[
|
9
|
-
{ "guid": "aa14f148-3d82-4db3-982e-fe0fd00582f4", "host": "app", "domain": { "name": "
|
9
|
+
{ "guid": "aa14f148-3d82-4db3-982e-fe0fd00582f4", "host": "app", "domain": { "name": "example.com"}}
|
10
10
|
],
|
11
11
|
"urls":[
|
12
|
-
"app.
|
12
|
+
"app.example.com"
|
13
13
|
],
|
14
14
|
"state":"STARTED",
|
15
15
|
"memory":128,
|
@@ -25,12 +25,12 @@
|
|
25
25
|
"guid":"application-id-2",
|
26
26
|
"name":"application-name-2",
|
27
27
|
"routes":[
|
28
|
-
{ "guid": "a14c5666-5354-49a7-8da8-2c29eaaaac18", "host": "app2-1", "domain": { "name": "
|
29
|
-
{ "guid": "7c183670-2e4b-4dd1-b2b5-d7ada5d470fb", "host": "app2-2", "domain": { "name": "
|
28
|
+
{ "guid": "a14c5666-5354-49a7-8da8-2c29eaaaac18", "host": "app2-1", "domain": { "name": "example.com"}},
|
29
|
+
{ "guid": "7c183670-2e4b-4dd1-b2b5-d7ada5d470fb", "host": "app2-2", "domain": { "name": "example.com"}}
|
30
30
|
],
|
31
31
|
"urls":[
|
32
|
-
"app2-1.
|
33
|
-
"app2-2.
|
32
|
+
"app2-1.example.com",
|
33
|
+
"app2-2.example.com"
|
34
34
|
],
|
35
35
|
"state":"STOPPED",
|
36
36
|
"memory":256,
|
@@ -22,14 +22,14 @@ describe CFoundry::V2::Client do
|
|
22
22
|
if ENV["CF_V2_RUN_INTEGRATION"]
|
23
23
|
it "requires a re-login" do
|
24
24
|
client = CFoundry::V2::Client.new("http://api." + a1_domain)
|
25
|
-
client.login(ENV["CF_V2_TEST_USER"], ENV["CF_V2_TEST_PASSWORD"])
|
25
|
+
client.login({username: ENV["CF_V2_TEST_USER"], password: ENV["CF_V2_TEST_PASSWORD"]})
|
26
26
|
client.quota_definitions # Getting quota definitions will always be the shortest request that requires auth
|
27
27
|
|
28
28
|
client.target = nil
|
29
29
|
client.target = "http://api." + a1_domain
|
30
30
|
expect { client.quota_definitions }.to raise_error(CFoundry::InvalidAuthToken)
|
31
31
|
|
32
|
-
client.login(ENV["CF_V2_TEST_USER"], ENV["CF_V2_TEST_PASSWORD"])
|
32
|
+
client.login({username: ENV["CF_V2_TEST_USER"], password: ENV["CF_V2_TEST_PASSWORD"]})
|
33
33
|
client.quota_definitions
|
34
34
|
end
|
35
35
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
shared_examples_for 'client login prompts' do
|
2
|
-
let(:uaa) { CFoundry::UAAClient.new }
|
2
|
+
let(:uaa) { CFoundry::UAAClient.new('http://uaa.example.com') }
|
3
3
|
let(:prompts) do
|
4
4
|
{
|
5
5
|
:user_id => ["text", "User ID"],
|
@@ -22,7 +22,7 @@ end
|
|
22
22
|
shared_examples_for 'client login' do
|
23
23
|
let(:email) { 'test@test.com' }
|
24
24
|
let(:password) { 'secret' }
|
25
|
-
let(:uaa) { CFoundry::UAAClient.new }
|
25
|
+
let(:uaa) { CFoundry::UAAClient.new('http://uaa.example.com') }
|
26
26
|
let(:access_token) { "some-access-token" }
|
27
27
|
let(:token_info) { CF::UAA::TokenInfo.new({ :access_token => access_token, :token_type => "bearer" }) }
|
28
28
|
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfoundry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
5
|
-
prerelease:
|
4
|
+
version: 2.4.1.rc1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Cloud Foundry Team
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-07-
|
13
|
+
date: 2013-07-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activemodel
|
@@ -337,6 +337,7 @@ files:
|
|
337
337
|
- spec/cfoundry/v2/organization_spec.rb
|
338
338
|
- spec/cfoundry/v2/quota_definition_spec.rb
|
339
339
|
- spec/cfoundry/v2/route_spec.rb
|
340
|
+
- spec/cfoundry/v2/service_instance_spec.rb
|
340
341
|
- spec/cfoundry/v2/space_spec.rb
|
341
342
|
- spec/cfoundry/v2/user_spec.rb
|
342
343
|
- spec/cfoundry/validator_spec.rb
|
@@ -347,6 +348,8 @@ files:
|
|
347
348
|
- spec/factories/organizations_factory.rb
|
348
349
|
- spec/factories/quota_definitions_factory.rb
|
349
350
|
- spec/factories/routes_factory.rb
|
351
|
+
- spec/factories/service_instances_factory.rb
|
352
|
+
- spec/factories/service_plans_factory.rb
|
350
353
|
- spec/factories/spaces_factory.rb
|
351
354
|
- spec/factories/users_factory.rb
|
352
355
|
- spec/fixtures/apps/with_cfignore/ambiguous_ignored
|
@@ -416,16 +419,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
416
419
|
version: '0'
|
417
420
|
segments:
|
418
421
|
- 0
|
419
|
-
hash: -
|
422
|
+
hash: -3405419350059499948
|
420
423
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
421
424
|
none: false
|
422
425
|
requirements:
|
423
|
-
- - ! '
|
426
|
+
- - ! '>'
|
424
427
|
- !ruby/object:Gem::Version
|
425
|
-
version:
|
426
|
-
segments:
|
427
|
-
- 0
|
428
|
-
hash: -3185654219291849147
|
428
|
+
version: 1.3.1
|
429
429
|
requirements: []
|
430
430
|
rubyforge_project: cfoundry
|
431
431
|
rubygems_version: 1.8.25
|
@@ -467,6 +467,7 @@ test_files:
|
|
467
467
|
- spec/cfoundry/v2/organization_spec.rb
|
468
468
|
- spec/cfoundry/v2/quota_definition_spec.rb
|
469
469
|
- spec/cfoundry/v2/route_spec.rb
|
470
|
+
- spec/cfoundry/v2/service_instance_spec.rb
|
470
471
|
- spec/cfoundry/v2/space_spec.rb
|
471
472
|
- spec/cfoundry/v2/user_spec.rb
|
472
473
|
- spec/cfoundry/validator_spec.rb
|
@@ -477,6 +478,8 @@ test_files:
|
|
477
478
|
- spec/factories/organizations_factory.rb
|
478
479
|
- spec/factories/quota_definitions_factory.rb
|
479
480
|
- spec/factories/routes_factory.rb
|
481
|
+
- spec/factories/service_instances_factory.rb
|
482
|
+
- spec/factories/service_plans_factory.rb
|
480
483
|
- spec/factories/spaces_factory.rb
|
481
484
|
- spec/factories/users_factory.rb
|
482
485
|
- spec/fixtures/apps/with_cfignore/ambiguous_ignored
|