tugboat 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 915e7c6438004c7d7e4f44e862b5b25805dfb3ba
4
- data.tar.gz: 5ff32fa64a881616643aab6c263046b7ddccdcf5
3
+ metadata.gz: f8c7f40ec8f57278de6f0554c189d74fda010d97
4
+ data.tar.gz: 4be4fefc1760f3b2a4caaa4bcab754147b273084
5
5
  SHA512:
6
- metadata.gz: 94024933ca93615895225b97192bf3e6cbd29f960b8168cee9dd7611398a287e276eb3cec308bfebcd65a95b7e74dc91b6f5a20427f296af692c66ec8cca9726
7
- data.tar.gz: 8c3ceb32fa4a6ffd82e49875646a7914e2aec85e5a4dd75d50eeca1175ed33b811c4857accccb569e15d9e9e9096f49e39dcb75ea36047986286ba46cdf1d303
6
+ metadata.gz: 7525344456c0cc885294bfb17dde276f99277fc16f3ed5779c2a9d1a976872a7a67e475651ff75808dae0f2a3ed8d1311536389b35afb957518dcb49da443863
7
+ data.tar.gz: f3a895a5877808d06976d96b99531b58555f2aa6ecaa73886be28479ee78abb67f9ec29811da6b6ac2fced4062839f08839642f898288559e51ef5aaacf06c4f
data/.gitignore CHANGED
@@ -11,3 +11,5 @@ doc/*
11
11
  log/*
12
12
  pkg/*
13
13
  tmp/*
14
+ # Added file to not force other to use it.
15
+ .overcommit.yml
data/CHANGELOG.md CHANGED
@@ -1,19 +1,81 @@
1
1
  # Change Log
2
2
 
3
- ## [Unreleased](https://github.com/pearkes/tugboat/tree/HEAD)
3
+ ## [v2.1.0](https://github.com/pearkes/tugboat/tree/v2.1.0) (2015-12-01)
4
4
 
5
- [Full Changelog](https://github.com/pearkes/tugboat/compare/v2.0.1...HEAD)
5
+ [Full Changelog](https://github.com/pearkes/tugboat/compare/v2.0.1...v2.1.0)
6
+
7
+ **Implemented enhancements:**
8
+
9
+ - --wait option would be useful for ssh [\#133](https://github.com/pearkes/tugboat/issues/133)
10
+
11
+ **Fixed bugs:**
12
+
13
+ - Show private ip alongside public ip in droplets list [\#220](https://github.com/pearkes/tugboat/issues/220)
14
+
15
+ - bug in connect [\#211](https://github.com/pearkes/tugboat/issues/211)
16
+
17
+ - Wrong color for successful snapshot creation? [\#209](https://github.com/pearkes/tugboat/issues/209)
18
+
19
+ - Seems to be a limit to the number of retrieved droplets [\#205](https://github.com/pearkes/tugboat/issues/205)
20
+
21
+ - tugboat ssh not using ssh-agent? [\#160](https://github.com/pearkes/tugboat/issues/160)
22
+
23
+ **Closed issues:**
24
+
25
+ - 'fuzzy name' message shows up even when full name is used [\#132](https://github.com/pearkes/tugboat/issues/132)
26
+
27
+ **Merged pull requests:**
28
+
29
+ - Add specs to private ip in droplet list fix from \#222 [\#223](https://github.com/pearkes/tugboat/pull/223) ([petems](https://github.com/petems))
30
+
31
+ - Lock simplecov version [\#222](https://github.com/pearkes/tugboat/pull/222) ([petems](https://github.com/petems))
32
+
33
+ - Fix showing of private ips when running 'tugboat droplets' [\#221](https://github.com/pearkes/tugboat/pull/221) ([mtbottle](https://github.com/mtbottle))
34
+
35
+ - Check credentials for all find droplets [\#219](https://github.com/pearkes/tugboat/pull/219) ([petems](https://github.com/petems))
36
+
37
+ - Fix v2 API changes [\#218](https://github.com/pearkes/tugboat/pull/218) ([pchaussalet](https://github.com/pchaussalet))
38
+
39
+ - Fixing error checking with new API 2.0 [\#217](https://github.com/pearkes/tugboat/pull/217) ([petems](https://github.com/petems))
40
+
41
+ - Changes logic when no ssh\_key\_path has been set [\#216](https://github.com/pearkes/tugboat/pull/216) ([petems](https://github.com/petems))
42
+
43
+ - Rename features folder [\#215](https://github.com/pearkes/tugboat/pull/215) ([petems](https://github.com/petems))
44
+
45
+ - Add SSH -w command [\#214](https://github.com/pearkes/tugboat/pull/214) ([petems](https://github.com/petems))
46
+
47
+ - Changes colour of successful snapshot to green [\#213](https://github.com/pearkes/tugboat/pull/213) ([petems](https://github.com/petems))
48
+
49
+ - Pagination regression fix for API 2.0 [\#212](https://github.com/pearkes/tugboat/pull/212) ([petems](https://github.com/petems))
50
+
51
+ - Fixes tests for each help text [\#208](https://github.com/pearkes/tugboat/pull/208) ([petems](https://github.com/petems))
52
+
53
+ - Enable pagination for Droplets list [\#210](https://github.com/pearkes/tugboat/pull/210) ([lachesis](https://github.com/lachesis))
6
54
 
7
55
  ## [v2.0.1](https://github.com/pearkes/tugboat/tree/v2.0.1) (2015-11-10)
8
56
 
9
57
  [Full Changelog](https://github.com/pearkes/tugboat/compare/v2.0.0...v2.0.1)
10
58
 
59
+ **Implemented enhancements:**
60
+
61
+ - Setting client\_id and api\_key as environment variables in shell [\#176](https://github.com/pearkes/tugboat/issues/176)
62
+
63
+ - API v2.0 Support [\#122](https://github.com/pearkes/tugboat/issues/122)
64
+
11
65
  **Fixed bugs:**
12
66
 
13
67
  - Slugs don't work [\#204](https://github.com/pearkes/tugboat/issues/204)
14
68
 
15
69
  - New Droplets dont have IP address immediatly, so the info command fails [\#198](https://github.com/pearkes/tugboat/issues/198)
16
70
 
71
+ **Closed issues:**
72
+
73
+ - API 2.0 Release Candidate Guinea Pigs and Feedback [\#182](https://github.com/pearkes/tugboat/issues/182)
74
+
75
+ - API 2.0 Switchover [\#161](https://github.com/pearkes/tugboat/issues/161)
76
+
77
+ - API v2 Support [\#102](https://github.com/pearkes/tugboat/issues/102)
78
+
17
79
  **Merged pull requests:**
18
80
 
19
81
  - Fixes format for creating droplets [\#207](https://github.com/pearkes/tugboat/pull/207) ([petems](https://github.com/petems))
@@ -26,10 +88,6 @@
26
88
 
27
89
  **Implemented enhancements:**
28
90
 
29
- - Setting client\_id and api\_key as environment variables in shell [\#176](https://github.com/pearkes/tugboat/issues/176)
30
-
31
- - API v2.0 Support [\#122](https://github.com/pearkes/tugboat/issues/122)
32
-
33
91
  - If a command that requires arguments is entered without arguments, print the help for that. [\#191](https://github.com/pearkes/tugboat/issues/191)
34
92
 
35
93
  - Support traditional `-y` for automatically confirming a destructive action. [\#190](https://github.com/pearkes/tugboat/issues/190)
@@ -48,8 +106,6 @@
48
106
 
49
107
  **Fixed bugs:**
50
108
 
51
- - New Droplets dont have IP address immediatly, so the info command fails [\#198](https://github.com/pearkes/tugboat/issues/198)
52
-
53
109
  - Ipv6 changes broke ssh [\#192](https://github.com/pearkes/tugboat/issues/192)
54
110
 
55
111
  - tugboat doesn't work with team accounts, because they use api v2 [\#168](https://github.com/pearkes/tugboat/issues/168)
@@ -92,12 +148,6 @@
92
148
 
93
149
  **Closed issues:**
94
150
 
95
- - API 2.0 Release Candidate Guinea Pigs and Feedback [\#182](https://github.com/pearkes/tugboat/issues/182)
96
-
97
- - API 2.0 Switchover [\#161](https://github.com/pearkes/tugboat/issues/161)
98
-
99
- - API v2 Support [\#102](https://github.com/pearkes/tugboat/issues/102)
100
-
101
151
  - Possible to delete an image/snapshot? [\#177](https://github.com/pearkes/tugboat/issues/177)
102
152
 
103
153
  **Merged pull requests:**
data/CONTRIBUTING.md CHANGED
@@ -12,7 +12,7 @@
12
12
  To add a feature, fix a bug, or to run a development build of Tugboat
13
13
  on your machine, clone down the repo and run:
14
14
 
15
- $ bundle
15
+ $ bundle install --path vendor/bundle
16
16
 
17
17
  You can then execute tugboat:
18
18
 
@@ -21,6 +21,8 @@ You can then execute tugboat:
21
21
  As well as run the tests:
22
22
 
23
23
  $ bundle exec rspec
24
+ Or
25
+ $ rake spec
24
26
 
25
27
  To install the gem on your system from source:
26
28
 
data/README.md CHANGED
@@ -243,7 +243,270 @@ After installation, source the bundle path in your `.bash_profile`/`.bashrc`:
243
243
 
244
244
  Yes, please!
245
245
 
246
- You can create a new issue [here](https://github.com/pearkes/tugboat/issues/new). Thank you!
246
+ You can create a new issue [here](https://github.com/pearkes/tugboat/issues/new). To help with the investigation of your issue, you can set the environment variable DEBUG to give verbose Faraday logging.
247
+
248
+ * DEBUG=1 is full unredacted
249
+ * DEBUG=2 redacts private keys from the log.
250
+
251
+ Example:
252
+
253
+ ```bash
254
+ DEBUG=2 bundle exec tugboat regions
255
+ I, [2015-12-06T12:04:27.148922 #92772] INFO -- : Started GET request to: https://api.digitalocean.com/v2/regions?per_page=200
256
+ D, [2015-12-06T12:04:27.149334 #92772] DEBUG -- : Request Headers:
257
+ ----------------
258
+ Authorization : Bearer [TOKEN REDACTED]
259
+ Content-Type : application/json
260
+ User-Agent : Faraday v0.9.2
261
+
262
+ Request Body:
263
+ -------------
264
+ {
265
+ "regions": [
266
+ {
267
+ "name": "New York 1",
268
+ "slug": "nyc1",
269
+ "sizes": [
270
+ "32gb",
271
+ "16gb",
272
+ "2gb",
273
+ "1gb",
274
+ "4gb",
275
+ "8gb",
276
+ "512mb",
277
+ "64gb",
278
+ "48gb"
279
+ ],
280
+ "features": [
281
+ "private_networking",
282
+ "backups",
283
+ "ipv6",
284
+ "metadata"
285
+ ],
286
+ "available": true
287
+ },
288
+ {
289
+ "name": "Amsterdam 1",
290
+ "slug": "ams1",
291
+ "sizes": [
292
+ "16gb",
293
+ "2gb",
294
+ "1gb",
295
+ "4gb",
296
+ "8gb",
297
+ "512mb"
298
+ ],
299
+ "features": [
300
+ "backups"
301
+ ],
302
+ "available": true
303
+ },
304
+ {
305
+ "name": "San Francisco 1",
306
+ "slug": "sfo1",
307
+ "sizes": [
308
+ "32gb",
309
+ "16gb",
310
+ "2gb",
311
+ "1gb",
312
+ "4gb",
313
+ "8gb",
314
+ "512mb",
315
+ "64gb",
316
+ "48gb"
317
+ ],
318
+ "features": [
319
+ "private_networking",
320
+ "backups",
321
+ "ipv6",
322
+ "metadata"
323
+ ],
324
+ "available": true
325
+ },
326
+ {
327
+ "name": "New York 2",
328
+ "slug": "nyc2",
329
+ "sizes": [
330
+ "32gb",
331
+ "16gb",
332
+ "2gb",
333
+ "1gb",
334
+ "4gb",
335
+ "8gb",
336
+ "512mb",
337
+ "64gb",
338
+ "48gb"
339
+ ],
340
+ "features": [
341
+ "private_networking",
342
+ "backups",
343
+ "ipv6",
344
+ "metadata"
345
+ ],
346
+ "available": true
347
+ },
348
+ {
349
+ "name": "Amsterdam 2",
350
+ "slug": "ams2",
351
+ "sizes": [
352
+ "32gb",
353
+ "16gb",
354
+ "2gb",
355
+ "1gb",
356
+ "4gb",
357
+ "8gb",
358
+ "512mb",
359
+ "64gb",
360
+ "48gb"
361
+ ],
362
+ "features": [
363
+ "private_networking",
364
+ "backups",
365
+ "ipv6",
366
+ "metadata"
367
+ ],
368
+ "available": true
369
+ },
370
+ {
371
+ "name": "Singapore 1",
372
+ "slug": "sgp1",
373
+ "sizes": [
374
+ "32gb",
375
+ "16gb",
376
+ "2gb",
377
+ "1gb",
378
+ "4gb",
379
+ "8gb",
380
+ "512mb",
381
+ "64gb",
382
+ "48gb"
383
+ ],
384
+ "features": [
385
+ "private_networking",
386
+ "backups",
387
+ "ipv6",
388
+ "metadata"
389
+ ],
390
+ "available": true
391
+ },
392
+ {
393
+ "name": "London 1",
394
+ "slug": "lon1",
395
+ "sizes": [
396
+ "32gb",
397
+ "16gb",
398
+ "2gb",
399
+ "1gb",
400
+ "4gb",
401
+ "8gb",
402
+ "512mb",
403
+ "64gb",
404
+ "48gb"
405
+ ],
406
+ "features": [
407
+ "private_networking",
408
+ "backups",
409
+ "ipv6",
410
+ "metadata"
411
+ ],
412
+ "available": true
413
+ },
414
+ {
415
+ "name": "New York 3",
416
+ "slug": "nyc3",
417
+ "sizes": [
418
+ "32gb",
419
+ "16gb",
420
+ "2gb",
421
+ "1gb",
422
+ "4gb",
423
+ "8gb",
424
+ "512mb",
425
+ "64gb",
426
+ "48gb"
427
+ ],
428
+ "features": [
429
+ "private_networking",
430
+ "backups",
431
+ "ipv6",
432
+ "metadata"
433
+ ],
434
+ "available": true
435
+ },
436
+ {
437
+ "name": "Amsterdam 3",
438
+ "slug": "ams3",
439
+ "sizes": [
440
+ "32gb",
441
+ "16gb",
442
+ "2gb",
443
+ "1gb",
444
+ "4gb",
445
+ "8gb",
446
+ "512mb",
447
+ "64gb",
448
+ "48gb"
449
+ ],
450
+ "features": [
451
+ "private_networking",
452
+ "backups",
453
+ "ipv6",
454
+ "metadata"
455
+ ],
456
+ "available": true
457
+ },
458
+ {
459
+ "name": "Frankfurt 1",
460
+ "slug": "fra1",
461
+ "sizes": [
462
+ "32gb",
463
+ "16gb",
464
+ "2gb",
465
+ "1gb",
466
+ "4gb",
467
+ "8gb",
468
+ "512mb",
469
+ "64gb",
470
+ "48gb"
471
+ ],
472
+ "features": [
473
+ "private_networking",
474
+ "backups",
475
+ "ipv6",
476
+ "metadata"
477
+ ],
478
+ "available": true
479
+ },
480
+ {
481
+ "name": "Toronto 1",
482
+ "slug": "tor1",
483
+ "sizes": [
484
+ "32gb",
485
+ "16gb",
486
+ "2gb",
487
+ "1gb",
488
+ "4gb",
489
+ "8gb",
490
+ "512mb",
491
+ "64gb",
492
+ "48gb"
493
+ ],
494
+ "features": [
495
+ "private_networking",
496
+ "backups",
497
+ "ipv6",
498
+ "metadata"
499
+ ],
500
+ "available": true
501
+ }
502
+ ],
503
+ "links": {
504
+ },
505
+ "meta": {
506
+ "total": 11
507
+ }
508
+ }
509
+ ```
247
510
 
248
511
  ## Contributing
249
512
 
data/Rakefile CHANGED
@@ -1,3 +1,6 @@
1
+ require 'bundler'
2
+ Bundler.require(:development)
3
+
1
4
  require 'bundler/gem_tasks'
2
5
  require 'rspec/core/rake_task'
3
6
  require 'cucumber/rake/task'
@@ -106,7 +106,7 @@ module Tugboat
106
106
  end
107
107
 
108
108
  # Writes a config file
109
- def create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled)
109
+ def create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled, ip6)
110
110
  # Default SSH Key path
111
111
  if ssh_key_path.empty?
112
112
  ssh_key_path = File.join("~", DEFAULT_SSH_KEY_PATH)
@@ -144,6 +144,10 @@ module Tugboat
144
144
  backups_enabled = DEFAULT_BACKUPS_ENABLED
145
145
  end
146
146
 
147
+ if ip6.empty?
148
+ ip6 = DEFAULT_IP6
149
+ end
150
+
147
151
  require 'yaml'
148
152
  File.open(@path, File::RDWR|File::TRUNC|File::CREAT, 0600) do |file|
149
153
  data = {
@@ -160,7 +164,8 @@ module Tugboat
160
164
  "size" => size,
161
165
  "ssh_key" => ssh_key,
162
166
  "private_networking" => private_networking,
163
- "backups_enabled" => backups_enabled
167
+ "backups_enabled" => backups_enabled,
168
+ "ip6" => ip6,
164
169
  }
165
170
  }
166
171
  file.write data.to_yaml
@@ -20,9 +20,10 @@ module Tugboat
20
20
  ssh_key = ask "Enter your default ssh key IDs (optional, defaults to none, comma separated string):"
21
21
  private_networking = ask "Enter your default for private networking (optional, defaults to false):"
22
22
  backups_enabled = ask "Enter your default for enabling backups (optional, defaults to false):"
23
+ ip6 = ask "Enter your default for IPv6 (optional, defaults to false):"
23
24
 
24
25
  # Write the config file.
25
- env['config'].create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled)
26
+ env['config'].create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled, ip6)
26
27
  env['config'].reload!
27
28
 
28
29
  @app.call(env)
@@ -18,6 +18,13 @@ module Tugboat
18
18
  say "", :clear, false
19
19
  end
20
20
 
21
+ def check_response_success(task_string, response)
22
+ unless response.success?
23
+ say "Failed to #{task_string}: #{response.message}", :red
24
+ exit 1
25
+ end
26
+ end
27
+
21
28
  def call(env)
22
29
  @app.call(env)
23
30
  end
@@ -27,8 +27,7 @@ module Tugboat
27
27
 
28
28
  def filter(output)
29
29
  if ENV['DEBUG'].to_i == 2
30
- output = output.to_s.gsub(/client_id=[a-zA-Z0-9]*/,'client_id=[CLIENT-ID]')
31
- output = output.to_s.gsub(/api_key=[a-zA-Z0-9]*/,'api_key=[API-KEY]')
30
+ output = output.to_s.gsub(/Bearer [a-zA-Z0-9]*/,'Bearer [TOKEN REDACTED]')
32
31
  output = output.to_s.gsub(/_digitalocean2_session_v2=[a-zA-Z0-9%-]*/,'_digitalocean2_session_v2=[SESSION_COOKIE]')
33
32
  else
34
33
  output
@@ -52,15 +51,23 @@ module Tugboat
52
51
  end
53
52
 
54
53
  def debug_message(name, headers, body)
55
- <<-MESSAGE.gsub(/^ +([^ ])/m, '\\1')
54
+
55
+ main_message = <<-MESSAGE.gsub(/^ +([^ ])/m, '\\1')
56
56
  #{name} Headers:
57
57
  ----------------
58
58
  #{format_headers(headers)}
59
59
 
60
60
  #{name} Body:
61
61
  -------------
62
- #{body}
63
62
  MESSAGE
63
+ main_message + pretty_body(body)
64
+ end
65
+
66
+ def pretty_body(body)
67
+ body_json = JSON.parse(body)
68
+ JSON.pretty_generate(body_json)
69
+ rescue JSON::ParserError => e
70
+ body
64
71
  end
65
72
 
66
73
  def format_headers(headers)
@@ -6,10 +6,7 @@ module Tugboat
6
6
 
7
7
  response = ocean.droplet.show env["droplet_id"]
8
8
 
9
- unless response.success?
10
- say "Failed to get info for Droplet: #{response.message}", :red
11
- exit 1
12
- end
9
+ check_response_success('get info for Droplet', response)
13
10
 
14
11
  droplet = response.droplet
15
12
 
@@ -18,6 +18,7 @@ module Tugboat
18
18
  say "ID: #{image.id}"
19
19
  say "Distribution: #{image.distribution}"
20
20
  say "Min Disk Size: #{image.min_disk_size}GB"
21
+ say "Regions: #{image.regions.join(',')}"
21
22
 
22
23
  @app.call(env)
23
24
  end
@@ -1,22 +1,11 @@
1
1
  require 'barge'
2
+ require File.expand_path('../custom_logger', __FILE__)
2
3
 
3
4
  module Tugboat
4
5
  module Middleware
5
6
  # Inject the digital ocean client into the environment
6
7
  class InjectClient < Base
7
8
 
8
- def tugboat_faraday
9
- Faraday.new(:url => 'https://api.digitalocean.com/') do |faraday|
10
- faraday.use AuthenticationMiddleware, @client_id, @api_key
11
- faraday.use Faraday::Response::RaiseError
12
- faraday.use CustomLogger if ENV['DEBUG']
13
- faraday.request :url_encoded
14
- faraday.response :rashify
15
- faraday.response :json, :content_type => /\b(json|json-home)$/
16
- faraday.adapter Faraday.default_adapter
17
- end
18
- end
19
-
20
9
  def call(env)
21
10
  # Sets the digital ocean client into the environment for use
22
11
  # later.
@@ -24,6 +13,8 @@ module Tugboat
24
13
 
25
14
  env['barge'] = Barge::Client.new(:access_token => @access_token)
26
15
 
16
+ env['barge'].faraday.use CustomLogger if ENV['DEBUG']
17
+
27
18
  @app.call(env)
28
19
  end
29
20
  end
@@ -1,3 +1,3 @@
1
1
  module Tugboat
2
- VERSION = "2.1.0"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -36,6 +36,8 @@ describe Tugboat::CLI do
36
36
  expect($stdin).to receive(:gets).and_return(private_networking)
37
37
  expect($stdout).to receive(:print).with("Enter your default for enabling backups (optional, defaults to false): ")
38
38
  expect($stdin).to receive(:gets).and_return(backups_enabled)
39
+ expect($stdout).to receive(:print).with("Enter your default for IPv6 (optional, defaults to false): ")
40
+ expect($stdin).to receive(:gets).and_return(ip6)
39
41
 
40
42
  @cli.authorize
41
43
 
@@ -54,6 +56,7 @@ describe Tugboat::CLI do
54
56
  expect(config["defaults"]["ssh_key"]).to eq ssh_key_id
55
57
  expect(config["defaults"]["private_networking"]).to eq private_networking
56
58
  expect(config["defaults"]["backups_enabled"]).to eq backups_enabled
59
+ expect(config["defaults"]["ip6"]).to eq ip6
57
60
  end
58
61
 
59
62
  it "sets defaults if no input given" do
@@ -82,6 +85,8 @@ describe Tugboat::CLI do
82
85
  expect($stdin).to receive(:gets).and_return('')
83
86
  expect($stdout).to receive(:print).with("Enter your default for enabling backups (optional, defaults to false): ")
84
87
  expect($stdin).to receive(:gets).and_return('')
88
+ expect($stdout).to receive(:print).with("Enter your default for IPv6 (optional, defaults to false): ")
89
+ expect($stdin).to receive(:gets).and_return('')
85
90
 
86
91
  @cli.authorize
87
92
 
@@ -98,6 +103,9 @@ describe Tugboat::CLI do
98
103
  expect(config["ssh"]["ssh_key_path"]).to eq "~/.ssh/id_rsa"
99
104
  expect(config["ssh"]["ssh_port"]).to eq "22"
100
105
  expect(config["defaults"]["ssh_key"]).to eq ""
106
+ expect(config["defaults"]["private_networking"]).to eq 'false'
107
+ expect(config["defaults"]["backups_enabled"]).to eq 'false'
108
+ expect(config["defaults"]["ip6"]).to eq 'false'
101
109
  end
102
110
  end
103
111
 
@@ -25,6 +25,7 @@ defaults:
25
25
  ssh_key: '1234'
26
26
  private_networking: 'false'
27
27
  backups_enabled: 'false'
28
+ ip6: 'false'
28
29
  eos
29
30
  end
30
31
 
@@ -50,6 +51,7 @@ defaults:
50
51
  ssh_key: '1234'
51
52
  private_networking: 'false'
52
53
  backups_enabled: 'false'
54
+ ip6: 'false'
53
55
  eos
54
56
  end
55
57
  end
@@ -6,7 +6,7 @@ describe Tugboat::CLI do
6
6
  describe "create a droplet" do
7
7
  it "with a name, uses defaults from configuration" do
8
8
  stub_request(:post, "https://api.digitalocean.com/v2/droplets").
9
- with(:body => "{\"name\":\"foo\",\"size\":\"512mb\",\"image\":\"ubuntu-14-04-x64\",\"region\":\"nyc2\",\"ssh_keys\":[\"1234\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":null,\"user_data\":null}",
9
+ with(:body => "{\"name\":\"foo\",\"size\":\"512mb\",\"image\":\"ubuntu-14-04-x64\",\"region\":\"nyc2\",\"ssh_keys\":[\"1234\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":\"false\",\"user_data\":null}",
10
10
  :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
11
11
  to_return(:status => 200, :body => fixture('create_droplet'), :headers => {})
12
12
 
@@ -19,7 +19,7 @@ Queueing creation of droplet '#{droplet_name}'...Droplet created!
19
19
 
20
20
  it "with args does not use defaults from configuration" do
21
21
  stub_request(:post, "https://api.digitalocean.com/v2/droplets").
22
- with(:body => "{\"name\":\"example.com\",\"size\":\"1gb\",\"image\":\"ubuntu-12-04-x64\",\"region\":\"nyc3\",\"ssh_keys\":[\"foo_bar_key\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":null,\"user_data\":null}",
22
+ with(:body => "{\"name\":\"example.com\",\"size\":\"1gb\",\"image\":\"ubuntu-12-04-x64\",\"region\":\"nyc3\",\"ssh_keys\":[\"foo_bar_key\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":\"false\",\"user_data\":null}",
23
23
  :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
24
24
  to_return(:status => 200, :body => fixture('create_droplet'), :headers => {})
25
25
 
@@ -49,7 +49,7 @@ Queueing creation of droplet 'example.com'...Droplet created!
49
49
 
50
50
  it "with user data args" do
51
51
  stub_request(:post, "https://api.digitalocean.com/v2/droplets").
52
- with(:body => "{\"name\":\"example.com\",\"size\":\"512mb\",\"image\":\"ubuntu-14-04-x64\",\"region\":\"nyc2\",\"ssh_keys\":[\"1234\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":null,\"user_data\":\"#!/bin/bash\\n\\necho \\\"Hello world\\\"\"}",
52
+ with(:body => "{\"name\":\"example.com\",\"size\":\"512mb\",\"image\":\"ubuntu-14-04-x64\",\"region\":\"nyc2\",\"ssh_keys\":[\"1234\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":\"false\",\"user_data\":\"#!/bin/bash\\n\\necho \\\"Hello world\\\"\"}",
53
53
  :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
54
54
  to_return(:status => 200, :body => fixture('create_droplet'), :headers => {})
55
55
 
@@ -103,7 +103,7 @@ eos
103
103
 
104
104
  it "does not clobber named droplets that contain the word help" do
105
105
  stub_request(:post, "https://api.digitalocean.com/v2/droplets").
106
- with(:body => "{\"name\":\"somethingblahblah--help\",\"size\":\"512mb\",\"image\":\"ubuntu-14-04-x64\",\"region\":\"nyc2\",\"ssh_keys\":[\"1234\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":null,\"user_data\":null}",
106
+ with(:body => "{\"name\":\"somethingblahblah--help\",\"size\":\"512mb\",\"image\":\"ubuntu-14-04-x64\",\"region\":\"nyc2\",\"ssh_keys\":[\"1234\"],\"private_networking\":\"false\",\"backups_enabled\":\"false\",\"ipv6\":\"false\",\"user_data\":null}",
107
107
  :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
108
108
  to_return(:status => 200, :body => fixture('create_droplet'), :headers => {})
109
109
 
@@ -8,14 +8,24 @@ describe Tugboat::CLI do
8
8
  allow(ENV).to receive(:[]).with('HOME').and_return('/tmp/fake_home')
9
9
  allow(ENV).to receive(:[]).with('DEBUG').and_return(1)
10
10
  allow(ENV).to receive(:[]).with('http_proxy').and_return(nil)
11
+ allow(ENV).to receive(:[]).with('DO_API_TOKEN').and_return(nil)
11
12
  end
12
13
 
13
14
  it "gives full faraday logs" do
14
- pending 'Debug flag not avaliable yet'
15
- stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=200").
16
- with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
17
- to_return(:status => 200, :body => fixture('show_droplets'), :headers => {})
15
+ stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=1").
16
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
17
+ to_return(:status => 200, :body => fixture('show_droplets'), :headers => {})
18
+
19
+ stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=200").
20
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
21
+ to_return(:status => 200, :body => fixture('show_droplets'), :headers => {})
22
+
18
23
  @cli.droplets
24
+
25
+ expect($stdout.string).to include "Started GET request to: https://api.digitalocean.com/v2/droplets?page=1&per_page=200"
26
+ expect($stdout.string).to include "DEBUG -- : Request Headers:"
27
+
28
+ expect($stdout.string).to include "Bearer foo"
19
29
  end
20
30
  end
21
31
 
@@ -24,15 +34,25 @@ stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=200
24
34
  allow(ENV).to receive(:[]).with('HOME').and_return('/tmp/fake_home')
25
35
  allow(ENV).to receive(:[]).with('DEBUG').and_return(2)
26
36
  allow(ENV).to receive(:[]).with('http_proxy').and_return(nil)
37
+ allow(ENV).to receive(:[]).with('DO_API_TOKEN').and_return(nil)
27
38
  end
28
39
 
29
40
  it "gives full faraday logs with redacted API keys" do
30
- pending 'Debug flag not avaliable yet'
31
- stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=200").
41
+ stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=1").
42
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
43
+ to_return(:status => 200, :body => fixture('show_droplets'), :headers => {})
44
+
45
+ stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=200").
32
46
  with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
33
47
  to_return(:status => 200, :body => fixture('show_droplets'), :headers => {})
34
48
  @cli.droplets
49
+
50
+ expect($stdout.string).to include "Started GET request to: https://api.digitalocean.com/v2/droplets?page=1&per_page=200"
51
+ expect($stdout.string).to include "DEBUG -- : Request Headers:"
52
+
53
+ expect($stdout.string).to_not include "Bearer foo"
35
54
  end
36
55
  end
56
+
37
57
  end
38
58
 
@@ -12,6 +12,7 @@ describe Tugboat::CLI do
12
12
  allow(ENV).to receive(:[]).with('HOME').and_return('/tmp/fake_home')
13
13
  allow(ENV).to receive(:[]).with('DO_API_TOKEN').and_return('env_variable')
14
14
  allow(ENV).to receive(:[]).with('http_proxy').and_return(nil)
15
+ allow(ENV).to receive(:[]).with('DEBUG').and_return(nil)
15
16
 
16
17
  @cli.verify
17
18
  expect($stdout.string).to eq "Authentication with DigitalOcean was successful.\n"
@@ -26,6 +27,7 @@ describe Tugboat::CLI do
26
27
  allow(ENV).to receive(:[]).with('HOME').and_return('/tmp/fake_home')
27
28
  allow(ENV).to receive(:[]).with('DO_API_TOKEN').and_return('')
28
29
  allow(ENV).to receive(:[]).with('http_proxy').and_return(nil)
30
+ allow(ENV).to receive(:[]).with('DEBUG').and_return(nil)
29
31
 
30
32
  @cli.verify
31
33
  expect($stdout.string).to eq "Authentication with DigitalOcean was successful.\n"
@@ -4,6 +4,26 @@ describe Tugboat::CLI do
4
4
  include_context "spec"
5
5
 
6
6
  describe "info" do
7
+ it "shows an error if response is not successful" do
8
+ stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=1").
9
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
10
+ to_return(:status => 200, :body => fixture('show_droplets'), :headers => {})
11
+
12
+ stub_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200").
13
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
14
+ to_return(:status => 404, :body => fixture('not_found'), :headers => {})
15
+
16
+ @cli.options = @cli.options.merge(:id => 6918990)
17
+
18
+ expect {@cli.info}.to raise_error(SystemExit)
19
+
20
+ expect($stdout.string).to eq <<-eos
21
+ Droplet id provided. Finding Droplet...Failed to find Droplet: The resource you were accessing could not be found.
22
+ eos
23
+
24
+ expect(a_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200")).to have_been_made
25
+ end
26
+
7
27
  it "shows a droplet with a fuzzy name" do
8
28
  stub_request(:get, "https://api.digitalocean.com/v2/droplets?page=1&per_page=1").
9
29
  with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
@@ -22,6 +22,7 @@ Name: 745.1.0 (alpha)
22
22
  ID: 12789325
23
23
  Distribution: CoreOS
24
24
  Min Disk Size: 20GB
25
+ Regions: nyc1,sfo1,nyc2,ams2,sgp1,lon1,nyc3,ams3,fra1
25
26
  eos
26
27
  end
27
28
 
@@ -44,6 +45,7 @@ Name: Redmine on 14.04
44
45
  ID: 12438838
45
46
  Distribution: Ubuntu
46
47
  Min Disk Size: 20GB
48
+ Regions: nyc1,ams1,sfo1,nyc2,ams2,sgp1,lon1,nyc3,ams3,fra1
47
49
  eos
48
50
  end
49
51
 
@@ -66,6 +68,7 @@ Name: Redmine on 14.04
66
68
  ID: 12438838
67
69
  Distribution: Ubuntu
68
70
  Min Disk Size: 20GB
71
+ Regions: nyc1,ams1,sfo1,nyc2,ams2,sgp1,lon1,nyc3,ams3,fra1
69
72
  eos
70
73
  end
71
74
 
@@ -143,6 +146,7 @@ Name: 14.10 x32
143
146
  ID: 9801951
144
147
  Distribution: Ubuntu
145
148
  Min Disk Size: 20GB
149
+ Regions: nyc1,ams1,sfo1,nyc2,ams2,sgp1,lon1,nyc3,ams3,fra1
146
150
  eos
147
151
  end
148
152
 
@@ -37,19 +37,17 @@ eos
37
37
 
38
38
  stub_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200").
39
39
  with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
40
- to_return(:status => 200, :body => fixture('show_droplet_inactive'), :headers => {})
41
-
42
-
43
- stub_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200").
44
- with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
45
- to_return(:status => 200, :body => fixture('show_droplet'), :headers => {})
40
+ to_return(
41
+ {:status => 200, :body => fixture('show_droplet_inactive'), :headers => {}},
42
+ {:status => 200, :body => fixture('show_droplet'), :headers => {}}
43
+ )
46
44
 
47
45
  @cli.options = @cli.options.merge(:state => "active")
48
46
  @cli.wait("example.com")
49
47
 
50
48
  expect($stdout.string).to eq <<-eos
51
49
  Droplet fuzzy name provided. Finding droplet ID...done\e[0m, 6918990 (example.com)
52
- Waiting for droplet to become active..done\e[0m (0s)
50
+ Waiting for droplet to become active...done\e[0m (2s)
53
51
  eos
54
52
  end
55
53
 
data/spec/config_spec.rb CHANGED
@@ -33,12 +33,13 @@ describe Tugboat::Configuration do
33
33
  let(:ssh_key_id) { '1234' }
34
34
  let(:private_networking) { 'false' }
35
35
  let(:backups_enabled) { 'false' }
36
+ let(:ip6) { 'false' }
36
37
 
37
38
  let(:config) { config = Tugboat::Configuration.instance }
38
39
 
39
40
  before :each do
40
41
  # Create a temporary file
41
- config.create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking, backups_enabled)
42
+ config.create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking, backups_enabled, ip6)
42
43
  end
43
44
 
44
45
  it "can be created" do
@@ -105,6 +106,7 @@ describe Tugboat::Configuration do
105
106
  let(:config_default_ssh_key) { Tugboat::Configuration::DEFAULT_SSH_KEY }
106
107
  let(:config_default_networking) { Tugboat::Configuration::DEFAULT_PRIVATE_NETWORKING }
107
108
  let(:config_default_backups) { Tugboat::Configuration::DEFAULT_BACKUPS_ENABLED }
109
+ let(:config_default_ip6) { Tugboat::Configuration::DEFAULT_IP6 }
108
110
  let(:backwards_config) {
109
111
  {
110
112
  'authentication' => { 'client_key' => client_key, 'api_key' => api_key },
@@ -151,5 +153,10 @@ describe Tugboat::Configuration do
151
153
  expect(backups_enabled).to eql config_default_backups
152
154
  end
153
155
 
156
+ it "should use default ip6 if not in the configuration" do
157
+ ip6 = config.default_ip6
158
+ expect(ip6).to eql config_default_ip6
159
+ end
160
+
154
161
  end
155
162
  end
@@ -19,6 +19,7 @@ shared_context "spec" do
19
19
  let(:ssh_public_key) { 'ssh-dss A123= user@host' }
20
20
  let(:private_networking) { 'false'}
21
21
  let(:backups_enabled) { 'false'}
22
+ let(:ip6) { 'false' }
22
23
  let(:ocean) { Barge::Client.new(:access_token => access_token) }
23
24
  let(:app) { lambda { |env| } }
24
25
  let(:env) { {} }
@@ -30,7 +31,7 @@ shared_context "spec" do
30
31
  @cli = Tugboat::CLI.new
31
32
 
32
33
  # Set a temprary project path and create fake config.
33
- config.create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking, backups_enabled)
34
+ config.create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking, backups_enabled, ip6)
34
35
  config.reload!
35
36
 
36
37
  # Keep track of the old stderr / out
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require 'simplecov'
2
+ require 'simplecov-console'
2
3
  require 'coveralls'
3
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+
5
+ SimpleCov.formatters = [
4
6
  SimpleCov::Formatter::HTMLFormatter,
7
+ SimpleCov::Formatter::Console,
5
8
  Coveralls::SimpleCov::Formatter
6
9
  ]
7
10
  SimpleCov.start do
data/tugboat.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
19
19
  gem.required_ruby_version = '>= 1.9.2'
20
20
 
21
21
  gem.add_dependency 'thor', '~> 0.18.1'
22
- gem.add_dependency 'barge', '~> 0.10.0'
22
+ gem.add_dependency 'barge', '~> 0.12.0'
23
23
  gem.add_dependency 'middleware', '~> 0.1.0'
24
24
 
25
25
  gem.add_development_dependency 'rake'
@@ -28,6 +28,7 @@ Gem::Specification.new do |gem|
28
28
  gem.add_development_dependency 'rspec-mocks', '~> 2.14.0'
29
29
  gem.add_development_dependency 'webmock', '~> 1.11.0'
30
30
  gem.add_development_dependency 'simplecov', '0.10'
31
+ gem.add_development_dependency 'simplecov-console', '0.2.0'
31
32
  gem.add_development_dependency 'coveralls', '~> 0.6.7'
32
33
  gem.add_development_dependency 'aruba', '~> 0.6.2'
33
34
  gem.add_development_dependency 'pry'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tugboat
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jack Pearkes
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-12-01 00:00:00.000000000 Z
13
+ date: 2016-01-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: thor
@@ -32,14 +32,14 @@ dependencies:
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: 0.10.0
35
+ version: 0.12.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: 0.10.0
42
+ version: 0.12.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: middleware
45
45
  requirement: !ruby/object:Gem::Requirement
@@ -138,6 +138,20 @@ dependencies:
138
138
  - - '='
139
139
  - !ruby/object:Gem::Version
140
140
  version: '0.10'
141
+ - !ruby/object:Gem::Dependency
142
+ name: simplecov-console
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - '='
146
+ - !ruby/object:Gem::Version
147
+ version: 0.2.0
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - '='
153
+ - !ruby/object:Gem::Version
154
+ version: 0.2.0
141
155
  - !ruby/object:Gem::Dependency
142
156
  name: coveralls
143
157
  requirement: !ruby/object:Gem::Requirement
@@ -207,7 +221,6 @@ files:
207
221
  - lib/tugboat/middleware.rb
208
222
  - lib/tugboat/middleware/add_key.rb
209
223
  - lib/tugboat/middleware/ask_for_credentials.rb
210
- - lib/tugboat/middleware/authentication_middleware.rb
211
224
  - lib/tugboat/middleware/base.rb
212
225
  - lib/tugboat/middleware/check_configuration.rb
213
226
  - lib/tugboat/middleware/check_credentials.rb
@@ -334,7 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
334
347
  version: '0'
335
348
  requirements: []
336
349
  rubyforge_project:
337
- rubygems_version: 2.4.8
350
+ rubygems_version: 2.5.1
338
351
  signing_key:
339
352
  specification_version: 4
340
353
  summary: A command line tool for interacting with your DigitalOcean droplets.
@@ -1,40 +0,0 @@
1
- module Tugboat
2
- class AuthenticationMiddleware < Faraday::Middleware
3
- extend Forwardable
4
- def_delegators :'Faraday::Utils', :parse_query, :build_query
5
- RED = "\e[31m"
6
- CLEAR = "\e[0m"
7
-
8
- def initialize(app, client_id, api_key)
9
- @client_id = client_id
10
- @api_key = api_key
11
-
12
- super(app)
13
- end
14
-
15
- def call(env)
16
- params = { 'client_id' => @client_id, 'api_key' => @api_key }.update query_params(env[:url])
17
-
18
- env[:url].query = build_query params
19
-
20
- begin
21
- @app.call(env)
22
- rescue Faraday::Error::ClientError => e
23
- puts "#{RED}#{e}!#{CLEAR}\n"
24
- if env[:body].is_a?(Hashie::Rash)
25
- puts "\n#{RED}#{env[:body].error_message}#{CLEAR}\n\n"
26
- end
27
- puts "Double-check your parameters and configuration (in your ~/.tugboat file)" if env[:status] == 401
28
- exit 1
29
- end
30
- end
31
-
32
- def query_params(url)
33
- if url.query.nil? or url.query.empty?
34
- {}
35
- else
36
- parse_query url.query
37
- end
38
- end
39
- end
40
- end