aws_as_code 1.0.1 → 1.0.2
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/.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
|