cfndsl-pipeline 0.1.2 → 0.1.4

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.
data/lib/options.rb CHANGED
@@ -1,10 +1,15 @@
1
1
  # frozen_string_literal: true
2
+ require 'cfn-nag/custom_rule_loader'
3
+ require 'cfn-nag/cfn_nag_config'
2
4
 
3
5
  module CfnDslPipeline
6
+ #
4
7
  class Options
5
- attr_accessor :aws_region, :validation_bucket, :save_audit_report, :validate_syntax, :save_syntax_report, :validate_cfn_nag, :validate_output, :estimate_cost, :dump_deploy_params, :cfn_nag, :debug_audit
6
- def initialize()
7
- self.aws_region = 'ap-southeast-2'
8
+ attr_accessor :aws_region, :validation_bucket, :estimate_cost, :dump_deploy_params, :cfn_nag
9
+ attr_accessor :validate_cfn_nag, :save_audit_report, :validate_syntax, :save_syntax_report, :validate_output
10
+ attr_accessor :debug_audit, :debug_pipeline, :debug_cfndsl
11
+ def initialize
12
+ self.aws_region = ENV['AWS_REGION'] || 'ap-southeast-2'
8
13
  self.validation_bucket = ''
9
14
  self.validate_cfn_nag = false
10
15
  self.validate_syntax = false
@@ -12,6 +17,8 @@ module CfnDslPipeline
12
17
  self.save_syntax_report = false
13
18
  self.dump_deploy_params = false
14
19
  self.save_audit_report = false
20
+ self.debug_pipeline = false
21
+ self.debug_cfndsl = false
15
22
  self.debug_audit = false
16
23
  self.cfn_nag = CfnNagConfig.new(
17
24
  print_suppression: false,
@@ -20,4 +27,3 @@ module CfnDslPipeline
20
27
  end
21
28
  end
22
29
  end
23
-
data/lib/params.rb CHANGED
@@ -2,14 +2,15 @@
2
2
  require 'shellwords'
3
3
 
4
4
  module CfnDslPipeline
5
+ #
5
6
  class Pipeline
6
- def exec_dump_params
7
- param_filename = "#{self.output_dir}/#{self.base_name}.params"
7
+ def exec_dump_params
8
+ param_filename = "#{output_dir}/#{base_name}.params"
8
9
  puts "Deploy parameters written to #{param_filename}"
9
10
  param_file = File.open(File.expand_path(param_filename), 'w')
10
- self.syntax_report['parameters'].each do | param |
11
- param_file.puts "#{param['parameter_key']}=#{Shellwords.escape(param['default_value'])}"
11
+ syntax_report['parameters'].each do |param|
12
+ param_file.puts "#{param['parameter_key']}=#{param['default_value']}"
12
13
  end
13
14
  end
14
15
  end
15
- end
16
+ end
data/lib/version.rb CHANGED
@@ -1,3 +1,4 @@
1
+ #
1
2
  module CfnDslPipeline
2
- VERSION = "0.1.2"
3
+ VERSION = '0.1.4'
3
4
  end
@@ -0,0 +1,11 @@
1
+ require "cfndsl"
2
+
3
+ RSpec.describe CfnDslPipeline do
4
+ it "has a version number" do
5
+ expect(CfnDslPipeline::VERSION).not_to be nil
6
+ end
7
+
8
+ it "does something useful" do
9
+ expect(true).to eq(true)
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ require 'bundler/setup'
2
+ require 'cfndsl'
3
+ require 'cfndsl-pipeline'
4
+
5
+ RSpec.configure do |config|
6
+ # Enable flags like --only-failures and --next-failure
7
+ config.example_status_persistence_file_path = '.rspec_status'
8
+
9
+ # Disable RSpec exposing methods globally on `Module` and `main`
10
+ config.disable_monkey_patching!
11
+
12
+ config.expect_with :rspec do |c|
13
+ c.syntax = :expect
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfndsl-pipeline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cam Maxwell
@@ -14,86 +14,156 @@ dependencies:
14
14
  name: cfn-nag
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.4.35
19
+ version: '0.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.4.35
26
+ version: '0.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: cfndsl
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.17.0
33
+ version: '0.17'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.17.0
40
+ version: '0.17'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: aws-sdk-cloudformation
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.25.0
47
+ version: '1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '='
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.25.0
54
+ version: '1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: aws-sdk-s3
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '='
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.46.0
61
+ version: '1'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '='
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.46.0
68
+ version: '1'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: uuid
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '='
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 2.3.9
75
+ version: '2.3'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '='
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 2.3.9
82
+ version: '2.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: colorize
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '='
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.8.1
89
+ version: '0.8'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '='
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.8.1
96
+ version: '0.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bundler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.5'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.5'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: cfndsl
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 0.49.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: 0.49.0
97
167
  description: Integrated CfnDsl CloudFormation template generation pipeline that integrates
98
168
  cfn_nag, AWS template validation, and AWS template costing (where possible), and
99
169
  generated `aws cloudformation deploy` compatible parameters files
@@ -103,16 +173,35 @@ executables:
103
173
  extensions: []
104
174
  extra_rdoc_files: []
105
175
  files:
176
+ - ".gitignore"
177
+ - ".rspec"
178
+ - ".rubocop.yml"
179
+ - ".travis.yml"
180
+ - Gemfile
181
+ - Guardfile
182
+ - LICENCE
183
+ - README.md
184
+ - Rakefile
106
185
  - bin/cfndsl_pipeline
186
+ - cfndsl-pipeline.gemspec
187
+ - examples/common_definitions.yaml
188
+ - examples/pipeline_multple_files.rb
189
+ - examples/pipeline_single_file.rb
190
+ - examples/s3bucket.rb
191
+ - examples/s3bucket.yaml
192
+ - examples/standard_tags.yaml
107
193
  - lib/cfndsl-pipeline.rb
108
- - lib/monkey_patches.rb
194
+ - lib/cli_options.rb
195
+ - lib/exec_cfn_nag.rb
196
+ - lib/exec_cfndsl.rb
197
+ - lib/exec_syntax.rb
198
+ - lib/monkey-patches/cfndsl_patch.rb
199
+ - lib/monkey-patches/stdout_capture.rb
109
200
  - lib/options.rb
110
201
  - lib/params.rb
111
- - lib/run-cfn_nag.rb
112
- - lib/run-cfndsl.rb
113
- - lib/run-syntax.rb
114
- - lib/stdout_capture.rb
115
202
  - lib/version.rb
203
+ - spec/cfndsl/pipeline_spec.rb
204
+ - spec/spec_helper.rb
116
205
  homepage: https://github.com/cmaxwellau/cfndsl-pipeline.git
117
206
  licenses:
118
207
  - MIT
data/lib/run-cfn_nag.rb DELETED
@@ -1,38 +0,0 @@
1
- require 'cfn-nag'
2
- require 'colorize'
3
-
4
- module CfnDslPipeline
5
-
6
- class Pipeline
7
- def exec_cfn_nag
8
- puts "Auditing template with cfn-nag..."
9
-
10
- CfnNagLogging.configure_logging({:debug => self.options.debug_audit})
11
- cfn_nag = CfnNag.new(config: self.options.cfn_nag)
12
- result = cfn_nag.audit(cloudformation_string: self.template)
13
- if self.options.save_audit_report
14
- audit_report = Capture.capture do
15
- SimpleStdoutResults.new.render([{
16
- filename: output_filename,
17
- file_results: result
18
- }])
19
- end
20
- audit_filename = "#{self.output_dir}/#{self.base_name}.audit"
21
- File.open(File.expand_path(audit_filename), 'w').puts audit_report['stdout']
22
- puts "Saved audit report to #{audit_filename}"
23
- if result[:failure_count]>0
24
- puts "Audit failed. #{result[:failure_count]} error(s) found ( ಠ ʖ̯ ಠ) ".red
25
- elsif result[:violations].count>0
26
- puts "Audit passed with #{result[:warning_count]} warnings. (._.) ".yellow
27
- else
28
- puts "Audit passed! ヽ( ゚ヮ゚)/ ヽ(´ー`)ノ".green
29
- end
30
- else
31
- ColoredStdoutResults.new.render([{
32
- filename: "cfn-nag results:",
33
- file_results: result
34
- }])
35
- end
36
- end
37
- end
38
- end
data/lib/run-syntax.rb DELETED
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'aws-sdk-cloudformation'
3
- require 'aws-sdk-s3'
4
- require 'uuid'
5
-
6
-
7
- module CfnDslPipeline
8
- class Pipeline
9
- attr_accessor :cfn_client, :s3_client
10
-
11
- def initialize
12
- self.cfn_client = Aws::CloudFormation::Client.new(region: self.aws_region)
13
- self.s3_client = Aws::S3::Client.new(region: self.aws_region)
14
- end
15
-
16
- def exec_syntax_validation
17
- print "Validating template syntax...\n"
18
- if self.options.estimate_cost || (self.output_file.size > 51200)
19
- puts "Filesize is greater than 51200, or cost estimation required. Validating via S3 bucket "
20
- uuid = UUID.new
21
- object_name = "#{uuid.generate}"
22
-
23
- if self.options.validation_bucket
24
- bucket_name = self.options.validation_bucket
25
- puts "Using existing S3 bucket #{bucket_name}..."
26
- bucket = self.s3_client.bucket(self.options.validation_bucket)
27
- else
28
- bucket_name = "arch-code-#{uuid.generate}"
29
- puts "Creating temporary S3 bucket #{bucket_name}..."
30
- bucket = self.s3_client.bucket(bucket_name)
31
- bucket.create
32
- end
33
- upload_template(bucket, object_name)
34
-
35
- self.syntax_report = s3_validate_syntax(bucket, object_name)
36
-
37
- if self.options.estimate_cost
38
- estimate_cost(bucket_name, object_name)
39
- end
40
-
41
- if !self.options.validation_bucket
42
- puts "Deleting temporary S3 bucket..."
43
- bucket.delete!
44
- end
45
-
46
- else
47
- self.syntax_report = local_validate_syntax
48
- end
49
-
50
- save_syntax_report if self.options.save_syntax_report
51
-
52
- end
53
-
54
- private
55
- def save_syntax_report
56
- report_filename = "#{self.output_dir}/#{self.base_name}.report"
57
- puts "Syntax validation report written to #{report_filename}"
58
- File.open(File.expand_path(report_filename), 'w').puts self.syntax_report.to_hash.to_yaml
59
- end
60
-
61
- def upload_template(bucket, object_name)
62
- puts "Uploading template to temporary S3 bucket..."
63
- object = bucket.object(object_name)
64
- object.upload_file(self.output_file)
65
- puts " https://s3.amazonaws.com/#{bucket_name}/#{object_name}"
66
- end
67
-
68
- def estimate_cost(bucket, object_name)
69
- puts "Estimate cost of template..."
70
- client = Aws::CloudFormation::Client.new(region: self.options.aws_region)
71
- costing = client.estimate_template_cost(template_url: "https://#{bucket.url}/#{object_name}")
72
- puts "Cost Calculator URL is: #{costing.url}"
73
- end
74
-
75
- def s3_validate_syntax(bucket, object_name)
76
- if self.options.validate_syntax
77
- puts "Validating template syntax in S3 Bucket..."
78
- client = Aws::CloudFormation::Client.new(region: self.options.aws_region)
79
- client.validate_template(template_url: "https://s3.amazonaws.com/#{bucket.url}/#{object_name}")
80
- end
81
- end
82
-
83
- def local_validate_syntax
84
- puts "Validating template syntax locally..."
85
- client = Aws::CloudFormation::Client.new(region: self.options.aws_region)
86
- client.validate_template(template_body: self.template)
87
- end
88
- end
89
- end