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 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