tools-cf-plugin 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -48,7 +48,7 @@ module CFTools
48
48
 
49
49
  [ c(idx, :name),
50
50
  list(attrs["stacks"]),
51
- diff(attrs, prev) { |x| x["app_id_to_count"].values.inject(&:+) },
51
+ diff(attrs, prev) { |x| x["app_id_to_count"].values.inject(0, &:+) },
52
52
  diff(attrs, prev, :pretty_memory, :pretty_memory_diff) do |x|
53
53
  x["available_memory"]
54
54
  end
@@ -20,7 +20,16 @@ module CFTools
20
20
 
21
21
  locations.each do |(name, index), locs|
22
22
  Thread.new do
23
- stream_location(name, index, locs, entries)
23
+ begin
24
+ stream_location(name, index, locs, entries)
25
+ rescue => e
26
+ entries << LogEntry.new(
27
+ "#{name}/#{index}",
28
+ c("failed: #{e.class}: #{e}", :error),
29
+ :stdout)
30
+
31
+ retry
32
+ end
24
33
  end
25
34
  end
26
35
 
@@ -30,6 +30,8 @@ module CFTools::Tunnel
30
30
 
31
31
  director = connected_director(director_host, gateway)
32
32
 
33
+ line "Director: #{director.director_uri}"
34
+
33
35
  manifest =
34
36
  with_progress("Downloading deployment manifest") do
35
37
  current_deployment_manifest(director)
@@ -46,6 +48,8 @@ module CFTools::Tunnel
46
48
  login_as_admin(manifest)
47
49
  end
48
50
 
51
+ line "NATS connection: nats://#{nats["user"]}:#{nats["password"]}@127.0.0.1:#{nport}"
52
+
49
53
  execute(
50
54
  command,
51
55
  args + %W[
@@ -16,11 +16,12 @@ module CFTools::Tunnel
16
16
 
17
17
  desc "Stream logs from the jobs of a deployment"
18
18
  input :director, :argument => :required, :desc => "BOSH director address"
19
- input :gateway, :argument => :optional,
20
- :default => proc { "vcap@#{input[:director]}" },
19
+ input :components, :argument => :splat, :desc => "Which components to log"
20
+ input :gateway, :default => proc { "vcap@#{input[:director]}" },
21
21
  :desc => "SSH connection string (default: vcap@director)"
22
22
  def watch_logs
23
23
  director_host = input[:director]
24
+ components = input[:components]
24
25
  gateway = input[:gateway]
25
26
 
26
27
  director = connected_director(director_host, gateway)
@@ -32,7 +33,7 @@ module CFTools::Tunnel
32
33
 
33
34
  locations =
34
35
  with_progress("Finding logs for #{c(deployment["name"], :name)}") do
35
- locs = stream_locations(director, deployment["name"])
36
+ locs = stream_locations(director, deployment["name"], components)
36
37
 
37
38
  if locs.empty?
38
39
  fail "No locations found."
@@ -69,16 +70,19 @@ module CFTools::Tunnel
69
70
  ].join(" ")
70
71
  end
71
72
 
72
- def stream_locations(director, deployment)
73
+ def stream_locations(director, deployment, components)
73
74
  locations = Hash.new { |h, k| h[k] = [] }
74
75
 
76
+ logs = LOGS.dup
77
+ logs.select! { |l, _| components.include?(l) } unless components.empty?
78
+
75
79
  director.fetch_vm_state(deployment, :use_cache => false).each do |vm|
76
80
  name = vm["job_name"]
77
81
  index = vm["index"]
78
- next unless LOGS.key?(name)
82
+ next unless logs.key?(name)
79
83
 
80
84
  vm["ips"].each do |ip|
81
- LOGS[name].each do |file|
85
+ logs[name].each do |file|
82
86
  locations[[name, index]] << StreamLocation.new(file, "#{name}/#{index}")
83
87
  end
84
88
  end
@@ -1,3 +1,3 @@
1
1
  module CFTools
2
- VERSION = "2.0.0".freeze
2
+ VERSION = "2.1.0".freeze
3
3
  end
@@ -138,7 +138,11 @@ module CFTools
138
138
  payload = JSON.parse(msg)
139
139
  dea, _ = payload["id"].split("-", 2)
140
140
  [ d(sub),
141
- "dea: #{dea}, stacks: #{list(payload["stacks"])}, available mem: #{human_mb(payload["available_memory"])}, apps: #{pretty_app_count(payload["app_id_to_count"])}"
141
+ [ "dea: #{dea}",
142
+ "stacks: #{list(payload["stacks"])}",
143
+ "available mem: #{human_mb(payload["available_memory"])}",
144
+ "apps: #{pretty_app_count(payload["app_id_to_count"] || [])}"
145
+ ].join(", ")
142
146
  ]
143
147
  end
144
148
 
@@ -146,7 +150,10 @@ module CFTools
146
150
  payload = JSON.parse(msg)
147
151
  dea, _ = payload["id"].split("-", 2)
148
152
  [ d(sub),
149
- "dea: #{dea}, stacks: #{list(payload["stacks"])}, available mem: #{human_mb(payload["available_memory"])}"
153
+ [ "dea: #{dea}",
154
+ "stacks: #{list(payload["stacks"])}",
155
+ "available mem: #{human_mb(payload["available_memory"])}"
156
+ ].join(", ")
150
157
  ]
151
158
  end
152
159
 
@@ -157,7 +164,10 @@ module CFTools
157
164
  def pretty_exited(sub, msg)
158
165
  payload = JSON.parse(msg)
159
166
  [ c(sub, :bad),
160
- "app: #{pretty_app(payload["droplet"])}, reason: #{payload["reason"]}, index: #{payload["index"]}"
167
+ [ "app: #{pretty_app(payload["droplet"])}",
168
+ "reason: #{payload["reason"]}",
169
+ "index: #{payload["index"]}"
170
+ ].join(", ")
161
171
  ]
162
172
  end
163
173
 
@@ -187,44 +197,57 @@ module CFTools
187
197
  def pretty_register(sub, msg)
188
198
  payload = JSON.parse(msg)
189
199
 
200
+ message = []
201
+
190
202
  if (dea_id = payload["dea"])
191
203
  dea, _ = dea_id.split("-", 2)
192
- message = "app: #{pretty_app(payload["app"])}, dea: #{dea}, "
193
- else
194
- message = ""
204
+ message += ["app: #{pretty_app(payload["app"])}", "dea: #{dea}"]
195
205
  end
196
206
 
197
- message << "uris: #{list(payload["uris"])}, host: #{payload["host"]}, port: #{payload["port"]}"
207
+ message += [
208
+ "uris: #{list(payload["uris"])}",
209
+ "host: #{payload["host"]}",
210
+ "port: #{payload["port"]}"
211
+ ]
198
212
 
199
- [c(sub, :neutral), message]
213
+ [c(sub, :neutral), message.join(", ")]
200
214
  end
201
215
 
202
216
  def pretty_unregister(sub, msg)
203
217
  payload = JSON.parse(msg)
204
218
 
219
+ message = []
220
+
205
221
  if (dea_id = payload["dea"])
206
222
  dea, _ = dea_id.split("-", 2)
207
- message = "app: #{pretty_app(payload["app"])}, dea: #{dea}, "
208
- else
209
- message = ""
223
+ message += ["app: #{pretty_app(payload["app"])}", "dea: #{dea}"]
210
224
  end
211
225
 
212
- message << "uris: #{list(payload["uris"])}, host: #{payload["host"]}, port: #{payload["port"]}"
226
+ message += [
227
+ "uris: #{list(payload["uris"])}",
228
+ "host: #{payload["host"]}",
229
+ "port: #{payload["port"]}"
230
+ ]
213
231
 
214
- [c(sub, :warning), message]
232
+ [c(sub, :warning), message.join(", ")]
215
233
  end
216
234
 
217
235
  def pretty_start(sub, msg, dea)
218
236
  payload = JSON.parse(msg)
219
237
  [ c("dea.#{dea}.start", :good),
220
- "app: #{pretty_app(payload["droplet"])}, dea: #{dea}, index: #{payload["index"]}, uris: #{list(payload["uris"])}"
238
+ [ "app: #{pretty_app(payload["droplet"])}",
239
+ "dea: #{dea}",
240
+ "index: #{payload["index"]}",
241
+ "uris: #{list(payload["uris"])}"
242
+ ].join(", ")
221
243
  ]
222
244
  end
223
245
 
224
246
  def pretty_stop(sub, msg)
225
247
  payload = JSON.parse(msg)
226
248
 
227
- message = "app: #{pretty_app(payload["droplet"])}, "
249
+ message = ["app: #{pretty_app(payload["droplet"])}"]
250
+
228
251
  if (indices = payload["indices"])
229
252
  message << "scaling down indices: #{indices.join(", ")}"
230
253
  elsif (instances = payload["instances"])
@@ -233,18 +256,26 @@ module CFTools
233
256
  message << "stopping application"
234
257
  end
235
258
 
236
- [c(sub, :warning), message]
259
+ [c(sub, :warning), message.join(", ")]
237
260
  end
238
261
 
239
262
  def pretty_dea_update(sub, msg)
240
263
  payload = JSON.parse(msg)
241
- [d(sub), "app: #{pretty_app(payload["droplet"])}, uris: #{payload["uris"].join(", ")}"]
264
+ [ d(sub),
265
+ [ "app: #{pretty_app(payload["droplet"])}",
266
+ "uris: #{list(payload["uris"])}"
267
+ ].join(", ")
268
+ ]
242
269
  end
243
270
 
244
271
  def pretty_find_droplet(sub, msg)
245
272
  payload = JSON.parse(msg)
246
273
  states = payload["states"].collect { |s| c(s.downcase, state_color(s))}
247
- [d(sub), "app: #{pretty_app(payload["droplet"])}, querying states: #{states.join(", ")}"]
274
+ [ d(sub),
275
+ [ "app: #{pretty_app(payload["droplet"])}",
276
+ "querying states: #{states.join(", ")}"
277
+ ].join(", ")
278
+ ]
248
279
  end
249
280
 
250
281
  def pretty_find_droplet_response(sub, msg)
@@ -254,14 +285,22 @@ module CFTools
254
285
  state = payload["state"]
255
286
  time = Time.at(payload["state_timestamp"])
256
287
  [ sub,
257
- "dea: #{dea}, index: #{index}, state: #{c(state.downcase, state_color(state))}, since: #{time}"
288
+ [ "dea: #{dea}",
289
+ "index: #{index}",
290
+ "state: #{c(state.downcase, state_color(state))}",
291
+ "since: #{time}"
292
+ ].join(", ")
258
293
  ]
259
294
  end
260
295
 
261
296
  def pretty_healthmanager_status(sub, msg)
262
297
  payload = JSON.parse(msg)
263
298
  state = payload["state"]
264
- [d(sub), "app: #{pretty_app(payload["droplet"])}, querying states: #{c(state.downcase, state_color(state))}"]
299
+ [ d(sub),
300
+ [ "app: #{pretty_app(payload["droplet"])}",
301
+ "querying states: #{c(state.downcase, state_color(state))}"
302
+ ].join(", ")
303
+ ]
265
304
  end
266
305
 
267
306
  def pretty_healthmanager_status_response(sub, msg)
@@ -277,7 +316,11 @@ module CFTools
277
316
 
278
317
  def pretty_healthmanager_health_response(sub, msg)
279
318
  payload = JSON.parse(msg)
280
- [sub, "app: #{pretty_app(payload["droplet"])}, healthy: #{payload["healthy"]}"]
319
+ [ sub,
320
+ [ "app: #{pretty_app(payload["droplet"])}",
321
+ "healthy: #{payload["healthy"]}"
322
+ ].join(", ")
323
+ ]
281
324
  end
282
325
 
283
326
  def pretty_updated(sub, msg)
@@ -303,7 +346,11 @@ module CFTools
303
346
 
304
347
  op = payload["op"]
305
348
 
306
- message = "app: #{pretty_app(payload["droplet"])}, operation: #{pretty_hm_op(op)}, app last updated: #{last_updated}, "
349
+ message = [
350
+ "app: #{pretty_app(payload["droplet"])}",
351
+ "operation: #{pretty_hm_op(op)}",
352
+ "app last updated: #{last_updated}"
353
+ ]
307
354
 
308
355
  case op
309
356
  when "STOP"
@@ -312,7 +359,7 @@ module CFTools
312
359
  message << "indices: #{list(payload["indices"])}"
313
360
  end
314
361
 
315
- [c("hm.request", :warning), message]
362
+ [c("hm.request", :warning), message.join(", ")]
316
363
  end
317
364
 
318
365
  def pretty_service_announcement(sub, msg)
@@ -324,7 +371,13 @@ module CFTools
324
371
  c_avail = payload["available_capacity"]
325
372
  s_versions = payload["supported_versions"]
326
373
 
327
- [d(sub), "id: #{id}, plan: #{plan}, supported versions: #{list(s_versions)}, capacity: (available: #{c_avail}, max: #{c_max}, unit: #{c_unit})"]
374
+ [ d(sub),
375
+ [ "id: #{id}",
376
+ "plan: #{plan}",
377
+ "supported versions: #{list(s_versions)}",
378
+ "capacity: (available: #{c_avail}, max: #{c_max}, unit: #{c_unit})"
379
+ ].join(", ")
380
+ ]
328
381
  end
329
382
 
330
383
  def pretty_component_announcement(sub, msg)
@@ -334,7 +387,13 @@ module CFTools
334
387
  uuid = payload["uuid"]
335
388
  time = payload["start"]
336
389
 
337
- [d(sub), "type: #{type}, index: #{index}, uuid: #{uuid}, start time: #{time}"]
390
+ [ d(sub),
391
+ [ "type: #{type}",
392
+ "index: #{index}",
393
+ "uuid: #{uuid}",
394
+ "start time: #{time}"
395
+ ].join(", ")
396
+ ]
338
397
  end
339
398
 
340
399
  def pretty_component_discover(sub, msg)
@@ -346,12 +405,18 @@ module CFTools
346
405
  type = payload["type"]
347
406
  index = payload["index"]
348
407
  host = payload["host"]
408
+ user, pass = payload["credentials"]
349
409
  uptime = payload["uptime"]
350
410
 
351
- message = "type: #{type}, index: #{index}, host: #{host}"
352
- message << ", uptime: #{uptime}" if uptime
411
+ message = [
412
+ "type: #{type}",
413
+ "index: #{index}",
414
+ "uri: #{user}:#{pass}@#{host}"
415
+ ]
416
+
417
+ message << "uptime: #{uptime}" if uptime
353
418
 
354
- [d(sub), message]
419
+ [d(sub), message.join(", ")]
355
420
  end
356
421
 
357
422
  def pretty_hm_op(op)
data/spec/dea-ads_spec.rb CHANGED
@@ -6,25 +6,25 @@ describe CFTools::DEAAds do
6
6
  before { stub_client }
7
7
 
8
8
  before do
9
- stub(NATS).start.yields
10
- stub(NATS).subscribe
11
- stub(EM).add_periodic_timer.yields
9
+ NATS.stub(:start).and_yield
10
+ NATS.stub(:subscribe)
11
+ EM.stub(:add_periodic_timer).and_yield
12
12
  end
13
13
 
14
14
  it "subscribes to dea.advertise" do
15
- mock(NATS).subscribe("dea.advertise")
15
+ expect(NATS).to receive(:subscribe).with("dea.advertise")
16
16
  cf %W[dea-ads]
17
17
  end
18
18
 
19
19
  it "refreshes every 3 seconds" do
20
- mock(EM).add_periodic_timer(3).yields
21
- mock.instance_of(described_class).render_table
20
+ expect(EM).to receive(:add_periodic_timer).with(3).and_yield
21
+ expect_any_instance_of(described_class).to receive(:render_table)
22
22
  cf %W[dea-ads]
23
23
  end
24
24
 
25
25
  context "when no NATS server info is specified" do
26
26
  it "connects on nats:nats@127.0.0.1:4222" do
27
- mock(NATS).start(hash_including(
27
+ expect(NATS).to receive(:start).with(hash_including(
28
28
  :uri => "nats://nats:nats@127.0.0.1:4222"))
29
29
 
30
30
  cf %W[dea-ads]
@@ -33,7 +33,7 @@ describe CFTools::DEAAds do
33
33
 
34
34
  context "when NATS server info is specified" do
35
35
  it "connects to the given location using the given credentials" do
36
- mock(NATS).start(hash_including(
36
+ expect(NATS).to receive(:start).with(hash_including(
37
37
  :uri => "nats://someuser:somepass@example.com:4242"))
38
38
 
39
39
  cf %W[dea-ads -h example.com -P 4242 -u someuser -p somepass]
@@ -64,7 +64,7 @@ describe CFTools::DEAAds do
64
64
  PAYLOAD
65
65
 
66
66
  before do
67
- stub(NATS).subscribe.yields(advertise)
67
+ NATS.stub(:subscribe).and_yield(advertise)
68
68
  end
69
69
 
70
70
  it "prints its entry in the table" do
@@ -72,12 +72,28 @@ PAYLOAD
72
72
  expect(output).to say(/^2\s+lucid64, lucid86\s+6\s+1\.2G$/)
73
73
  end
74
74
 
75
+ context "and it has no apps" do
76
+ let(:advertise) { <<PAYLOAD }
77
+ {
78
+ "app_id_to_count": {},
79
+ "available_memory": 1256,
80
+ "stacks": [
81
+ "lucid64"
82
+ ],
83
+ "prod": false,
84
+ "id": "2-1d0cf3bcd994d9f2c5ea22b9b624d77b"
85
+ }
86
+ PAYLOAD
87
+
88
+ it "prints 0 as the droplet count" do
89
+ cf %W[dea-ads]
90
+ expect(output).to say(/^2\s+lucid64\s+0\s+1\.2G$/)
91
+ end
92
+ end
93
+
75
94
  context "and another advertise is seen" do
76
95
  before do
77
- stub(NATS).subscribe do |_, blk|
78
- blk.call(advertise)
79
- blk.call(other_advertise)
80
- end
96
+ NATS.stub(:subscribe).and_yield(advertise).and_yield(other_advertise)
81
97
  end
82
98
 
83
99
  context "from a different DEA" do
data/spec/shell_spec.rb CHANGED
@@ -6,10 +6,10 @@ describe CFTools::Shell do
6
6
  before { stub_client }
7
7
 
8
8
  it "starts a pry session with :quiet" do
9
- binding = stub
9
+ binding = double
10
10
 
11
- mock.instance_of(described_class).binding { binding }
12
- mock(binding).pry :quiet => true
11
+ expect_any_instance_of(described_class).to receive(:binding).and_return(binding)
12
+ expect(binding).to receive(:pry).with(:quiet => true)
13
13
 
14
14
  cf %w[shell]
15
15
  end
data/spec/spec_helper.rb CHANGED
@@ -14,7 +14,6 @@ require "#{SPEC_ROOT}/../lib/tools-cf-plugin/plugin"
14
14
 
15
15
  RSpec.configure do |c|
16
16
  c.include Fake::FakeMethods
17
- c.mock_with :rr
18
17
 
19
18
  c.include FakeHomeDir
20
19
  c.include CliHelper
@@ -2,14 +2,12 @@ require "spec_helper"
2
2
 
3
3
  module CFTools::Tunnel
4
4
  describe Base do
5
- before do
6
- stub(subject).input { { :quiet => true } }
7
- end
5
+ before { subject.stub(:input => {:quiet => true}) }
8
6
 
9
7
  describe "#director" do
10
8
  context "when the given director is accessible" do
11
9
  before do
12
- stub(subject).address_reachable?("some-director.com", 25555) { true }
10
+ subject.stub(:address_reachable?).with("some-director.com", 25555).and_return(true)
13
11
  end
14
12
 
15
13
  it "returns the given director" do
@@ -21,11 +19,11 @@ module CFTools::Tunnel
21
19
 
22
20
  context "when the given director is inaccessible" do
23
21
  before do
24
- stub(subject).address_reachable?("some-director.com", 25555) { false }
22
+ subject.stub(:address_reachable?).with("some-director.com", 25555).and_return(false)
25
23
  end
26
24
 
27
25
  it "opens a tunnel through the gateway" do
28
- mock(subject).tunnel_to("some-director.com", 25555, "user@some-gateway") do
26
+ expect(subject).to receive(:tunnel_to).with("some-director.com", 25555, "user@some-gateway") do
29
27
  1234
30
28
  end
31
29
 
@@ -37,63 +35,61 @@ module CFTools::Tunnel
37
35
  end
38
36
 
39
37
  describe "#login_to_director" do
40
- let(:director) { stub }
38
+ let(:director) { double }
41
39
 
42
40
  before do
43
- stub(director).user = anything
44
- stub(director).password = anything
45
- stub(director).authenticated? { true }
41
+ director.stub(:user=)
42
+ director.stub(:password=)
43
+ director.stub(:authenticated? => true)
46
44
  end
47
45
 
48
46
  it "assigns the given user/pass on the director" do
49
- mock(director).user = "user"
50
- mock(director).password = "pass"
47
+ expect(director).to receive(:user=).with("user")
48
+ expect(director).to receive(:password=).with("pass")
51
49
  subject.login_to_director(director, "user", "pass")
52
50
  end
53
51
 
54
52
  it "returns true iff director.authenticated?" do
55
- mock(director).authenticated? { true }
53
+ expect(director).to receive(:authenticated?).and_return(true)
56
54
  expect(subject.login_to_director(director, "user", "pass")).to be_true
57
55
  end
58
56
 
59
57
  it "returns false iff !director.authenticated?" do
60
- mock(director).authenticated? { false }
58
+ expect(director).to receive(:authenticated?).and_return(false)
61
59
  expect(subject.login_to_director(director, "user", "pass")).to be_false
62
60
  end
63
61
  end
64
62
 
65
63
  describe "#tunnel_to" do
66
- let(:gateway) { stub }
64
+ let(:gateway) { double }
67
65
 
68
- before do
69
- stub(gateway).open
70
- end
66
+ before { gateway.stub(:open) }
71
67
 
72
68
  it "creates a gateway using the given user/host" do
73
- mock(Net::SSH::Gateway).new("ghost", "guser") { gateway }
69
+ expect(Net::SSH::Gateway).to receive(:new).with("ghost", "guser") { gateway }
74
70
  subject.tunnel_to("1.2.3.4", 1234, "guser@ghost")
75
71
  end
76
72
 
77
73
  it "opens a local tunnel and returns its port" do
78
- stub(Net::SSH::Gateway).new("ghost", "guser") { gateway }
79
- mock(gateway).open("1.2.3.4", 1234) { 5678 }
74
+ Net::SSH::Gateway.stub(:new).with("ghost", "guser") { gateway }
75
+ expect(gateway).to receive(:open).with("1.2.3.4", 1234) { 5678 }
80
76
  expect(subject.tunnel_to("1.2.3.4", 1234, "guser@ghost")).to eq(5678)
81
77
  end
82
78
  end
83
79
 
84
80
  describe "#authenticate_with_director" do
85
- let(:director) { stub }
81
+ let(:director) { double }
86
82
 
87
83
  def self.it_asks_interactively
88
84
  it "asks for the credentials interactively" do
89
85
  if saved_credentials
90
- mock(subject).login_to_director(director, "user", "pass") { false }.ordered
86
+ expect(subject).to receive(:login_to_director).with(director, "user", "pass").and_return(false).ordered
91
87
  end
92
88
 
93
- mock_ask("Director Username") { "fizz" }.ordered
94
- mock_ask("Director Password", anything) { "buzz" }.ordered
89
+ should_ask("Director Username") { "fizz" }
90
+ should_ask("Director Password", anything) { "buzz" }
95
91
 
96
- mock(subject).login_to_director(director, "fizz", "buzz") { true }.ordered
92
+ expect(subject).to receive(:login_to_director).with(director, "fizz", "buzz").and_return(true).ordered
97
93
 
98
94
  subject.authenticate_with_director(director, "foo", saved_credentials)
99
95
  end
@@ -101,13 +97,13 @@ module CFTools::Tunnel
101
97
  context "when the interactive user/pass is valid" do
102
98
  it "returns true" do
103
99
  if saved_credentials
104
- mock(subject).login_to_director(director, "user", "pass") { false }.ordered
100
+ expect(subject).to receive(:login_to_director).with(director, "user", "pass").and_return(false).ordered
105
101
  end
106
102
 
107
- mock_ask("Director Username") { "fizz" }.ordered
108
- mock_ask("Director Password", anything) { "buzz" }.ordered
103
+ should_ask("Director Username") { "fizz" }
104
+ should_ask("Director Password", anything) { "buzz" }
109
105
 
110
- mock(subject).login_to_director(director, "fizz", "buzz") { true }.ordered
106
+ expect(subject).to receive(:login_to_director).with(director, "fizz", "buzz").and_return(true).ordered
111
107
 
112
108
  expect(
113
109
  subject.authenticate_with_director(director, "foo", saved_credentials)
@@ -116,15 +112,15 @@ module CFTools::Tunnel
116
112
 
117
113
  it "saves them to the bosh config" do
118
114
  if saved_credentials
119
- mock(subject).login_to_director(director, "user", "pass") { false }.ordered
115
+ expect(subject).to receive(:login_to_director).with(director, "user", "pass").and_return(false).ordered
120
116
  end
121
117
 
122
- mock_ask("Director Username") { "fizz" }.ordered
123
- mock_ask("Director Password", anything) { "buzz" }.ordered
118
+ should_ask("Director Username") { "fizz" }
119
+ should_ask("Director Password", anything) { "buzz" }
124
120
 
125
- mock(subject).login_to_director(director, "fizz", "buzz") { true }.ordered
121
+ expect(subject).to receive(:login_to_director).with(director, "fizz", "buzz").and_return(true).ordered
126
122
 
127
- mock(subject).save_auth("foo", "username" => "fizz", "password" => "buzz")
123
+ expect(subject).to receive(:save_auth).with("foo", "username" => "fizz", "password" => "buzz")
128
124
 
129
125
  subject.authenticate_with_director(director, "foo", saved_credentials)
130
126
  end
@@ -133,18 +129,18 @@ module CFTools::Tunnel
133
129
  context "when the interactive user/pass is invalid" do
134
130
  it "asks again" do
135
131
  if saved_credentials
136
- mock(subject).login_to_director(director, "user", "pass") { false }.ordered
132
+ expect(subject).to receive(:login_to_director).with(director, "user", "pass").and_return(false).ordered
137
133
  end
138
134
 
139
- mock_ask("Director Username") { "fizz" }.ordered
140
- mock_ask("Director Password", anything) { "buzz" }.ordered
135
+ should_ask("Director Username") { "fizz" }
136
+ should_ask("Director Password", anything) { "buzz" }
141
137
 
142
- mock(subject).login_to_director(director, "fizz", "buzz") { false }.ordered
138
+ expect(subject).to receive(:login_to_director).with(director, "fizz", "buzz").and_return(false).ordered
143
139
 
144
- mock_ask("Director Username") { "a" }.ordered
145
- mock_ask("Director Password", anything) { "b" }.ordered
140
+ should_ask("Director Username") { "a" }
141
+ should_ask("Director Password", anything) { "b" }
146
142
 
147
- mock(subject).login_to_director(director, "a", "b") { true }.ordered
143
+ expect(subject).to receive(:login_to_director).with(director, "a", "b").and_return(true).ordered
148
144
 
149
145
  subject.authenticate_with_director(director, "foo", saved_credentials)
150
146
  end
@@ -156,7 +152,7 @@ module CFTools::Tunnel
156
152
 
157
153
  context "and they are valid" do
158
154
  it "returns true" do
159
- mock(subject).login_to_director(director, "user", "pass") { true }
155
+ expect(subject).to receive(:login_to_director).with(director, "user", "pass").and_return(true)
160
156
 
161
157
  expect(
162
158
  subject.authenticate_with_director(