hako 2.12.0 → 2.15.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 +4 -4
- data/.github/workflows/ci.yml +42 -0
- data/.rubocop.yml +8 -3
- data/.rubocop_todo.yml +0 -2
- data/CHANGELOG.md +21 -2
- data/README.md +1 -1
- data/examples/hello-grpc.jsonnet +60 -0
- data/hako.gemspec +3 -4
- data/lib/hako/cli.rb +3 -3
- data/lib/hako/commander.rb +2 -2
- data/lib/hako/container.rb +9 -0
- data/lib/hako/env_providers/file.rb +1 -1
- data/lib/hako/env_providers/yaml.rb +1 -1
- data/lib/hako/schedulers/ecs.rb +83 -31
- data/lib/hako/schedulers/ecs_autoscaling.rb +1 -3
- data/lib/hako/schedulers/ecs_definition_comparator.rb +7 -0
- data/lib/hako/schedulers/ecs_elb_v2.rb +9 -0
- data/lib/hako/schedulers/ecs_service_comparator.rb +10 -1
- data/lib/hako/scripts/nginx_front.rb +1 -1
- data/lib/hako/version.rb +1 -1
- metadata +13 -26
- data/.travis.yml +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c14a60c35c89be5465d9844da304c8dad15dce069edf54ccbba7f47376dc536
|
4
|
+
data.tar.gz: c9714116d65bc4d3746cbc968a0bd0315cd3677d3e5042e0937e4cfd29a48620
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12f663b6e4c17872e8d117f0a5fb4049b786e4af0e76ac7ff0b0d9bcb490299da15c0bc24a86a8a16a7d286585e9b428b68eba6121ed0212d353027db049cbe9
|
7
|
+
data.tar.gz: ee0bc9a4692583f332ac08060088f3e5374fd2297d6c54b9208ec529a813413ee11f3847788b32aa43f5c1d7b40814889de86b9290c4000707060ea51a68e8cb
|
@@ -0,0 +1,42 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
pull_request:
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
rspec:
|
10
|
+
name: RSpec
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
continue-on-error: ${{ matrix.experimental }}
|
13
|
+
strategy:
|
14
|
+
fail-fast: false
|
15
|
+
matrix:
|
16
|
+
ruby:
|
17
|
+
- 2.5
|
18
|
+
- 2.6
|
19
|
+
- 2.7
|
20
|
+
- 3.0
|
21
|
+
experimental: [false]
|
22
|
+
include:
|
23
|
+
- ruby: head
|
24
|
+
experimental: true
|
25
|
+
steps:
|
26
|
+
- uses: actions/checkout@v2
|
27
|
+
- uses: ruby/setup-ruby@v1
|
28
|
+
with:
|
29
|
+
ruby-version: ${{ matrix.ruby }}
|
30
|
+
bundler-cache: true
|
31
|
+
- run: bundle exec rspec
|
32
|
+
rubocop:
|
33
|
+
name: RuboCop
|
34
|
+
runs-on: ubuntu-latest
|
35
|
+
steps:
|
36
|
+
- uses: actions/checkout@v2
|
37
|
+
- uses: ruby/setup-ruby@v1
|
38
|
+
with:
|
39
|
+
# Use the same version with .rubocop.yml
|
40
|
+
ruby-version: 2.5
|
41
|
+
bundler-cache: true
|
42
|
+
- run: bundle exec rubocop
|
data/.rubocop.yml
CHANGED
@@ -2,14 +2,17 @@ inherit_from: .rubocop_todo.yml
|
|
2
2
|
|
3
3
|
AllCops:
|
4
4
|
DisplayCopNames: true
|
5
|
-
TargetRubyVersion: 2.
|
5
|
+
TargetRubyVersion: 2.5
|
6
|
+
NewCops: disable
|
6
7
|
|
7
|
-
Layout/
|
8
|
+
Layout/FirstArgumentIndentation:
|
9
|
+
Enabled: false
|
10
|
+
Layout/LineLength:
|
8
11
|
Enabled: false
|
9
12
|
|
10
13
|
Naming/PredicateName:
|
11
14
|
Enabled: false
|
12
|
-
Naming/
|
15
|
+
Naming/MethodParameterName:
|
13
16
|
Enabled: false
|
14
17
|
Naming/MemoizedInstanceVariableName:
|
15
18
|
Enabled: false
|
@@ -35,6 +38,8 @@ Style/RaiseArgs:
|
|
35
38
|
EnforcedStyle: compact
|
36
39
|
Style/SignalException:
|
37
40
|
Enabled: false
|
41
|
+
Style/SoleNestedConditional:
|
42
|
+
Enabled: false
|
38
43
|
Style/StderrPuts:
|
39
44
|
Enabled: false
|
40
45
|
Style/TrailingCommaInArguments:
|
data/.rubocop_todo.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
# 2.15.1 (2021-08-06)
|
2
|
+
## Bug fixes
|
3
|
+
- Fix keyword arguments for Ruby 3.0
|
4
|
+
|
5
|
+
# 2.15.0 (2020-11-02)
|
6
|
+
## New features
|
7
|
+
- Support protocol_version and matcher option of ALB target groups
|
8
|
+
|
9
|
+
# 2.14.0 (2020-05-20)
|
10
|
+
## New features
|
11
|
+
- Support tags for task definition and propagate them to ECS tasks
|
12
|
+
- Now all created ECS services and launched ECS tasks have `propagate_tags=TASK_DEFINITION` parameter.
|
13
|
+
- Support repository_credentials
|
14
|
+
|
15
|
+
# 2.13.0 (2020-01-10)
|
16
|
+
## New features
|
17
|
+
- Support capacity provider strategy
|
18
|
+
|
19
|
+
## Bug fixes
|
20
|
+
- Do not try to update assign_public_ip when it is not changed
|
21
|
+
|
1
22
|
# 2.12.0 (2019-09-09)
|
2
23
|
## New features
|
3
24
|
- Support more overrides options for `hako oneshot`
|
@@ -6,8 +27,6 @@
|
|
6
27
|
## Bug fixes
|
7
28
|
- Show `--health-*` options in dry-run
|
8
29
|
|
9
|
-
## Bug fixes
|
10
|
-
|
11
30
|
# 2.11.1 (2019-05-17)
|
12
31
|
## Bug fixes
|
13
32
|
- Fix comparison of `system_controls` parameter
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Hako
|
2
2
|
[](http://badge.fury.io/rb/hako)
|
3
|
-
|
3
|
+

|
4
4
|
|
5
5
|
Deploy Docker container.
|
6
6
|
|
@@ -0,0 +1,60 @@
|
|
1
|
+
{
|
2
|
+
scheduler: {
|
3
|
+
type: 'ecs',
|
4
|
+
region: 'ap-northeast-1',
|
5
|
+
cluster: 'eagletmt',
|
6
|
+
desired_count: 2,
|
7
|
+
role: 'ecsServiceRole',
|
8
|
+
elb_v2: {
|
9
|
+
// Specify protocol_version for gRPC servers
|
10
|
+
protocol_version: 'GRPC',
|
11
|
+
// VPC id where the target group is located
|
12
|
+
vpc_id: 'vpc-WWWWWWWW',
|
13
|
+
// If you want internal ELB, then use 'scheme'. (ex. internal service that like microservice inside VPC)
|
14
|
+
scheme: 'internal',
|
15
|
+
// Health check path of the target group
|
16
|
+
health_check_path: '/AWS.ELB/healthcheck',
|
17
|
+
listeners: [
|
18
|
+
{
|
19
|
+
port: 50051,
|
20
|
+
protocol: 'HTTPS',
|
21
|
+
certificate_arn: 'arn:aws:acm:ap-northeast-1:012345678901:certificate/01234567-89ab-cdef-0123-456789abcdef',
|
22
|
+
},
|
23
|
+
],
|
24
|
+
subnets: ['subnet-XXXXXXXX', 'subnet-YYYYYYYY'],
|
25
|
+
security_groups: ['sg-ZZZZZZZZ'],
|
26
|
+
load_balancer_attributes: {
|
27
|
+
'access_logs.s3.enabled': 'true',
|
28
|
+
'access_logs.s3.bucket': 'hako-access-logs',
|
29
|
+
'access_logs.s3.prefix': 'hako-hello-grpc',
|
30
|
+
},
|
31
|
+
target_group_attributes: {
|
32
|
+
// http://docs.aws.amazon.com/en_us/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-attributes
|
33
|
+
'deregistration_delay.timeout_seconds': '20',
|
34
|
+
},
|
35
|
+
// Route ELB traffic to app container directly
|
36
|
+
container_name: 'app',
|
37
|
+
container: 50051,
|
38
|
+
},
|
39
|
+
},
|
40
|
+
app: {
|
41
|
+
image: 'awesome-grpc-server',
|
42
|
+
memory: 128,
|
43
|
+
cpu: 256,
|
44
|
+
env: {
|
45
|
+
PORT: '50051',
|
46
|
+
},
|
47
|
+
secrets: [{
|
48
|
+
name: 'MESSAGE',
|
49
|
+
value_from: 'arn:aws:ssm:ap-northeast-1:012345678901:parameter/hako/hello-grpc/secret-message',
|
50
|
+
}],
|
51
|
+
port_mappings: [
|
52
|
+
{
|
53
|
+
container_port: 50051,
|
54
|
+
host_port: 0,
|
55
|
+
protocol: 'tcp',
|
56
|
+
},
|
57
|
+
],
|
58
|
+
},
|
59
|
+
scripts: [],
|
60
|
+
}
|
data/hako.gemspec
CHANGED
@@ -19,16 +19,16 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.bindir = 'exe'
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ['lib']
|
22
|
-
spec.required_ruby_version = '>= 2.
|
22
|
+
spec.required_ruby_version = '>= 2.5.0'
|
23
23
|
|
24
24
|
spec.add_dependency 'aws-sdk-applicationautoscaling'
|
25
25
|
spec.add_dependency 'aws-sdk-autoscaling'
|
26
26
|
spec.add_dependency 'aws-sdk-cloudwatch'
|
27
27
|
spec.add_dependency 'aws-sdk-cloudwatchlogs'
|
28
28
|
spec.add_dependency 'aws-sdk-ec2'
|
29
|
-
spec.add_dependency 'aws-sdk-ecs', '>= 1.
|
29
|
+
spec.add_dependency 'aws-sdk-ecs', '>= 1.54.0'
|
30
30
|
spec.add_dependency 'aws-sdk-elasticloadbalancing'
|
31
|
-
spec.add_dependency 'aws-sdk-elasticloadbalancingv2'
|
31
|
+
spec.add_dependency 'aws-sdk-elasticloadbalancingv2', '>= 1.54.0'
|
32
32
|
spec.add_dependency 'aws-sdk-s3'
|
33
33
|
spec.add_dependency 'aws-sdk-servicediscovery'
|
34
34
|
spec.add_dependency 'aws-sdk-sns'
|
@@ -36,7 +36,6 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_dependency 'jsonnet'
|
37
37
|
|
38
38
|
spec.add_development_dependency 'bundler'
|
39
|
-
spec.add_development_dependency 'coveralls'
|
40
39
|
spec.add_development_dependency 'rake'
|
41
40
|
spec.add_development_dependency 'rspec'
|
42
41
|
spec.add_development_dependency 'rubocop', '>= 0.53.0'
|
data/lib/hako/cli.rb
CHANGED
@@ -73,7 +73,7 @@ module Hako
|
|
73
73
|
else
|
74
74
|
{}
|
75
75
|
end
|
76
|
-
Commander.new(Application.new(@definition_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)
|
77
77
|
end
|
78
78
|
|
79
79
|
DEFAULT_TIMEOUT = 1200 # 20 minutes
|
@@ -121,7 +121,7 @@ module Hako
|
|
121
121
|
else
|
122
122
|
{}
|
123
123
|
end
|
124
|
-
Commander.new(Application.new(@definition_path, options)).rollback(dry_run: @dry_run)
|
124
|
+
Commander.new(Application.new(@definition_path, **options)).rollback(dry_run: @dry_run)
|
125
125
|
end
|
126
126
|
|
127
127
|
def parse!(argv)
|
@@ -164,7 +164,7 @@ module Hako
|
|
164
164
|
else
|
165
165
|
{}
|
166
166
|
end
|
167
|
-
Commander.new(Application.new(@definition_path, options)).oneshot(@argv, tag: @tag, containers: @containers, env: @env, dry_run: @dry_run, no_wait: @no_wait, overrides: @overrides)
|
167
|
+
Commander.new(Application.new(@definition_path, **options)).oneshot(@argv, tag: @tag, containers: @containers, env: @env, dry_run: @dry_run, no_wait: @no_wait, overrides: @overrides)
|
168
168
|
end
|
169
169
|
|
170
170
|
def parse!(argv)
|
data/lib/hako/commander.rb
CHANGED
@@ -18,7 +18,7 @@ module Hako
|
|
18
18
|
# @param [String, nil] tag
|
19
19
|
# @param [Boolean] dry_run
|
20
20
|
# @return [nil]
|
21
|
-
def deploy(force: false,
|
21
|
+
def deploy(tag:, timeout:, force: false, dry_run: false)
|
22
22
|
containers = load_containers(tag, dry_run: dry_run)
|
23
23
|
scripts = @app.definition.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
|
24
24
|
volumes = @app.definition.fetch('volumes', {})
|
@@ -126,7 +126,7 @@ module Hako
|
|
126
126
|
# @param [Boolean] dry_run
|
127
127
|
# @param [Integer] timeout
|
128
128
|
# @return [Scheduler]
|
129
|
-
def load_scheduler(scheduler_definition, scripts, volumes: {}, force: false,
|
129
|
+
def load_scheduler(scheduler_definition, scripts, dry_run:, volumes: {}, force: false, timeout: nil)
|
130
130
|
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)
|
131
131
|
end
|
132
132
|
|
data/lib/hako/container.rb
CHANGED
@@ -213,6 +213,15 @@ module Hako
|
|
213
213
|
end
|
214
214
|
end
|
215
215
|
|
216
|
+
# @return [Hash, nil]
|
217
|
+
def repository_credentials
|
218
|
+
if @definition.key?('repository_credentials')
|
219
|
+
{
|
220
|
+
credentials_parameter: @definition['repository_credentials'].fetch('credentials_parameter'),
|
221
|
+
}
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
216
225
|
private
|
217
226
|
|
218
227
|
PROVIDERS_KEY = '$providers'
|
@@ -7,7 +7,7 @@ module Hako
|
|
7
7
|
class File < EnvProvider
|
8
8
|
# @param [Pathname] root_path
|
9
9
|
# @param [Hash<String, Object>] options
|
10
|
-
def initialize(root_path, options)
|
10
|
+
def initialize(root_path, options) # rubocop:disable Lint/MissingSuper
|
11
11
|
unless options['path']
|
12
12
|
validation_error!('path must be set')
|
13
13
|
end
|
@@ -8,7 +8,7 @@ module Hako
|
|
8
8
|
class Yaml < EnvProvider
|
9
9
|
# @param [Pathname] root_path
|
10
10
|
# @param [Hash<String, Object>] options
|
11
|
-
def initialize(root_path, options)
|
11
|
+
def initialize(root_path, options) # rubocop:disable Lint/MissingSuper
|
12
12
|
unless options['path']
|
13
13
|
validation_error!('path must be set')
|
14
14
|
end
|
data/lib/hako/schedulers/ecs.rb
CHANGED
@@ -74,6 +74,15 @@ module Hako
|
|
74
74
|
@memory = options.fetch('memory', nil)
|
75
75
|
@requires_compatibilities = options.fetch('requires_compatibilities', nil)
|
76
76
|
@launch_type = options.fetch('launch_type', nil)
|
77
|
+
if options.key?('capacity_provider_strategy')
|
78
|
+
@capacity_provider_strategy = options.fetch('capacity_provider_strategy').map do |strategy|
|
79
|
+
{
|
80
|
+
capacity_provider: strategy.fetch('capacity_provider'),
|
81
|
+
weight: strategy.fetch('weight', nil),
|
82
|
+
base: strategy.fetch('base', nil),
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
77
86
|
@platform_version = options.fetch('platform_version', nil)
|
78
87
|
if options.key?('network_configuration')
|
79
88
|
network_configuration = options.fetch('network_configuration')
|
@@ -91,6 +100,7 @@ module Hako
|
|
91
100
|
if options['service_discovery']
|
92
101
|
@service_discovery = EcsServiceDiscovery.new(options.fetch('service_discovery'), @region, dry_run: @dry_run)
|
93
102
|
end
|
103
|
+
@tags = options.fetch('tags', {}).map { |k, v| { key: k, value: v.to_s } }
|
94
104
|
|
95
105
|
@started_at = nil
|
96
106
|
@container_instance_arn = nil
|
@@ -455,8 +465,9 @@ module Hako
|
|
455
465
|
|
456
466
|
# @param [Array<Hash>] desired_definitions
|
457
467
|
# @param [Aws::ECS::Types::TaskDefinition] actual_definition
|
458
|
-
# @
|
459
|
-
|
468
|
+
# @param [Array<Aws::ECS::Types::Tag>] actual_tags
|
469
|
+
# @return [Array<Boolean>]
|
470
|
+
def task_definition_changed?(desired_definitions, actual_definition, actual_tags)
|
460
471
|
if @force
|
461
472
|
return true
|
462
473
|
end
|
@@ -505,6 +516,12 @@ module Hako
|
|
505
516
|
return true
|
506
517
|
end
|
507
518
|
|
519
|
+
actual_tags_set = Set.new(actual_tags.map { |t| { key: t.key, value: t.value } })
|
520
|
+
tags_set = Set.new(@tags)
|
521
|
+
if actual_tags_set != tags_set
|
522
|
+
return true
|
523
|
+
end
|
524
|
+
|
508
525
|
false
|
509
526
|
end
|
510
527
|
|
@@ -526,7 +543,10 @@ module Hako
|
|
526
543
|
# @return [Array<Boolean, Aws::ECS::Types::TaskDefinition>]
|
527
544
|
def register_task_definition(definitions)
|
528
545
|
current_task_definition = describe_task_definition(@app_id)
|
529
|
-
if
|
546
|
+
if current_task_definition
|
547
|
+
current_tags = ecs_client.list_tags_for_resource(resource_arn: current_task_definition.task_definition_arn).tags
|
548
|
+
end
|
549
|
+
if task_definition_changed?(definitions, current_task_definition, current_tags)
|
530
550
|
new_task_definition = ecs_client.register_task_definition(
|
531
551
|
family: @app_id,
|
532
552
|
task_role_arn: @task_role_arn,
|
@@ -537,6 +557,7 @@ module Hako
|
|
537
557
|
requires_compatibilities: @requires_compatibilities,
|
538
558
|
cpu: @cpu,
|
539
559
|
memory: @memory,
|
560
|
+
tags: @tags.empty? ? nil : @tags,
|
540
561
|
).task_definition
|
541
562
|
[true, new_task_definition]
|
542
563
|
else
|
@@ -556,34 +577,36 @@ module Hako
|
|
556
577
|
# @return [Array<Boolean, Aws::ECS::Types::TaskDefinition]
|
557
578
|
def register_task_definition_for_oneshot(definitions)
|
558
579
|
10.times do |i|
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
580
|
+
family = "#{@app_id}-oneshot"
|
581
|
+
current_task_definition = describe_task_definition(family)
|
582
|
+
if current_task_definition
|
583
|
+
current_tags = ecs_client.list_tags_for_resource(resource_arn: current_task_definition.task_definition_arn).tags
|
584
|
+
end
|
585
|
+
if task_definition_changed?(definitions, current_task_definition, current_tags)
|
586
|
+
new_task_definition = ecs_client.register_task_definition(
|
587
|
+
family: family,
|
588
|
+
task_role_arn: @task_role_arn,
|
589
|
+
execution_role_arn: @execution_role_arn,
|
590
|
+
network_mode: @network_mode,
|
591
|
+
container_definitions: definitions,
|
592
|
+
volumes: volumes_definition,
|
593
|
+
requires_compatibilities: @requires_compatibilities,
|
594
|
+
cpu: @cpu,
|
595
|
+
memory: @memory,
|
596
|
+
tags: @tags.empty? ? nil : @tags,
|
597
|
+
).task_definition
|
598
|
+
return [true, new_task_definition]
|
599
|
+
else
|
600
|
+
return [false, current_task_definition]
|
601
|
+
end
|
602
|
+
rescue Aws::ECS::Errors::ClientException => e
|
603
|
+
if e.message.include?('Too many concurrent attempts to create a new revision of the specified family')
|
604
|
+
Hako.logger.error(e.message)
|
605
|
+
interval = 2**i + rand(0.0..10.0)
|
606
|
+
Hako.logger.error("Retrying register_task_definition_for_oneshot after #{interval} seconds")
|
607
|
+
sleep(interval)
|
608
|
+
else
|
609
|
+
raise e
|
587
610
|
end
|
588
611
|
end
|
589
612
|
raise Error.new('Unable to register task definition for oneshot due to too many client errors')
|
@@ -653,6 +676,7 @@ module Hako
|
|
653
676
|
readonly_root_filesystem: container.readonly_root_filesystem,
|
654
677
|
docker_security_options: container.docker_security_options,
|
655
678
|
system_controls: container.system_controls,
|
679
|
+
repository_credentials: container.repository_credentials,
|
656
680
|
}
|
657
681
|
end
|
658
682
|
|
@@ -670,8 +694,10 @@ module Hako
|
|
670
694
|
placement_constraints: @placement_constraints,
|
671
695
|
started_by: 'hako oneshot',
|
672
696
|
launch_type: @launch_type,
|
697
|
+
capacity_provider_strategy: @capacity_provider_strategy,
|
673
698
|
platform_version: @platform_version,
|
674
699
|
network_configuration: @network_configuration,
|
700
|
+
propagate_tags: 'TASK_DEFINITION',
|
675
701
|
)
|
676
702
|
result.failures.each do |failure|
|
677
703
|
Hako.logger.error("#{failure.arn} #{failure.reason}")
|
@@ -864,6 +890,7 @@ module Hako
|
|
864
890
|
desired_count: @desired_count,
|
865
891
|
task_definition: task_definition_arn,
|
866
892
|
deployment_configuration: @deployment_configuration,
|
893
|
+
capacity_provider_strategy: @capacity_provider_strategy,
|
867
894
|
platform_version: @platform_version,
|
868
895
|
network_configuration: @network_configuration,
|
869
896
|
health_check_grace_period_seconds: @health_check_grace_period_seconds,
|
@@ -872,6 +899,20 @@ module Hako
|
|
872
899
|
# Keep current desired_count if autoscaling is enabled
|
873
900
|
params[:desired_count] = current_service.desired_count
|
874
901
|
end
|
902
|
+
# Copy the current capacity provider strategy in order to avoid a
|
903
|
+
# perpetual diff when the service is created with no strategy to use the
|
904
|
+
# cluster's default capacity provider strategy, which results in the
|
905
|
+
# strategy being set to the default strategy at that moment.
|
906
|
+
# It is not allowed to update the service to use the cluster's default
|
907
|
+
# capacity provider strategy when it is using a non-default capacity
|
908
|
+
# provider strategy.
|
909
|
+
params[:capacity_provider_strategy] ||= current_service.capacity_provider_strategy&.map(&:to_h)
|
910
|
+
if different_capacity_provider_strategy?(params[:capacity_provider_strategy], current_service.capacity_provider_strategy)
|
911
|
+
# Switching from launch type to capacity provider strategy or making
|
912
|
+
# a change to a capacity provider strategy requires to force a new
|
913
|
+
# deployment.
|
914
|
+
params[:force_new_deployment] = true
|
915
|
+
end
|
875
916
|
warn_placement_policy_change(current_service)
|
876
917
|
warn_service_registries_change(current_service)
|
877
918
|
if service_changed?(current_service, params)
|
@@ -895,9 +936,11 @@ module Hako
|
|
895
936
|
placement_strategy: @placement_strategy,
|
896
937
|
scheduling_strategy: @scheduling_strategy,
|
897
938
|
launch_type: @launch_type,
|
939
|
+
capacity_provider_strategy: @capacity_provider_strategy,
|
898
940
|
platform_version: @platform_version,
|
899
941
|
network_configuration: @network_configuration,
|
900
942
|
health_check_grace_period_seconds: @health_check_grace_period_seconds,
|
943
|
+
propagate_tags: 'TASK_DEFINITION',
|
901
944
|
}
|
902
945
|
if @scheduling_strategy != 'DAEMON'
|
903
946
|
params[:desired_count] = 0
|
@@ -1348,6 +1391,15 @@ module Hako
|
|
1348
1391
|
nil
|
1349
1392
|
end
|
1350
1393
|
|
1394
|
+
# @param [Hash, nil] expected_strategy
|
1395
|
+
# @param [Aws::ECS::Types::CapacityProviderStrategyItem, nil] actual_strategy
|
1396
|
+
# @return [Boolean]
|
1397
|
+
def different_capacity_provider_strategy?(expected_strategy, actual_strategy)
|
1398
|
+
expected = (expected_strategy || []).map { |s| [s[:capacity_provider], s[:weight] || 0, s[:base] || 0] }.sort
|
1399
|
+
actual = (actual_strategy || []).map { |s| [s.capacity_provider, s.weight, s.base] }.sort
|
1400
|
+
expected != actual
|
1401
|
+
end
|
1402
|
+
|
1351
1403
|
# @param [Aws::ECS::Types::Service] service
|
1352
1404
|
# @return [nil]
|
1353
1405
|
def warn_placement_policy_change(service)
|
@@ -162,9 +162,7 @@ module Hako
|
|
162
162
|
end
|
163
163
|
|
164
164
|
class Policy
|
165
|
-
attr_reader :policy_type
|
166
|
-
attr_reader :alarms, :cooldown, :adjustment_type, :scaling_adjustment, :metric_interval_lower_bound, :metric_interval_upper_bound, :metric_aggregation_type
|
167
|
-
attr_reader :target_value, :predefined_metric_type, :scale_out_cooldown, :scale_in_cooldown, :disable_scale_in
|
165
|
+
attr_reader :policy_type, :alarms, :cooldown, :adjustment_type, :scaling_adjustment, :metric_interval_lower_bound, :metric_interval_upper_bound, :metric_aggregation_type, :target_value, :predefined_metric_type, :scale_out_cooldown, :scale_in_cooldown, :disable_scale_in
|
168
166
|
|
169
167
|
# @param [Hash] options
|
170
168
|
def initialize(options)
|
@@ -46,6 +46,7 @@ module Hako
|
|
46
46
|
struct.member(:readonly_root_filesystem, Schema::Nullable.new(Schema::Boolean.new))
|
47
47
|
struct.member(:docker_security_options, Schema::Nullable.new(Schema::UnorderedArray.new(Schema::String.new)))
|
48
48
|
struct.member(:system_controls, Schema::Nullable.new(system_controls_schema))
|
49
|
+
struct.member(:repository_credentials, Schema::Nullable.new(repository_credentials_schema))
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
@@ -182,6 +183,12 @@ module Hako
|
|
182
183
|
struct.member(:value, Schema::String.new)
|
183
184
|
end
|
184
185
|
end
|
186
|
+
|
187
|
+
def repository_credentials_schema
|
188
|
+
Schema::Structure.new.tap do |struct|
|
189
|
+
struct.member(:credentials_parameter, Schema::String.new)
|
190
|
+
end
|
191
|
+
end
|
185
192
|
end
|
186
193
|
end
|
187
194
|
end
|
@@ -89,13 +89,22 @@ module Hako
|
|
89
89
|
target_type: @elb_v2_config.fetch('target_type', nil),
|
90
90
|
).target_groups[0]
|
91
91
|
else
|
92
|
+
matcher =
|
93
|
+
if @elb_v2_config.key?('matcher')
|
94
|
+
{
|
95
|
+
http_code: @elb_v2_config.fetch('matcher')['http_code'],
|
96
|
+
grpc_code: @elb_v2_config.fetch('matcher')['grpc_code'],
|
97
|
+
}
|
98
|
+
end
|
92
99
|
elb_client.create_target_group(
|
93
100
|
name: target_group_name,
|
94
101
|
port: 80,
|
95
102
|
protocol: 'HTTP',
|
103
|
+
protocol_version: @elb_v2_config.fetch('protocol_version', 'HTTP1'),
|
96
104
|
vpc_id: @elb_v2_config.fetch('vpc_id'),
|
97
105
|
health_check_path: @elb_v2_config.fetch('health_check_path', nil),
|
98
106
|
target_type: @elb_v2_config.fetch('target_type', nil),
|
107
|
+
matcher: matcher,
|
99
108
|
).target_groups[0]
|
100
109
|
end
|
101
110
|
|
@@ -23,6 +23,7 @@ module Hako
|
|
23
23
|
struct.member(:desired_count, Schema::Integer.new)
|
24
24
|
struct.member(:task_definition, Schema::String.new)
|
25
25
|
struct.member(:deployment_configuration, Schema::WithDefault.new(deployment_configuration_schema, default_configuration))
|
26
|
+
struct.member(:capacity_provider_strategy, Schema::Nullable.new(Schema::UnorderedArray.new(capacity_provider_strategy_schema)))
|
26
27
|
struct.member(:platform_version, Schema::WithDefault.new(Schema::String.new, 'LATEST'))
|
27
28
|
struct.member(:network_configuration, Schema::Nullable.new(network_configuration_schema))
|
28
29
|
struct.member(:health_check_grace_period_seconds, Schema::Nullable.new(Schema::Integer.new))
|
@@ -36,6 +37,14 @@ module Hako
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
40
|
+
def capacity_provider_strategy_schema
|
41
|
+
Schema::Structure.new.tap do |struct|
|
42
|
+
struct.member(:capacity_provider, Schema::String.new)
|
43
|
+
struct.member(:weight, Schema::WithDefault.new(Schema::Integer.new, 0))
|
44
|
+
struct.member(:base, Schema::WithDefault.new(Schema::Integer.new, 0))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
39
48
|
def network_configuration_schema
|
40
49
|
Schema::Structure.new.tap do |struct|
|
41
50
|
struct.member(:awsvpc_configuration, awsvpc_configuration_schema)
|
@@ -46,7 +55,7 @@ module Hako
|
|
46
55
|
Schema::Structure.new.tap do |struct|
|
47
56
|
struct.member(:subnets, Schema::UnorderedArray.new(Schema::String.new))
|
48
57
|
struct.member(:security_groups, Schema::UnorderedArray.new(Schema::String.new))
|
49
|
-
struct.member(:assign_public_ip, Schema::String.new)
|
58
|
+
struct.member(:assign_public_ip, Schema::WithDefault.new(Schema::String.new, 'DISABLED'))
|
50
59
|
end
|
51
60
|
end
|
52
61
|
|
@@ -10,7 +10,7 @@ module Hako
|
|
10
10
|
class NginxFront < Script
|
11
11
|
S3Config = Struct.new(:region, :bucket, :prefix) do
|
12
12
|
# @param [Hash] options
|
13
|
-
def initialize(options)
|
13
|
+
def initialize(options) # rubocop:disable Lint/MissingSuper
|
14
14
|
self.region = options.fetch('region')
|
15
15
|
self.bucket = options.fetch('bucket')
|
16
16
|
self.prefix = options.fetch('prefix', nil)
|
data/lib/hako/version.rb
CHANGED
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.
|
4
|
+
version: 2.15.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kohei Suzuki
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-applicationautoscaling
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.
|
89
|
+
version: 1.54.0
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.
|
96
|
+
version: 1.54.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: aws-sdk-elasticloadbalancing
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 1.54.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 1.54.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: aws-sdk-s3
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,20 +206,6 @@ dependencies:
|
|
206
206
|
- - ">="
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: '0'
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: coveralls
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - ">="
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: '0'
|
216
|
-
type: :development
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - ">="
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '0'
|
223
209
|
- !ruby/object:Gem::Dependency
|
224
210
|
name: rake
|
225
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -298,11 +284,11 @@ executables:
|
|
298
284
|
extensions: []
|
299
285
|
extra_rdoc_files: []
|
300
286
|
files:
|
287
|
+
- ".github/workflows/ci.yml"
|
301
288
|
- ".gitignore"
|
302
289
|
- ".rspec"
|
303
290
|
- ".rubocop.yml"
|
304
291
|
- ".rubocop_todo.yml"
|
305
|
-
- ".travis.yml"
|
306
292
|
- ".yardopts"
|
307
293
|
- CHANGELOG.md
|
308
294
|
- Gemfile
|
@@ -321,6 +307,7 @@ files:
|
|
321
307
|
- examples/hello-cap-add-app.jsonnet
|
322
308
|
- examples/hello-fargate-batch.jsonnet
|
323
309
|
- examples/hello-fargate.jsonnet
|
310
|
+
- examples/hello-grpc.jsonnet
|
324
311
|
- examples/hello-internal-nlb.jsonnet
|
325
312
|
- examples/hello-lb-v2.jsonnet
|
326
313
|
- examples/hello-lb.jsonnet
|
@@ -382,7 +369,7 @@ homepage: https://github.com/eagletmt/hako
|
|
382
369
|
licenses:
|
383
370
|
- MIT
|
384
371
|
metadata: {}
|
385
|
-
post_install_message:
|
372
|
+
post_install_message:
|
386
373
|
rdoc_options: []
|
387
374
|
require_paths:
|
388
375
|
- lib
|
@@ -390,15 +377,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
390
377
|
requirements:
|
391
378
|
- - ">="
|
392
379
|
- !ruby/object:Gem::Version
|
393
|
-
version: 2.
|
380
|
+
version: 2.5.0
|
394
381
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
395
382
|
requirements:
|
396
383
|
- - ">="
|
397
384
|
- !ruby/object:Gem::Version
|
398
385
|
version: '0'
|
399
386
|
requirements: []
|
400
|
-
rubygems_version: 3.
|
401
|
-
signing_key:
|
387
|
+
rubygems_version: 3.2.21
|
388
|
+
signing_key:
|
402
389
|
specification_version: 4
|
403
390
|
summary: Deploy Docker container
|
404
391
|
test_files: []
|
data/.travis.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
sudo: false
|
3
|
-
rvm:
|
4
|
-
- 2.3.8
|
5
|
-
- 2.4.6
|
6
|
-
- 2.5.5
|
7
|
-
- 2.6.3
|
8
|
-
- ruby-head
|
9
|
-
before_install:
|
10
|
-
- gem update --system # https://github.com/rubygems/rubygems/pull/1819
|
11
|
-
- gem install bundler
|
12
|
-
matrix:
|
13
|
-
allow_failures:
|
14
|
-
- rvm: ruby-head
|