opsup 0.0.1 → 0.0.2
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/lib/opsup.rb +3 -0
- data/lib/opsup/app.rb +19 -8
- data/lib/opsup/cli.rb +12 -4
- data/lib/opsup/config.rb +32 -7
- data/lib/opsup/error.rb +1 -0
- data/lib/opsup/logger.rb +6 -0
- data/lib/opsup/stack_operator.rb +37 -5
- data/lib/opsup/version.rb +2 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0698811d56d95cb68cd1e4bc1575bacaff650c46ed2e22e4ccb84a5d2196a769'
|
4
|
+
data.tar.gz: 4e65ac9d6515e35a4c5f71ed72bacda9bb17c7b188b3dd0412a76344bc4403bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6453421cf1c5ef732f00e21c243eb8f324ca8e486564663166fa5a892402ec041cecf1b7f160bc3e207da5c4d64267fa6d3232d7012e8020b008f6a8eb8ec2a7
|
7
|
+
data.tar.gz: 76af537846ec040151228949946efdd8e3b5c93dff6dee1eedaa127d01a5e8919a8ca45c2aaa62b4f27939a157313afc7be23b37348e41d1b42990dbec939cea
|
data/lib/opsup.rb
CHANGED
data/lib/opsup/app.rb
CHANGED
@@ -1,32 +1,40 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'aws-sdk-opsworks'
|
4
5
|
|
5
6
|
module Opsup
|
6
7
|
class App
|
7
|
-
|
8
|
+
extend T::Sig
|
8
9
|
|
10
|
+
sig { returns(Opsup::App) }
|
9
11
|
def self.create
|
10
12
|
new(
|
11
13
|
logger: Opsup::Logger.instance,
|
12
14
|
)
|
13
15
|
end
|
14
16
|
|
17
|
+
sig { params(logger: ::Logger).void }
|
15
18
|
def initialize(logger:)
|
16
|
-
@logger = logger
|
19
|
+
@logger = T.let(logger, ::Logger)
|
17
20
|
end
|
18
21
|
|
19
|
-
AVAILABLE_COMMANDS =
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
AVAILABLE_COMMANDS = T.let(
|
23
|
+
%w[
|
24
|
+
update_cookbooks
|
25
|
+
setup
|
26
|
+
configure
|
27
|
+
deploy
|
28
|
+
].freeze,
|
29
|
+
T::Array[String],
|
30
|
+
)
|
25
31
|
|
32
|
+
sig { returns(T::Array[String]) }
|
26
33
|
def available_commands
|
27
34
|
AVAILABLE_COMMANDS
|
28
35
|
end
|
29
36
|
|
37
|
+
sig { params(commands: T::Array[String], config: Opsup::Config).void }
|
30
38
|
def run(commands, config)
|
31
39
|
validate_commands(commands)
|
32
40
|
@logger.warn('Started in DRYRUN MODE') if config.dryrun
|
@@ -46,6 +54,7 @@ module Opsup
|
|
46
54
|
@logger.warn('Finished in DRYRUN MODE') if config.dryrun
|
47
55
|
end
|
48
56
|
|
57
|
+
sig { params(commands: T::Array[String]).void }
|
49
58
|
private def validate_commands(commands)
|
50
59
|
raise Opsup::Error, 'No commands specified' if commands.empty?
|
51
60
|
|
@@ -53,12 +62,14 @@ module Opsup
|
|
53
62
|
raise Opsup::Error, "Unknown commands: #{unknown_cmds.join(' ')}" unless unknown_cmds.empty?
|
54
63
|
end
|
55
64
|
|
65
|
+
sig { params(config: Opsup::Config).returns(Aws::OpsWorks::Client) }
|
56
66
|
private def new_opsworks_client(config)
|
57
67
|
creds = Aws::Credentials.new(config.aws_access_key_id, config.aws_secret_access_key)
|
58
68
|
Aws::OpsWorks::Client.new(region: config.opsworks_region, credentials: creds)
|
59
69
|
end
|
60
70
|
|
61
71
|
# Assumes the command is a valid value.
|
72
|
+
sig { params(command: String).returns(String) }
|
62
73
|
private def command_to_opsworks_command(command)
|
63
74
|
command == 'update_cookbooks' ? 'update_custom_cookbooks' : command
|
64
75
|
end
|
data/lib/opsup/cli.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'optparse'
|
4
5
|
|
5
6
|
module Opsup
|
6
7
|
class CLI
|
7
|
-
|
8
|
+
extend T::Sig
|
8
9
|
|
10
|
+
sig { returns(Opsup::CLI) }
|
9
11
|
def self.create
|
10
12
|
new(
|
11
13
|
app: Opsup::App.create,
|
@@ -13,11 +15,13 @@ module Opsup
|
|
13
15
|
)
|
14
16
|
end
|
15
17
|
|
18
|
+
sig { params(app: Opsup::App, option_builder: Opsup::CLI::OptionBuilder).void }
|
16
19
|
def initialize(app:, option_builder:)
|
17
|
-
@app = app
|
18
|
-
@option_builder = option_builder
|
20
|
+
@app = T.let(app, Opsup::App)
|
21
|
+
@option_builder = T.let(option_builder, Opsup::CLI::OptionBuilder)
|
19
22
|
end
|
20
23
|
|
24
|
+
sig { params(argv: T::Array[String]).returns(T::Boolean) }
|
21
25
|
def run(argv)
|
22
26
|
parser = create_parser
|
23
27
|
@option_builder.define_options(parser)
|
@@ -42,6 +46,7 @@ module Opsup
|
|
42
46
|
true
|
43
47
|
end
|
44
48
|
|
49
|
+
sig { returns(OptionParser) }
|
45
50
|
private def create_parser
|
46
51
|
# ref: https://docs.ruby-lang.org/en/2.1.0/OptionParser.html
|
47
52
|
OptionParser.new do |p|
|
@@ -61,14 +66,16 @@ module Opsup
|
|
61
66
|
end
|
62
67
|
|
63
68
|
class OptionBuilder
|
64
|
-
|
69
|
+
extend T::Sig
|
65
70
|
|
71
|
+
sig { returns(Opsup::CLI::OptionBuilder) }
|
66
72
|
def self.create
|
67
73
|
new
|
68
74
|
end
|
69
75
|
|
70
76
|
DEFAULT_OPSWORKS_REGION = 'ap-northeast-1'
|
71
77
|
|
78
|
+
sig { params(parser: OptionParser).returns(OptionParser) }
|
72
79
|
def define_options(parser)
|
73
80
|
parser.tap do |p|
|
74
81
|
p.on('-s', '--stack STACK_NAME', 'target stack name')
|
@@ -79,6 +86,7 @@ module Opsup
|
|
79
86
|
end
|
80
87
|
end
|
81
88
|
|
89
|
+
sig { params(options: T::Hash[Symbol, T.untyped]).returns(Opsup::Config) }
|
82
90
|
def generate_config(options)
|
83
91
|
%w[stack aws-cred].each do |key|
|
84
92
|
raise Opsup::Error, "missing required option: --#{key}" unless options[key.to_sym]
|
data/lib/opsup/config.rb
CHANGED
@@ -1,16 +1,40 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Opsup
|
4
5
|
class Config
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
sig { returns(String) }
|
5
9
|
attr_reader :stack_name
|
10
|
+
|
11
|
+
sig { returns(String) }
|
6
12
|
attr_reader :aws_access_key_id
|
13
|
+
|
14
|
+
sig { returns(String) }
|
7
15
|
attr_reader :aws_secret_access_key
|
16
|
+
|
17
|
+
sig { returns(String) }
|
8
18
|
attr_reader :opsworks_region
|
19
|
+
|
20
|
+
sig { returns(Symbol) }
|
9
21
|
attr_reader :running_mode
|
22
|
+
|
23
|
+
sig { returns(T::Boolean) }
|
10
24
|
attr_reader :dryrun
|
11
25
|
|
12
|
-
MODES = %i[parallel serial one_then_all].freeze
|
26
|
+
MODES = T.let(%i[parallel serial one_then_all].freeze, T::Array[Symbol])
|
13
27
|
|
28
|
+
sig do
|
29
|
+
params(
|
30
|
+
stack_name: String,
|
31
|
+
aws_access_key_id: String,
|
32
|
+
aws_secret_access_key: String,
|
33
|
+
opsworks_region: String,
|
34
|
+
running_mode: T.nilable(Symbol),
|
35
|
+
dryrun: T::Boolean,
|
36
|
+
).void
|
37
|
+
end
|
14
38
|
def initialize(
|
15
39
|
stack_name:,
|
16
40
|
aws_access_key_id:,
|
@@ -19,14 +43,15 @@ module Opsup
|
|
19
43
|
running_mode: nil,
|
20
44
|
dryrun: false
|
21
45
|
)
|
22
|
-
@stack_name = stack_name
|
23
|
-
@aws_access_key_id = aws_access_key_id
|
24
|
-
@aws_secret_access_key = aws_secret_access_key
|
25
|
-
@opsworks_region = opsworks_region
|
26
|
-
@running_mode = running_mode || MODES
|
27
|
-
@dryrun = dryrun
|
46
|
+
@stack_name = T.let(stack_name, String)
|
47
|
+
@aws_access_key_id = T.let(aws_access_key_id, String)
|
48
|
+
@aws_secret_access_key = T.let(aws_secret_access_key, String)
|
49
|
+
@opsworks_region = T.let(opsworks_region, String)
|
50
|
+
@running_mode = T.let(running_mode || MODES.fetch(0), Symbol)
|
51
|
+
@dryrun = T.let(dryrun, T::Boolean)
|
28
52
|
end
|
29
53
|
|
54
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
30
55
|
def to_h
|
31
56
|
{
|
32
57
|
stack_name: stack_name,
|
data/lib/opsup/error.rb
CHANGED
data/lib/opsup/logger.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'logger'
|
4
5
|
|
5
6
|
module Opsup
|
6
7
|
class Logger
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
@instance = T.let(nil, T.nilable(::Logger))
|
11
|
+
|
12
|
+
sig { returns(::Logger) }
|
7
13
|
def self.instance
|
8
14
|
env_log_level = ENV['OPSUP_LOG_LEVEL']
|
9
15
|
log_level =
|
data/lib/opsup/stack_operator.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Opsup
|
4
5
|
class StackOperator
|
5
|
-
|
6
|
+
extend T::Sig
|
6
7
|
|
8
|
+
sig { params(opsworks: Aws::OpsWorks::Client).returns(Opsup::StackOperator) }
|
7
9
|
def self.create(opsworks:)
|
8
10
|
new(
|
9
11
|
opsworks: opsworks,
|
@@ -11,11 +13,20 @@ module Opsup
|
|
11
13
|
)
|
12
14
|
end
|
13
15
|
|
16
|
+
sig { params(opsworks: Aws::OpsWorks::Client, logger: ::Logger).void }
|
14
17
|
def initialize(opsworks:, logger:)
|
15
|
-
@opsworks = opsworks
|
16
|
-
@logger = logger
|
18
|
+
@opsworks = T.let(opsworks, Aws::OpsWorks::Client)
|
19
|
+
@logger = T.let(logger, ::Logger)
|
17
20
|
end
|
18
21
|
|
22
|
+
sig do
|
23
|
+
params(
|
24
|
+
commands: T::Array[String],
|
25
|
+
stack_name: String,
|
26
|
+
mode: Symbol,
|
27
|
+
dryrun: T::Boolean,
|
28
|
+
).void
|
29
|
+
end
|
19
30
|
def run_commands(commands, stack_name:, mode:, dryrun: false)
|
20
31
|
# Find the target stack.
|
21
32
|
@logger.debug('Verifying the specified stack exists...')
|
@@ -32,6 +43,9 @@ module Opsup
|
|
32
43
|
@logger.debug('Finding all working instances in the stack...')
|
33
44
|
instances = @opsworks.describe_instances(stack_id: stack.stack_id).instances
|
34
45
|
instances = instances.reject { |inst| inst.status == 'stopped' }
|
46
|
+
|
47
|
+
raise Opsup::Error, 'No available instances found' if instances.empty?
|
48
|
+
|
35
49
|
@logger.debug(
|
36
50
|
"#{instances.size} #{instances.size == 1 ? 'instance is' : 'instances are'} found",
|
37
51
|
)
|
@@ -54,6 +68,16 @@ module Opsup
|
|
54
68
|
end
|
55
69
|
end
|
56
70
|
|
71
|
+
sig do
|
72
|
+
params(
|
73
|
+
command: String,
|
74
|
+
dryrun: T::Boolean,
|
75
|
+
mode: Symbol,
|
76
|
+
stack: Aws::OpsWorks::Types::Stack,
|
77
|
+
app: Aws::OpsWorks::Types::App,
|
78
|
+
instance_ids: T::Array[String],
|
79
|
+
).void
|
80
|
+
end
|
57
81
|
private def run_command(command, dryrun:, mode:, stack:, app:, instance_ids:)
|
58
82
|
case mode
|
59
83
|
when :parallel
|
@@ -66,9 +90,9 @@ module Opsup
|
|
66
90
|
end
|
67
91
|
when :one_then_all
|
68
92
|
@logger.info("Creating deployment for the first instance (#{instance_ids[0]})...")
|
69
|
-
create_deployment(command, stack, app, [instance_ids[0]]) unless dryrun
|
93
|
+
create_deployment(command, stack, app, [T.must(instance_ids[0])]) unless dryrun
|
70
94
|
|
71
|
-
rest = instance_ids[1..-1]
|
95
|
+
rest = T.must(instance_ids[1..-1])
|
72
96
|
if !rest.empty?
|
73
97
|
@logger.info("Creating deployment for the other #{rest.size} instances...")
|
74
98
|
create_deployment(command, stack, app, rest) unless dryrun
|
@@ -80,6 +104,14 @@ module Opsup
|
|
80
104
|
end
|
81
105
|
end
|
82
106
|
|
107
|
+
sig do
|
108
|
+
params(
|
109
|
+
command: String,
|
110
|
+
stack: Aws::OpsWorks::Types::Stack,
|
111
|
+
app: Aws::OpsWorks::Types::App,
|
112
|
+
instance_ids: T::Array[String],
|
113
|
+
).void
|
114
|
+
end
|
83
115
|
private def create_deployment(command, stack, app, instance_ids)
|
84
116
|
res = @opsworks.create_deployment(
|
85
117
|
stack_id: stack.stack_id,
|
data/lib/opsup/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opsup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ryym
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-opsworks
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.71'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sorbet
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.4'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.4'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sorbet-runtime
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.4'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.4'
|
41
69
|
description:
|
42
70
|
email:
|
43
71
|
- ryym.64@gmail.com
|