cf 4.2.7 → 4.2.8.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.
- checksums.yaml +15 -0
- data/lib/cf/cli/service/create.rb +64 -20
- data/lib/cf/version.rb +1 -1
- data/spec/assets/env/Gemfile +4 -0
- data/spec/assets/env/Gemfile.lock +17 -0
- data/spec/assets/env/env_test.rb +58 -0
- data/spec/cf/cli/service/create_spec.rb +32 -0
- data/spec/cf/cli/service/services_spec.rb +55 -27
- data/spec/features/services_spec.rb +84 -2
- data/spec/integration/push_flow_spec.rb +0 -1
- data/spec/support/features_helper.rb +41 -3
- data/spec/support/interact_helper.rb +8 -0
- data/spec/support/matchers.rb +5 -0
- metadata +17 -49
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
Y2E2N2JhODkyOTg2YzFiNGI3YzFkOTZhMTUwYTcwYTViZGFlMDYzYw==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
OWExNzFiZGNlYmFhODE4MjZlOTIzMDIwNGNkNTcyN2JhZWM3MGUwNg==
|
|
7
|
+
!binary "U0hBNTEy":
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
MDAzYWU4ODRmODA0YTU3NjMwYmE3NzYzMjUxZDI1NmI4MmY2OGNlNzIxZmE0
|
|
10
|
+
MzNiNmM1OTUzNTUyOGYzZjExZDVjYTFhNDE1MGNjNWM4YzAxODhhMDM2NjE4
|
|
11
|
+
NGIyOGQ0ZTI1M2NjMDg4MmYyNTBhYTc3ODUzMzM5OTY4YmY0M2Y=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
OTkxYTMwYjg5MTQ1MGJlMjcxMTk4MGQzNDZjOTdmZjI0OTU1MjdlMGU3MGEw
|
|
14
|
+
ZTQ0ZDhkNTI2Nzc4ZmRjYmE0NzgwNzU3YzI4NjczZDdkMGM3OTM1YjgwOTY4
|
|
15
|
+
ZDVkMDJjMjNmMDc2ZTI2NWZjN2VmZjc5MTdjNzQwMGFhNmQ0MTI=
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
require "cf/cli/service/base"
|
|
2
2
|
|
|
3
3
|
module CF::Service
|
|
4
|
+
USER_PROVIDED_OFFERING = "user-provided" # I'd rather move this to CFoundry
|
|
5
|
+
|
|
6
|
+
class UPDummy
|
|
7
|
+
def label
|
|
8
|
+
"user-provided"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_reader :version, :provider
|
|
12
|
+
end
|
|
13
|
+
|
|
4
14
|
class Create < Base
|
|
5
15
|
offerings_from_label = proc { |label, offerings|
|
|
6
16
|
offerings.select { |s| s.label == label }
|
|
@@ -46,6 +56,8 @@ module CF::Service
|
|
|
46
56
|
end
|
|
47
57
|
finalize
|
|
48
58
|
|
|
59
|
+
offerings << UPDummy.new
|
|
60
|
+
|
|
49
61
|
selected_offerings = offerings.any? ? Array(input[:offering, offerings.sort_by(&:label)]) : []
|
|
50
62
|
finalize
|
|
51
63
|
|
|
@@ -55,48 +67,80 @@ module CF::Service
|
|
|
55
67
|
|
|
56
68
|
offering = selected_offerings.first
|
|
57
69
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
if offering.label == CF::Service::USER_PROVIDED_OFFERING
|
|
71
|
+
service_instance = client.user_provided_service_instance
|
|
72
|
+
service_instance.name = input[:name, offering]
|
|
73
|
+
finalize
|
|
74
|
+
|
|
75
|
+
service_instance.credentials = ask_credentials # input[:credentials]
|
|
76
|
+
else
|
|
77
|
+
service_instance = client.service_instance
|
|
78
|
+
service_instance.name = input[:name, offering]
|
|
79
|
+
finalize
|
|
80
|
+
|
|
81
|
+
plan = input[:plan, offering.service_plans]
|
|
82
|
+
finalize
|
|
83
|
+
service_instance.service_plan = if plan.is_a?(String)
|
|
84
|
+
offering.service_plans.find { |p| p.name.casecmp(plan) == 0 }
|
|
85
|
+
else
|
|
86
|
+
plan
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
service_instance.space = client.current_space
|
|
91
|
+
|
|
92
|
+
with_progress("Creating service #{c(service_instance.name, :name)}") do
|
|
93
|
+
service_instance.create!
|
|
72
94
|
end
|
|
73
95
|
|
|
74
96
|
app = input[:app]
|
|
75
97
|
finalize
|
|
76
98
|
|
|
77
99
|
if app
|
|
78
|
-
invoke :bind_service, :service =>
|
|
100
|
+
invoke :bind_service, :service => service_instance, :app => app
|
|
79
101
|
end
|
|
80
|
-
|
|
102
|
+
service_instance
|
|
81
103
|
end
|
|
82
104
|
|
|
83
105
|
private
|
|
84
106
|
|
|
107
|
+
def ask_credentials
|
|
108
|
+
credentials = {}
|
|
109
|
+
line("What credentials parameters should applications use to connect to this service instance? (e.g. key: uri, value: mysql://username:password@hostname:port/name)")
|
|
110
|
+
|
|
111
|
+
while true
|
|
112
|
+
key = ask("Key")
|
|
113
|
+
finalize
|
|
114
|
+
value = ask("Value")
|
|
115
|
+
finalize
|
|
116
|
+
credentials[key] = value
|
|
117
|
+
|
|
118
|
+
break unless ask("Another credentials parameter?", :default => false)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
credentials
|
|
122
|
+
end
|
|
123
|
+
|
|
85
124
|
def ask_offering(offerings)
|
|
86
125
|
[ask("What kind?", :choices => offerings.sort_by(&:label),
|
|
87
|
-
:display => proc
|
|
126
|
+
:display => proc do |s|
|
|
88
127
|
str = "#{c(s.label, :name)} #{s.version}"
|
|
89
128
|
if s.provider != "core"
|
|
90
129
|
str << ", via #{s.provider}"
|
|
91
130
|
end
|
|
92
131
|
str
|
|
93
|
-
|
|
132
|
+
end,
|
|
94
133
|
:complete => proc { |s| "#{s.label} #{s.version}" })]
|
|
95
134
|
end
|
|
96
135
|
|
|
97
136
|
def ask_name(offering)
|
|
98
|
-
|
|
99
|
-
|
|
137
|
+
default = nil
|
|
138
|
+
unless offering == CF::Service::USER_PROVIDED_OFFERING
|
|
139
|
+
random = sprintf("%x", rand(1000000))
|
|
140
|
+
default = "#{offering.label}-#{random}"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
ask "Name?", :default => default
|
|
100
144
|
end
|
|
101
145
|
|
|
102
146
|
def ask_plan(plans)
|
data/lib/cf/version.rb
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
require 'sinatra'
|
|
4
|
+
require 'json'
|
|
5
|
+
|
|
6
|
+
$stdout.sync = true
|
|
7
|
+
|
|
8
|
+
def dump_env(fmt)
|
|
9
|
+
if fmt == 'html' || fmt == nil
|
|
10
|
+
res = ''
|
|
11
|
+
ENV.each do |k, v|
|
|
12
|
+
res << "#{k}: #{v}<br/>"
|
|
13
|
+
end
|
|
14
|
+
res
|
|
15
|
+
elsif fmt == 'json'
|
|
16
|
+
res = {}
|
|
17
|
+
ENV.each do |k, v|
|
|
18
|
+
res[k] = v
|
|
19
|
+
end
|
|
20
|
+
puts res
|
|
21
|
+
res.to_json
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
get '/' do
|
|
26
|
+
dump_env('html')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
get '/healthcheck' do
|
|
30
|
+
"OK"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
get '/env' do
|
|
34
|
+
dump_env('json')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
get '/services' do
|
|
39
|
+
app_instance = JSON.parse(ENV['VCAP_APPLICATION'])
|
|
40
|
+
services = JSON.parse(ENV['VCAP_SERVICES'])
|
|
41
|
+
|
|
42
|
+
valid_services = false
|
|
43
|
+
service_list = []
|
|
44
|
+
services.each do |k, v|
|
|
45
|
+
v.each do |i|
|
|
46
|
+
s = {}
|
|
47
|
+
s['vendor'] = k.split('-')[0]
|
|
48
|
+
s['name'] = i['name']
|
|
49
|
+
service_list << s
|
|
50
|
+
valid_services = true
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
response = "{\"status\":\"ok\", \"services\": #{service_list.to_json}}" if valid_services
|
|
54
|
+
response = "{\"status\":\"fail\", \"services\": []}" if !valid_services
|
|
55
|
+
|
|
56
|
+
puts "my response: #{response}"
|
|
57
|
+
response
|
|
58
|
+
end
|
|
@@ -94,6 +94,38 @@ module CF
|
|
|
94
94
|
capture_output { command }
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
|
+
|
|
98
|
+
describe "when selecting the user-provided service" do
|
|
99
|
+
let(:services) { [build(:service), build(:service)] }
|
|
100
|
+
let(:user_provided_service) { build(:service, label: "user-provided")}
|
|
101
|
+
|
|
102
|
+
before do
|
|
103
|
+
client.stub(:services).and_return(services)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "asks for an instance name and credentials" do
|
|
107
|
+
should_ask("What kind?", hash_including(choices: include(has_label("user-provided")))) { user_provided_service }
|
|
108
|
+
should_ask("Name?", anything) { "user-provided-service-name-1" }
|
|
109
|
+
|
|
110
|
+
should_print("What credentials parameters should applications use to connect to this service instance? (e.g. key: uri, value: mysql://username:password@hostname:port/name)")
|
|
111
|
+
should_ask("Key") { "host" }
|
|
112
|
+
should_ask("Value") { "example.com" }
|
|
113
|
+
should_ask("Another credentials parameter?", anything) { true }
|
|
114
|
+
should_ask("Key") { "port" }
|
|
115
|
+
should_ask("Value") { 8080 }
|
|
116
|
+
should_ask("Another credentials parameter?", anything) { false }
|
|
117
|
+
mock_with_progress("Creating service user-provided-service-name-1")
|
|
118
|
+
|
|
119
|
+
instance = client.user_provided_service_instance
|
|
120
|
+
client.should_receive(:user_provided_service_instance).and_return(instance)
|
|
121
|
+
instance.should_receive(:create!)
|
|
122
|
+
|
|
123
|
+
capture_output { command }
|
|
124
|
+
|
|
125
|
+
instance.credentials['host'].should == 'example.com'
|
|
126
|
+
instance.credentials['port'].should == 8080
|
|
127
|
+
end
|
|
128
|
+
end
|
|
97
129
|
end
|
|
98
130
|
end
|
|
99
131
|
end
|
|
@@ -48,23 +48,28 @@ module CF
|
|
|
48
48
|
let(:current_space) { build(:space, :name => "the space") }
|
|
49
49
|
|
|
50
50
|
subject do
|
|
51
|
-
capture_output {
|
|
51
|
+
capture_output { CF::CLI.new.invoke(:services, inputs, given, global) }
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
before do
|
|
55
|
-
|
|
55
|
+
stub_client
|
|
56
56
|
client.stub(:service_bindings).and_return([service_binding])
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
context "when the user is targeted to a space" do
|
|
60
|
+
before do
|
|
61
|
+
stub_precondition
|
|
62
|
+
end
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
it "produces a table of services" do
|
|
65
|
+
subject
|
|
66
|
+
stdout.rewind
|
|
67
|
+
output = stdout.read
|
|
65
68
|
|
|
66
|
-
|
|
67
|
-
|
|
69
|
+
expect(output).to match /Getting services in the space.*OK/
|
|
70
|
+
|
|
71
|
+
expect(output).to match /name\s+service\s+provider\s+version\s+plan\s+bound apps/
|
|
72
|
+
expect(output).to match /service-instance-.+?\s+ # name
|
|
68
73
|
service-.*?\s+ # service
|
|
69
74
|
provider.*?\s+ # provider
|
|
70
75
|
service_version\s+ # version
|
|
@@ -72,21 +77,21 @@ module CF
|
|
|
72
77
|
app-name-\d+\s+ # bound apps
|
|
73
78
|
/x
|
|
74
79
|
|
|
75
|
-
|
|
80
|
+
end
|
|
76
81
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
context "when one of the services does not have a service plan" do
|
|
83
|
+
let(:service_instances) { [service1, service2]}
|
|
84
|
+
let(:service2) { build(:service_instance, :service_plan => nil, :service_bindings => [service_binding]) }
|
|
85
|
+
it 'still produces a table of service' do
|
|
86
|
+
subject
|
|
87
|
+
stdout.rewind
|
|
88
|
+
output = stdout.read
|
|
84
89
|
|
|
85
|
-
|
|
90
|
+
expect(output).to match /Getting services in the space.*OK/
|
|
86
91
|
|
|
87
|
-
|
|
92
|
+
expect(output).to match /name\s+service\s+provider\s+version\s+plan\s+bound apps/
|
|
88
93
|
|
|
89
|
-
|
|
94
|
+
expect(output).to match /service-instance-.+?\s+ # name
|
|
90
95
|
service-.*?\s+ # service
|
|
91
96
|
provider.*?\s+ # provider
|
|
92
97
|
service_version\s+ # version
|
|
@@ -94,23 +99,46 @@ module CF
|
|
|
94
99
|
app-name-\d+\s+ # bound apps
|
|
95
100
|
/x
|
|
96
101
|
|
|
97
|
-
|
|
102
|
+
expect(output).to match /service-instance-.+?\s+ # name
|
|
98
103
|
none\s+ # service
|
|
99
104
|
none\s+ # provider
|
|
100
105
|
none\s+ # version
|
|
101
106
|
none\s+ # plan
|
|
102
107
|
app-name-\d+\s+ # bound apps
|
|
103
108
|
/x
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context 'when given --marketplace argument' do
|
|
113
|
+
it 'lists services on the target' do
|
|
114
|
+
client.stub(:services => Array.new(3) { build(:service) })
|
|
115
|
+
cf %W[services --marketplace]
|
|
116
|
+
expect(output).to say("Getting services... OK")
|
|
117
|
+
expect(output).to say(/service\s+version\s+provider\s+plans\s+description/)
|
|
118
|
+
end
|
|
104
119
|
end
|
|
105
120
|
end
|
|
106
121
|
|
|
122
|
+
context "when the user is not targeted to a space" do
|
|
123
|
+
before do
|
|
124
|
+
service_command.stub(:check_logged_in).and_return(true)
|
|
125
|
+
client.stub(:current_organization).and_return(true)
|
|
126
|
+
end
|
|
127
|
+
let(:service_command) { CF::Service::Services.new(nil, {}) }
|
|
128
|
+
let(:current_space) { nil }
|
|
129
|
+
|
|
130
|
+
subject do
|
|
131
|
+
capture_output { service_command.execute(:services, inputs, global) }
|
|
132
|
+
|
|
133
|
+
#capture_output { CF::CLI.new.invoke(:services, inputs, given, global) }
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "returns an error" do
|
|
137
|
+
subject
|
|
138
|
+
stdout.rewind
|
|
139
|
+
output = stderr.read
|
|
107
140
|
|
|
108
|
-
|
|
109
|
-
it 'lists services on the target' do
|
|
110
|
-
client.stub(:services => Array.new(3) { build(:service) })
|
|
111
|
-
cf %W[services --marketplace]
|
|
112
|
-
expect(output).to say("Getting services... OK")
|
|
113
|
-
expect(output).to say(/service\s+version\s+provider\s+plans\s+description/)
|
|
141
|
+
expect(output.to_s).to match "Please select a space with 'cf target --space SPACE_NAME'"
|
|
114
142
|
end
|
|
115
143
|
end
|
|
116
144
|
end
|
|
@@ -6,10 +6,23 @@ if ENV['CF_V2_RUN_INTEGRATION']
|
|
|
6
6
|
login
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
describe "listing services" do
|
|
10
|
+
it "shows all service instances in the space" do
|
|
11
|
+
pending "Need a test environment to run this against. A1 should soon contain the necessary changes - DS & RT"
|
|
12
|
+
service1 = "some-provided-instance-#{Time.now.to_i}"
|
|
13
|
+
service2 = "cf-managed-instance-#{Time.now.to_i}"
|
|
14
|
+
create_service_instance("user-provided", service1, credentials: { hostname: "myservice.com"} )
|
|
15
|
+
create_service_instance("1", service2, plan: "1")
|
|
16
|
+
|
|
17
|
+
BlueShell::Runner.run("#{cf_bin} services") do |runner|
|
|
18
|
+
expect(runner).to say /#{service1}\s+none\s+none\s+none\s+none\s+.*/
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
9
24
|
describe "creating a service" do
|
|
10
25
|
describe "when the user leaves the line blank for a plan" do
|
|
11
|
-
let(:services) { [selected_service] }
|
|
12
|
-
|
|
13
26
|
it "re-prompts for the plan" do
|
|
14
27
|
BlueShell::Runner.run("#{cf_bin} create-service") do |runner|
|
|
15
28
|
expect(runner).to say "What kind?"
|
|
@@ -22,6 +35,75 @@ if ENV['CF_V2_RUN_INTEGRATION']
|
|
|
22
35
|
end
|
|
23
36
|
end
|
|
24
37
|
end
|
|
38
|
+
|
|
39
|
+
describe "when the service is a user-provided instance" do
|
|
40
|
+
let(:service_name) { "my-private-db-#{Random.rand(1000) + 1000}"}
|
|
41
|
+
|
|
42
|
+
it "can create a service instance" do
|
|
43
|
+
pending "Need a test environment to run this against. A1 should soon contain the necessary changes - DS & RT"
|
|
44
|
+
BlueShell::Runner.run("#{cf_bin} create-service") do |runner|
|
|
45
|
+
expect(runner).to say "What kind?"
|
|
46
|
+
runner.send_keys "user-provided"
|
|
47
|
+
|
|
48
|
+
expect(runner).to say "Name?"
|
|
49
|
+
runner.send_keys service_name
|
|
50
|
+
|
|
51
|
+
expect(runner).to say "What credentials parameters should applications use to connect to this service instance? (e.g. key: uri, value: mysql://username:password@hostname:port/name)
|
|
52
|
+
Key"
|
|
53
|
+
runner.send_keys "hostname"
|
|
54
|
+
expect(runner).to say "Value"
|
|
55
|
+
runner.send_keys "myserviceinstance.com"
|
|
56
|
+
expect(runner).to say "Another credentials parameter?"
|
|
57
|
+
runner.send_keys "n"
|
|
58
|
+
|
|
59
|
+
expect(runner).to say /Creating service #{service_name}.+ OK/
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe "binding to a service" do
|
|
66
|
+
let(:app_folder) { "env" }
|
|
67
|
+
let(:app_name) { "services_env_test_app" }
|
|
68
|
+
|
|
69
|
+
let(:service_name) { "some-provided-instance-#{Time.now.to_i}" }
|
|
70
|
+
|
|
71
|
+
xit "can bind and unbind user-provided services to apps" do
|
|
72
|
+
pending "Unbind needs to work -- RT + WR"
|
|
73
|
+
push_app(app_folder, app_name, start_command: "'bundle exec ruby env_test.rb -p $PORT'", timeout: 90)
|
|
74
|
+
create_service_instance("user-provided", service_name, credentials: { hostname: "myservice.com"} )
|
|
75
|
+
|
|
76
|
+
BlueShell::Runner.run("#{cf_bin} bind-service") do |runner|
|
|
77
|
+
expect(runner).to say "Which application?>"
|
|
78
|
+
runner.send_keys app_name
|
|
79
|
+
|
|
80
|
+
expect(runner).to say "Which service?>"
|
|
81
|
+
runner.send_keys service_name
|
|
82
|
+
|
|
83
|
+
expect(runner).to say "Binding #{service_name} to #{app_name}... OK"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
BlueShell::Runner.run("#{cf_bin} unbind-service") do |runner|
|
|
87
|
+
expect(runner).to say "Which application?"
|
|
88
|
+
runner.send_keys app_name
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
after do
|
|
95
|
+
delete_app(app_name)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def delete_app(app_name, routes=true)
|
|
99
|
+
delete_cmd = "#{cf_bin} delete #{app_name}"
|
|
100
|
+
delete_cmd + " --routes" if routes
|
|
101
|
+
BlueShell::Runner.run(delete_cmd) do |runner|
|
|
102
|
+
expect(runner).to say "Really delete #{app_name}?"
|
|
103
|
+
runner.send_keys "y"
|
|
104
|
+
expect(runner).to say "Deleting #{app_name}... OK"
|
|
105
|
+
end
|
|
106
|
+
end
|
|
25
107
|
end
|
|
26
108
|
end
|
|
27
109
|
end
|
|
@@ -97,7 +97,6 @@ if ENV["CF_V2_RUN_INTEGRATION"]
|
|
|
97
97
|
expect(runner).to say "Uploading #{app}... OK", 180
|
|
98
98
|
expect(runner).to say "Preparing to start #{app}... OK", 180
|
|
99
99
|
expect(runner).to say "Checking status of app '#{app}'...", 180
|
|
100
|
-
expect(runner).to say "0 of 1 instances running (1 starting)"
|
|
101
100
|
expect(runner).to say "1 of 1 instances running"
|
|
102
101
|
expect(runner).to say "Push successful! App '#{app}' available at http://#{subdomain}.a1-app.cf-app.com", 30
|
|
103
102
|
end
|
|
@@ -28,9 +28,45 @@ module FeaturesHelper
|
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def
|
|
31
|
+
def create_service_instance(service_name, instance_name, opts = {})
|
|
32
|
+
plan_name = opts[:plan]
|
|
33
|
+
credentials = opts[:credentials]
|
|
34
|
+
|
|
35
|
+
BlueShell::Runner.run("#{cf_bin} create-service") do |runner|
|
|
36
|
+
expect(runner).to say "What kind?>"
|
|
37
|
+
runner.send_keys service_name
|
|
38
|
+
|
|
39
|
+
expect(runner).to say "Name?>"
|
|
40
|
+
runner.send_keys instance_name
|
|
41
|
+
|
|
42
|
+
if service_name == "user-provided"
|
|
43
|
+
credentials.keys.each_with_index do |k, i|
|
|
44
|
+
expect(runner).to say "Key"
|
|
45
|
+
runner.send_keys k
|
|
46
|
+
expect(runner).to say "Value"
|
|
47
|
+
runner.send_keys credentials[k]
|
|
48
|
+
expect(runner).to say "Another credentials parameter?"
|
|
49
|
+
if i < credentials.size - 1
|
|
50
|
+
runner.send_keys "y"
|
|
51
|
+
else
|
|
52
|
+
runner.send_keys "n"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
expect(runner).to say "Which plan?"
|
|
57
|
+
runner.send_keys plan_name
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
expect(runner).to say "Creating service #{instance_name}... OK"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def push_app(app_folder, deployed_app_name, opts = {})
|
|
65
|
+
push_cmd = "#{cf_bin} push --no-manifest"
|
|
66
|
+
push_cmd += " --command #{opts[:start_command]}" if opts[:start_command]
|
|
67
|
+
|
|
32
68
|
Dir.chdir("#{SPEC_ROOT}/assets/#{app_folder}") do
|
|
33
|
-
BlueShell::Runner.run(
|
|
69
|
+
BlueShell::Runner.run(push_cmd) do |runner|
|
|
34
70
|
expect(runner).to say "Name>"
|
|
35
71
|
runner.send_keys deployed_app_name
|
|
36
72
|
|
|
@@ -59,7 +95,9 @@ module FeaturesHelper
|
|
|
59
95
|
runner.send_return
|
|
60
96
|
end
|
|
61
97
|
|
|
62
|
-
runner.
|
|
98
|
+
expect(runner).to say "Push successful!"
|
|
99
|
+
|
|
100
|
+
runner.wait_for_exit opts[:timeout] || 30
|
|
63
101
|
end
|
|
64
102
|
end
|
|
65
103
|
end
|
|
@@ -7,6 +7,14 @@ module InteractHelper
|
|
|
7
7
|
CF::CLI.any_instance.should_receive(:ask).with(*args, &block)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
+
def should_print(*args, &block)
|
|
11
|
+
CF::CLI.any_instance.should_receive(:line).with(*args, &block)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def should_print_error(*args, &block)
|
|
15
|
+
CF::CLI.any_instance.should_receive(:err).with(*args, &block)
|
|
16
|
+
end
|
|
17
|
+
|
|
10
18
|
def dont_allow_ask(*args)
|
|
11
19
|
CF::CLI.any_instance.should_not_receive(:ask).with(*args)
|
|
12
20
|
end
|
metadata
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cf
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.2.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 4.2.8.rc1
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Cloud Foundry Team
|
|
@@ -10,12 +9,11 @@ authors:
|
|
|
10
9
|
autorequire:
|
|
11
10
|
bindir: bin
|
|
12
11
|
cert_chain: []
|
|
13
|
-
date: 2013-07-
|
|
12
|
+
date: 2013-07-26 00:00:00.000000000 Z
|
|
14
13
|
dependencies:
|
|
15
14
|
- !ruby/object:Gem::Dependency
|
|
16
15
|
name: addressable
|
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
|
18
|
-
none: false
|
|
19
17
|
requirements:
|
|
20
18
|
- - ~>
|
|
21
19
|
- !ruby/object:Gem::Version
|
|
@@ -23,7 +21,6 @@ dependencies:
|
|
|
23
21
|
type: :runtime
|
|
24
22
|
prerelease: false
|
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
-
none: false
|
|
27
24
|
requirements:
|
|
28
25
|
- - ~>
|
|
29
26
|
- !ruby/object:Gem::Version
|
|
@@ -31,7 +28,6 @@ dependencies:
|
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
|
32
29
|
name: caldecott-client
|
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
|
34
|
-
none: false
|
|
35
31
|
requirements:
|
|
36
32
|
- - ~>
|
|
37
33
|
- !ruby/object:Gem::Version
|
|
@@ -39,7 +35,6 @@ dependencies:
|
|
|
39
35
|
type: :runtime
|
|
40
36
|
prerelease: false
|
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
42
|
-
none: false
|
|
43
38
|
requirements:
|
|
44
39
|
- - ~>
|
|
45
40
|
- !ruby/object:Gem::Version
|
|
@@ -47,23 +42,20 @@ dependencies:
|
|
|
47
42
|
- !ruby/object:Gem::Dependency
|
|
48
43
|
name: cfoundry
|
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
|
50
|
-
none: false
|
|
51
45
|
requirements:
|
|
52
46
|
- - ~>
|
|
53
47
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 4.0.
|
|
48
|
+
version: 4.0.2.rc5
|
|
55
49
|
type: :runtime
|
|
56
50
|
prerelease: false
|
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
|
58
|
-
none: false
|
|
59
52
|
requirements:
|
|
60
53
|
- - ~>
|
|
61
54
|
- !ruby/object:Gem::Version
|
|
62
|
-
version: 4.0.
|
|
55
|
+
version: 4.0.2.rc5
|
|
63
56
|
- !ruby/object:Gem::Dependency
|
|
64
57
|
name: interact
|
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
|
66
|
-
none: false
|
|
67
59
|
requirements:
|
|
68
60
|
- - ~>
|
|
69
61
|
- !ruby/object:Gem::Version
|
|
@@ -71,7 +63,6 @@ dependencies:
|
|
|
71
63
|
type: :runtime
|
|
72
64
|
prerelease: false
|
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
|
74
|
-
none: false
|
|
75
66
|
requirements:
|
|
76
67
|
- - ~>
|
|
77
68
|
- !ruby/object:Gem::Version
|
|
@@ -79,7 +70,6 @@ dependencies:
|
|
|
79
70
|
- !ruby/object:Gem::Dependency
|
|
80
71
|
name: json_pure
|
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
|
82
|
-
none: false
|
|
83
73
|
requirements:
|
|
84
74
|
- - ~>
|
|
85
75
|
- !ruby/object:Gem::Version
|
|
@@ -87,7 +77,6 @@ dependencies:
|
|
|
87
77
|
type: :runtime
|
|
88
78
|
prerelease: false
|
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
|
90
|
-
none: false
|
|
91
80
|
requirements:
|
|
92
81
|
- - ~>
|
|
93
82
|
- !ruby/object:Gem::Version
|
|
@@ -95,7 +84,6 @@ dependencies:
|
|
|
95
84
|
- !ruby/object:Gem::Dependency
|
|
96
85
|
name: mothership
|
|
97
86
|
requirement: !ruby/object:Gem::Requirement
|
|
98
|
-
none: false
|
|
99
87
|
requirements:
|
|
100
88
|
- - ! '>='
|
|
101
89
|
- !ruby/object:Gem::Version
|
|
@@ -106,7 +94,6 @@ dependencies:
|
|
|
106
94
|
type: :runtime
|
|
107
95
|
prerelease: false
|
|
108
96
|
version_requirements: !ruby/object:Gem::Requirement
|
|
109
|
-
none: false
|
|
110
97
|
requirements:
|
|
111
98
|
- - ! '>='
|
|
112
99
|
- !ruby/object:Gem::Version
|
|
@@ -117,7 +104,6 @@ dependencies:
|
|
|
117
104
|
- !ruby/object:Gem::Dependency
|
|
118
105
|
name: multi_json
|
|
119
106
|
requirement: !ruby/object:Gem::Requirement
|
|
120
|
-
none: false
|
|
121
107
|
requirements:
|
|
122
108
|
- - ~>
|
|
123
109
|
- !ruby/object:Gem::Version
|
|
@@ -125,7 +111,6 @@ dependencies:
|
|
|
125
111
|
type: :runtime
|
|
126
112
|
prerelease: false
|
|
127
113
|
version_requirements: !ruby/object:Gem::Requirement
|
|
128
|
-
none: false
|
|
129
114
|
requirements:
|
|
130
115
|
- - ~>
|
|
131
116
|
- !ruby/object:Gem::Version
|
|
@@ -133,7 +118,6 @@ dependencies:
|
|
|
133
118
|
- !ruby/object:Gem::Dependency
|
|
134
119
|
name: rest-client
|
|
135
120
|
requirement: !ruby/object:Gem::Requirement
|
|
136
|
-
none: false
|
|
137
121
|
requirements:
|
|
138
122
|
- - ~>
|
|
139
123
|
- !ruby/object:Gem::Version
|
|
@@ -141,7 +125,6 @@ dependencies:
|
|
|
141
125
|
type: :runtime
|
|
142
126
|
prerelease: false
|
|
143
127
|
version_requirements: !ruby/object:Gem::Requirement
|
|
144
|
-
none: false
|
|
145
128
|
requirements:
|
|
146
129
|
- - ~>
|
|
147
130
|
- !ruby/object:Gem::Version
|
|
@@ -149,7 +132,6 @@ dependencies:
|
|
|
149
132
|
- !ruby/object:Gem::Dependency
|
|
150
133
|
name: uuidtools
|
|
151
134
|
requirement: !ruby/object:Gem::Requirement
|
|
152
|
-
none: false
|
|
153
135
|
requirements:
|
|
154
136
|
- - ~>
|
|
155
137
|
- !ruby/object:Gem::Version
|
|
@@ -157,7 +139,6 @@ dependencies:
|
|
|
157
139
|
type: :runtime
|
|
158
140
|
prerelease: false
|
|
159
141
|
version_requirements: !ruby/object:Gem::Requirement
|
|
160
|
-
none: false
|
|
161
142
|
requirements:
|
|
162
143
|
- - ~>
|
|
163
144
|
- !ruby/object:Gem::Version
|
|
@@ -165,7 +146,6 @@ dependencies:
|
|
|
165
146
|
- !ruby/object:Gem::Dependency
|
|
166
147
|
name: anchorman
|
|
167
148
|
requirement: !ruby/object:Gem::Requirement
|
|
168
|
-
none: false
|
|
169
149
|
requirements:
|
|
170
150
|
- - ! '>='
|
|
171
151
|
- !ruby/object:Gem::Version
|
|
@@ -173,7 +153,6 @@ dependencies:
|
|
|
173
153
|
type: :development
|
|
174
154
|
prerelease: false
|
|
175
155
|
version_requirements: !ruby/object:Gem::Requirement
|
|
176
|
-
none: false
|
|
177
156
|
requirements:
|
|
178
157
|
- - ! '>='
|
|
179
158
|
- !ruby/object:Gem::Version
|
|
@@ -181,7 +160,6 @@ dependencies:
|
|
|
181
160
|
- !ruby/object:Gem::Dependency
|
|
182
161
|
name: blue-shell
|
|
183
162
|
requirement: !ruby/object:Gem::Requirement
|
|
184
|
-
none: false
|
|
185
163
|
requirements:
|
|
186
164
|
- - ! '>='
|
|
187
165
|
- !ruby/object:Gem::Version
|
|
@@ -189,7 +167,6 @@ dependencies:
|
|
|
189
167
|
type: :development
|
|
190
168
|
prerelease: false
|
|
191
169
|
version_requirements: !ruby/object:Gem::Requirement
|
|
192
|
-
none: false
|
|
193
170
|
requirements:
|
|
194
171
|
- - ! '>='
|
|
195
172
|
- !ruby/object:Gem::Version
|
|
@@ -197,7 +174,6 @@ dependencies:
|
|
|
197
174
|
- !ruby/object:Gem::Dependency
|
|
198
175
|
name: factory_girl
|
|
199
176
|
requirement: !ruby/object:Gem::Requirement
|
|
200
|
-
none: false
|
|
201
177
|
requirements:
|
|
202
178
|
- - ! '>='
|
|
203
179
|
- !ruby/object:Gem::Version
|
|
@@ -205,7 +181,6 @@ dependencies:
|
|
|
205
181
|
type: :development
|
|
206
182
|
prerelease: false
|
|
207
183
|
version_requirements: !ruby/object:Gem::Requirement
|
|
208
|
-
none: false
|
|
209
184
|
requirements:
|
|
210
185
|
- - ! '>='
|
|
211
186
|
- !ruby/object:Gem::Version
|
|
@@ -213,7 +188,6 @@ dependencies:
|
|
|
213
188
|
- !ruby/object:Gem::Dependency
|
|
214
189
|
name: fakefs
|
|
215
190
|
requirement: !ruby/object:Gem::Requirement
|
|
216
|
-
none: false
|
|
217
191
|
requirements:
|
|
218
192
|
- - ~>
|
|
219
193
|
- !ruby/object:Gem::Version
|
|
@@ -221,7 +195,6 @@ dependencies:
|
|
|
221
195
|
type: :development
|
|
222
196
|
prerelease: false
|
|
223
197
|
version_requirements: !ruby/object:Gem::Requirement
|
|
224
|
-
none: false
|
|
225
198
|
requirements:
|
|
226
199
|
- - ~>
|
|
227
200
|
- !ruby/object:Gem::Version
|
|
@@ -229,7 +202,6 @@ dependencies:
|
|
|
229
202
|
- !ruby/object:Gem::Dependency
|
|
230
203
|
name: ffaker
|
|
231
204
|
requirement: !ruby/object:Gem::Requirement
|
|
232
|
-
none: false
|
|
233
205
|
requirements:
|
|
234
206
|
- - '='
|
|
235
207
|
- !ruby/object:Gem::Version
|
|
@@ -237,7 +209,6 @@ dependencies:
|
|
|
237
209
|
type: :development
|
|
238
210
|
prerelease: false
|
|
239
211
|
version_requirements: !ruby/object:Gem::Requirement
|
|
240
|
-
none: false
|
|
241
212
|
requirements:
|
|
242
213
|
- - '='
|
|
243
214
|
- !ruby/object:Gem::Version
|
|
@@ -245,7 +216,6 @@ dependencies:
|
|
|
245
216
|
- !ruby/object:Gem::Dependency
|
|
246
217
|
name: gem-release
|
|
247
218
|
requirement: !ruby/object:Gem::Requirement
|
|
248
|
-
none: false
|
|
249
219
|
requirements:
|
|
250
220
|
- - ! '>='
|
|
251
221
|
- !ruby/object:Gem::Version
|
|
@@ -253,7 +223,6 @@ dependencies:
|
|
|
253
223
|
type: :development
|
|
254
224
|
prerelease: false
|
|
255
225
|
version_requirements: !ruby/object:Gem::Requirement
|
|
256
|
-
none: false
|
|
257
226
|
requirements:
|
|
258
227
|
- - ! '>='
|
|
259
228
|
- !ruby/object:Gem::Version
|
|
@@ -261,7 +230,6 @@ dependencies:
|
|
|
261
230
|
- !ruby/object:Gem::Dependency
|
|
262
231
|
name: rake
|
|
263
232
|
requirement: !ruby/object:Gem::Requirement
|
|
264
|
-
none: false
|
|
265
233
|
requirements:
|
|
266
234
|
- - ~>
|
|
267
235
|
- !ruby/object:Gem::Version
|
|
@@ -269,7 +237,6 @@ dependencies:
|
|
|
269
237
|
type: :development
|
|
270
238
|
prerelease: false
|
|
271
239
|
version_requirements: !ruby/object:Gem::Requirement
|
|
272
|
-
none: false
|
|
273
240
|
requirements:
|
|
274
241
|
- - ~>
|
|
275
242
|
- !ruby/object:Gem::Version
|
|
@@ -277,7 +244,6 @@ dependencies:
|
|
|
277
244
|
- !ruby/object:Gem::Dependency
|
|
278
245
|
name: rspec
|
|
279
246
|
requirement: !ruby/object:Gem::Requirement
|
|
280
|
-
none: false
|
|
281
247
|
requirements:
|
|
282
248
|
- - ~>
|
|
283
249
|
- !ruby/object:Gem::Version
|
|
@@ -285,7 +251,6 @@ dependencies:
|
|
|
285
251
|
type: :development
|
|
286
252
|
prerelease: false
|
|
287
253
|
version_requirements: !ruby/object:Gem::Requirement
|
|
288
|
-
none: false
|
|
289
254
|
requirements:
|
|
290
255
|
- - ~>
|
|
291
256
|
- !ruby/object:Gem::Version
|
|
@@ -293,7 +258,6 @@ dependencies:
|
|
|
293
258
|
- !ruby/object:Gem::Dependency
|
|
294
259
|
name: rspec-instafail
|
|
295
260
|
requirement: !ruby/object:Gem::Requirement
|
|
296
|
-
none: false
|
|
297
261
|
requirements:
|
|
298
262
|
- - ~>
|
|
299
263
|
- !ruby/object:Gem::Version
|
|
@@ -301,7 +265,6 @@ dependencies:
|
|
|
301
265
|
type: :development
|
|
302
266
|
prerelease: false
|
|
303
267
|
version_requirements: !ruby/object:Gem::Requirement
|
|
304
|
-
none: false
|
|
305
268
|
requirements:
|
|
306
269
|
- - ~>
|
|
307
270
|
- !ruby/object:Gem::Version
|
|
@@ -309,7 +272,6 @@ dependencies:
|
|
|
309
272
|
- !ruby/object:Gem::Dependency
|
|
310
273
|
name: webmock
|
|
311
274
|
requirement: !ruby/object:Gem::Requirement
|
|
312
|
-
none: false
|
|
313
275
|
requirements:
|
|
314
276
|
- - ~>
|
|
315
277
|
- !ruby/object:Gem::Version
|
|
@@ -317,7 +279,6 @@ dependencies:
|
|
|
317
279
|
type: :development
|
|
318
280
|
prerelease: false
|
|
319
281
|
version_requirements: !ruby/object:Gem::Requirement
|
|
320
|
-
none: false
|
|
321
282
|
requirements:
|
|
322
283
|
- - ~>
|
|
323
284
|
- !ruby/object:Gem::Version
|
|
@@ -450,6 +411,9 @@ files:
|
|
|
450
411
|
- spec/admin/curl_spec.rb
|
|
451
412
|
- spec/admin/guid_spec.rb
|
|
452
413
|
- spec/admin/set_quota_spec.rb
|
|
414
|
+
- spec/assets/env/env_test.rb
|
|
415
|
+
- spec/assets/env/Gemfile
|
|
416
|
+
- spec/assets/env/Gemfile.lock
|
|
453
417
|
- spec/assets/hello-sinatra/config.ru
|
|
454
418
|
- spec/assets/hello-sinatra/fat-cat-makes-app-larger.png
|
|
455
419
|
- spec/assets/hello-sinatra/Gemfile
|
|
@@ -593,6 +557,7 @@ files:
|
|
|
593
557
|
- spec/support/fake_home_dir.rb
|
|
594
558
|
- spec/support/features_helper.rb
|
|
595
559
|
- spec/support/interact_helper.rb
|
|
560
|
+
- spec/support/matchers.rb
|
|
596
561
|
- spec/support/shared_examples/errors.rb
|
|
597
562
|
- spec/support/shared_examples/input.rb
|
|
598
563
|
- spec/tunnel/plugin_spec.rb
|
|
@@ -601,32 +566,34 @@ files:
|
|
|
601
566
|
homepage: http://github.com/cloudfoundry/cf
|
|
602
567
|
licenses:
|
|
603
568
|
- Apache 2.0
|
|
569
|
+
metadata: {}
|
|
604
570
|
post_install_message:
|
|
605
571
|
rdoc_options: []
|
|
606
572
|
require_paths:
|
|
607
573
|
- lib
|
|
608
574
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
609
|
-
none: false
|
|
610
575
|
requirements:
|
|
611
576
|
- - ! '>='
|
|
612
577
|
- !ruby/object:Gem::Version
|
|
613
578
|
version: '0'
|
|
614
579
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
615
|
-
none: false
|
|
616
580
|
requirements:
|
|
617
|
-
- - ! '
|
|
581
|
+
- - ! '>'
|
|
618
582
|
- !ruby/object:Gem::Version
|
|
619
|
-
version:
|
|
583
|
+
version: 1.3.1
|
|
620
584
|
requirements: []
|
|
621
585
|
rubyforge_project: cf
|
|
622
|
-
rubygems_version:
|
|
586
|
+
rubygems_version: 2.0.5
|
|
623
587
|
signing_key:
|
|
624
|
-
specification_version:
|
|
588
|
+
specification_version: 4
|
|
625
589
|
summary: Friendly command-line interface for Cloud Foundry.
|
|
626
590
|
test_files:
|
|
627
591
|
- spec/admin/curl_spec.rb
|
|
628
592
|
- spec/admin/guid_spec.rb
|
|
629
593
|
- spec/admin/set_quota_spec.rb
|
|
594
|
+
- spec/assets/env/env_test.rb
|
|
595
|
+
- spec/assets/env/Gemfile
|
|
596
|
+
- spec/assets/env/Gemfile.lock
|
|
630
597
|
- spec/assets/hello-sinatra/config.ru
|
|
631
598
|
- spec/assets/hello-sinatra/fat-cat-makes-app-larger.png
|
|
632
599
|
- spec/assets/hello-sinatra/Gemfile
|
|
@@ -770,6 +737,7 @@ test_files:
|
|
|
770
737
|
- spec/support/fake_home_dir.rb
|
|
771
738
|
- spec/support/features_helper.rb
|
|
772
739
|
- spec/support/interact_helper.rb
|
|
740
|
+
- spec/support/matchers.rb
|
|
773
741
|
- spec/support/shared_examples/errors.rb
|
|
774
742
|
- spec/support/shared_examples/input.rb
|
|
775
743
|
- spec/tunnel/plugin_spec.rb
|