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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6cc178acdd70bf25302010af889f45a52d95d2f1f1fa841ab7f6534cb98d024a
4
- data.tar.gz: 3a063657be7b128f9b4dc47e0c91d4f42a0e0dce978e71d4f89fee9c94f22ca3
3
+ metadata.gz: '0698811d56d95cb68cd1e4bc1575bacaff650c46ed2e22e4ccb84a5d2196a769'
4
+ data.tar.gz: 4e65ac9d6515e35a4c5f71ed72bacda9bb17c7b188b3dd0412a76344bc4403bc
5
5
  SHA512:
6
- metadata.gz: b29e1e1e7842bda942d3ff0c0921b09f47a69aab108f34481e73e7bf520d87820a36d02bc9c6c49e793bb0e16d4fab7688f1281e5e15b39a7b79c627abd6ed63
7
- data.tar.gz: 70231d0c02c3e1fd9c135bceae0e41e39cc601bc03e8875e6c50f6c3be88c6c572fbcb37714a05520f75d6269270a8e1cb3b5b3e7be4e73b2a7ef5b4a02b6ab0
6
+ metadata.gz: 6453421cf1c5ef732f00e21c243eb8f324ca8e486564663166fa5a892402ec041cecf1b7f160bc3e207da5c4d64267fa6d3232d7012e8020b008f6a8eb8ec2a7
7
+ data.tar.gz: 76af537846ec040151228949946efdd8e3b5c93dff6dee1eedaa127d01a5e8919a8ca45c2aaa62b4f27939a157313afc7be23b37348e41d1b42990dbec939cea
@@ -1,5 +1,8 @@
1
+ # typed: strong
1
2
  # frozen_string_literal: true
2
3
 
4
+ require 'sorbet-runtime'
5
+
3
6
  require_relative 'opsup/version'
4
7
  require_relative 'opsup/error'
5
8
  require_relative 'opsup/config'
@@ -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
- private_class_method :new
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 = %w[
20
- update_cookbooks
21
- setup
22
- configure
23
- deploy
24
- ].freeze
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
@@ -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
- private_class_method :new
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
- private_class_method :new
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]
@@ -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[0]
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,
@@ -1,3 +1,4 @@
1
+ # typed: strong
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Opsup
@@ -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 =
@@ -1,9 +1,11 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Opsup
4
5
  class StackOperator
5
- private_class_method :new
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,
@@ -1,5 +1,6 @@
1
+ # typed: strong
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Opsup
4
- VERSION = '0.0.1'
5
+ VERSION = '0.0.2'
5
6
  end
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.1
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-07-12 00:00:00.000000000 Z
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