cfndsl 0.13.1 → 0.14.0

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: 6f1ea58c47151076ab3ac17d4b08f54cf3570fe8
4
- data.tar.gz: 10efc2a3c4ac3a0bfe76a1a61548af07aaa7c727
3
+ metadata.gz: 17794b4c98827341ca1be479e9b41394e351bf0a
4
+ data.tar.gz: 96c8c7fb7868190f9e69268c9b0e331671c9ff92
5
5
  SHA512:
6
- metadata.gz: eee1534678839520fdcb4b930cca135311dabf794b09760885ff60b5aab8a1984ac79f493467d90809913cae4a1ddd98143432c80958d027028f796397be1746
7
- data.tar.gz: 1cd703f1dcf86a50ef64620c85735a537e7b9a00c75ac920c3cce121ae11630895027c06c96e6429f4455b9535a49431e769e61c55b0cc211eeb154b3573aa6b
6
+ metadata.gz: 140566d5b12c819b586e000deb5c1dca773bc2aecce051935fec314b9c72f3103e976afea2daf058fe61d9a8400e95e2b7ccd4ae7a6356c0239fac23ab287124
7
+ data.tar.gz: 354452707c917d0db1e41dc98fdddff6aa20f9ba35301a27dbfdd5af643c92e555542353a02142b5f7ea5c51bb3c76e10e1667cb7819ecd0e1501b5a5e743f10
data/.rubocop.yml CHANGED
@@ -21,6 +21,10 @@ Style/VariableName:
21
21
  Style/MethodName:
22
22
  Enabled: false
23
23
 
24
+ # Because of the way FnFormat was developed
25
+ Style/FormatStringToken:
26
+ Enabled: false
27
+
24
28
  # Lone String
25
29
  Lint/Void:
26
30
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,7 +1,22 @@
1
1
  # Change Log
2
2
 
3
- ## [0.13.1](https://github.com/stevenjack/cfndsl/tree/0.13.1) (2017-05-18)
4
- [Full Changelog](https://github.com/stevenjack/cfndsl/compare/v0.13.0...0.13.1)
3
+ ## [0.14.0](https://github.com/stevenjack/cfndsl/tree/0.14.0) (2017-06-15)
4
+ [Full Changelog](https://github.com/stevenjack/cfndsl/compare/v0.13.1...0.14.0)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - Adding support for auto generating cloudformation resources [\#326](https://github.com/stevenjack/cfndsl/pull/326) ([elmobp](https://github.com/elmobp))
9
+
10
+ **Closed issues:**
11
+
12
+ - Error reading specification file on 0.13.0 [\#322](https://github.com/stevenjack/cfndsl/issues/322)
13
+
14
+ **Merged pull requests:**
15
+
16
+ - Modernize cfndsl executable [\#319](https://github.com/stevenjack/cfndsl/pull/319) ([kornypoet](https://github.com/kornypoet))
17
+
18
+ ## [v0.13.1](https://github.com/stevenjack/cfndsl/tree/v0.13.1) (2017-05-17)
19
+ [Full Changelog](https://github.com/stevenjack/cfndsl/compare/v0.13.0...v0.13.1)
5
20
 
6
21
  **Implemented enhancements:**
7
22
 
data/README.md CHANGED
@@ -434,6 +434,11 @@ Usage: cfndsl [options] FILE
434
434
  -D, --define "VARIABLE=VALUE" Directly set local VARIABLE as VALUE
435
435
  -v, --verbose Turn on verbose ouptut
436
436
  -b, --disable-binding Disable binding configuration
437
+ -g RESOURCE_TYPE,RESOURCE_LOGICAL_NAME,
438
+ --generate Add resource type and logical name
439
+ -i, --indent TOKEN Use TOKEN for indent character (default space)
440
+ -l, --list List supported resources
441
+ -c, --indent-count [COUNT] Count of characters to use for indenting. (default: 2)
437
442
  -h, --help Display this screen
438
443
  ```
439
444
 
@@ -573,3 +578,21 @@ And then use rake to generate the cloudformation:
573
578
  ```bash
574
579
  $ bin/rake generate
575
580
  ```
581
+
582
+ ### Generating CloudFormation resources from cfndsl
583
+ By supplying the -g paramater you are now able to generate cloudformation resources for support objects, for a list of supported resources run cfndsl -l
584
+
585
+ Example
586
+ ```
587
+ cfndsl -g AWS::EC2::EIP,EIP
588
+ require 'cfndsl'
589
+ CloudFormation do
590
+ Description 'auto generated cloudformation cfndsl template'
591
+
592
+ EC2_EIP('EIP') do
593
+ Domain String # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html#cfn-ec2-eip-domain
594
+ InstanceId String # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html#cfn-ec2-eip-instanceid
595
+ end
596
+ end
597
+ ```
598
+ Many thanks to the base code from cfnlego to make this possible!
data/bin/cfndsl CHANGED
@@ -6,8 +6,9 @@ require 'fileutils'
6
6
  require 'json'
7
7
  require 'open-uri'
8
8
  require 'optparse'
9
+ require 'cfnlego'
9
10
 
10
- options = {}
11
+ options = { resources: [] }
11
12
 
12
13
  optparse = OptionParser.new do |opts|
13
14
  Version = CfnDsl::VERSION
@@ -37,7 +38,8 @@ optparse = OptionParser.new do |opts|
37
38
  end
38
39
 
39
40
  opts.on('-f', '--format FORMAT', 'Specify the output format (JSON default)') do |format|
40
- raise "Format #{format} not supported" unless format == 'json' || format == 'yaml'
41
+ types = %w[json yaml]
42
+ raise "Format #{format} not supported" unless types.include? format
41
43
  options[:outformat] = format
42
44
  end
43
45
 
@@ -62,6 +64,16 @@ optparse = OptionParser.new do |opts|
62
64
  options[:update_spec] = true
63
65
  end
64
66
 
67
+ opts.on('-g', '--generate RESOURCE_TYPE,RESOURCE_LOGICAL_NAME', 'Add resource type and logical name') do |r|
68
+ options[:lego] = true
69
+ options[:resources] << r
70
+ end
71
+
72
+ opts.on('-l', '--list', 'List supported resources') do
73
+ puts Cfnlego.Resources.sort
74
+ exit
75
+ end
76
+
65
77
  # This displays the help screen, all programs are
66
78
  # assumed to have this option.
67
79
  opts.on('-h', '--help', 'Display this screen') do
@@ -80,6 +92,11 @@ if options[:update_spec]
80
92
  STDERR.puts "Specification successfully written to #{CfnDsl.specification_file}"
81
93
  end
82
94
 
95
+ if options[:lego]
96
+ puts Cfnlego.run(options)
97
+ exit
98
+ end
99
+
83
100
  if ARGV.empty?
84
101
  if options[:update_spec]
85
102
  exit 0
data/lib/cfndsl/errors.rb CHANGED
@@ -7,8 +7,8 @@ module CfnDsl
7
7
  if idx.nil?
8
8
  @errors.push(err + "\n" + caller.join("\n") + "\n")
9
9
  else
10
- m = caller[idx].match(/^.*?:\d+:/)
11
- err_loc = m ? m[0] : caller[idx]
10
+ m = caller(idx..idx).first.match(/^.*?:\d+:/)
11
+ err_loc = m ? m[0] : caller(idx..idx).first
12
12
 
13
13
  @errors.push(err_loc + ' ' + err + "\n")
14
14
  end
@@ -1,3 +1,3 @@
1
1
  module CfnDsl
2
- VERSION = '0.13.1'.freeze
2
+ VERSION = '0.14.0'.freeze
3
3
  end
data/lib/cfnlego.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'yaml'
2
+ require 'erb'
3
+ require 'cfnlego/cloudformation'
4
+ require 'cfnlego/resource'
5
+ require 'net/http'
6
+ require 'uri'
7
+
8
+ # Cfnlego
9
+ module Cfnlego
10
+ def self.Resources
11
+ content = fetch_resource_content
12
+ supported_resources = JSON.parse(content)
13
+ resources = []
14
+ supported_resources['ResourceTypes'].each do |resource, _value|
15
+ resources << resource
16
+ end
17
+ resources
18
+ end
19
+
20
+ def self.fetch_resource_content
21
+ File.read(CfnDsl.specification_file)
22
+ end
23
+
24
+ def self.run(options)
25
+ # Constructure Resources
26
+ resources = []
27
+ options[:resources].each do |r|
28
+ /(.*),(.*)/.match(r) do |m|
29
+ type = m[1]
30
+ name = m[2]
31
+ resources << Cfnlego::Resource.new(type, name)
32
+ end
33
+ end
34
+
35
+ begin
36
+ return Cfnlego::CloudFormation.new(resources).render
37
+ rescue RuntimeError => e
38
+ $stderr.puts "Error: #{e.message}"
39
+ end
40
+ nil
41
+ end
42
+ end
@@ -0,0 +1,21 @@
1
+ require 'cfndsl'
2
+ CloudFormation do
3
+ Description '<%= @description %>'
4
+ <%- @resources.each do |r| -%>
5
+ <% restype = r.type.split('::').delete_if{|i|i=='AWS'}
6
+ restype = restype.join('::').gsub('::', '_') %>
7
+ <%= restype %>('<%= r.name %>') do
8
+ <%- ps = r.properties -%>
9
+ <%- ps.keys.each do |p| -%>
10
+ <%- if !r.properties[p]['PrimitiveType'].nil?
11
+ type = r.properties[p]['PrimitiveType']
12
+ elsif r.properties[p]['Type'] == 'List'
13
+ type = '[List]'
14
+ else
15
+ type = r.properties[p]['Type']
16
+ end -%>
17
+ <%= p %> <%= type %> # <%= r.properties[p]['Documentation'] %>
18
+ <%- end -%>
19
+ end
20
+ <% end -%>
21
+ end
@@ -0,0 +1,19 @@
1
+ # Cfnlego
2
+ module Cfnlego
3
+ # CloudFormation
4
+ class CloudFormation
5
+ TEMPLATE = "#{File.dirname(__FILE__)}/cloudformation.erb".freeze
6
+
7
+ attr_reader :resources
8
+
9
+ def initialize(resources)
10
+ @description = 'auto generated cloudformation cfndsl template'
11
+ @resources = resources
12
+ end
13
+
14
+ def render
15
+ erb = ERB.new(File.read(TEMPLATE), nil, '-')
16
+ erb.result(binding)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ require 'yaml'
2
+ require 'net/http'
3
+ require 'uri'
4
+
5
+ # Cfnlego
6
+ module Cfnlego
7
+ # Resource
8
+ class Resource
9
+ attr_reader :type, :name
10
+
11
+ def initialize(type, name)
12
+ @type = type
13
+ @name = name
14
+ end
15
+
16
+ def attributes
17
+ definition['Attributes']
18
+ end
19
+
20
+ def properties
21
+ definition['Properties']
22
+ end
23
+
24
+ private
25
+
26
+ def definition
27
+ content = Cfnlego.fetch_resource_content
28
+ datainput = JSON.parse(content)
29
+ data = datainput['ResourceTypes']
30
+ begin
31
+ @definition ||= data[@type]
32
+ rescue
33
+ raise "unknown #{@type}, no matching definition found"
34
+ end
35
+ end
36
+ end
37
+ end
data/spec/cli_spec.rb CHANGED
@@ -15,6 +15,9 @@ describe 'cfndsl', type: :aruba do
15
15
  -b, --disable-binding Disable binding configuration
16
16
  -s, --specification-file FILE Location of Cloudformation Resource Specification file
17
17
  -u, --update-specification Update the Cloudformation Resource Specification file
18
+ -g RESOURCE_TYPE,RESOURCE_LOGICAL_NAME,
19
+ --generate Add resource type and logical name
20
+ -l, --list List supported resources
18
21
  -h, --help Display this screen
19
22
  USAGE
20
23
  end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+ describe Cfnlego do
3
+ let(:template) { Cfnlego.run(resources: ['AWS::EC2::EIP,EIP']) }
4
+
5
+ context '#Export' do
6
+ it 'formats correctly' do
7
+ output = "require 'cfndsl'\nCloudFormation do\n Description 'auto generated cloudformation cfndsl template'\n\n "
8
+ output << " EC2_EIP('EIP') do\n Domain String "
9
+ output << '# http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html#cfn-ec2-eip-domain'
10
+ output << "\n InstanceId String # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html#cfn-ec2-eip-instanceid"
11
+ output << "\n end\nend\n"
12
+ expect(template).to eq output
13
+ end
14
+ end
15
+ end
data/spec/spec_helper.rb CHANGED
@@ -13,6 +13,7 @@ require 'cfndsl/globals'
13
13
  CfnDsl.specification_file File.expand_path('../../lib/cfndsl/aws/resource_specification.json', __FILE__)
14
14
  # use local fixture for tests
15
15
  require 'cfndsl'
16
+ require 'cfnlego'
16
17
 
17
18
  bindir = File.expand_path('../../bin', __FILE__)
18
19
  ENV['PATH'] = [ENV['PATH'], bindir].join(':')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfndsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Jack
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-05-17 00:00:00.000000000 Z
12
+ date: 2017-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -75,6 +75,10 @@ files:
75
75
  - lib/cfndsl/types.rb
76
76
  - lib/cfndsl/update_policy.rb
77
77
  - lib/cfndsl/version.rb
78
+ - lib/cfnlego.rb
79
+ - lib/cfnlego/cloudformation.erb
80
+ - lib/cfnlego/cloudformation.rb
81
+ - lib/cfnlego/resource.rb
78
82
  - sample/autoscale.rb
79
83
  - sample/autoscale.template
80
84
  - sample/autoscale2.rb
@@ -106,6 +110,7 @@ files:
106
110
  - spec/fixtures/serverless-api.json
107
111
  - spec/fixtures/serverless-function.json
108
112
  - spec/fixtures/test.rb
113
+ - spec/generate_spec.rb
109
114
  - spec/heat_template_spec.rb
110
115
  - spec/jsonable_spec.rb
111
116
  - spec/metadata_spec.rb
@@ -158,6 +163,7 @@ test_files:
158
163
  - spec/fixtures/serverless-api.json
159
164
  - spec/fixtures/serverless-function.json
160
165
  - spec/fixtures/test.rb
166
+ - spec/generate_spec.rb
161
167
  - spec/heat_template_spec.rb
162
168
  - spec/jsonable_spec.rb
163
169
  - spec/metadata_spec.rb