hako 2.3.0 → 2.3.1

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: d76103b970308d4f028189a3ec7bade0959330f3f8540ecd5a8df40a2263c753
4
- data.tar.gz: 1dee2f57732bc15d5125e8baf5edb88202db0cbfa3308051bec4acdb29a10966
3
+ metadata.gz: 126110ac130316221e7ac640144170031d9efceb2cf81f89c1c22525d2be6275
4
+ data.tar.gz: dd1934716a185d3e653b6d0343424b72a3afd62207ad566568b7ea19218d997d
5
5
  SHA512:
6
- metadata.gz: 876336df0208426be1f00e8f6a0097eddaf59508c8149c24533de70d3a22444393b5f9d42b5fc9537c3a0f41b96d2ed6e4101722a06a69f0f75a334e281fd0b9
7
- data.tar.gz: fd9debc540cebf63304917b64c87a51a7579216998ecd5ff2098353a48edf1f9459c82f1c6df8aba69757f656b452fe648a97631c6c77aa3f057a56856acf403
6
+ metadata.gz: ce6f9bba7385b6cdba908d70e268a299e24db76a63276cc96ae774f7d699ac830acce6224eaabf08caae2dc7d50d7df9a76b2dbcb206438e3920b97d6f84a182
7
+ data.tar.gz: 6954189052e21677c5cda4dab43b438b88287ae6975160a82bdd8c7350d2a3eb5630411f6e798a756cb9f53bd46b91ade81e04cd9e7e5eabcb81034972183bb2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 2.3.1 (2018-09-26)
2
+ ## Changes
3
+ - Change show-definition output from YAML to JSON
4
+ - The show-definition output is still persable as YAML
5
+
6
+ ## Bug fixes
7
+ - Set `deployment_configuration` to nil when absent
8
+
1
9
  # 2.3.0 (2018-08-30)
2
10
  ## New features
3
11
  - Support `health_check` parameter
@@ -13,12 +13,15 @@ Amazon S3 is a good storage for polling, so connecting CloudWatch Events to AWS
13
13
 
14
14
  The example implementation of AWS Lambda can be found in [../examples/put-ecs-container-status-to-s3](../examples/put-ecs-container-status-to-s3) directory.
15
15
 
16
- To enable task notification with S3, you have to configure scheduler in YAML.
16
+ To enable task notification with S3, you have to configure scheduler in definition file.
17
17
 
18
- ```yaml
19
- scheduler:
20
- type: ecs
21
- oneshot_notification_prefix: 's3://ecs-task-notifications/task_statuses?region=ap-northeast-1'
18
+ ```js
19
+ {
20
+ scheduler: {
21
+ type: 'ecs',
22
+ oneshot_notification_prefix: 's3://ecs-task-notifications/task_statuses?region=ap-northeast-1',
23
+ },
24
+ }
22
25
  ```
23
26
 
24
27
  It uses ecs-task-notifications bucket in ap-northeast-1 region.
@@ -15,8 +15,8 @@ module Hako
15
15
  # @return [Hash]
16
16
  attr_reader :id, :root_path, :definition
17
17
 
18
- def initialize(yaml_path, expand_variables: true, ask_keys: false)
19
- path = Pathname.new(yaml_path)
18
+ def initialize(definition_path, expand_variables: true, ask_keys: false)
19
+ path = Pathname.new(definition_path)
20
20
  @id = path.basename.sub_ext('').to_s
21
21
  @root_path = path.parent
22
22
  @definition =
data/lib/hako/cli.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'hako'
4
+ require 'json'
4
5
  require 'optparse'
5
6
  require 'pathname'
6
7
 
@@ -72,7 +73,7 @@ module Hako
72
73
  else
73
74
  {}
74
75
  end
75
- Commander.new(Application.new(@yaml_path, options)).deploy(force: @force, tag: @tag, dry_run: @dry_run, timeout: @timeout)
76
+ Commander.new(Application.new(@definition_path, options)).deploy(force: @force, tag: @tag, dry_run: @dry_run, timeout: @timeout)
76
77
  end
77
78
 
78
79
  DEFAULT_TIMEOUT = 1200 # 20 minutes
@@ -84,9 +85,9 @@ module Hako
84
85
  @verbose = false
85
86
  @timeout = DEFAULT_TIMEOUT
86
87
  parser.parse!(argv)
87
- @yaml_path = argv.first
88
+ @definition_path = argv.first
88
89
 
89
- if @yaml_path.nil?
90
+ if @definition_path.nil?
90
91
  puts parser.help
91
92
  exit 1
92
93
  end
@@ -121,16 +122,16 @@ module Hako
121
122
  else
122
123
  {}
123
124
  end
124
- Commander.new(Application.new(@yaml_path, options)).rollback(dry_run: @dry_run)
125
+ Commander.new(Application.new(@definition_path, options)).rollback(dry_run: @dry_run)
125
126
  end
126
127
 
127
128
  def parse!(argv)
128
129
  @dry_run = false
129
130
  @verbose = false
130
131
  parser.parse!(argv)
131
- @yaml_path = argv.first
132
+ @definition_path = argv.first
132
133
 
133
- if @yaml_path.nil?
134
+ if @definition_path.nil?
134
135
  puts parser.help
135
136
  exit 1
136
137
  end
@@ -162,7 +163,7 @@ module Hako
162
163
  else
163
164
  {}
164
165
  end
165
- Commander.new(Application.new(@yaml_path, options)).oneshot(@argv, tag: @tag, containers: @containers, env: @env, dry_run: @dry_run, no_wait: @no_wait)
166
+ Commander.new(Application.new(@definition_path, options)).oneshot(@argv, tag: @tag, containers: @containers, env: @env, dry_run: @dry_run, no_wait: @no_wait)
166
167
  end
167
168
 
168
169
  def parse!(argv)
@@ -173,10 +174,10 @@ module Hako
173
174
  @verbose = false
174
175
  @no_wait = false
175
176
  parser.parse!(argv)
176
- @yaml_path = argv.shift
177
+ @definition_path = argv.shift
177
178
  @argv = argv
178
179
 
179
- if @yaml_path.nil? || @argv.empty?
180
+ if @definition_path.nil? || @argv.empty?
180
181
  puts parser.help
181
182
  exit 1
182
183
  end
@@ -204,7 +205,7 @@ module Hako
204
205
  parse!(argv)
205
206
  require 'hako/application'
206
207
  app = Application.new(@path, expand_variables: @expand_variables)
207
- puts app.definition.to_yaml
208
+ puts JSON.pretty_generate(app.definition)
208
209
  end
209
210
 
210
211
  def parse!(argv)
@@ -231,14 +232,14 @@ module Hako
231
232
  parse!(argv)
232
233
  require 'hako/application'
233
234
  require 'hako/commander'
234
- Commander.new(Application.new(@yaml_path, expand_variables: false)).status
235
+ Commander.new(Application.new(@definition_path, expand_variables: false)).status
235
236
  end
236
237
 
237
238
  def parse!(argv)
238
239
  parser.parse!(argv)
239
- @yaml_path = argv.first
240
+ @definition_path = argv.first
240
241
 
241
- if @yaml_path.nil?
242
+ if @definition_path.nil?
242
243
  puts parser.help
243
244
  exit 1
244
245
  end
@@ -258,15 +259,15 @@ module Hako
258
259
  require 'hako/application'
259
260
  require 'hako/commander'
260
261
 
261
- Commander.new(Application.new(@yaml_path, expand_variables: false)).remove(dry_run: @dry_run)
262
+ Commander.new(Application.new(@definition_path, expand_variables: false)).remove(dry_run: @dry_run)
262
263
  end
263
264
 
264
265
  def parse!(argv)
265
266
  @dry_run = false
266
267
  parser.parse!(argv)
267
- @yaml_path = argv.first
268
+ @definition_path = argv.first
268
269
 
269
- if @yaml_path.nil?
270
+ if @definition_path.nil?
270
271
  puts parser.help
271
272
  exit 1
272
273
  end
@@ -287,15 +288,15 @@ module Hako
287
288
  require 'hako/application'
288
289
  require 'hako/commander'
289
290
 
290
- Commander.new(Application.new(@yaml_path, expand_variables: false)).stop(dry_run: @dry_run)
291
+ Commander.new(Application.new(@definition_path, expand_variables: false)).stop(dry_run: @dry_run)
291
292
  end
292
293
 
293
294
  def parse!(argv)
294
295
  @dry_run = false
295
296
  parser.parse!(argv)
296
- @yaml_path = argv.first
297
+ @definition_path = argv.first
297
298
 
298
- if @yaml_path.nil?
299
+ if @definition_path.nil?
299
300
  puts parser.help
300
301
  exit 1
301
302
  end
@@ -118,21 +118,21 @@ module Hako
118
118
  DefinitionLoader.new(@app, dry_run: dry_run).load(tag, with: with)
119
119
  end
120
120
 
121
- # @param [Hash] yaml
121
+ # @param [Hash] scheduler_definition
122
122
  # @param [Hash] volumes
123
123
  # @param [Boolean] force
124
124
  # @param [Boolean] dry_run
125
125
  # @param [Integer] timeout
126
126
  # @return [Scheduler]
127
- def load_scheduler(yaml, scripts, volumes: {}, force: false, dry_run:, timeout: nil)
128
- Loader.new(Hako::Schedulers, 'hako/schedulers').load(yaml.fetch('type')).new(@app.id, yaml, volumes: volumes, scripts: scripts, force: force, dry_run: dry_run, timeout: timeout)
127
+ def load_scheduler(scheduler_definition, scripts, volumes: {}, force: false, dry_run:, timeout: nil)
128
+ Loader.new(Hako::Schedulers, 'hako/schedulers').load(scheduler_definition.fetch('type')).new(@app.id, scheduler_definition, volumes: volumes, scripts: scripts, force: force, dry_run: dry_run, timeout: timeout)
129
129
  end
130
130
 
131
- # @param [Hash] yaml
131
+ # @param [Hash] script_definition
132
132
  # @param [Boolean] dry_run
133
133
  # @return [Script]
134
- def load_script(yaml, dry_run:)
135
- Loader.new(Hako::Scripts, 'hako/scripts').load(yaml.fetch('type')).new(@app, yaml, dry_run: dry_run)
134
+ def load_script(script_definition, dry_run:)
135
+ Loader.new(Hako::Scripts, 'hako/scripts').load(script_definition.fetch('type')).new(@app, script_definition, dry_run: dry_run)
136
136
  end
137
137
  end
138
138
  end
@@ -195,8 +195,8 @@ module Hako
195
195
  # @param [Array<Hash>] provider_configs
196
196
  # @return [Array<EnvProvider>]
197
197
  def load_providers(provider_configs)
198
- provider_configs.map do |yaml|
199
- Loader.new(Hako::EnvProviders, 'hako/env_providers').load(yaml.fetch('type')).new(@app.root_path, yaml)
198
+ provider_configs.map do |provider_config|
199
+ Loader.new(Hako::EnvProviders, 'hako/env_providers').load(provider_config.fetch('type')).new(@app.root_path, provider_config)
200
200
  end
201
201
  end
202
202
 
@@ -36,6 +36,7 @@ module Hako
36
36
  if variables.empty?
37
37
  break
38
38
  end
39
+
39
40
  provider.ask(variables.to_a).each do |var, val|
40
41
  values[var] = val
41
42
  variables.delete(var)
@@ -69,6 +70,7 @@ module Hako
69
70
  if variables.empty?
70
71
  break
71
72
  end
73
+
72
74
  if provider.can_ask_keys?
73
75
  provider.ask_keys(variables.to_a).each do |var|
74
76
  variables.delete(var)
@@ -81,6 +83,7 @@ module Hako
81
83
  unless variables.empty?
82
84
  raise ExpansionError.new("Could not find embedded variables from $providers=#{@providers}: #{variables.to_a}")
83
85
  end
86
+
84
87
  true
85
88
  end
86
89
 
@@ -94,6 +97,7 @@ module Hako
94
97
  unless val.is_a?(String)
95
98
  raise ExpansionError.new("#{key} must be a String but got #{val.class}: #{val.inspect}")
96
99
  end
100
+
97
101
  parsed_env[key] = parse(val)
98
102
  end
99
103
  parsed_env
@@ -116,6 +120,7 @@ module Hako
116
120
  else
117
121
  tokens << Variable.new(var)
118
122
  end
123
+
119
124
  pos = s.pos
120
125
  end
121
126
  unless s.rest.empty?
@@ -57,6 +57,7 @@ module Hako
57
57
  # line comment
58
58
  next
59
59
  end
60
+
60
61
  key, val = line.split('=', 2)
61
62
  if val
62
63
  block.call(key, val)
@@ -54,9 +54,13 @@ module Hako
54
54
  validation_error!('autoscaling_group_for_oneshot must be set when autoscaling_topic_for_oneshot is set')
55
55
  end
56
56
  @oneshot_notification_prefix = options.fetch('oneshot_notification_prefix', nil)
57
- @deployment_configuration = {}
58
- %i[maximum_percent minimum_healthy_percent].each do |key|
59
- @deployment_configuration[key] = options.dig('deployment_configuration', key.to_s)
57
+ if options.key?('deployment_configuration')
58
+ @deployment_configuration = {}
59
+ %i[maximum_percent minimum_healthy_percent].each do |key|
60
+ @deployment_configuration[key] = options.fetch('deployment_configuration')[key.to_s]
61
+ end
62
+ else
63
+ @deployment_configuration = nil
60
64
  end
61
65
  @placement_constraints = options.fetch('placement_constraints', [])
62
66
  @placement_strategy = options.fetch('placement_strategy', [])
@@ -358,6 +362,7 @@ module Hako
358
362
  if @dry_run
359
363
  return DEFAULT_FRONT_PORT
360
364
  end
365
+
361
366
  service = describe_service
362
367
  if service
363
368
  find_front_port(service)
@@ -412,6 +417,7 @@ module Hako
412
417
  # Initial deployment
413
418
  return true
414
419
  end
420
+
415
421
  actual_volume_definitions = {}
416
422
  actual_definition.volumes.each do |v|
417
423
  actual_volume_definitions[v.name] = v
@@ -628,6 +634,7 @@ module Hako
628
634
  if result.tasks.empty?
629
635
  raise NoTasksStarted.new('No tasks started')
630
636
  end
637
+
631
638
  result.tasks[0]
632
639
  rescue Aws::ECS::Errors::InvalidParameterException => e
633
640
  if e.message == 'No Container Instances were found in your cluster.' && on_no_tasks_started(task_definition)
@@ -874,6 +881,7 @@ module Hako
874
881
  if e.id == latest_event_id
875
882
  break
876
883
  end
884
+
877
885
  Hako.logger.info "#{e.created_at}: #{e.message}"
878
886
  task_id = extract_task_id(e.message)
879
887
  if task_id && e.message.include?(' has started ')
@@ -1114,6 +1122,7 @@ module Hako
1114
1122
  source_volume = mount_point.fetch(:source_volume)
1115
1123
  v = volumes_definition.find { |d| d[:name] == source_volume }
1116
1124
  raise "Could not find volume #{source_volume}" unless v
1125
+
1117
1126
  source = v.dig(:host, :source_path) || source_volume
1118
1127
  cmd << '--volume' << "#{source}:#{mount_point.fetch(:container_path)}#{mount_point[:read_only] ? ':ro' : ''}"
1119
1128
  end
@@ -1171,7 +1180,7 @@ module Hako
1171
1180
  definition.fetch(:environment).each do |env|
1172
1181
  name = env.fetch(:name)
1173
1182
  value = env.fetch(:value)
1174
- # additional_env (given in command line) has priority over env (declared in YAML)
1183
+ # additional_env (given in command line) has priority over env (declared in definition file)
1175
1184
  unless additional_env.key?(name)
1176
1185
  cmd << '--env' << "#{name}=#{value}"
1177
1186
  cmd << "\\\n "
@@ -80,10 +80,12 @@ module Hako
80
80
  if service.load_balancers.empty? || service.load_balancers[0].target_group_arn.nil?
81
81
  raise Error.new('Target group must be attached to the ECS service for predefined metric type ALBRequestCountPerTarget')
82
82
  end
83
+
83
84
  resource_label = target_group_resource_label
84
85
  unless resource_label.start_with?('app/')
85
86
  raise Error.new("Load balancer type must be 'application' for predefined metric type ALBRequestCountPerTarget")
86
87
  end
88
+
87
89
  predefined_metric_specification[:resource_label] = resource_label
88
90
  end
89
91
  policy_params[:target_tracking_scaling_policy_configuration] = {
@@ -208,6 +208,7 @@ module Hako
208
208
  unless deleted
209
209
  raise Error.new("Cannot delete target group #{target_group.target_group_arn}")
210
210
  end
211
+
211
212
  Hako.logger.info "Deleted target group #{target_group.target_group_arn}"
212
213
  end
213
214
  end
@@ -11,6 +11,7 @@ module Hako
11
11
  unless object.is_a?(::Hash)
12
12
  return false
13
13
  end
14
+
14
15
  @members.each do |key, val_schema|
15
16
  unless val_schema.valid?(object[key])
16
17
  return false
data/lib/hako/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hako
4
- VERSION = '2.3.0'
4
+ VERSION = '2.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hako
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kohei Suzuki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-30 00:00:00.000000000 Z
11
+ date: 2018-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-applicationautoscaling