opsup 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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