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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eade5597ca3f105f6391f9d610d8f221fb206e67
4
- data.tar.gz: 0416d1eae2493a8bf05d8d3a35cbf900b598f0f4
3
+ metadata.gz: 845781da3a27dfdea57874670229deee74f64c31
4
+ data.tar.gz: e3ca61b0478a6e28b19d7ebab071fdee03dc14ba
5
5
  SHA512:
6
- metadata.gz: 94799f73045ee7899ed3301c9f6308a5322d9baeb3382817fdb70bd939a4cb5a9d36cf4c7747c58170653a1d2583f0867af8508c07b6ce4c8f1cb59ffc1785af
7
- data.tar.gz: bc3ea12b89769e178244729d96066e415527eeb966677eced702e61c7be314185a0880b662accac95d2ce9ee5996838d0acee70ec3639d0e6657b883fd5682e4
6
+ metadata.gz: 45590824f2c89688adc10c8edbac361eb7aa15a041eae67d404a565607f0246d4ecdf616114d3f520187cec8f822fc82b3725fc63260b25eebf8f0ef439a3a39
7
+ data.tar.gz: fd4970255bcc21d2ce6ec03875eb717e60e30142bd2d106b5f2f25985a0f08320dc7494e957592f2183fc977d2b7fe52605df67f9ab53e98800cb50402bd31ad
data/.rubocop.yml CHANGED
@@ -8,6 +8,7 @@ AllCops:
8
8
  - "spec/**/*"
9
9
  - "features/**/*"
10
10
  - "db/schema.rb"
11
+ - "*.gemspec"
11
12
 
12
13
  Style/StringLiterals:
13
14
  EnforcedStyle: double_quotes
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
- bucket.object "#{config.stack}/#{config.template}.json"
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
@@ -0,0 +1,14 @@
1
+ RDS_INSTANCE_CLASSES = %w(
2
+ db.m3.medium
3
+ db.m3.large
4
+ db.m3.xlarge
5
+ db.m3.2xlarge
6
+ db.r3.large
7
+ db.r3.xlarge
8
+ db.r3.2xlarge
9
+ db.r3.4xlarge
10
+ db.r3.8xlarge
11
+ db.t2.micro
12
+ db.t2.small
13
+ db.t2.medium
14
+ ).freeze
@@ -15,7 +15,9 @@ module AwsAsCode
15
15
  end
16
16
 
17
17
  def wait_for_stack_availability(stack)
18
- stack.wait_until(max_attempts: 360, delay: 10) do |s|
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
- output_filename = File.basename(filename, ".rb") + ".json"
23
- output_pathname = File.join config.json_dir, output_filename
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
- cfn = CfnDsl.eval_file_with_extras(
26
- filename,
27
- [],
28
- STDERR
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
- File.open(output_pathname, "w") { |f| f.write cfn.to_json }
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
@@ -30,7 +30,11 @@ module AwsAsCode
30
30
  .relative_path_from(config_path)
31
31
  .to_s
32
32
 
33
- [config.stack, key].join("/")
33
+ [
34
+ config.stack,
35
+ config.version,
36
+ key
37
+ ].join("/")
34
38
  end
35
39
 
36
40
  def input_files
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module AwsAsCode
3
- VERSION = "1.0.1".freeze
3
+ VERSION = "1.0.2".freeze
4
4
  end
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.1
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-09-25 00:00:00.000000000 Z
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