aws_as_code 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/bin/aws-as-code +1 -0
- data/exe/aws-as-code +3 -0
- data/lib/aws_as_code.rb +46 -0
- data/lib/aws_as_code/concerns/aws_task_helpers.rb +2 -1
- data/lib/aws_as_code/dsl/cache_instances.rb +14 -0
- data/lib/aws_as_code/dsl/ec2_instances.rb +41 -0
- data/lib/aws_as_code/dsl/rds_instances.rb +14 -0
- data/lib/aws_as_code/stack_state_semaphore.rb +3 -1
- data/lib/aws_as_code/task/compile.rb +66 -8
- data/lib/aws_as_code/task/create.rb +13 -1
- data/lib/aws_as_code/task/update.rb +41 -1
- data/lib/aws_as_code/task/upload.rb +5 -1
- data/lib/aws_as_code/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 845781da3a27dfdea57874670229deee74f64c31
|
4
|
+
data.tar.gz: e3ca61b0478a6e28b19d7ebab071fdee03dc14ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45590824f2c89688adc10c8edbac361eb7aa15a041eae67d404a565607f0246d4ecdf616114d3f520187cec8f822fc82b3725fc63260b25eebf8f0ef439a3a39
|
7
|
+
data.tar.gz: fd4970255bcc21d2ce6ec03875eb717e60e30142bd2d106b5f2f25985a0f08320dc7494e957592f2183fc977d2b7fe52605df67f9ab53e98800cb50402bd31ad
|
data/.rubocop.yml
CHANGED
data/bin/aws-as-code
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative "../exe/aws-as-code"
|
data/exe/aws-as-code
CHANGED
@@ -14,11 +14,14 @@ DEFAULT_TEMPLATE = "environment".freeze
|
|
14
14
|
|
15
15
|
# Main CLI application for aws-as-code gem
|
16
16
|
class AwsAsCodeCli < Thor
|
17
|
+
class_option :config_dir, default: DEFAULT_RUBY_DIR
|
17
18
|
class_option :ruby_dir, default: DEFAULT_RUBY_DIR
|
18
19
|
class_option :json_dir, default: DEFAULT_JSON_DIR
|
19
20
|
class_option :bucket, required: true
|
20
21
|
class_option :template, default: DEFAULT_TEMPLATE
|
21
22
|
class_option :stack, default: DEFAULT_STACK
|
23
|
+
class_option :stack_params, type: :hash, default: Hash[]
|
24
|
+
class_option :version, required: true
|
22
25
|
|
23
26
|
desc "compile", "compile cfndsl to CF JSON"
|
24
27
|
def compile
|
data/lib/aws_as_code.rb
CHANGED
@@ -2,8 +2,54 @@
|
|
2
2
|
require "aws_as_code/version"
|
3
3
|
require "aws_as_code/stack_state_semaphore"
|
4
4
|
require "aws_as_code/concerns/aws_task_helpers"
|
5
|
+
require "aws_as_code/dsl/cache_instances"
|
6
|
+
require "aws_as_code/dsl/ec2_instances"
|
7
|
+
require "aws_as_code/dsl/rds_instances"
|
5
8
|
require "aws_as_code/task/base"
|
6
9
|
require "aws_as_code/task/compile"
|
7
10
|
require "aws_as_code/task/upload"
|
8
11
|
require "aws_as_code/task/create"
|
9
12
|
require "aws_as_code/task/update"
|
13
|
+
|
14
|
+
module CfnDsl
|
15
|
+
class JSONable
|
16
|
+
def parameter_type(type)
|
17
|
+
case type
|
18
|
+
when "String" then String()
|
19
|
+
when "Number" then Number()
|
20
|
+
when "CommaDelimitedList" then CommaDelimitedList()
|
21
|
+
else raise ArgumentError, "Unknown parameter type #{type}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def inputs(env = nil)
|
26
|
+
params(env).each do |name, data|
|
27
|
+
Parameter name do
|
28
|
+
parameter_type data["Type"]
|
29
|
+
|
30
|
+
Default data["Default"] unless data["Default"].nil?
|
31
|
+
Description data["Description"] unless data["Description"].nil?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def env_passthrough(env = nil)
|
37
|
+
Hash[
|
38
|
+
params(env).to_a.map do |pair|
|
39
|
+
k = pair.first
|
40
|
+
[k, Ref(k)]
|
41
|
+
end
|
42
|
+
]
|
43
|
+
end
|
44
|
+
|
45
|
+
def env_ebs_options(env = nil)
|
46
|
+
params(env).map do |name, data|
|
47
|
+
{
|
48
|
+
Namespace: "aws:elasticbeanstalk:application:environment",
|
49
|
+
OptionName: data["_ext"]["env"],
|
50
|
+
Value: Ref(name)
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -21,7 +21,8 @@ module AwsAsCode
|
|
21
21
|
|
22
22
|
def template_object
|
23
23
|
bucket = s3.bucket config.bucket
|
24
|
-
|
24
|
+
prefix = "#{config.stack}/#{config.version}"
|
25
|
+
bucket.object "#{prefix}/#{config.template}.json"
|
25
26
|
end
|
26
27
|
end
|
27
28
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
CACHE_INSTANCE_CLASSES = %w(
|
2
|
+
cache.t2.micro
|
3
|
+
cache.t2.small
|
4
|
+
cache.t2.medium
|
5
|
+
cache.m3.medium
|
6
|
+
cache.m3.large
|
7
|
+
cache.m3.xlarge
|
8
|
+
cache.m3.2xlarge
|
9
|
+
cache.r3.large
|
10
|
+
cache.r3.xlarge
|
11
|
+
cache.r3.2xlarge
|
12
|
+
cache.r3.4xlarge
|
13
|
+
cache.r3.8xlarge
|
14
|
+
).freeze
|
@@ -0,0 +1,41 @@
|
|
1
|
+
EC2_INSTANCE_CLASSES = %w(
|
2
|
+
c3.2xlarge
|
3
|
+
c3.4xlarge
|
4
|
+
c3.8xlarge
|
5
|
+
c3.large
|
6
|
+
c3.xlarge
|
7
|
+
c4.2xlarge
|
8
|
+
c4.4xlarge
|
9
|
+
c4.8xlarge
|
10
|
+
c4.large
|
11
|
+
c4.xlarge
|
12
|
+
d2.2xlarge
|
13
|
+
d2.4xlarge
|
14
|
+
d2.xlarge
|
15
|
+
d3.8xlarge
|
16
|
+
g2.2xlarge
|
17
|
+
g2.8xlarge
|
18
|
+
i2.2xlarge
|
19
|
+
i2.4xlarge
|
20
|
+
i2.8xlarge
|
21
|
+
i2.xlarge
|
22
|
+
m3.2xlarge
|
23
|
+
m3.large
|
24
|
+
m3.medium
|
25
|
+
m3.xlarge
|
26
|
+
m4.10xlarge
|
27
|
+
m4.2xlarge
|
28
|
+
m4.4xlarge
|
29
|
+
m4.large
|
30
|
+
m4.xlarge
|
31
|
+
r3.2xlarge
|
32
|
+
r3.4xlarge
|
33
|
+
r3.8xlarge
|
34
|
+
r3.large
|
35
|
+
r3.xlarge
|
36
|
+
t2.large
|
37
|
+
t2.medium
|
38
|
+
t2.micro
|
39
|
+
t2.nano
|
40
|
+
t2.small
|
41
|
+
).freeze
|
@@ -15,7 +15,9 @@ module AwsAsCode
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def wait_for_stack_availability(stack)
|
18
|
-
stack
|
18
|
+
# Note that stack can have old state cached, hence explicit
|
19
|
+
# .reload here
|
20
|
+
stack.reload.wait_until(max_attempts: 360, delay: 10) do |s|
|
19
21
|
if in_progress? s
|
20
22
|
log_waiting s
|
21
23
|
false
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require "cfndsl"
|
2
|
+
require "yaml"
|
3
|
+
require "fileutils"
|
2
4
|
|
3
5
|
# frozen_string_literal: true
|
4
6
|
module AwsAsCode
|
@@ -18,17 +20,73 @@ module AwsAsCode
|
|
18
20
|
|
19
21
|
private
|
20
22
|
|
23
|
+
def load_params
|
24
|
+
param_filename = File.join config.config_dir, "parameters.yml"
|
25
|
+
return [] unless File.exist? param_filename
|
26
|
+
YAML.load_file(param_filename).to_a
|
27
|
+
end
|
28
|
+
|
29
|
+
def def_params
|
30
|
+
pairs = load_params
|
31
|
+
|
32
|
+
CfnDsl::JSONable.send :define_method, :params do |env = nil|
|
33
|
+
pairs.reject do |pair|
|
34
|
+
data = pair.last
|
35
|
+
services = data["_ext"]["services"]
|
36
|
+
|
37
|
+
!env.nil? &&
|
38
|
+
!services.nil? &&
|
39
|
+
!services.include?(env)
|
40
|
+
end.to_h
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def def_template_url
|
45
|
+
c = config
|
46
|
+
CfnDsl::JSONable.send :define_method, :template_url do |name|
|
47
|
+
prefix = "#{c.stack}/#{c.version}"
|
48
|
+
"https://s3.amazonaws.com/#{c.bucket}/#{prefix}/#{name}.json"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def load_settings
|
53
|
+
filename = File.join config.config_dir, "settings.yml"
|
54
|
+
YAML.load_file(filename)
|
55
|
+
end
|
56
|
+
|
57
|
+
def def_settings
|
58
|
+
data = load_settings
|
59
|
+
c = config
|
60
|
+
CfnDsl::JSONable.send :define_method, :setting do |name|
|
61
|
+
data[name][c.stack] || data[name]["_default"]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
21
65
|
def compile_single_file(filename)
|
22
|
-
|
23
|
-
|
66
|
+
def_params
|
67
|
+
def_settings
|
68
|
+
def_template_url
|
69
|
+
|
70
|
+
cfn = binding.eval(File.read(filename), filename)
|
71
|
+
save_output cfn, filename
|
72
|
+
end
|
73
|
+
|
74
|
+
def save_output(cfn, filename)
|
75
|
+
dest = File.join config.json_dir,
|
76
|
+
output_pathname(filename)
|
24
77
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
78
|
+
dirname = File.dirname(dest)
|
79
|
+
FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
|
80
|
+
|
81
|
+
File.open(dest, "w") { |f| f.write cfn.to_json }
|
82
|
+
end
|
30
83
|
|
31
|
-
|
84
|
+
def output_pathname(filename)
|
85
|
+
Pathname
|
86
|
+
.new(filename)
|
87
|
+
.relative_path_from(Pathname.new(config.ruby_dir))
|
88
|
+
.sub_ext(".json")
|
89
|
+
.to_s
|
32
90
|
end
|
33
91
|
|
34
92
|
def input_files
|
@@ -8,9 +8,21 @@ module AwsAsCode
|
|
8
8
|
cloud_formation
|
9
9
|
.create_stack stack_name: config.stack,
|
10
10
|
template_url: template_object.public_url,
|
11
|
-
parameters:
|
11
|
+
parameters: parameters
|
12
12
|
semaphore.wait_for_stack_availability stack
|
13
13
|
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def parameters
|
18
|
+
config.stack_params.to_a.map do |pair|
|
19
|
+
k, v = pair
|
20
|
+
{
|
21
|
+
parameter_key: k.to_s,
|
22
|
+
parameter_value: v
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
14
26
|
end
|
15
27
|
end
|
16
28
|
end
|
@@ -9,9 +9,49 @@ module AwsAsCode
|
|
9
9
|
cloud_formation
|
10
10
|
.update_stack stack_name: config.stack,
|
11
11
|
template_url: template_object.public_url,
|
12
|
-
parameters:
|
12
|
+
parameters: parameters
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def parameters
|
19
|
+
existing_parameters + overridden_parameters
|
20
|
+
end
|
21
|
+
|
22
|
+
def existing_parameters
|
23
|
+
keys = stack.parameters.map(&:parameter_key)
|
24
|
+
(keys - removed_keys - overridden_keys).map do |key|
|
25
|
+
{
|
26
|
+
parameter_key: key,
|
27
|
+
use_previous_value: true
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def removed_keys
|
33
|
+
config.stack_params.to_a.map do |pair|
|
34
|
+
k, v = pair
|
35
|
+
v.empty? ? k.to_s : nil
|
36
|
+
end.compact
|
37
|
+
end
|
38
|
+
|
39
|
+
def overridden_keys
|
40
|
+
overridden_parameters.map { |p| p[:parameter_key] }
|
41
|
+
end
|
42
|
+
|
43
|
+
def overridden_parameters
|
44
|
+
config.stack_params.to_a.map do |pair|
|
45
|
+
k, v = pair
|
46
|
+
|
47
|
+
next nil if v.empty?
|
48
|
+
|
49
|
+
{
|
50
|
+
parameter_key: k.to_s,
|
51
|
+
parameter_value: v
|
52
|
+
}
|
53
|
+
end.compact
|
54
|
+
end
|
15
55
|
end
|
16
56
|
end
|
17
57
|
end
|
data/lib/aws_as_code/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws_as_code
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Konstantin Burnaev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cfndsl
|
@@ -213,12 +213,16 @@ files:
|
|
213
213
|
- README.md
|
214
214
|
- Rakefile
|
215
215
|
- aws-as-code.gemspec
|
216
|
+
- bin/aws-as-code
|
216
217
|
- bin/console
|
217
218
|
- bin/setup
|
218
219
|
- circle.yml
|
219
220
|
- exe/aws-as-code
|
220
221
|
- lib/aws_as_code.rb
|
221
222
|
- lib/aws_as_code/concerns/aws_task_helpers.rb
|
223
|
+
- lib/aws_as_code/dsl/cache_instances.rb
|
224
|
+
- lib/aws_as_code/dsl/ec2_instances.rb
|
225
|
+
- lib/aws_as_code/dsl/rds_instances.rb
|
222
226
|
- lib/aws_as_code/stack_state_semaphore.rb
|
223
227
|
- lib/aws_as_code/task/base.rb
|
224
228
|
- lib/aws_as_code/task/compile.rb
|