ey-core 3.1.2 → 3.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.ruby-version +1 -1
- data/.travis.yml +1 -0
- data/Gemfile +0 -2
- data/examples/add_instance.rb +74 -0
- data/examples/boot_env.rb +60 -0
- data/examples/stop_env.rb +51 -0
- data/examples/terminate_instance.rb +58 -0
- data/lib/ey-core/cli/accounts.rb +14 -6
- data/lib/ey-core/cli/applications.rb +32 -12
- data/lib/ey-core/cli/console.rb +24 -10
- data/lib/ey-core/cli/current_user.rb +13 -5
- data/lib/ey-core/cli/deploy.rb +110 -52
- data/lib/ey-core/cli/environments.rb +34 -12
- data/lib/ey-core/cli/errors.rb +10 -6
- data/lib/ey-core/cli/help.rb +30 -0
- data/lib/ey-core/cli/helpers/archive.rb +70 -0
- data/lib/ey-core/cli/helpers/chef.rb +35 -0
- data/lib/ey-core/cli/helpers/core.rb +195 -0
- data/lib/ey-core/cli/helpers/deprecated.rb +39 -0
- data/lib/ey-core/cli/helpers/log_streaming.rb +41 -0
- data/lib/ey-core/cli/helpers/stream_printer.rb +42 -0
- data/lib/ey-core/cli/init.rb +11 -8
- data/lib/ey-core/cli/login.rb +33 -21
- data/lib/ey-core/cli/logout.rb +18 -10
- data/lib/ey-core/cli/logs.rb +57 -35
- data/lib/ey-core/cli/main.rb +52 -15
- data/lib/ey-core/cli/recipes.rb +5 -87
- data/lib/ey-core/cli/recipes/apply.rb +83 -43
- data/lib/ey-core/cli/recipes/download.rb +48 -22
- data/lib/ey-core/cli/recipes/main.rb +21 -0
- data/lib/ey-core/cli/recipes/upload.rb +56 -23
- data/lib/ey-core/cli/scp.rb +11 -8
- data/lib/ey-core/cli/servers.rb +37 -15
- data/lib/ey-core/cli/ssh.rb +127 -70
- data/lib/ey-core/cli/status.rb +54 -14
- data/lib/ey-core/cli/subcommand.rb +47 -108
- data/lib/ey-core/cli/timeout_deploy.rb +56 -26
- data/lib/ey-core/cli/version.rb +13 -5
- data/lib/ey-core/cli/web.rb +7 -7
- data/lib/ey-core/cli/web/disable.rb +46 -20
- data/lib/ey-core/cli/web/enable.rb +40 -17
- data/lib/ey-core/cli/web/main.rb +21 -0
- data/lib/ey-core/cli/web/restart.rb +34 -15
- data/lib/ey-core/cli/whoami.rb +11 -3
- data/lib/ey-core/mock/searching.rb +4 -0
- data/lib/ey-core/model.rb +5 -0
- data/lib/ey-core/models/deployment.rb +7 -0
- data/lib/ey-core/models/environment.rb +5 -0
- data/lib/ey-core/models/request.rb +2 -0
- data/lib/ey-core/models/user.rb +2 -0
- data/lib/ey-core/requests/get_servers.rb +1 -1
- data/lib/ey-core/response.rb +4 -0
- data/lib/ey-core/subscribable.rb +3 -3
- data/lib/ey-core/version.rb +1 -1
- data/spec/ey-core/cli/accounts_spec.rb +20 -0
- data/spec/ey-core/cli/recipes/apply_spec.rb +4 -17
- data/spec/ey-core/cli/recipes/download_spec.rb +93 -0
- data/spec/ey-core/cli/recipes/upload_spec.rb +80 -0
- data/spec/servers_spec.rb +15 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/support/cli_helpers.rb +38 -2
- metadata +116 -53
- checksums.yaml +0 -7
@@ -1,26 +1,52 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
1
|
+
require 'ey-core/cli/subcommand'
|
2
|
+
require 'ey-core/cli/helpers/archive'
|
3
|
+
|
4
|
+
module Ey
|
5
|
+
module Core
|
6
|
+
module Cli
|
7
|
+
module Recipes
|
8
|
+
class Download < Ey::Core::Cli::Subcommand
|
9
|
+
include Ey::Core::Cli::Helpers::Archive
|
10
|
+
|
11
|
+
title "download"
|
12
|
+
summary "Download a copy of the custom chef recipes from this environment into the current directory"
|
13
|
+
|
14
|
+
description <<-DESC
|
15
|
+
The recipes will be unpacked into a directory called "cookbooks" in the
|
16
|
+
current directory. This is the opposite of 'recipes upload'.
|
17
|
+
|
18
|
+
If the cookbooks directory already exists, an error will be raised.
|
19
|
+
DESC
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
option :environment,
|
22
|
+
short: "e",
|
23
|
+
long: "environment",
|
24
|
+
description: "Environment that will receive the recipes.",
|
25
|
+
argument: "environment"
|
22
26
|
|
23
|
-
|
24
|
-
|
27
|
+
option :account,
|
28
|
+
short: "c",
|
29
|
+
long: "account",
|
30
|
+
description: "Name of the account in which the environment can be found.",
|
31
|
+
argument: "account"
|
32
|
+
|
33
|
+
def handle
|
34
|
+
if File.exist?("cookbooks")
|
35
|
+
raise Ey::Core::Cli::RecipesExist.new(
|
36
|
+
"Cannot download recipes, cookbooks directory already exists."
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
operator, environment = core_operator_and_environment_for(options)
|
41
|
+
|
42
|
+
puts "Downloading recipes".green
|
43
|
+
recipes = environment.download_recipes
|
44
|
+
|
45
|
+
puts "Extracting recipes to 'cookbooks/'".green
|
46
|
+
untar(ungzip(recipes), './')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
25
51
|
end
|
26
52
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'ey-core/cli/subcommand'
|
2
|
+
require 'ey-core/cli/recipes/apply'
|
3
|
+
require 'ey-core/cli/recipes/download'
|
4
|
+
require 'ey-core/cli/recipes/upload'
|
5
|
+
|
6
|
+
module Ey
|
7
|
+
module Core
|
8
|
+
module Cli
|
9
|
+
module Recipes
|
10
|
+
class Main < Ey::Core::Cli::Subcommand
|
11
|
+
title "recipes"
|
12
|
+
summary "Chef specific commands"
|
13
|
+
|
14
|
+
mount Ey::Core::Cli::Recipes::Apply
|
15
|
+
mount Ey::Core::Cli::Recipes::Download
|
16
|
+
mount Ey::Core::Cli::Recipes::Upload
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,27 +1,60 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
1
|
+
require 'ey-core/cli/subcommand'
|
2
|
+
require 'ey-core/cli/helpers/chef'
|
3
|
+
require 'ey-core/cli/helpers/archive'
|
4
|
+
|
5
|
+
module Ey
|
6
|
+
module Core
|
7
|
+
module Cli
|
8
|
+
module Recipes
|
9
|
+
class Upload < Ey::Core::Cli::Subcommand
|
10
|
+
include Ey::Core::Cli::Helpers::Archive
|
11
|
+
include Ey::Core::Cli::Helpers::Chef
|
12
|
+
|
13
|
+
title "upload"
|
14
|
+
summary "Upload custom recipes to an environment"
|
15
|
+
|
16
|
+
option :environment,
|
17
|
+
short: "e",
|
18
|
+
long: "environment",
|
19
|
+
description: "Environment that will receive the recipes.",
|
20
|
+
argument: "environment"
|
21
|
+
|
22
|
+
option :account,
|
23
|
+
short: "c",
|
24
|
+
long: "account",
|
25
|
+
description: "Name of the account in which the environment can be found.",
|
26
|
+
argument: "account"
|
27
|
+
|
28
|
+
option :file,
|
29
|
+
short: "f",
|
30
|
+
long: "file",
|
31
|
+
description: "Path to recipes",
|
32
|
+
argument: "path"
|
33
|
+
|
34
|
+
switch :apply,
|
35
|
+
short: "a",
|
36
|
+
long: "apply",
|
37
|
+
description: "Apply the recipes immediately after they are uploaded"
|
38
|
+
|
39
|
+
def handle
|
40
|
+
operator, environment = core_operator_and_environment_for(options)
|
41
|
+
path = option(:file) || "cookbooks/"
|
42
|
+
|
43
|
+
puts "Uploading custom recipes for #{environment.name}".green
|
44
|
+
|
45
|
+
begin
|
46
|
+
upload_recipes(environment, path)
|
47
|
+
puts "Uploading custom recipes complete".green
|
48
|
+
rescue => e
|
49
|
+
abort "There was a problem uploading the recipes".red
|
50
|
+
end
|
22
51
|
|
23
|
-
|
24
|
-
|
52
|
+
if switch_active?(:apply)
|
53
|
+
run_chef("custom", environment)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
25
58
|
end
|
26
59
|
end
|
27
60
|
end
|
data/lib/ey-core/cli/scp.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
summary "This command is deprecated"
|
4
|
-
description <<-DESC
|
5
|
-
The scp command has been deprecated. We apologize for any inconvenience.
|
6
|
-
DESC
|
1
|
+
require 'ey-core/cli/subcommand'
|
2
|
+
require 'ey-core/cli/helpers/deprecated'
|
7
3
|
|
8
|
-
|
9
|
-
|
4
|
+
module Ey
|
5
|
+
module Core
|
6
|
+
module Cli
|
7
|
+
class Scp < Subcommand
|
8
|
+
include Helpers::Deprecated
|
9
|
+
|
10
|
+
deprecate('scp')
|
11
|
+
end
|
12
|
+
end
|
10
13
|
end
|
11
14
|
end
|
data/lib/ey-core/cli/servers.rb
CHANGED
@@ -1,19 +1,41 @@
|
|
1
|
-
|
2
|
-
title "servers"
|
3
|
-
summary "List servers you have access to"
|
4
|
-
option :account, short: 'c', long: 'account', description: 'Filter by account name or id', argument: 'Account'
|
5
|
-
option :environment, short: "-e", long: "environment", description: "Filter by environment.", argument: "environment"
|
1
|
+
require 'ey-core/cli/subcommand'
|
6
2
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
else
|
14
|
-
core_client.servers.all
|
15
|
-
end
|
3
|
+
module Ey
|
4
|
+
module Core
|
5
|
+
module Cli
|
6
|
+
class Servers < Subcommand
|
7
|
+
title "servers"
|
8
|
+
summary "List servers you have access to"
|
16
9
|
|
17
|
-
|
10
|
+
option :account,
|
11
|
+
short: 'c',
|
12
|
+
long: 'account',
|
13
|
+
description: 'Filter by account name or id',
|
14
|
+
argument: 'Account'
|
15
|
+
|
16
|
+
option :environment,
|
17
|
+
short: "-e",
|
18
|
+
long: "environment",
|
19
|
+
description: "Filter by environment.",
|
20
|
+
argument: "environment"
|
21
|
+
|
22
|
+
def handle
|
23
|
+
puts TablePrint::Printer.
|
24
|
+
new(servers, [{id: {width: 10}}, :role, :provisioned_id]).
|
25
|
+
table_print
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def servers
|
30
|
+
if option(:account)
|
31
|
+
core_client.servers.all(account: core_account)
|
32
|
+
elsif environment = option(:environment)
|
33
|
+
(core_client.environments.get(environment) || core_client.environments.first(name: environment)).servers.all
|
34
|
+
else
|
35
|
+
core_client.servers.all
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
18
40
|
end
|
19
41
|
end
|
data/lib/ey-core/cli/ssh.rb
CHANGED
@@ -1,81 +1,138 @@
|
|
1
1
|
require 'ey-core/cli/helpers/server_sieve'
|
2
|
+
require 'ey-core/cli/subcommand'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
option :utilities, long: "utilities", description: "Run command on the utility servers with the given names. Specify all to run the command on all utility servers.", argument: "'all,resque,redis,etc'"
|
10
|
-
option :command, long: "command", description: "Command to run", argument: "'command with args'"
|
11
|
-
option :shell, short: 's', long: "shell", description: "Run command in a shell other than bash", argument: "shell"
|
12
|
-
option :bind_address, long: "bind_address", description: "When no command is specified, pass -L to ssh", argument: "bind address"
|
13
|
-
|
14
|
-
switch :all, long: "all", description: "Run command on all servers"
|
15
|
-
switch :app_servers, long: "app_servers", description: "Run command on all application servers"
|
16
|
-
switch :db_servers, long: "db_servers", description: "Run command on all database servers"
|
17
|
-
switch :db_master, long: "db_master", description: "Run command on database master"
|
18
|
-
switch :db_slaves, long: "db_slaves", description: "Run command on database slaves"
|
19
|
-
switch :tty, short: 't', long: "tty", description: "Allocated a tty for the command"
|
20
|
-
|
21
|
-
def handle
|
22
|
-
operator, environment = core_operator_and_environment_for(options)
|
23
|
-
abort "Unable to find matching environment".red unless environment
|
24
|
-
|
25
|
-
cmd = option(:command)
|
26
|
-
ssh_opts = []
|
27
|
-
ssh_cmd = ["ssh"]
|
28
|
-
exits = []
|
29
|
-
user = environment.username
|
30
|
-
servers = []
|
31
|
-
|
32
|
-
if option(:command)
|
33
|
-
if shell = option(:shell)
|
34
|
-
cmd = Escape.shell_command([shell,'-lc',cmd])
|
35
|
-
end
|
4
|
+
module Ey
|
5
|
+
module Core
|
6
|
+
module Cli
|
7
|
+
class Ssh < Subcommand
|
8
|
+
title "ssh"
|
9
|
+
summary "Open an SSH session to the environment's application master"
|
36
10
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
11
|
+
option :account,
|
12
|
+
short: "c",
|
13
|
+
long: "account",
|
14
|
+
description: "Name or id of account",
|
15
|
+
argument: "account"
|
42
16
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
db_master: switch_active?(:db_master),
|
49
|
-
utilities: option(:utilities)
|
50
|
-
)
|
51
|
-
else
|
52
|
-
if option(:bind_address)
|
53
|
-
ssh_opts += ["-L", option(:bind_address)]
|
54
|
-
end
|
17
|
+
option :environment,
|
18
|
+
short: "e",
|
19
|
+
long: "environment",
|
20
|
+
description: "Name or id of environment",
|
21
|
+
argument: "environment"
|
55
22
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
23
|
+
option :server,
|
24
|
+
short: 's',
|
25
|
+
long: "server",
|
26
|
+
description: "Specific server to ssh into. Id or amazon id (i-12345)",
|
27
|
+
argument: "server"
|
62
28
|
|
63
|
-
|
64
|
-
|
65
|
-
|
29
|
+
option :utilities,
|
30
|
+
long: "utilities",
|
31
|
+
description: "Run command on the utility servers with the given names. Specify all to run the command on all utility servers.",
|
32
|
+
argument: "'all,resque,redis,etc'"
|
66
33
|
|
67
|
-
|
34
|
+
option :command,
|
35
|
+
long: "command",
|
36
|
+
description: "Command to run",
|
37
|
+
argument: "'command with args'"
|
68
38
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
39
|
+
option :shell,
|
40
|
+
short: 's',
|
41
|
+
long: "shell",
|
42
|
+
description: "Run command in a shell other than bash",
|
43
|
+
argument: "shell"
|
44
|
+
|
45
|
+
option :bind_address,
|
46
|
+
long: "bind_address",
|
47
|
+
description: "When no command is specified, pass -L to ssh",
|
48
|
+
argument: "bind address"
|
49
|
+
|
50
|
+
switch :all,
|
51
|
+
long: "all",
|
52
|
+
description: "Run command on all servers"
|
53
|
+
|
54
|
+
switch :app_servers,
|
55
|
+
long: "app_servers",
|
56
|
+
description: "Run command on all application servers"
|
57
|
+
|
58
|
+
switch :db_servers,
|
59
|
+
long: "db_servers",
|
60
|
+
description: "Run command on all database servers"
|
61
|
+
|
62
|
+
switch :db_master,
|
63
|
+
long: "db_master",
|
64
|
+
description: "Run command on database master"
|
65
|
+
|
66
|
+
switch :db_slaves,
|
67
|
+
long: "db_slaves",
|
68
|
+
description: "Run command on database slaves"
|
78
69
|
|
79
|
-
|
70
|
+
switch :tty,
|
71
|
+
short: 't',
|
72
|
+
long: "tty",
|
73
|
+
description: "Allocated a tty for the command"
|
74
|
+
|
75
|
+
def handle
|
76
|
+
operator, environment = core_operator_and_environment_for(options)
|
77
|
+
abort "Unable to find matching environment".red unless environment
|
78
|
+
|
79
|
+
cmd = option(:command)
|
80
|
+
ssh_opts = []
|
81
|
+
ssh_cmd = ["ssh"]
|
82
|
+
exits = []
|
83
|
+
user = environment.username
|
84
|
+
servers = []
|
85
|
+
|
86
|
+
if option(:command)
|
87
|
+
if shell = option(:shell)
|
88
|
+
cmd = Escape.shell_command([shell,'-lc',cmd])
|
89
|
+
end
|
90
|
+
|
91
|
+
if switch_active?(:tty)
|
92
|
+
ssh_opts << "-t"
|
93
|
+
elsif cmd.match(/sudo/)
|
94
|
+
puts "sudo commands often need a tty to run correctly. Use -t option to spawn a tty.".yellow
|
95
|
+
end
|
96
|
+
|
97
|
+
servers += Ey::Core::Cli::Helpers::ServerSieve.filter(
|
98
|
+
environment.servers,
|
99
|
+
all: switch_active?(:all),
|
100
|
+
app_servers: switch_active?(:app_servers),
|
101
|
+
db_servers: switch_active?(:db_servers),
|
102
|
+
db_master: switch_active?(:db_master),
|
103
|
+
utilities: option(:utilities)
|
104
|
+
)
|
105
|
+
else
|
106
|
+
if option(:bind_address)
|
107
|
+
ssh_opts += ["-L", option(:bind_address)]
|
108
|
+
end
|
109
|
+
|
110
|
+
if option(:server)
|
111
|
+
servers += [core_server_for(server: option[:server], operator: environment)]
|
112
|
+
else
|
113
|
+
servers += (environment.servers.all(role: "app_master") + environment.servers.all(role: "solo")).to_a
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
if servers.empty?
|
118
|
+
abort "Unable to find any matching servers. Aborting.".red
|
119
|
+
end
|
120
|
+
|
121
|
+
servers.uniq!
|
122
|
+
|
123
|
+
servers.each do |server|
|
124
|
+
host = server.public_hostname
|
125
|
+
name = server.name ? "#{server.role} (#{server.name})" : server.role
|
126
|
+
puts "\nConnecting to #{name} #{host}".green
|
127
|
+
sshcmd = Escape.shell_command((ssh_cmd + ["#{user}@#{host}"] + [cmd]).compact)
|
128
|
+
puts "Running command: #{sshcmd}".green
|
129
|
+
system sshcmd
|
130
|
+
exits << $?.exitstatus
|
131
|
+
end
|
132
|
+
|
133
|
+
exit exits.detect {|status| status != 0 } || 0
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
80
137
|
end
|
81
138
|
end
|