tugboat 2.2.2 → 2.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +520 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +0 -6
- data/README.md +34 -2
- data/Rakefile +6 -1
- data/bin/tugboat +2 -2
- data/features/cassettes/config/Array_of_SSH_Keys_in_Config.yml +1 -1
- data/features/cassettes/config/Single_SSH_key_as_number_in_config.yml +1 -1
- data/features/step_definitions/steps.rb +1 -1
- data/features/support/env.rb +7 -3
- data/lib/tugboat.rb +2 -2
- data/lib/tugboat/cli.rb +394 -444
- data/lib/tugboat/config.rb +43 -61
- data/lib/tugboat/middleware.rb +33 -33
- data/lib/tugboat/middleware/add_key.rb +12 -13
- data/lib/tugboat/middleware/ask_for_credentials.rb +12 -13
- data/lib/tugboat/middleware/base.rb +25 -20
- data/lib/tugboat/middleware/check_configuration.rb +3 -6
- data/lib/tugboat/middleware/check_credentials.rb +0 -1
- data/lib/tugboat/middleware/check_droplet_active.rb +2 -4
- data/lib/tugboat/middleware/check_droplet_inactive.rb +2 -4
- data/lib/tugboat/middleware/config.rb +3 -5
- data/lib/tugboat/middleware/confirm_action.rb +4 -6
- data/lib/tugboat/middleware/create_droplet.rb +27 -44
- data/lib/tugboat/middleware/custom_logger.rb +52 -54
- data/lib/tugboat/middleware/destroy_droplet.rb +5 -6
- data/lib/tugboat/middleware/destroy_image.rb +5 -6
- data/lib/tugboat/middleware/find_droplet.rb +43 -47
- data/lib/tugboat/middleware/find_image.rb +23 -29
- data/lib/tugboat/middleware/halt_droplet.rb +9 -10
- data/lib/tugboat/middleware/info_droplet.rb +30 -33
- data/lib/tugboat/middleware/info_image.rb +1 -1
- data/lib/tugboat/middleware/inject_client.rb +8 -10
- data/lib/tugboat/middleware/inject_configuration.rb +1 -2
- data/lib/tugboat/middleware/list_droplets.rb +9 -10
- data/lib/tugboat/middleware/list_images.rb +9 -9
- data/lib/tugboat/middleware/list_regions.rb +1 -1
- data/lib/tugboat/middleware/list_sizes.rb +1 -1
- data/lib/tugboat/middleware/list_ssh_keys.rb +1 -3
- data/lib/tugboat/middleware/password_reset.rb +6 -7
- data/lib/tugboat/middleware/rebuild_droplet.rb +7 -7
- data/lib/tugboat/middleware/resize_droplet.rb +6 -7
- data/lib/tugboat/middleware/restart_droplet.rb +4 -11
- data/lib/tugboat/middleware/snapshot_droplet.rb +7 -8
- data/lib/tugboat/middleware/ssh_droplet.rb +30 -31
- data/lib/tugboat/middleware/start_droplet.rb +5 -5
- data/lib/tugboat/middleware/wait_for_state.rb +2 -3
- data/lib/tugboat/version.rb +1 -1
- data/spec/cli/add_key_spec.rb +25 -28
- data/spec/cli/authorize_cli_spec.rb +57 -60
- data/spec/cli/config_cli_spec.rb +8 -11
- data/spec/cli/create_cli_spec.rb +40 -46
- data/spec/cli/debug_cli_spec.rb +29 -29
- data/spec/cli/destroy_cli_spec.rb +58 -60
- data/spec/cli/destroy_image_cli_spec.rb +42 -45
- data/spec/cli/droplets_cli_spec.rb +62 -64
- data/spec/cli/env_variable_spec.rb +14 -15
- data/spec/cli/halt_cli_spec.rb +65 -69
- data/spec/cli/help_cli_spec.rb +8 -8
- data/spec/cli/images_cli_spec.rb +28 -30
- data/spec/cli/info_cli_spec.rb +144 -147
- data/spec/cli/info_image_cli_spec.rb +57 -60
- data/spec/cli/keys_cli_spec.rb +8 -10
- data/spec/cli/password_reset_cli_spec.rb +56 -56
- data/spec/cli/rebuild_cli_spec.rb +194 -198
- data/spec/cli/regions_cli_spec.rb +8 -8
- data/spec/cli/resize_cli_spec.rb +54 -56
- data/spec/cli/restart_cli_spec.rb +53 -57
- data/spec/cli/sizes_cli_spec.rb +7 -8
- data/spec/cli/snapshot_cli_spec.rb +50 -53
- data/spec/cli/ssh_cli_spec.rb +41 -42
- data/spec/cli/start_cli_spec.rb +48 -52
- data/spec/cli/verify_cli_spec.rb +22 -25
- data/spec/cli/version_cli_spec.rb +6 -8
- data/spec/cli/wait_cli_spec.rb +50 -52
- data/spec/config_spec.rb +56 -57
- data/spec/middleware/base_spec.rb +5 -6
- data/spec/middleware/check_configuration_spec.rb +5 -7
- data/spec/middleware/check_credentials_spec.rb +9 -10
- data/spec/middleware/check_droplet_active_spec.rb +5 -7
- data/spec/middleware/check_droplet_inactive_spec.rb +5 -7
- data/spec/middleware/find_droplet_spec.rb +4 -5
- data/spec/middleware/find_image_spec.rb +4 -5
- data/spec/middleware/inject_client_spec.rb +9 -12
- data/spec/middleware/inject_configuration_spec.rb +4 -7
- data/spec/middleware/ssh_droplet_spec.rb +70 -73
- data/spec/shared/environment.rb +18 -20
- data/spec/spec_helper.rb +4 -4
- data/tugboat.gemspec +10 -6
- metadata +88 -17
data/lib/tugboat/config.rb
CHANGED
@@ -9,25 +9,25 @@ module Tugboat
|
|
9
9
|
attr_reader :data
|
10
10
|
attr_reader :path
|
11
11
|
|
12
|
-
FILE_NAME = '.tugboat'
|
13
|
-
DEFAULT_SSH_KEY_PATH = '.ssh/id_rsa'
|
14
|
-
DEFAULT_SSH_PORT = '22'
|
15
|
-
DEFAULT_REGION = 'nyc2'
|
16
|
-
DEFAULT_IMAGE = 'ubuntu-14-04-x64'
|
17
|
-
DEFAULT_SIZE = '512mb'
|
18
|
-
DEFAULT_SSH_KEY = ''
|
19
|
-
DEFAULT_IP6 = 'false'
|
20
|
-
DEFAULT_PRIVATE_NETWORKING = 'false'
|
21
|
-
DEFAULT_BACKUPS_ENABLED = 'false'
|
12
|
+
FILE_NAME = '.tugboat'.freeze
|
13
|
+
DEFAULT_SSH_KEY_PATH = '.ssh/id_rsa'.freeze
|
14
|
+
DEFAULT_SSH_PORT = '22'.freeze
|
15
|
+
DEFAULT_REGION = 'nyc2'.freeze
|
16
|
+
DEFAULT_IMAGE = 'ubuntu-14-04-x64'.freeze
|
17
|
+
DEFAULT_SIZE = '512mb'.freeze
|
18
|
+
DEFAULT_SSH_KEY = ''.freeze
|
19
|
+
DEFAULT_IP6 = 'false'.freeze
|
20
|
+
DEFAULT_PRIVATE_NETWORKING = 'false'.freeze
|
21
|
+
DEFAULT_BACKUPS_ENABLED = 'false'.freeze
|
22
22
|
DEFAULT_USER_DATA = nil
|
23
23
|
|
24
24
|
# Load config file from current directory, if not exit load from user's home directory
|
25
25
|
def initialize
|
26
|
-
@path = File.join(File.expand_path(
|
27
|
-
unless File.
|
28
|
-
@path = (
|
26
|
+
@path = File.join(File.expand_path('.'), FILE_NAME)
|
27
|
+
unless File.exist?(@path)
|
28
|
+
@path = (ENV['TUGBOAT_CONFIG_PATH'] || File.join(File.expand_path('~'), FILE_NAME))
|
29
29
|
end
|
30
|
-
@data =
|
30
|
+
@data = load_config_file
|
31
31
|
end
|
32
32
|
|
33
33
|
# If we can't load the config file, self.data is nil, which we can
|
@@ -97,80 +97,62 @@ module Tugboat
|
|
97
97
|
|
98
98
|
# Re-runs initialize
|
99
99
|
def reset!
|
100
|
-
|
100
|
+
send(:initialize)
|
101
101
|
end
|
102
102
|
|
103
103
|
# Re-loads the config
|
104
104
|
def reload!
|
105
|
-
@data =
|
105
|
+
@data = load_config_file
|
106
106
|
end
|
107
107
|
|
108
108
|
# Writes a config file
|
109
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
|
-
if ssh_key_path.empty?
|
112
|
-
ssh_key_path = File.join("~", DEFAULT_SSH_KEY_PATH)
|
113
|
-
end
|
111
|
+
ssh_key_path = File.join('~', DEFAULT_SSH_KEY_PATH) if ssh_key_path.empty?
|
114
112
|
|
115
|
-
if ssh_user.empty?
|
116
|
-
ssh_user = 'root'
|
117
|
-
end
|
113
|
+
ssh_user = 'root' if ssh_user.empty?
|
118
114
|
|
119
|
-
if ssh_port.empty?
|
120
|
-
ssh_port = DEFAULT_SSH_PORT
|
121
|
-
end
|
115
|
+
ssh_port = DEFAULT_SSH_PORT if ssh_port.empty?
|
122
116
|
|
123
|
-
if region.empty?
|
124
|
-
region = DEFAULT_REGION
|
125
|
-
end
|
117
|
+
region = DEFAULT_REGION if region.empty?
|
126
118
|
|
127
|
-
if image.empty?
|
128
|
-
image = DEFAULT_IMAGE
|
129
|
-
end
|
119
|
+
image = DEFAULT_IMAGE if image.empty?
|
130
120
|
|
131
|
-
if size.empty?
|
132
|
-
size = DEFAULT_SIZE
|
133
|
-
end
|
121
|
+
size = DEFAULT_SIZE if size.empty?
|
134
122
|
|
135
|
-
if ssh_key.empty?
|
136
|
-
default_ssh_key = DEFAULT_SSH_KEY
|
137
|
-
end
|
123
|
+
default_ssh_key = DEFAULT_SSH_KEY if ssh_key.empty?
|
138
124
|
|
139
125
|
if private_networking.empty?
|
140
126
|
private_networking = DEFAULT_PRIVATE_NETWORKING
|
141
127
|
end
|
142
128
|
|
143
|
-
if backups_enabled.empty?
|
144
|
-
backups_enabled = DEFAULT_BACKUPS_ENABLED
|
145
|
-
end
|
129
|
+
backups_enabled = DEFAULT_BACKUPS_ENABLED if backups_enabled.empty?
|
146
130
|
|
147
|
-
if ip6.empty?
|
148
|
-
ip6 = DEFAULT_IP6
|
149
|
-
end
|
131
|
+
ip6 = DEFAULT_IP6 if ip6.empty?
|
150
132
|
|
151
133
|
require 'yaml'
|
152
|
-
File.open(@path, File::RDWR|File::TRUNC|File::CREAT,
|
134
|
+
File.open(@path, File::RDWR | File::TRUNC | File::CREAT, 0o600) do |file|
|
153
135
|
data = {
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
136
|
+
'authentication' => {
|
137
|
+
'access_token' => access_token
|
138
|
+
},
|
139
|
+
'ssh' => {
|
140
|
+
'ssh_user' => ssh_user,
|
141
|
+
'ssh_key_path' => ssh_key_path,
|
142
|
+
'ssh_port' => ssh_port
|
143
|
+
},
|
144
|
+
'defaults' => {
|
145
|
+
'region' => region,
|
146
|
+
'image' => image,
|
147
|
+
'size' => size,
|
148
|
+
'ssh_key' => ssh_key,
|
149
|
+
'private_networking' => private_networking,
|
150
|
+
'backups_enabled' => backups_enabled,
|
151
|
+
'ip6' => ip6
|
152
|
+
}
|
170
153
|
}
|
171
154
|
file.write data.to_yaml
|
172
155
|
end
|
173
156
|
end
|
174
|
-
|
175
157
|
end
|
176
158
|
end
|
data/lib/tugboat/middleware.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
require
|
1
|
+
require 'middleware'
|
2
2
|
|
3
3
|
module Tugboat
|
4
4
|
module Middleware
|
5
|
-
autoload :AddKey,
|
6
|
-
autoload :AskForCredentials,
|
7
|
-
autoload :Base,
|
8
|
-
autoload :CheckConfiguration,
|
9
|
-
autoload :CheckCredentials,
|
10
|
-
autoload :CheckDropletActive,
|
11
|
-
autoload :CheckDropletInactive,
|
12
|
-
autoload :Config,
|
13
|
-
autoload :ConfirmAction,
|
14
|
-
autoload :CreateDroplet,
|
15
|
-
autoload :RebuildDroplet,
|
16
|
-
autoload :DestroyDroplet,
|
17
|
-
autoload :DestroyImage,
|
18
|
-
autoload :FindDroplet,
|
19
|
-
autoload :FindImage,
|
20
|
-
autoload :HaltDroplet,
|
21
|
-
autoload :InfoDroplet,
|
22
|
-
autoload :InfoImage,
|
23
|
-
autoload :InjectClient,
|
24
|
-
autoload :InjectConfiguration,
|
25
|
-
autoload :ListDroplets,
|
26
|
-
autoload :ListImages,
|
27
|
-
autoload :ListRegions,
|
28
|
-
autoload :ListSizes,
|
29
|
-
autoload :ListSSHKeys,
|
30
|
-
autoload :PasswordReset,
|
31
|
-
autoload :ResizeDroplet,
|
32
|
-
autoload :RestartDroplet,
|
33
|
-
autoload :SnapshotDroplet,
|
34
|
-
autoload :SSHDroplet,
|
35
|
-
autoload :StartDroplet,
|
36
|
-
autoload :WaitForState,
|
5
|
+
autoload :AddKey, 'tugboat/middleware/add_key'
|
6
|
+
autoload :AskForCredentials, 'tugboat/middleware/ask_for_credentials'
|
7
|
+
autoload :Base, 'tugboat/middleware/base'
|
8
|
+
autoload :CheckConfiguration, 'tugboat/middleware/check_configuration'
|
9
|
+
autoload :CheckCredentials, 'tugboat/middleware/check_credentials'
|
10
|
+
autoload :CheckDropletActive, 'tugboat/middleware/check_droplet_active'
|
11
|
+
autoload :CheckDropletInactive, 'tugboat/middleware/check_droplet_inactive'
|
12
|
+
autoload :Config, 'tugboat/middleware/config'
|
13
|
+
autoload :ConfirmAction, 'tugboat/middleware/confirm_action'
|
14
|
+
autoload :CreateDroplet, 'tugboat/middleware/create_droplet'
|
15
|
+
autoload :RebuildDroplet, 'tugboat/middleware/rebuild_droplet'
|
16
|
+
autoload :DestroyDroplet, 'tugboat/middleware/destroy_droplet'
|
17
|
+
autoload :DestroyImage, 'tugboat/middleware/destroy_image'
|
18
|
+
autoload :FindDroplet, 'tugboat/middleware/find_droplet'
|
19
|
+
autoload :FindImage, 'tugboat/middleware/find_image'
|
20
|
+
autoload :HaltDroplet, 'tugboat/middleware/halt_droplet'
|
21
|
+
autoload :InfoDroplet, 'tugboat/middleware/info_droplet'
|
22
|
+
autoload :InfoImage, 'tugboat/middleware/info_image'
|
23
|
+
autoload :InjectClient, 'tugboat/middleware/inject_client'
|
24
|
+
autoload :InjectConfiguration, 'tugboat/middleware/inject_configuration'
|
25
|
+
autoload :ListDroplets, 'tugboat/middleware/list_droplets'
|
26
|
+
autoload :ListImages, 'tugboat/middleware/list_images'
|
27
|
+
autoload :ListRegions, 'tugboat/middleware/list_regions'
|
28
|
+
autoload :ListSizes, 'tugboat/middleware/list_sizes'
|
29
|
+
autoload :ListSSHKeys, 'tugboat/middleware/list_ssh_keys'
|
30
|
+
autoload :PasswordReset, 'tugboat/middleware/password_reset'
|
31
|
+
autoload :ResizeDroplet, 'tugboat/middleware/resize_droplet'
|
32
|
+
autoload :RestartDroplet, 'tugboat/middleware/restart_droplet'
|
33
|
+
autoload :SnapshotDroplet, 'tugboat/middleware/snapshot_droplet'
|
34
|
+
autoload :SSHDroplet, 'tugboat/middleware/ssh_droplet'
|
35
|
+
autoload :StartDroplet, 'tugboat/middleware/start_droplet'
|
36
|
+
autoload :WaitForState, 'tugboat/middleware/wait_for_state'
|
37
37
|
|
38
38
|
# Start the authorization flow.
|
39
39
|
# This writes a ~/.tugboat file, which can be edited manually.
|
@@ -4,40 +4,40 @@ module Tugboat
|
|
4
4
|
def call(env)
|
5
5
|
ocean = env['barge']
|
6
6
|
|
7
|
-
if env[
|
8
|
-
pub_key_string = env[
|
7
|
+
if env['add_key_pub_key']
|
8
|
+
pub_key_string = env['add_key_pub_key']
|
9
9
|
else
|
10
|
-
if env[
|
11
|
-
pub_key_string = File.read(env[
|
10
|
+
if env['add_key_file_path']
|
11
|
+
pub_key_string = File.read(env['add_key_file_path'])
|
12
12
|
else
|
13
13
|
possible_keys = Dir.glob("#{ENV['HOME']}/.ssh/*.pub")
|
14
14
|
|
15
15
|
# Only show hinted keys if the user has any
|
16
|
-
|
16
|
+
unless possible_keys.empty?
|
17
17
|
say "Possible public key paths from #{ENV['HOME']}/.ssh:"
|
18
18
|
say
|
19
19
|
possible_keys.each do |key_file|
|
20
|
-
say
|
20
|
+
say key_file.to_s
|
21
21
|
end
|
22
22
|
say
|
23
23
|
end
|
24
24
|
|
25
|
-
ssh_key_file = ask
|
26
|
-
pub_key_string = File.read(
|
25
|
+
ssh_key_file = ask 'Enter the path to your SSH key:'
|
26
|
+
pub_key_string = File.read(ssh_key_file.to_s)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
say "Queueing upload of SSH key '#{env[
|
30
|
+
say "Queueing upload of SSH key '#{env['add_key_name']}'...", nil, false
|
31
31
|
|
32
|
-
response = ocean.key.create :
|
33
|
-
|
32
|
+
response = ocean.key.create name: env['add_key_name'],
|
33
|
+
public_key: pub_key_string
|
34
34
|
|
35
35
|
unless response.success?
|
36
36
|
say "Failed to create key: #{response.message}", :red
|
37
37
|
exit 1
|
38
38
|
end
|
39
39
|
|
40
|
-
say
|
40
|
+
say 'SSH Key uploaded', :green
|
41
41
|
say
|
42
42
|
say "Name: #{response.ssh_key.name}"
|
43
43
|
say "ID: #{response.ssh_key.id}"
|
@@ -47,4 +47,3 @@ module Tugboat
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
@@ -3,24 +3,24 @@ module Tugboat
|
|
3
3
|
# Ask for user credentials from the command line, then write them out.
|
4
4
|
class AskForCredentials < Base
|
5
5
|
def call(env)
|
6
|
-
say
|
6
|
+
say 'Note: You can get your Access Token from https://cloud.digitalocean.com/settings/tokens/new', :yellow
|
7
7
|
say
|
8
|
-
access_token = ask
|
8
|
+
access_token = ask 'Enter your access token:'
|
9
9
|
access_token.strip!
|
10
|
-
ssh_key_path = ask
|
11
|
-
ssh_user = ask
|
12
|
-
ssh_port = ask
|
10
|
+
ssh_key_path = ask 'Enter your SSH key path (optional, defaults to ~/.ssh/id_rsa):'
|
11
|
+
ssh_user = ask 'Enter your SSH user (optional, defaults to root):'
|
12
|
+
ssh_port = ask 'Enter your SSH port number (optional, defaults to 22):'
|
13
13
|
say
|
14
14
|
say "To retrieve region, image, size and key ID's, you can use the corresponding tugboat command, such as `tugboat images`."
|
15
|
-
say
|
15
|
+
say 'Defaults can be changed at any time in your ~/.tugboat configuration file.'
|
16
16
|
say
|
17
|
-
region = ask
|
18
|
-
image = ask
|
19
|
-
size = ask
|
17
|
+
region = ask 'Enter your default region (optional, defaults to nyc1):'
|
18
|
+
image = ask 'Enter your default image ID or image slug (optional, defaults to ubuntu-14-04-x64):'
|
19
|
+
size = ask 'Enter your default size (optional, defaults to 512mb)):'
|
20
20
|
ssh_key = ask "Enter your default ssh key IDs (optional, defaults to none, array of IDs of ssh keys eg. ['1234']):"
|
21
|
-
private_networking = ask
|
22
|
-
backups_enabled = ask
|
23
|
-
ip6
|
21
|
+
private_networking = ask 'Enter your default for private networking (optional, defaults to false):'
|
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):'
|
24
24
|
|
25
25
|
# Write the config file.
|
26
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)
|
@@ -31,4 +31,3 @@ module Tugboat
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
@@ -3,10 +3,10 @@ module Tugboat
|
|
3
3
|
# A base middleware class to initalize.
|
4
4
|
class Base
|
5
5
|
# Some colors for making things pretty.
|
6
|
-
CLEAR = "\e[0m"
|
7
|
-
RED = "\e[31m"
|
8
|
-
GREEN = "\e[32m"
|
9
|
-
YELLOW = "\e[33m"
|
6
|
+
CLEAR = "\e[0m".freeze
|
7
|
+
RED = "\e[31m".freeze
|
8
|
+
GREEN = "\e[32m".freeze
|
9
|
+
YELLOW = "\e[33m".freeze
|
10
10
|
|
11
11
|
# We want access to all of the fun thor cli helper methods,
|
12
12
|
# like say, yes?, ask, etc.
|
@@ -15,7 +15,7 @@ module Tugboat
|
|
15
15
|
def initialize(app)
|
16
16
|
@app = app
|
17
17
|
# This resets the color to "clear" on the user's terminal.
|
18
|
-
say
|
18
|
+
say '', :clear, false
|
19
19
|
end
|
20
20
|
|
21
21
|
def check_response_success(task_string, response)
|
@@ -29,11 +29,11 @@ module Tugboat
|
|
29
29
|
@app.call(env)
|
30
30
|
end
|
31
31
|
|
32
|
-
def verify_credentials(ocean, say_success=false)
|
32
|
+
def verify_credentials(ocean, say_success = false)
|
33
33
|
begin
|
34
|
-
response = ocean.droplet.all(
|
34
|
+
response = ocean.droplet.all(per_page: '1', page: '1')
|
35
35
|
rescue Faraday::ClientError => e
|
36
|
-
say
|
36
|
+
say 'Authentication with DigitalOcean failed at an early stage'
|
37
37
|
say "Error was: #{e}"
|
38
38
|
exit 1
|
39
39
|
end
|
@@ -43,25 +43,25 @@ module Tugboat
|
|
43
43
|
exit 1
|
44
44
|
end
|
45
45
|
|
46
|
-
say
|
46
|
+
say 'Authentication with DigitalOcean was successful.', :green if say_success
|
47
47
|
end
|
48
48
|
|
49
|
-
def wait_for_state(droplet_id, desired_state,ocean)
|
49
|
+
def wait_for_state(droplet_id, desired_state, ocean)
|
50
50
|
start_time = Time.now
|
51
51
|
|
52
52
|
response = ocean.droplet.show droplet_id
|
53
53
|
|
54
|
-
say
|
54
|
+
say '.', nil, false
|
55
55
|
|
56
|
-
|
56
|
+
unless response.success?
|
57
57
|
say "Failed to get status of Droplet: #{response.message}", :red
|
58
58
|
exit 1
|
59
59
|
end
|
60
60
|
|
61
|
-
while response.droplet.status != desired_state
|
61
|
+
while response.droplet.status != desired_state
|
62
62
|
sleep 2
|
63
63
|
response = ocean.droplet.show droplet_id
|
64
|
-
say
|
64
|
+
say '.', nil, false
|
65
65
|
end
|
66
66
|
|
67
67
|
total_time = (Time.now - start_time).to_i
|
@@ -69,15 +69,22 @@ module Tugboat
|
|
69
69
|
say "done#{CLEAR} (#{total_time}s)", :green
|
70
70
|
end
|
71
71
|
|
72
|
+
def restart_droplet(hard_restart, ocean, droplet_id = '', droplet_name = '')
|
73
|
+
if hard_restart
|
74
|
+
say "Queuing hard restart for #{droplet_id} #{droplet_name}...", nil, false
|
75
|
+
ocean.droplet.power_cycle droplet_id
|
76
|
+
else
|
77
|
+
say "Queuing restart for #{droplet_id} #{droplet_name}...", nil, false
|
78
|
+
ocean.droplet.reboot droplet_id
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
72
82
|
# Get all pages of droplets
|
73
83
|
def get_droplet_list(ocean)
|
74
|
-
|
75
84
|
verify_credentials(ocean)
|
76
85
|
|
77
86
|
page = ocean.droplet.all(per_page: 200, page: 1)
|
78
|
-
|
79
|
-
return page.droplets
|
80
|
-
end
|
87
|
+
return page.droplets unless page.paginated?
|
81
88
|
|
82
89
|
Enumerator.new do |enum|
|
83
90
|
page.droplets.each { |drop| enum.yield drop }
|
@@ -88,7 +95,5 @@ module Tugboat
|
|
88
95
|
end
|
89
96
|
end
|
90
97
|
end
|
91
|
-
|
92
98
|
end
|
93
99
|
end
|
94
|
-
|
@@ -3,22 +3,19 @@ module Tugboat
|
|
3
3
|
# Check if the client has set-up configuration yet.
|
4
4
|
class CheckConfiguration < Base
|
5
5
|
def call(env)
|
6
|
-
config = env[
|
6
|
+
config = env['config']
|
7
7
|
|
8
8
|
if !config || !config.data || !config.access_token
|
9
|
-
say
|
9
|
+
say 'You must run `tugboat authorize` in order to connect to DigitalOcean', :red
|
10
10
|
exit 1
|
11
11
|
end
|
12
12
|
|
13
13
|
# If the user passes the global `-q/--quiet` flag, redirect
|
14
14
|
# stdout
|
15
|
-
if env[
|
16
|
-
$stdout = File.new('/dev/null', 'w')
|
17
|
-
end
|
15
|
+
$stdout = File.new('/dev/null', 'w') if env['user_quiet']
|
18
16
|
|
19
17
|
@app.call(env)
|
20
18
|
end
|
21
19
|
end
|
22
20
|
end
|
23
21
|
end
|
24
|
-
|