ecs_compose 0.1.0.pre23 → 0.1.0.pre26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ecs_compose.gemspec +1 -0
- data/lib/ecs_compose/compare.rb +1 -0
- data/lib/ecs_compose/plugins/plugin.rb +26 -0
- data/lib/ecs_compose/plugins/vault_plugin.rb +48 -0
- data/lib/ecs_compose/plugins.rb +15 -0
- data/lib/ecs_compose/task_definition.rb +57 -10
- data/lib/ecs_compose.rb +1 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be50de9cd4fa54757a557a57ad8f30a6e600acc1
|
4
|
+
data.tar.gz: 5b0ddfed2870445d82fee42e8ab325f7c4ee0f4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98fed5d3058dd67d385426ff19c10425ee2b99ec4239ab99ceaee3f38695409cff0a0c7695776a4554fe99fe67de031d57391bf6988b98b9c08ebfac206de57f
|
7
|
+
data.tar.gz: b58f20d5927e3c4092b338ab931f257046ce47286ebcb28e839fdbc7cbb3f740eb20049d02180cdc916742b6c8f5bd46e35797d03bb7a4271247884427738f31
|
data/ecs_compose.gemspec
CHANGED
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_dependency "docopt", "~> 0.5.0"
|
31
31
|
spec.add_dependency "colorize", "~> 0.7.7"
|
32
32
|
|
33
|
+
spec.add_development_dependency "vault", "~> 0.1.5"
|
33
34
|
spec.add_development_dependency "bundler", "~> 1.10"
|
34
35
|
spec.add_development_dependency "rake", "~> 10.0"
|
35
36
|
spec.add_development_dependency "rspec"
|
data/lib/ecs_compose/compare.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
module EcsCompose
|
2
|
+
module Plugins
|
3
|
+
# A list of all available plugins.
|
4
|
+
AVAILABLE_PLUGINS = []
|
5
|
+
|
6
|
+
# Subclass this class and add it to `AVAILABLE_PLUGINS` to extend
|
7
|
+
# `ecs_compose`.
|
8
|
+
class Plugin
|
9
|
+
# Does this plugin apply
|
10
|
+
def self.enabled?
|
11
|
+
false
|
12
|
+
end
|
13
|
+
|
14
|
+
# Normalize a task definition for comparison. This may remove
|
15
|
+
# certain environment variables, for example, that are allowed to
|
16
|
+
# vary from one deploy to the next.
|
17
|
+
def normalize_task_definition!(taskdef)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Called when we decide to skip a deploy because the previous version
|
21
|
+
# of the software appears to still be valid.
|
22
|
+
def notify_skipping_deploy(old, new)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module EcsCompose
|
2
|
+
module Plugins
|
3
|
+
|
4
|
+
class VaultPlugin
|
5
|
+
# We're enabled if we know about a vault server.
|
6
|
+
def self.enabled?
|
7
|
+
ENV.has_key?('VAULT_ADDR') && ENV.has_key?('VAULT_MASTER_TOKEN')
|
8
|
+
end
|
9
|
+
|
10
|
+
# Make sure that vault is loaded and configured.
|
11
|
+
def initialize
|
12
|
+
begin
|
13
|
+
require 'vault' unless defined?(Vault)
|
14
|
+
rescue
|
15
|
+
STDERR.puts("VAULT_ADDR defined, but `vault` gem not available")
|
16
|
+
exit(1)
|
17
|
+
end
|
18
|
+
Vault.address = ENV.fetch('VAULT_ADDR')
|
19
|
+
Vault.token = ENV.fetch('VAULT_MASTER_TOKEN')
|
20
|
+
end
|
21
|
+
|
22
|
+
# Normalize a task definition for comparison by removing VAULT_TOKEN
|
23
|
+
# from each of the containers' environments.
|
24
|
+
def normalize_task_definition!(taskdef)
|
25
|
+
containers = taskdef.fetch("containerDefinitions", [])
|
26
|
+
containers.each do |container|
|
27
|
+
env = container.fetch("environment", [])
|
28
|
+
env.reject! {|v| v.fetch("name") == "VAULT_TOKEN" }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Called when we decide to skip a deploy because the previous version
|
33
|
+
# of the software appears to still be valid.
|
34
|
+
def notify_skipping_deploy(old, new)
|
35
|
+
tokens = old
|
36
|
+
.fetch("containerDefinitions", [])
|
37
|
+
.map {|c| c.fetch("environment", []) }
|
38
|
+
.flatten
|
39
|
+
.select {|var| var.fetch("name") == "VAULT_TOKEN" }
|
40
|
+
.map {|var| var.fetch("value") }
|
41
|
+
puts "Renewing #{tokens.length} vault tokens"
|
42
|
+
tokens.each {|tok| Vault.auth_token.renew(tok) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
AVAILABLE_PLUGINS << VaultPlugin
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "ecs_compose/plugins/plugin"
|
2
|
+
require "ecs_compose/plugins/vault_plugin"
|
3
|
+
|
4
|
+
module EcsCompose
|
5
|
+
# Plugins which allow ecs-compose to work better with various third-party
|
6
|
+
# tools.
|
7
|
+
module Plugins
|
8
|
+
# A list of all enabled plugins. Generated on demand to make it easier
|
9
|
+
# to work with test suites.
|
10
|
+
def self.plugins
|
11
|
+
AVAILABLE_PLUGINS.select {|p| p.enabled? }.map {|p| p.new }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -21,22 +21,69 @@ module EcsCompose
|
|
21
21
|
# add a new version of the task. Returns a string of the form
|
22
22
|
# `"name:revision"` identifying the task we registered, or an existing
|
23
23
|
# task with the same properties.
|
24
|
-
def register
|
25
|
-
|
24
|
+
def register(deployed=nil)
|
25
|
+
# Describe the version we're currently running.
|
26
|
+
if deployed
|
27
|
+
existing = Ecs.describe_task_definition(deployed)
|
28
|
+
.fetch("taskDefinition")
|
29
|
+
else
|
30
|
+
existing = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
# Register the new version. We always need to do this, so that we
|
34
|
+
# can compare two officially normalized versions of the same task,
|
35
|
+
# including any fields added by Amazon.
|
26
36
|
new = register_new.fetch("taskDefinition")
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
37
|
+
|
38
|
+
# Decide whether we can re-use the existing registration.
|
39
|
+
if existing && Compare.task_definitions_match?(existing, new)
|
40
|
+
rev1 = "#{existing.fetch('family')}:#{existing.fetch('revision')}"
|
41
|
+
rev2 = "#{new.fetch('family')}:#{new.fetch('revision')}"
|
42
|
+
puts "Running copy of #{rev1} looks good; not updating to #{rev2}."
|
43
|
+
Plugins.plugins.each {|p| p.notify_skipping_deploy(existing, new) }
|
44
|
+
wanted = existing
|
45
|
+
else
|
46
|
+
wanted = new
|
47
|
+
end
|
48
|
+
"#{wanted.fetch('family')}:#{wanted.fetch('revision')}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# Get the existing "PRIMARY" deployment for the ECS service
|
52
|
+
# corresponding to this task definition, and return it in
|
53
|
+
# `name:revision` format. Returns `nil` if it can't find a primary
|
54
|
+
# deployment.
|
55
|
+
def primary_deployment(cluster)
|
56
|
+
# Try to describe the existing service.
|
57
|
+
begin
|
58
|
+
service = Ecs.describe_services(cluster.name, [@name])
|
59
|
+
.fetch("services")[0]
|
60
|
+
rescue => e
|
61
|
+
puts <<EOD
|
62
|
+
Error: #{e}
|
63
|
+
|
64
|
+
Can't find an existing service '#{name}'. You'll probably need to
|
65
|
+
register one manually using the AWS console and set up any load balancers
|
66
|
+
you might need.
|
67
|
+
EOD
|
68
|
+
return nil
|
69
|
+
end
|
70
|
+
|
71
|
+
# Find the primary deployment.
|
72
|
+
deployment = service.fetch("deployments").find do |d|
|
73
|
+
d["status"] == "PRIMARY"
|
74
|
+
end
|
75
|
+
return nil if deployment.nil?
|
76
|
+
|
77
|
+
# Extract a task definition `name:revision`.
|
78
|
+
arn = deployment.fetch("taskDefinition")
|
79
|
+
arn.split('/').last
|
34
80
|
end
|
35
81
|
|
36
82
|
# Register this task definition with ECS, and update the corresponding
|
37
83
|
# service.
|
38
84
|
def update(cluster)
|
39
|
-
|
85
|
+
deployed = primary_deployment(cluster)
|
86
|
+
Ecs.update_service(cluster.name, name, register(deployed))
|
40
87
|
name
|
41
88
|
end
|
42
89
|
|
data/lib/ecs_compose.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ecs_compose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.pre26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kidd
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.7.7
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: vault
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.1.5
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.5
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,6 +124,9 @@ files:
|
|
110
124
|
- lib/ecs_compose/ecs.rb
|
111
125
|
- lib/ecs_compose/json_generator.rb
|
112
126
|
- lib/ecs_compose/manifest.rb
|
127
|
+
- lib/ecs_compose/plugins.rb
|
128
|
+
- lib/ecs_compose/plugins/plugin.rb
|
129
|
+
- lib/ecs_compose/plugins/vault_plugin.rb
|
113
130
|
- lib/ecs_compose/service_error.rb
|
114
131
|
- lib/ecs_compose/task_definition.rb
|
115
132
|
- lib/ecs_compose/task_error.rb
|