cfoundry 2.4.0 → 2.4.1.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|