tugboat 0.2.0 → 1.0.0
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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -4
- data/CHANGELOG.md +325 -102
- data/CHANGELOG_old.md +150 -0
- data/Gemfile +6 -0
- data/README.md +12 -6
- data/Rakefile +7 -3
- data/features/step_definitions/steps.rb +0 -0
- data/features/support/env.rb +9 -0
- data/features/vagrant-adam/config_current_directory.feature +27 -0
- data/lib/tugboat/cli.rb +31 -3
- data/lib/tugboat/config.rb +13 -5
- data/lib/tugboat/middleware.rb +8 -0
- data/lib/tugboat/middleware/ask_for_credentials.rb +5 -4
- data/lib/tugboat/middleware/authentication_middleware.rb +2 -2
- data/lib/tugboat/middleware/config.rb +29 -0
- data/lib/tugboat/middleware/custom_logger.rb +2 -2
- data/lib/tugboat/middleware/find_droplet.rb +4 -0
- data/lib/tugboat/middleware/info_droplet.rb +5 -0
- data/lib/tugboat/middleware/inject_client.rb +1 -1
- data/lib/tugboat/middleware/list_droplets.rb +5 -1
- data/lib/tugboat/middleware/list_regions.rb +2 -2
- data/lib/tugboat/middleware/ssh_droplet.rb +17 -2
- data/lib/tugboat/version.rb +1 -1
- data/spec/cli/add_key_spec.rb +9 -9
- data/spec/cli/authorize_cli_spec.rb +76 -52
- data/spec/cli/create_cli_spec.rb +39 -4
- data/spec/cli/debug_cli_spec.rb +44 -0
- data/spec/cli/destroy_cli_spec.rb +30 -11
- data/spec/cli/destroy_image_cli_spec.rb +11 -11
- data/spec/cli/droplets_cli_spec.rb +6 -6
- data/spec/cli/halt_cli_spec.rb +9 -9
- data/spec/cli/images_cli_spec.rb +6 -6
- data/spec/cli/info_cli_spec.rb +42 -7
- data/spec/cli/info_image_cli_spec.rb +6 -6
- data/spec/cli/keys_cli_spec.rb +1 -1
- data/spec/cli/password_reset_cli_spec.rb +8 -8
- data/spec/cli/rebuild_cli_spec.rb +49 -49
- data/spec/cli/regions_cli_spec.rb +4 -4
- data/spec/cli/resize_cli_spec.rb +8 -8
- data/spec/cli/restart_cli_spec.rb +8 -8
- data/spec/cli/sizes_cli_spec.rb +1 -1
- data/spec/cli/snapshot_cli_spec.rb +7 -7
- data/spec/cli/ssh_cli_spec.rb +4 -4
- data/spec/cli/start_cli_spec.rb +7 -7
- data/spec/cli/verify_cli_spec.rb +10 -2
- data/spec/cli/wait_cli_spec.rb +6 -6
- data/spec/fixtures/500.html +68 -0
- data/spec/fixtures/show_droplet.json +1 -0
- data/spec/fixtures/show_droplet_fuzzy.json +13 -0
- data/spec/fixtures/show_droplet_inactive.json +1 -0
- data/spec/fixtures/show_droplets.json +2 -0
- data/spec/fixtures/show_droplets_fuzzy.json +35 -0
- data/spec/fixtures/show_droplets_inactive.json +2 -0
- data/spec/fixtures/show_regions.json +9 -6
- data/spec/middleware/base_spec.rb +1 -1
- data/spec/middleware/check_credentials_spec.rb +1 -1
- data/spec/middleware/inject_client_spec.rb +29 -0
- data/spec/middleware/inject_configuration_spec.rb +1 -1
- data/spec/middleware/ssh_droplet_spec.rb +30 -7
- data/spec/shared/environment.rb +1 -0
- data/spec/spec_helper.rb +11 -4
- data/tugboat.gemspec +9 -7
- metadata +64 -33
@@ -0,0 +1,29 @@
|
|
1
|
+
module Tugboat
|
2
|
+
module Middleware
|
3
|
+
# Check if the droplet in the environment is inactive, or "off"
|
4
|
+
class Config < Base
|
5
|
+
def call(env)
|
6
|
+
|
7
|
+
config = Tugboat::Configuration.instance
|
8
|
+
|
9
|
+
keys_retracted = ''
|
10
|
+
|
11
|
+
config_data = config.data.to_yaml
|
12
|
+
|
13
|
+
if env["user_hide_keys"]
|
14
|
+
keys_retracted = '(Keys Redacted)'
|
15
|
+
config_data = config_data.gsub(/(client_key: )([a-zA-Z0-9]+)/,'\1 [REDACTED]')
|
16
|
+
config_data = config_data.gsub(/(api_key: )([a-zA-Z0-9]+)/,'\1 [REDACTED]')
|
17
|
+
end
|
18
|
+
|
19
|
+
say "Current Config #{keys_retracted}", :green
|
20
|
+
|
21
|
+
say "Path: #{config.path}"
|
22
|
+
say config_data
|
23
|
+
|
24
|
+
@app.call(env)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -7,7 +7,7 @@ module Tugboat
|
|
7
7
|
@app = app
|
8
8
|
@logger = options.fetch(:logger) {
|
9
9
|
require 'logger'
|
10
|
-
::Logger.new(
|
10
|
+
::Logger.new($stdout)
|
11
11
|
}
|
12
12
|
end
|
13
13
|
|
@@ -26,7 +26,7 @@ module Tugboat
|
|
26
26
|
private
|
27
27
|
|
28
28
|
def filter(output)
|
29
|
-
|
29
|
+
if ENV['DEBUG'].to_i == 2
|
30
30
|
output = output.to_s.gsub(/client_id=[a-zA-Z0-9]*/,'client_id=[CLIENT-ID]')
|
31
31
|
output = output.to_s.gsub(/api_key=[a-zA-Z0-9]*/,'api_key=[API-KEY]')
|
32
32
|
output = output.to_s.gsub(/_digitalocean2_session_v2=[a-zA-Z0-9%-]*/,'_digitalocean2_session_v2=[SESSION_COOKIE]')
|
@@ -33,6 +33,7 @@ module Tugboat
|
|
33
33
|
env["droplet_id"] = req.droplet.id
|
34
34
|
env["droplet_name"] = "(#{req.droplet.name})"
|
35
35
|
env["droplet_ip"] = req.droplet.ip_address
|
36
|
+
env["droplet_ip_private"] = req.droplet.private_ip_address
|
36
37
|
env["droplet_status"] = req.droplet.status
|
37
38
|
end
|
38
39
|
|
@@ -47,6 +48,7 @@ module Tugboat
|
|
47
48
|
env["droplet_id"] = d.id
|
48
49
|
env["droplet_name"] = "(#{d.name})"
|
49
50
|
env["droplet_ip"] = d.ip_address
|
51
|
+
env["droplet_ip_private"] = d.private_ip_address
|
50
52
|
env["droplet_status"] = d.status
|
51
53
|
end
|
52
54
|
end
|
@@ -83,6 +85,7 @@ module Tugboat
|
|
83
85
|
env["droplet_id"] = found_droplets.first.id
|
84
86
|
env["droplet_name"] = "(#{found_droplets.first.name})"
|
85
87
|
env["droplet_ip"] = found_droplets.first.ip_address
|
88
|
+
env["droplet_ip_private"] = found_droplets.first.private_ip_address
|
86
89
|
env["droplet_status"] = found_droplets.first.status
|
87
90
|
elsif found_droplets.length > 1
|
88
91
|
# Did we run the multiple questionairre?
|
@@ -99,6 +102,7 @@ module Tugboat
|
|
99
102
|
env["droplet_id"] = found_droplets[choice.to_i].id
|
100
103
|
env["droplet_name"] = found_droplets[choice.to_i].name
|
101
104
|
env["droplet_ip"] = found_droplets[choice.to_i].ip_address
|
105
|
+
env["droplet_ip_private"] = found_droplets[choice.to_i].private_ip_address
|
102
106
|
env["droplet_status"] = found_droplets[choice.to_i].status
|
103
107
|
end
|
104
108
|
|
@@ -24,6 +24,11 @@ module Tugboat
|
|
24
24
|
say "ID: #{droplet.id}"
|
25
25
|
say "Status: #{status_color}#{droplet.status}#{CLEAR}"
|
26
26
|
say "IP: #{droplet.ip_address}"
|
27
|
+
|
28
|
+
if droplet.private_ip_address
|
29
|
+
say "Private IP: #{droplet.private_ip_address}"
|
30
|
+
end
|
31
|
+
|
27
32
|
say "Region ID: #{droplet.region_id}"
|
28
33
|
say "Image ID: #{droplet.image_id}"
|
29
34
|
say "Size ID: #{droplet.size_id}"
|
@@ -14,7 +14,7 @@ module Tugboat
|
|
14
14
|
faraday.use CustomLogger if ENV['DEBUG']
|
15
15
|
faraday.request :url_encoded
|
16
16
|
faraday.response :rashify
|
17
|
-
faraday.response :json
|
17
|
+
faraday.response :json, :content_type => /\b(json|json-home)$/
|
18
18
|
faraday.adapter Faraday.default_adapter
|
19
19
|
end
|
20
20
|
end
|
@@ -13,13 +13,17 @@ module Tugboat
|
|
13
13
|
else
|
14
14
|
droplet_list.each do |droplet|
|
15
15
|
|
16
|
+
if droplet.private_ip_address
|
17
|
+
private_ip = ", privateip: #{droplet.private_ip_address}"
|
18
|
+
end
|
19
|
+
|
16
20
|
if droplet.status == "active"
|
17
21
|
status_color = GREEN
|
18
22
|
else
|
19
23
|
status_color = RED
|
20
24
|
end
|
21
25
|
|
22
|
-
say "#{droplet.name} (ip: #{droplet.ip_address}, status: #{status_color}#{droplet.status}#{CLEAR}, region: #{droplet.region_id}, id: #{droplet.id})"
|
26
|
+
say "#{droplet.name} (ip: #{droplet.ip_address}#{private_ip}, status: #{status_color}#{droplet.status}#{CLEAR}, region: #{droplet.region_id}, id: #{droplet.id})"
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
@@ -3,11 +3,11 @@ module Tugboat
|
|
3
3
|
class ListRegions < Base
|
4
4
|
def call(env)
|
5
5
|
ocean = env["ocean"]
|
6
|
-
regions = ocean.regions.list.regions
|
6
|
+
regions = ocean.regions.list.regions.sort_by(&:name)
|
7
7
|
|
8
8
|
say "Regions:"
|
9
9
|
regions.each do |region|
|
10
|
-
say "#{region.name} (id: #{region.id})"
|
10
|
+
say "#{region.name} (id: #{region.id}) (slug: #{region.slug})"
|
11
11
|
end
|
12
12
|
|
13
13
|
@app.call(env)
|
@@ -9,7 +9,7 @@ module Tugboat
|
|
9
9
|
"-o", "LogLevel=ERROR",
|
10
10
|
"-o", "StrictHostKeyChecking=no",
|
11
11
|
"-o", "UserKnownHostsFile=/dev/null",
|
12
|
-
"-i", env["config"].ssh_key_path.to_s]
|
12
|
+
"-i", File.expand_path(env["config"].ssh_key_path.to_s)]
|
13
13
|
|
14
14
|
if env["user_droplet_ssh_port"]
|
15
15
|
options.push("-p", env["user_droplet_ssh_port"].to_s)
|
@@ -24,7 +24,22 @@ module Tugboat
|
|
24
24
|
end
|
25
25
|
|
26
26
|
ssh_user = env["user_droplet_ssh_user"] || env["config"].ssh_user
|
27
|
-
|
27
|
+
|
28
|
+
host_ip = env["droplet_ip"]
|
29
|
+
|
30
|
+
if env["droplet_ip_private"]
|
31
|
+
use_public_ip = env["config"].use_public_ip
|
32
|
+
|
33
|
+
if not env["user_droplet_use_public_ip"].nil?
|
34
|
+
use_public_ip = env["user_droplet_use_public_ip"]
|
35
|
+
end
|
36
|
+
|
37
|
+
if not use_public_ip
|
38
|
+
host_ip = env["droplet_ip_private"]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
host_string = "#{ssh_user}@#{host_ip}"
|
28
43
|
|
29
44
|
options << host_string
|
30
45
|
|
data/lib/tugboat/version.rb
CHANGED
data/spec/cli/add_key_spec.rb
CHANGED
@@ -20,7 +20,7 @@ describe Tugboat::CLI do
|
|
20
20
|
it "with a name and key string" do
|
21
21
|
|
22
22
|
stub_request(:get, "https://api.digitalocean.com/ssh_keys/new?api_key=#{api_key}&client_id=#{client_key}&name=#{ssh_key_name}&ssh_pub_key=#{ssh_public_key}").
|
23
|
-
to_return(:status => 200, :body => fixture("create_ssh_key"))
|
23
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200, :body => fixture("create_ssh_key"))
|
24
24
|
|
25
25
|
@cli.options = @cli.options.merge(:key => "#{ssh_public_key}")
|
26
26
|
@cli.add_key(ssh_key_name)
|
@@ -33,21 +33,21 @@ Queueing upload of SSH key '#{ssh_key_name}'...done
|
|
33
33
|
end
|
34
34
|
|
35
35
|
before :each do
|
36
|
-
ENV.
|
37
|
-
ENV.
|
38
|
-
ENV.
|
36
|
+
allow(ENV).to receive(:[]).with('HOME').and_return(fake_home)
|
37
|
+
allow(ENV).to receive(:[]).with('DEBUG').and_return(nil)
|
38
|
+
allow(ENV).to receive(:[]).with('http_proxy').and_return(nil)
|
39
39
|
FileUtils.mkdir_p "#{fake_home}/.ssh"
|
40
40
|
File.open("#{fake_home}/.ssh/id_rsa.pub", 'w') {|f| f.write("ssh-dss A456= user@host") }
|
41
41
|
end
|
42
42
|
|
43
43
|
it "with name, prompts from file folder" do
|
44
44
|
stub_request(:get, "https://api.digitalocean.com/ssh_keys/new?api_key=#{api_key}&client_id=#{client_key}&name=#{ssh_key_name}&ssh_pub_key=ssh-dss%20A456=%20user@host").
|
45
|
-
to_return(:status => 200, :body => fixture("create_ssh_key"))
|
45
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200, :body => fixture("create_ssh_key"))
|
46
46
|
|
47
|
-
$stdout.
|
48
|
-
$stdout.
|
49
|
-
$stdout.
|
50
|
-
$stdin.
|
47
|
+
expect($stdout).to receive(:print).exactly(4).times
|
48
|
+
expect($stdout).to receive(:print).with("Enter the path to your SSH key: ")
|
49
|
+
expect($stdout).to receive(:print).with("Queueing upload of SSH key '#{ssh_key_name}'...")
|
50
|
+
expect($stdin).to receive(:gets).and_return("#{fake_home}/.ssh/id_rsa.pub")
|
51
51
|
|
52
52
|
@cli.add_key(ssh_key_name)
|
53
53
|
|
@@ -8,77 +8,101 @@ describe Tugboat::CLI do
|
|
8
8
|
describe "authorize" do
|
9
9
|
before do
|
10
10
|
stub_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}").
|
11
|
-
to_return(:status => 200)
|
11
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "asks the right questions and checks credentials" do
|
15
15
|
|
16
|
-
$stdout.
|
17
|
-
$stdout.
|
18
|
-
$stdin.
|
19
|
-
$stdout.
|
20
|
-
$stdin.
|
21
|
-
$stdout.
|
22
|
-
$stdin.
|
23
|
-
$stdout.
|
24
|
-
$stdin.
|
25
|
-
$stdout.
|
26
|
-
$stdin.
|
27
|
-
$stdout.
|
28
|
-
$stdin.
|
29
|
-
$stdout.
|
30
|
-
$stdin.
|
31
|
-
$stdout.
|
32
|
-
$stdin.
|
33
|
-
$stdout.
|
34
|
-
$stdin.
|
35
|
-
$stdout.
|
36
|
-
$stdin.
|
37
|
-
$stdout.
|
38
|
-
$stdin.
|
39
|
-
|
16
|
+
expect($stdout).to receive(:print).exactly(6).times
|
17
|
+
expect($stdout).to receive(:print).with("Enter your client key: ")
|
18
|
+
expect($stdin).to receive(:gets).and_return(client_key)
|
19
|
+
expect($stdout).to receive(:print).with("Enter your API key: ")
|
20
|
+
expect($stdin).to receive(:gets).and_return(api_key)
|
21
|
+
expect($stdout).to receive(:print).with("Enter your SSH key path (optional, defaults to ~/.ssh/id_rsa): ")
|
22
|
+
expect($stdin).to receive(:gets).and_return(ssh_key_path)
|
23
|
+
expect($stdout).to receive(:print).with("Enter your SSH user (optional, defaults to root): ")
|
24
|
+
expect($stdin).to receive(:gets).and_return(ssh_user)
|
25
|
+
expect($stdout).to receive(:print).with("Enter your SSH port number (optional, defaults to 22): ")
|
26
|
+
expect($stdin).to receive(:gets).and_return(ssh_port)
|
27
|
+
expect($stdout).to receive(:print).with("Enter your default region ID (optional, defaults to 8 (New York 3)): ")
|
28
|
+
expect($stdin).to receive(:gets).and_return(region)
|
29
|
+
expect($stdout).to receive(:print).with("Enter your default image ID (optional, defaults to 9801950 (Ubuntu 14.04 x64)): ")
|
30
|
+
expect($stdin).to receive(:gets).and_return(image)
|
31
|
+
expect($stdout).to receive(:print).with("Enter your default size ID (optional, defaults to 66 (512MB)): ")
|
32
|
+
expect($stdin).to receive(:gets).and_return(size)
|
33
|
+
expect($stdout).to receive(:print).with("Enter your default ssh key ID (optional, defaults to none): ")
|
34
|
+
expect($stdin).to receive(:gets).and_return(ssh_key_id)
|
35
|
+
expect($stdout).to receive(:print).with("Enter your default for private networking (optional, defaults to false): ")
|
36
|
+
expect($stdin).to receive(:gets).and_return(private_networking)
|
37
|
+
expect($stdout).to receive(:print).with("Enter your default for enabling backups (optional, defaults to false): ")
|
38
|
+
expect($stdin).to receive(:gets).and_return(backups_enabled)
|
40
39
|
|
41
40
|
@cli.authorize
|
42
41
|
|
43
|
-
expect(
|
42
|
+
expect($stdout.string).to include("Note: You can get this information from https://cloud.digitalocean.com/api_access")
|
43
|
+
expect($stdout.string).to include("Also Note: Tugboat is setup to work with v1 of the Digital Ocean API (https://developers.digitalocean.com/v1/)")
|
44
|
+
expect($stdout.string).to include("To retrieve region, image, size and key ID's, you can use the corresponding tugboat command, such as `tugboat images`.")
|
45
|
+
expect($stdout.string).to include("Defaults can be changed at any time in your ~/.tugboat configuration file.")
|
44
46
|
|
45
|
-
|
47
|
+
expect(a_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}")).to have_been_made
|
46
48
|
|
49
|
+
config = YAML.load_file(tmp_path)
|
50
|
+
|
51
|
+
expect(config["defaults"]["image"]).to eq image
|
52
|
+
expect(config["defaults"]["region"]).to eq region
|
53
|
+
expect(config["defaults"]["size"]).to eq size
|
54
|
+
expect(config["ssh"]["ssh_user"]).to eq ssh_user
|
55
|
+
expect(config["ssh"]["ssh_key_path"]).to eq ssh_key_path
|
56
|
+
expect(config["ssh"]["ssh_port"]).to eq ssh_port
|
57
|
+
expect(config["defaults"]["ssh_key"]).to eq ssh_key_id
|
58
|
+
expect(config["defaults"]["private_networking"]).to eq private_networking
|
59
|
+
expect(config["defaults"]["backups_enabled"]).to eq backups_enabled
|
47
60
|
end
|
48
61
|
|
49
62
|
it "sets defaults if no input given" do
|
50
63
|
|
51
|
-
$stdout.
|
52
|
-
$stdout.
|
53
|
-
$stdin.
|
54
|
-
$stdout.
|
55
|
-
$stdin.
|
56
|
-
$stdout.
|
57
|
-
$stdin.
|
58
|
-
$stdout.
|
59
|
-
$stdin.
|
60
|
-
$stdout.
|
61
|
-
$stdin.
|
62
|
-
$stdout.
|
63
|
-
$stdin.
|
64
|
-
$stdout.
|
65
|
-
$stdin.
|
66
|
-
$stdout.
|
67
|
-
$stdin.
|
68
|
-
$stdout.
|
69
|
-
$stdin.
|
70
|
-
$stdout.
|
71
|
-
$stdin.
|
72
|
-
$stdout.
|
73
|
-
$stdin.
|
74
|
-
|
64
|
+
expect($stdout).to receive(:print).exactly(6).times
|
65
|
+
expect($stdout).to receive(:print).with("Enter your client key: ")
|
66
|
+
expect($stdin).to receive(:gets).and_return(client_key)
|
67
|
+
expect($stdout).to receive(:print).with("Enter your API key: ")
|
68
|
+
expect($stdin).to receive(:gets).and_return(api_key)
|
69
|
+
expect($stdout).to receive(:print).with("Enter your SSH key path (optional, defaults to ~/.ssh/id_rsa): ")
|
70
|
+
expect($stdin).to receive(:gets).and_return(ssh_key_path)
|
71
|
+
expect($stdout).to receive(:print).with("Enter your SSH user (optional, defaults to root): ")
|
72
|
+
expect($stdin).to receive(:gets).and_return('')
|
73
|
+
expect($stdout).to receive(:print).with("Enter your SSH port number (optional, defaults to 22): ")
|
74
|
+
expect($stdin).to receive(:gets).and_return('')
|
75
|
+
expect($stdout).to receive(:print).with("Enter your default region ID (optional, defaults to 8 (New York 3)): ")
|
76
|
+
expect($stdin).to receive(:gets).and_return('')
|
77
|
+
expect($stdout).to receive(:print).with("Enter your default image ID (optional, defaults to 9801950 (Ubuntu 14.04 x64)): ")
|
78
|
+
expect($stdin).to receive(:gets).and_return('')
|
79
|
+
expect($stdout).to receive(:print).with("Enter your default size ID (optional, defaults to 66 (512MB)): ")
|
80
|
+
expect($stdin).to receive(:gets).and_return('')
|
81
|
+
expect($stdout).to receive(:print).with("Enter your default ssh key ID (optional, defaults to none): ")
|
82
|
+
expect($stdin).to receive(:gets).and_return('')
|
83
|
+
expect($stdout).to receive(:print).with("Enter your default for private networking (optional, defaults to false): ")
|
84
|
+
expect($stdin).to receive(:gets).and_return('')
|
85
|
+
expect($stdout).to receive(:print).with("Enter your default for enabling backups (optional, defaults to false): ")
|
86
|
+
expect($stdin).to receive(:gets).and_return('')
|
75
87
|
|
76
88
|
@cli.authorize
|
77
89
|
|
90
|
+
expect($stdout.string).to include("Note: You can get this information from https://cloud.digitalocean.com/api_access")
|
91
|
+
expect($stdout.string).to include("Also Note: Tugboat is setup to work with v1 of the Digital Ocean API (https://developers.digitalocean.com/v1/)")
|
92
|
+
expect($stdout.string).to include("To retrieve region, image, size and key ID's, you can use the corresponding tugboat command, such as `tugboat images`.")
|
93
|
+
expect($stdout.string).to include("Defaults can be changed at any time in your ~/.tugboat configuration file.")
|
94
|
+
|
78
95
|
expect(a_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}")).to have_been_made
|
79
96
|
|
80
|
-
|
97
|
+
config = YAML.load_file(tmp_path)
|
81
98
|
|
99
|
+
expect(config["defaults"]["image"]).to eq "9801950"
|
100
|
+
expect(config["defaults"]["region"]).to eq "8"
|
101
|
+
expect(config["defaults"]["size"]).to eq "66"
|
102
|
+
expect(config["ssh"]["ssh_user"]).to eq 'root'
|
103
|
+
expect(config["ssh"]["ssh_key_path"]).to eq "~/.ssh/id_rsa2"
|
104
|
+
expect(config["ssh"]["ssh_port"]).to eq "22"
|
105
|
+
expect(config["defaults"]["ssh_key"]).to eq ""
|
82
106
|
end
|
83
107
|
end
|
84
108
|
|
data/spec/cli/create_cli_spec.rb
CHANGED
@@ -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(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=#{image}&name=#{droplet_name}&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}®ion_id=#{region}&size_id=#{size}&ssh_key_ids=#{ssh_key_id}").
|
9
|
-
to_return(:status => 200, :body => '{"status":"OK"}')
|
9
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200, :body => '{"status":"OK"}')
|
10
10
|
|
11
11
|
@cli.create(droplet_name)
|
12
12
|
|
@@ -18,7 +18,7 @@ Queueing creation of droplet '#{droplet_name}'...done
|
|
18
18
|
|
19
19
|
it "with args does not use defaults from configuration" do
|
20
20
|
stub_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=555&name=foo&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}®ion_id=3&size_id=666&ssh_key_ids=4321").
|
21
|
-
to_return(:status => 200, :body => '{"status":"OK"}')
|
21
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200, :body => '{"status":"OK"}')
|
22
22
|
|
23
23
|
@cli.options = @cli.options.merge(:image => '555', :size => '666', :region => '3', :keys => '4321')
|
24
24
|
@cli.create(droplet_name)
|
@@ -29,8 +29,43 @@ Queueing creation of droplet '#{droplet_name}'...done
|
|
29
29
|
|
30
30
|
expect(a_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=555&name=foo&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}®ion_id=3&size_id=666&ssh_key_ids=4321")).to have_been_made
|
31
31
|
end
|
32
|
-
end
|
33
32
|
|
33
|
+
it "doesn't create a droplet when mistyping help command" do
|
34
|
+
help_text = <<-eos
|
35
|
+
Usage:
|
36
|
+
rspec create NAME
|
34
37
|
|
35
|
-
|
38
|
+
Options:
|
39
|
+
-s, [--size=N] # The size_id of the droplet
|
40
|
+
-i, [--image=N] # The image_id of the droplet
|
41
|
+
-r, [--region=N] # The region_id of the droplet
|
42
|
+
-k, [--keys=KEYS] # A comma separated list of SSH key ids to add to the droplet
|
43
|
+
-p, [--private-networking] # Enable private networking on the droplet
|
44
|
+
-b, [--backups-enabled] # Enable backups on the droplet
|
45
|
+
-q, [--quiet]
|
46
|
+
|
47
|
+
Create a droplet.
|
48
|
+
eos
|
49
|
+
|
50
|
+
@cli.create('help')
|
51
|
+
expect($stdout.string).to eq help_text
|
52
|
+
|
53
|
+
@cli.create('--help')
|
54
|
+
expect($stdout.string).to eq help_text + help_text
|
55
|
+
|
56
|
+
@cli.create('-h')
|
57
|
+
expect($stdout.string).to eq help_text + help_text + help_text
|
58
|
+
end
|
36
59
|
|
60
|
+
it "does not clobber named droplets that contain the word help" do
|
61
|
+
stub_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=#{image}&name=somethingblahblah--help&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}®ion_id=#{region}&size_id=#{size}&ssh_key_ids=#{ssh_key_id}").
|
62
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200, :body => '{"status":"OK"}')
|
63
|
+
|
64
|
+
@cli.create('somethingblahblah--help')
|
65
|
+
|
66
|
+
expect($stdout.string).to eq <<-eos
|
67
|
+
Queueing creation of droplet 'somethingblahblah--help'...done
|
68
|
+
eos
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Tugboat::CLI do
|
4
|
+
include_context "spec"
|
5
|
+
|
6
|
+
describe "DEBUG=1" do
|
7
|
+
before(:each) do
|
8
|
+
allow(ENV).to receive(:[]).with('HOME').and_return('/tmp/fake_home')
|
9
|
+
allow(ENV).to receive(:[]).with('DEBUG').and_return(1)
|
10
|
+
allow(ENV).to receive(:[]).with('http_proxy').and_return(nil)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "gives full faraday logs" do
|
14
|
+
stub_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}").
|
15
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200, :body => fixture("show_droplets"))
|
16
|
+
|
17
|
+
@cli.droplets
|
18
|
+
|
19
|
+
expect($stdout.string).to include('Response from https://api.digitalocean.com/droplets?client_id=foo&api_key=bar; Status: 200;')
|
20
|
+
|
21
|
+
expect(a_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}")).to have_been_made
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "DEBUG=2" do
|
26
|
+
before(:each) do
|
27
|
+
allow(ENV).to receive(:[]).with('HOME').and_return('/tmp/fake_home')
|
28
|
+
allow(ENV).to receive(:[]).with('DEBUG').and_return(2)
|
29
|
+
allow(ENV).to receive(:[]).with('http_proxy').and_return(nil)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "gives full faraday logs with redacted API keys" do
|
33
|
+
stub_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}").
|
34
|
+
to_return(:headers => {'Content-Type' => 'application/json'}, :status => 200, :body => fixture("show_droplets"))
|
35
|
+
|
36
|
+
@cli.droplets
|
37
|
+
|
38
|
+
expect($stdout.string).to include('Response from https://api.digitalocean.com/droplets?client_id=[CLIENT-ID]&api_key=[API-KEY]; Status: 200;')
|
39
|
+
|
40
|
+
expect(a_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}")).to have_been_made
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|