hako 1.9.0 → 2.0.0

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: be60277c499933be1ac03eed32027844eb410bb92d52355984833f16d19ac882
4
- data.tar.gz: f07f5c690efcc8c81a1610ff9077dcf36f21cb41eb6f6ff07b475083bfbb999d
3
+ metadata.gz: 85ef57c377dafbf524ddb4d442108f92aee5f278d2506c5f91ca61df1541dd2b
4
+ data.tar.gz: 7de25a114cf37299e18ffa034d8eed56d6253857c67865bd0a15f90c1c87bb02
5
5
  SHA512:
6
- metadata.gz: 17b332ddc9a4f4eca98938d7e5fec30898d6b50971f6700bb5e1717a0c211b88d97ed4b5dc9c24a4d75bb4fabc27d5d1ed374b3d51410305b8e184b5250b1a1c
7
- data.tar.gz: 288283a14dbed0e30066da6b1a7d4fa6568ceda09a4272981304e6b421f91c2fce8d6b67fc535e8440cfccf51852babc71b803a8a21542ed48d2a84b59cb58e1
6
+ metadata.gz: a30d023690fc56f462e230b0e9b229c63091489446ac85c45a01d7158d0ba363f999ea28ca0cac2a2c9c22dfb387f3a7d5cc8b5fcd9a552fb98581f518eedeee
7
+ data.tar.gz: 2095d02a1a7da744416a599abf5ba16762206349c4dfd772d7d74f7ef030aab4ffa4a6a4d36005f68d42fdced3e82c2bdbef51b4a0ea1839cdd4b07432709da2
@@ -1,3 +1,9 @@
1
+ # 2.0.0 (2017-12-13)
2
+ ## New features
3
+ - Support Jsonnet as the definition file format
4
+ - See [docs/jsonnet.md](docs/jsonnet.md)
5
+ - YAML definitions continues to be supported by hako at least v2.x series. Currently I don't have a plan which will be the default format.
6
+
1
7
  # 1.9.0 (2017-12-06)
2
8
  ## New features
3
9
  - Add support for awsvpc network mode
data/README.md CHANGED
@@ -23,16 +23,16 @@ Or install it yourself as:
23
23
  ## Usage
24
24
 
25
25
  ```
26
- % hako deploy examples/hello.yml
26
+ % hako deploy examples/hello.jsonnet
27
27
  I, [2015-10-02T12:51:24.530274 #7988] INFO -- : Registered task-definition: arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task-definition/hello:29
28
28
  I, [2015-10-02T12:51:24.750501 #7988] INFO -- : Uploaded front configuration to s3://nanika/hako/front_config/hello.conf
29
29
  I, [2015-10-02T12:51:24.877409 #7988] INFO -- : Updated service: arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:service/hello
30
30
  I, [2015-10-02T12:56:07.284874 #7988] INFO -- : Deployment completed
31
31
 
32
- % hako deploy examples/hello.yml
32
+ % hako deploy examples/hello.jsonnet
33
33
  I, [2015-10-02T12:56:12.262760 #8141] INFO -- : Deployment isn't needed
34
34
 
35
- % hako status examples/hello.yml
35
+ % hako status examples/hello.jsonnet
36
36
  Load balancer:
37
37
  hako-hello-XXXXXXXXXX.ap-northeast-1.elb.amazonaws.com:80 -> front:80
38
38
  Deployments:
@@ -44,7 +44,7 @@ Events:
44
44
  2015-10-05 13:35:53 +0900: (service hello) has reached a steady state.
45
45
  2015-10-05 13:35:14 +0900: (service hello) stopped 1 running tasks.
46
46
 
47
- % hako rollback examples/hello.yml
47
+ % hako rollback examples/hello.jsonnet
48
48
  I, [2016-05-02T13:07:12.679926 #10961] INFO -- : Current task defintion is hello:29. Rolling back to arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task-definition/hello:28
49
49
  I, [2016-05-02T13:07:12.959116 #10961] INFO -- : Updated service: arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:service/hello
50
50
  I, [2016-05-02T13:08:27.280686 #10961] INFO -- : Deployment completed
@@ -53,7 +53,7 @@ I, [2016-05-02T13:08:27.280686 #10961] INFO -- : Deployment completed
53
53
  Run oneshot command.
54
54
 
55
55
  ```
56
- % hako oneshot examples/hello.yml date
56
+ % hako oneshot examples/hello.jsonnet date
57
57
  I, [2017-07-18T18:14:06.099763 #6627] INFO -- : Task definition isn't changed: arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task-definition/hello-oneshot:32
58
58
  I, [2017-07-18T18:14:06.147062 #6627] INFO -- : Started task: arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task/01234567-89ab-cdef-0123-456789abcdef
59
59
  I, [2017-07-18T18:14:06.193860 #6627] INFO -- : Container instance is arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container-instance/01234567-89ab-cdef-0123-456789abcdef (i-0123456789abcdef0)
@@ -0,0 +1,48 @@
1
+ Jsonnet is a domain specific configuration language that helps you define JSON data.
2
+ http://jsonnet.org/
3
+
4
+ In hako, you can use Jsonnet format for defining applications.
5
+
6
+ # External variables
7
+ Jsonnet provide a way to refer external variables by `std.extVar(x)`.
8
+ http://jsonnet.org/docs/stdlib.html#ext_vars
9
+
10
+ ## appId
11
+ `std.extVar('appId')` returns application id of the definition.
12
+
13
+ ### Example
14
+ ```
15
+ % cat awesome-app.jsonnet
16
+ {
17
+ id: std.extVar('appId'),
18
+ }
19
+ % hako show-definition awesome-app.jsonnet
20
+ ---
21
+ id: awesome-app
22
+ ```
23
+
24
+ # Native functions
25
+ Jsonnet provide a way to refer native functions by `std.native(x)`.
26
+
27
+ ## provide.$NAME
28
+ `std.native('provide.$NAME')` returns a function which returns a corresponding EnvProvider.
29
+
30
+ ### Example
31
+ ```
32
+ % cat awesome-app.env
33
+ username=eagletmt
34
+ % cat awesome-app.yml
35
+ password: hako
36
+ % cat awesome-app.jsonnet
37
+ local provideFromFile(name) = std.native('provide.file')(std.toString({ path: 'awesome-app.env' }), name);
38
+ local provideFromYaml(name) = std.native('provide.yaml')(std.toString({ path: 'awesome-app.yml' }), name);
39
+
40
+ {
41
+ username: provideFromFile('username'),
42
+ password: provideFromYaml('password'),
43
+ }
44
+ % hako show-definition --expand awesome-app.jsonnet
45
+ ---
46
+ password: hako
47
+ username: eagletmt
48
+ ```
@@ -0,0 +1,8 @@
1
+ {
2
+ type: 'nginx_front',
3
+ s3: {
4
+ region: 'ap-northeast-1',
5
+ bucket: 'nanika',
6
+ prefix: 'hako/front_config',
7
+ },
8
+ }
@@ -0,0 +1,84 @@
1
+ local appId = std.extVar('appId');
2
+
3
+ local region = 'us-east-1';
4
+ local publicSubnets = ['subnet-xxxxxxxx', 'subnet-yyyyyyyy'];
5
+ local privateSubnets = ['subnet-zzzzzzzz', 'subnet-wwwwwwww'];
6
+ local elbSecurityGroups = ['sg-xxxxxxxx'];
7
+ local taskSecurityGroups = ['sg-yyyyyyyy', 'sg-zzzzzzzz'];
8
+ local awslogs = {
9
+ log_driver: 'awslogs',
10
+ options: {
11
+ 'awslogs-group': std.format('/ecs/%s', appId),
12
+ 'awslogs-region': region,
13
+ 'awslogs-stream-prefix': 'ecs',
14
+ },
15
+ };
16
+
17
+ {
18
+ scheduler: {
19
+ type: 'ecs',
20
+ region: region,
21
+ cluster: 'eagletmt',
22
+ desired_count: 1,
23
+ task_role_arn: 'arn:aws:iam::012345678901:role/EcsDefault',
24
+ elb_v2: {
25
+ vpc_id: 'vpc-xxxxxxxx',
26
+ health_check_path: '/site/sha',
27
+ listeners: [
28
+ {
29
+ port: 80,
30
+ protocol: 'HTTP',
31
+ },
32
+ {
33
+ port: 443,
34
+ protocol: 'HTTPS',
35
+ certificate_arn: 'arn:aws:acm:us-east-1:012345678901:certificate/01234567-89ab-cdef-0123-456789abcdef',
36
+ },
37
+ ],
38
+ subnets: publicSubnets,
39
+ security_groups: elbSecurityGroups,
40
+ load_balancer_attributes: {
41
+ 'access_logs.s3.enabled': 'true',
42
+ 'access_logs.s3.bucket': 'hako-access-logs',
43
+ 'access_logs.s3.prefix': std.format('hako-%s', appId),
44
+ 'idle_timeout.timeout_seconds': '5',
45
+ },
46
+ target_group_attributes: {
47
+ 'deregistration_delay.timeout_seconds': '20',
48
+ },
49
+ },
50
+ # Fargate
51
+ execution_role_arn: 'arn:aws:iam::012345678901:role/ecsTaskExecutionRole',
52
+ cpu: '1024',
53
+ memory: '2048',
54
+ requires_compatibilities: ['FARGATE'],
55
+ network_mode: 'awsvpc',
56
+ launch_type: 'FARGATE',
57
+ network_configuration: {
58
+ awsvpc_configuration: {
59
+ subnets: privateSubnets,
60
+ security_groups: taskSecurityGroups,
61
+ assign_public_ip: 'DISABLED',
62
+ },
63
+ },
64
+ },
65
+ app: {
66
+ image: 'ryotarai/hello-sinatra',
67
+ cpu: 128,
68
+ memory: 256,
69
+ env: {
70
+ PORT: '3000',
71
+ MESSAGE: 'Hello, Fargate',
72
+ },
73
+ log_configuration: awslogs,
74
+ },
75
+ additional_containers: {
76
+ front: {
77
+ image_tag: 'hako-nginx',
78
+ log_configuration: awslogs,
79
+ },
80
+ },
81
+ scripts: [
82
+ (import 'front.libsonnet') + { backend_port: 3000 },
83
+ ],
84
+ }
@@ -0,0 +1,45 @@
1
+ local fileProvider = std.native('provide.file');
2
+ local provide(name) = fileProvider(std.toString({ path: 'hello.env' }), name);
3
+
4
+ {
5
+ scheduler: {
6
+ type: 'ecs',
7
+ region: 'ap-northeast-1',
8
+ cluster: 'eagletmt',
9
+ desired_count: 2,
10
+ task_role_arn: 'arn:aws:iam::012345678901:role/HelloRole',
11
+ deployment_configuration: {
12
+ maximum_percent: 200,
13
+ minimum_healthy_percent: 50,
14
+ },
15
+ },
16
+ app: {
17
+ image: 'ryotarai/hello-sinatra',
18
+ memory: 128,
19
+ cpu: 256,
20
+ links: [
21
+ 'redis:redis',
22
+ ],
23
+ env: {
24
+ PORT: '3000',
25
+ MESSAGE: std.format('%s-san', provide('username')),
26
+ },
27
+ },
28
+ additional_containers: {
29
+ front: {
30
+ image_tag: 'hako-nginx',
31
+ memory: 32,
32
+ cpu: 32,
33
+ },
34
+ redis: {
35
+ image_tag: 'redis:3.0',
36
+ cpu: 64,
37
+ memory: 512,
38
+ },
39
+ },
40
+ scripts: [
41
+ (import 'front.libsonnet') + {
42
+ backend_port: 3000,
43
+ },
44
+ ],
45
+ }
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency 'aws-sdk-elasticloadbalancingv2'
32
32
  spec.add_dependency 'aws-sdk-s3'
33
33
  spec.add_dependency 'aws-sdk-sns'
34
+ spec.add_dependency 'jsonnet'
34
35
 
35
36
  spec.add_development_dependency 'bundler'
36
37
  spec.add_development_dependency 'coveralls'
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'hako/error'
4
+ require 'hako/jsonnet_loader'
3
5
  require 'hako/yaml_loader'
4
6
  require 'pathname'
5
7
 
@@ -9,15 +11,23 @@ module Hako
9
11
  # @return [String]
10
12
  # @!attribute [r] root_path
11
13
  # @return [Pathname]
12
- # @!attribute [r] yaml
14
+ # @!attribute [r] definition
13
15
  # @return [Hash]
14
- attr_reader :id, :root_path, :yaml
16
+ attr_reader :id, :root_path, :definition
15
17
 
16
- def initialize(yaml_path)
18
+ def initialize(yaml_path, expand_variables: true)
17
19
  path = Pathname.new(yaml_path)
18
20
  @id = path.basename.sub_ext('').to_s
19
21
  @root_path = path.parent
20
- @yaml = YamlLoader.new.load(path)
22
+ @definition =
23
+ case path.extname
24
+ when '.yml', '.yaml'
25
+ YamlLoader.new.load(path)
26
+ when '.jsonnet', '.json'
27
+ JsonnetLoader.new(self, expand_variables).load(path)
28
+ else
29
+ raise Error.new("Unknown extension: #{path}")
30
+ end
21
31
  end
22
32
  end
23
33
  end
@@ -10,7 +10,7 @@ module Hako
10
10
  deploy
11
11
  rollback
12
12
  oneshot
13
- show-yaml
13
+ show-definition
14
14
  status
15
15
  remove
16
16
  stop
@@ -181,17 +181,19 @@ module Hako
181
181
  end
182
182
  end
183
183
 
184
- class ShowYaml
184
+ class ShowDefinition
185
185
  def run(argv)
186
186
  parse!(argv)
187
- require 'hako/yaml_loader'
188
- puts YamlLoader.new.load(Pathname.new(@yaml_path)).to_yaml
187
+ require 'hako/application'
188
+ app = Application.new(@path, expand_variables: @expand_variables)
189
+ puts app.definition.to_yaml
189
190
  end
190
191
 
191
192
  def parse!(argv)
193
+ @expand_variables = false
192
194
  parser.parse!(argv)
193
- @yaml_path = argv.first
194
- if @yaml_path.nil?
195
+ @path = argv.first
196
+ if @path.nil?
195
197
  puts parser.help
196
198
  exit 1
197
199
  end
@@ -199,8 +201,9 @@ module Hako
199
201
 
200
202
  def parser
201
203
  @parser ||= OptionParser.new do |opts|
202
- opts.banner = 'hako show-yaml FILE'
204
+ opts.banner = 'hako show-definition FILE'
203
205
  opts.version = VERSION
206
+ opts.on('--expand', 'Expand variables (Jsonnet only)') { @expand_variables = true }
204
207
  end
205
208
  end
206
209
  end
@@ -20,9 +20,9 @@ module Hako
20
20
  # @return [nil]
21
21
  def deploy(force: false, tag: 'latest', dry_run: false, timeout:)
22
22
  containers = load_containers(tag, dry_run: dry_run)
23
- scripts = @app.yaml.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
24
- volumes = @app.yaml.fetch('volumes', {})
25
- scheduler = load_scheduler(@app.yaml['scheduler'], scripts, volumes: volumes, force: force, dry_run: dry_run, timeout: timeout)
23
+ scripts = @app.definition.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
24
+ volumes = @app.definition.fetch('volumes', {})
25
+ scheduler = load_scheduler(@app.definition['scheduler'], scripts, volumes: volumes, force: force, dry_run: dry_run, timeout: timeout)
26
26
 
27
27
  scripts.each { |script| script.deploy_starting(containers) }
28
28
  scheduler.deploy(containers)
@@ -33,8 +33,8 @@ module Hako
33
33
  # @param [Boolean] dry_run
34
34
  # @return [nil]
35
35
  def rollback(dry_run: false)
36
- scripts = @app.yaml.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
37
- scheduler = load_scheduler(@app.yaml['scheduler'], scripts, dry_run: dry_run)
36
+ scripts = @app.definition.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
37
+ scheduler = load_scheduler(@app.definition['scheduler'], scripts, dry_run: dry_run)
38
38
 
39
39
  scripts.each(&:rollback_starting)
40
40
  scheduler.rollback
@@ -49,9 +49,9 @@ module Hako
49
49
  # @return [nil]
50
50
  def oneshot(commands, tag:, containers:, env: {}, dry_run: false, no_wait: false)
51
51
  containers = load_containers(tag, dry_run: dry_run, with: containers)
52
- scripts = @app.yaml.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
53
- volumes = @app.yaml.fetch('volumes', {})
54
- scheduler = load_scheduler(@app.yaml['scheduler'], scripts, volumes: volumes, dry_run: dry_run)
52
+ scripts = @app.definition.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
53
+ volumes = @app.definition.fetch('volumes', {})
54
+ scheduler = load_scheduler(@app.definition['scheduler'], scripts, volumes: volumes, dry_run: dry_run)
55
55
 
56
56
  scripts.each { |script| script.oneshot_starting(containers) }
57
57
  exit_code = with_oneshot_signal_handlers(scheduler) do
@@ -63,19 +63,19 @@ module Hako
63
63
 
64
64
  # @return [nil]
65
65
  def status
66
- load_scheduler(@app.yaml['scheduler'], [], dry_run: false).status
66
+ load_scheduler(@app.definition['scheduler'], [], dry_run: false).status
67
67
  end
68
68
 
69
69
  # @param [Boolean] dry_run
70
70
  # @return [nil]
71
71
  def remove(dry_run:)
72
- scripts = @app.yaml.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
73
- load_scheduler(@app.yaml['scheduler'], scripts, dry_run: dry_run).remove
72
+ scripts = @app.definition.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
73
+ load_scheduler(@app.definition['scheduler'], scripts, dry_run: dry_run).remove
74
74
  scripts.each(&:after_remove)
75
75
  end
76
76
 
77
77
  def stop(dry_run:)
78
- load_scheduler(@app.yaml['scheduler'], [], dry_run: dry_run).stop
78
+ load_scheduler(@app.definition['scheduler'], [], dry_run: dry_run).stop
79
79
  end
80
80
 
81
81
  private
@@ -18,7 +18,7 @@ module Hako
18
18
  # @param [Array<String>, nil] with
19
19
  # @return [Hash<String, Container>]
20
20
  def load(tag, with: nil)
21
- additional_containers = @app.yaml.fetch('additional_containers', {})
21
+ additional_containers = @app.definition.fetch('additional_containers', {})
22
22
  container_names = ['app']
23
23
  if with
24
24
  container_names.concat(with)
@@ -43,7 +43,7 @@ module Hako
43
43
  containers[name] =
44
44
  case name
45
45
  when 'app'
46
- AppContainer.new(@app, @app.yaml['app'].merge('tag' => tag), dry_run: @dry_run)
46
+ AppContainer.new(@app, @app.definition['app'].merge('tag' => tag), dry_run: @dry_run)
47
47
  else
48
48
  Container.new(@app, additional_containers.fetch(name), dry_run: @dry_run)
49
49
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'hako'
4
+ require 'hako/env_providers'
5
+ require 'hako/loader'
6
+ require 'json'
7
+ require 'jsonnet'
8
+
9
+ module Hako
10
+ class JsonnetLoader
11
+ # @param [Application] application
12
+ # @param [Boolean] expand_variables
13
+ def initialize(application, expand_variables)
14
+ @vm = Jsonnet::VM.new
15
+ @root_path = application.root_path
16
+ define_provider_functions(expand_variables)
17
+ @vm.ext_var('appId', application.id)
18
+ end
19
+
20
+ # @param [Pathname] path
21
+ def load(path)
22
+ JSON.parse(@vm.evaluate_file(path.to_s))
23
+ end
24
+
25
+ private
26
+
27
+ def define_provider_functions(expand_variables)
28
+ Gem.loaded_specs.each do |gem_name, spec|
29
+ spec.require_paths.each do |path|
30
+ Dir.glob(File.join(spec.full_gem_path, path, 'hako/env_providers/*.rb')).each do |provider_path|
31
+ provider_name = File.basename(provider_path, '.rb')
32
+ provider_class = Loader.new(Hako::EnvProviders, 'hako/env_providers').load(provider_name)
33
+ Hako.logger.debug("Loaded #{provider_class} from '#{gem_name}' gem")
34
+ @vm.define_function("provide.#{provider_name}") do |options, name|
35
+ if expand_variables
36
+ provider_class.new(@root_path, JSON.parse(options)).ask([name]).fetch(name)
37
+ else
38
+ "\#{#{name}}"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hako
4
- VERSION = '1.9.0'
4
+ VERSION = '2.0.0'
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: 1.9.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kohei Suzuki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-06 00:00:00.000000000 Z
11
+ date: 2017-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-applicationautoscaling
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: jsonnet
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: bundler
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -270,19 +284,23 @@ files:
270
284
  - bin/console
271
285
  - bin/setup
272
286
  - docs/ecs-task-notification.md
287
+ - docs/jsonnet.md
273
288
  - examples/create_aws_cloud_watch_logs_log_group.yml
289
+ - examples/front.libsonnet
274
290
  - examples/front.yml
275
291
  - examples/hello-autoscaling-group.yml
276
292
  - examples/hello-autoscaling.yml
277
293
  - examples/hello-awslogs-driver.yml
278
294
  - examples/hello-cap-add-app.yml
279
295
  - examples/hello-fargate-batch.yml
296
+ - examples/hello-fargate.jsonnet
280
297
  - examples/hello-fargate.yml
281
298
  - examples/hello-lb-v2.yml
282
299
  - examples/hello-lb.yml
283
300
  - examples/hello-nofront.yml
284
301
  - examples/hello-privileged-app.yml
285
302
  - examples/hello.env
303
+ - examples/hello.jsonnet
286
304
  - examples/hello.yml
287
305
  - examples/put-ecs-container-status-to-s3/index.js
288
306
  - examples/put-ecs-container-status-to-s3/package.json
@@ -301,6 +319,7 @@ files:
301
319
  - lib/hako/env_providers/file.rb
302
320
  - lib/hako/env_providers/yaml.rb
303
321
  - lib/hako/error.rb
322
+ - lib/hako/jsonnet_loader.rb
304
323
  - lib/hako/loader.rb
305
324
  - lib/hako/scheduler.rb
306
325
  - lib/hako/schedulers.rb