hako 0.12.0 → 0.13.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
  SHA1:
3
- metadata.gz: e0cc680f33d2f80eed9ad5382ffe32075894a54b
4
- data.tar.gz: c1c79b446727c880bdf9e37a8e56f5b1bc690e44
3
+ metadata.gz: 44168c92adc956e117f59a47a63eeab9479288d0
4
+ data.tar.gz: 8dc7fbc348b50f6ea2194e2e2adb6a9802258e89
5
5
  SHA512:
6
- metadata.gz: 0f00ead195423c3db231323b7403c3d8ec7adf16ad140da95a33ee8ce84bae8ec7529b21572148a66d3e583c7b8bb456d5d102b5f063df7d6a3bb37be0807f73
7
- data.tar.gz: 879ad5e2940302f60211b27b8ef644a263d4ae4601db50f347e536de5e5ccb349bc8a22e827a089466bd362bdabd45f5df741ef73eb5a2197bbeb89c577e4e45
6
+ metadata.gz: 8a2cf60847f746fcc21a7c2b84c74898239d7b8d8b85a950491d01f9e367dcc8b7a5667279e6a1378c71a35a14e455a5613601d896e482b874cfe670d832d3bb
7
+ data.tar.gz: f39fcc090dac6613a3c6886582841bee8226a926da2d0ea1a63c231ba80d25d45f4ce5192af2def86cc52521e3722beeada382b8713bca5bc281dae7ca401c98
data/examples/front.yml CHANGED
@@ -1,7 +1,4 @@
1
- type: nginx
2
- image_tag: hako-nginx
3
- memory: 32
4
- cpu: 32
1
+ type: nginx_front
5
2
  s3:
6
3
  region: ap-northeast-1
7
4
  bucket: nanika
@@ -25,8 +25,11 @@ app:
25
25
  PORT: 3000
26
26
  MESSAGE: '#{username}-san'
27
27
  front:
28
- <<: !include front.yml
29
- extra:
28
+ image_tag: hako-nginx
29
+ memory: 32
30
+ cpu: 32
31
+ scripts:
32
+ - <<: !include front.yml
30
33
  locations:
31
34
  /:
32
35
  allow_only_from:
data/examples/hello.yml CHANGED
@@ -17,9 +17,13 @@ app:
17
17
  PORT: 3000
18
18
  MESSAGE: '#{username}-san'
19
19
  front:
20
- !include front.yml
20
+ image_tag: hako-nginx
21
+ memory: 32
22
+ cpu: 32
21
23
  additional_containers:
22
24
  redis:
23
25
  image_tag: redis:3.0
24
26
  cpu: 64
25
27
  memory: 512
28
+ scripts:
29
+ - !include front.yml
@@ -18,6 +18,7 @@ module Hako
18
18
  cpu
19
19
  memory
20
20
  links
21
+ port_mappings
21
22
  ].each do |name|
22
23
  define_method(name) do
23
24
  @definition[name]
@@ -29,7 +30,7 @@ module Hako
29
30
  end
30
31
 
31
32
  def env
32
- @expanded_env ||= expand_env(@definition.fetch('env', {}))
33
+ @expanded_env ||= expand_env(@definition.fetch('env'))
33
34
  end
34
35
 
35
36
  def mount_points
@@ -65,9 +66,11 @@ module Hako
65
66
 
66
67
  def default_config
67
68
  {
69
+ 'env' => {},
68
70
  'docker_labels' => {},
69
71
  'links' => [],
70
72
  'mount_points' => [],
73
+ 'port_mappings' => [],
71
74
  }
72
75
  end
73
76
 
@@ -2,7 +2,6 @@
2
2
  require 'set'
3
3
  require 'hako/app_container'
4
4
  require 'hako/container'
5
- require 'hako/fronts'
6
5
  require 'hako/loader'
7
6
 
8
7
  module Hako
@@ -39,7 +38,7 @@ module Hako
39
38
  when 'app'
40
39
  AppContainer.new(@app, @app.yaml['app'].merge('tag' => tag), dry_run: @dry_run)
41
40
  when 'front'
42
- load_front(@app.yaml['front'], dry_run: @dry_run)
41
+ Container.new(@app, @app.yaml.fetch('front'), dry_run: @dry_run)
43
42
  else
44
43
  Container.new(@app, additional_containers.fetch(name), dry_run: @dry_run)
45
44
  end
@@ -52,9 +51,5 @@ module Hako
52
51
  end
53
52
  containers
54
53
  end
55
-
56
- def load_front(yaml, dry_run:)
57
- Loader.new(Hako::Fronts, 'hako/fronts').load(yaml.fetch('type')).new(@app, yaml, dry_run: dry_run)
58
- end
59
54
  end
60
55
  end
@@ -30,17 +30,6 @@ module Hako
30
30
  raise NotImplementedError
31
31
  end
32
32
 
33
- def upload_front_config(app_id, front, app_port)
34
- front_conf = front.generate_config(app_port)
35
- s3_config = front.s3
36
- s3 = Aws::S3::Client.new(region: s3_config.region)
37
- s3.put_object(
38
- body: front_conf,
39
- bucket: s3_config.bucket,
40
- key: s3_config.key(app_id),
41
- )
42
- end
43
-
44
33
  private
45
34
 
46
35
  def validation_error!(message)
@@ -26,11 +26,9 @@ module Hako
26
26
  end
27
27
 
28
28
  def deploy(containers)
29
- app = containers.fetch('app')
30
- front = containers.fetch('front')
31
29
  front_port = determine_front_port
32
30
  @scripts.each { |script| script.deploy_started(containers, front_port) }
33
- definitions = create_definitions(containers, front_port)
31
+ definitions = create_definitions(containers)
34
32
 
35
33
  if @dry_run
36
34
  definitions.each do |d|
@@ -43,8 +41,6 @@ module Hako
43
41
  task_definition = @ecs.describe_task_definition(task_definition: @app_id).task_definition
44
42
  else
45
43
  Hako.logger.info "Registered task definition: #{task_definition.task_definition_arn}"
46
- upload_front_config(@app_id, front, app.port)
47
- Hako.logger.debug "Uploaded front configuration to s3://#{front.s3.bucket}/#{front.s3.key(@app_id)}"
48
44
  end
49
45
  service = create_or_update_service(task_definition.task_definition_arn, front_port)
50
46
  if service == :noop
@@ -58,7 +54,7 @@ module Hako
58
54
  end
59
55
 
60
56
  def oneshot(containers, commands, env)
61
- definitions = create_definitions(containers, -1)
57
+ definitions = create_definitions(containers)
62
58
  definitions.each do |definition|
63
59
  definition.delete(:essential)
64
60
  end
@@ -273,14 +269,9 @@ module Hako
273
269
  end
274
270
  end
275
271
 
276
- def create_definitions(containers, front_port)
272
+ def create_definitions(containers)
277
273
  containers.map do |name, container|
278
- case name
279
- when 'front'
280
- front_container(container, front_port)
281
- else
282
- app_container(name, container)
283
- end
274
+ create_definition(name, container)
284
275
  end
285
276
  end
286
277
 
@@ -306,35 +297,19 @@ module Hako
306
297
  end
307
298
  end
308
299
 
309
- def front_container(front, front_port)
310
- environment = front.env.map { |k, v| { name: k, value: v } }
311
- {
312
- name: 'front',
313
- image: front.image_tag,
314
- cpu: front.cpu,
315
- memory: front.memory,
316
- links: front.links,
317
- port_mappings: [{ container_port: 80, host_port: front_port, protocol: 'tcp' }],
318
- essential: true,
319
- environment: environment,
320
- docker_labels: front.docker_labels,
321
- mount_points: front.mount_points,
322
- }
323
- end
324
-
325
- def app_container(name, app)
326
- environment = app.env.map { |k, v| { name: k, value: v } }
300
+ def create_definition(name, container)
301
+ environment = container.env.map { |k, v| { name: k, value: v } }
327
302
  {
328
303
  name: name,
329
- image: app.image_tag,
330
- cpu: app.cpu,
331
- memory: app.memory,
332
- links: app.links,
333
- port_mappings: [],
304
+ image: container.image_tag,
305
+ cpu: container.cpu,
306
+ memory: container.memory,
307
+ links: container.links,
308
+ port_mappings: container.port_mappings,
334
309
  essential: true,
335
310
  environment: environment,
336
- docker_labels: app.docker_labels,
337
- mount_points: app.mount_points,
311
+ docker_labels: container.docker_labels,
312
+ mount_points: container.mount_points,
338
313
  }
339
314
  end
340
315
 
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+ require 'aws-sdk'
3
+ require 'erb'
4
+ require 'hako'
5
+ require 'hako/script'
6
+
7
+ module Hako
8
+ module Scripts
9
+ class NginxFront < Script
10
+ S3Config = Struct.new(:region, :bucket, :prefix) do
11
+ def initialize(options)
12
+ self.region = options.fetch('region')
13
+ self.bucket = options.fetch('bucket')
14
+ self.prefix = options.fetch('prefix', nil)
15
+ end
16
+
17
+ def key(app_id)
18
+ if prefix
19
+ "#{prefix}/#{app_id}.conf"
20
+ else
21
+ "#{app_id}.conf"
22
+ end
23
+ end
24
+ end
25
+
26
+ def deploy_starting(containers)
27
+ front = containers.fetch('front')
28
+ front.definition['env'].merge!(
29
+ 'AWS_DEFAULT_REGION' => @s3.region,
30
+ 'S3_CONFIG_BUCKET' => @s3.bucket,
31
+ 'S3_CONFIG_KEY' => @s3.key(@app.id),
32
+ )
33
+ front.links << link_app
34
+ end
35
+
36
+ def deploy_started(containers, front_port)
37
+ app = containers.fetch('app')
38
+ front = containers.fetch('front')
39
+ front.definition['port_mappings'] << port_mapping(front_port)
40
+ upload_config(generate_config(app.port))
41
+ Hako.logger.debug "Uploaded front configuration to s3://#{@s3.bucket}/#{@s3.key(@app.id)}"
42
+ end
43
+
44
+ private
45
+
46
+ def configure(options)
47
+ super
48
+ @options = options
49
+ @s3 = S3Config.new(@options.fetch('s3'))
50
+ end
51
+
52
+ def link_app
53
+ 'app:app'
54
+ end
55
+
56
+ def port_mapping(front_port)
57
+ { container_port: 80, host_port: front_port, protocol: 'tcp' }
58
+ end
59
+
60
+ def generate_config(app_port)
61
+ Generator.new(@options, app_port).render
62
+ end
63
+
64
+ def upload_config(front_conf)
65
+ s3_client.put_object(
66
+ body: front_conf,
67
+ bucket: @s3.bucket,
68
+ key: @s3.key(@app.id),
69
+ )
70
+ end
71
+
72
+ def s3_client
73
+ @s3_client ||= Aws::S3::Client.new(region: @s3.region)
74
+ end
75
+
76
+ class Generator
77
+ def initialize(options, app_port)
78
+ @options = options
79
+ @app_port = app_port
80
+ end
81
+
82
+ def render
83
+ ERB.new(File.read(nginx_conf_erb), nil, '-').result(binding)
84
+ end
85
+
86
+ private
87
+
88
+ def listen_spec
89
+ "app:#{@app_port}"
90
+ end
91
+
92
+ def templates_directory
93
+ File.expand_path('../../templates', __FILE__)
94
+ end
95
+
96
+ def nginx_conf_erb
97
+ File.join(templates_directory, 'nginx.conf.erb')
98
+ end
99
+
100
+ def nginx_location_conf_erb
101
+ File.join(templates_directory, 'nginx.location.conf.erb')
102
+ end
103
+
104
+ def locations
105
+ locs = @options.fetch('locations', {}).dup
106
+ locs['/'] ||= {}
107
+ locs.keys.each do |k|
108
+ locs[k] = Location.new(locs[k])
109
+ end
110
+ locs
111
+ end
112
+
113
+ def client_max_body_size
114
+ @options.fetch('client_max_body_size', nil)
115
+ end
116
+
117
+ def render_location(listen_spec, location)
118
+ ERB.new(File.read(nginx_location_conf_erb), nil, '-').result(binding).each_line.map do |line|
119
+ " #{line}"
120
+ end.join('')
121
+ end
122
+
123
+ class Location
124
+ def initialize(config)
125
+ @config = config
126
+ end
127
+
128
+ def allow_only_from
129
+ allow = @config.fetch('allow_only_from', nil)
130
+ if allow
131
+ allow.flatten
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
data/lib/hako/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Hako
3
- VERSION = '0.12.0'
3
+ VERSION = '0.13.0'
4
4
  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: 0.12.0
4
+ version: 0.13.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: 2016-03-18 00:00:00.000000000 Z
11
+ date: 2016-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -116,9 +116,6 @@ files:
116
116
  - lib/hako/env_providers.rb
117
117
  - lib/hako/env_providers/file.rb
118
118
  - lib/hako/error.rb
119
- - lib/hako/front.rb
120
- - lib/hako/fronts.rb
121
- - lib/hako/fronts/nginx.rb
122
119
  - lib/hako/loader.rb
123
120
  - lib/hako/scheduler.rb
124
121
  - lib/hako/schedulers.rb
@@ -128,6 +125,7 @@ files:
128
125
  - lib/hako/schedulers/ecs_elb.rb
129
126
  - lib/hako/script.rb
130
127
  - lib/hako/scripts.rb
128
+ - lib/hako/scripts/nginx_front.rb
131
129
  - lib/hako/templates/nginx.conf.erb
132
130
  - lib/hako/templates/nginx.location.conf.erb
133
131
  - lib/hako/version.rb
data/lib/hako/front.rb DELETED
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'hako/container'
3
-
4
- module Hako
5
- class Front < Container
6
- S3Config = Struct.new(:region, :bucket, :prefix) do
7
- def initialize(options)
8
- self.region = options.fetch('region')
9
- self.bucket = options.fetch('bucket')
10
- self.prefix = options.fetch('prefix', nil)
11
- end
12
-
13
- def key(app_id)
14
- if prefix
15
- "#{prefix}/#{app_id}.conf"
16
- else
17
- "#{app_id}.conf"
18
- end
19
- end
20
- end
21
-
22
- attr_reader :s3
23
-
24
- def initialize(*)
25
- super
26
- @s3 = S3Config.new(@definition.fetch('s3'))
27
- end
28
-
29
- def env
30
- super.merge(
31
- 'AWS_DEFAULT_REGION' => @s3.region,
32
- 'S3_CONFIG_BUCKET' => @s3.bucket,
33
- 'S3_CONFIG_KEY' => @s3.key(@app.id),
34
- )
35
- end
36
-
37
- DEFAULT_LINK = ['app:app'].freeze
38
-
39
- def links
40
- DEFAULT_LINK + super
41
- end
42
-
43
- def extra
44
- @definition.fetch('extra', {})
45
- end
46
-
47
- def generate_config(_app_port)
48
- raise NotImplementedError
49
- end
50
- end
51
- end
data/lib/hako/fronts.rb DELETED
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
- module Hako
3
- module Fronts
4
- end
5
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'erb'
3
- require 'hako/front'
4
-
5
- module Hako
6
- module Fronts
7
- class Nginx < Front
8
- def generate_config(app_port)
9
- listen_spec = "app:#{app_port}"
10
- ERB.new(File.read(nginx_conf_erb), nil, '-').result(binding)
11
- end
12
-
13
- private
14
-
15
- def templates_directory
16
- File.expand_path('../../templates', __FILE__)
17
- end
18
-
19
- def nginx_conf_erb
20
- File.join(templates_directory, 'nginx.conf.erb')
21
- end
22
-
23
- def nginx_location_conf_erb
24
- File.join(templates_directory, 'nginx.location.conf.erb')
25
- end
26
-
27
- def locations
28
- locs = extra.fetch('locations', {}).dup
29
- locs['/'] ||= {}
30
- locs.keys.each do |k|
31
- locs[k] = Location.new(locs[k])
32
- end
33
- locs
34
- end
35
-
36
- def client_max_body_size
37
- extra.fetch('client_max_body_size', nil)
38
- end
39
-
40
- def render_location(listen_spec, location)
41
- ERB.new(File.read(nginx_location_conf_erb), nil, '-').result(binding).each_line.map do |line|
42
- " #{line}"
43
- end.join('')
44
- end
45
-
46
- class Location
47
- def initialize(config)
48
- @config = config
49
- end
50
-
51
- def allow_only_from
52
- allow = @config.fetch('allow_only_from', nil)
53
- if allow
54
- allow.flatten
55
- end
56
- end
57
- end
58
- end
59
- end
60
- end