cfndsl-pipeline 0.1.4 → 0.1.5

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
  SHA256:
3
- metadata.gz: b2916ce7032d93f6a62603e4f7e0f67d1387429245eda792ae5aaa8421736cbc
4
- data.tar.gz: ef9800894ba6333955a3f1ab8bae3e4a2162a15c91a02049062267032a429224
3
+ metadata.gz: 5ac916d2749dd8f2515364b954dc62dc40e2d9d8242c930bfc0807ae702c2528
4
+ data.tar.gz: fb3f8cef4fa7cd04b13cca323835e3f1fbe226e5dc1d051c54627c980e3e186e
5
5
  SHA512:
6
- metadata.gz: 37fad470245cc31ac95127c0af8316b0ecdb28aa54a23e67fe5e9740eabecdb34ae48a7def92277ec01f54204390490a11f1ac46e06620166dff0afffc81c528
7
- data.tar.gz: 3a4a082fb5f433f84d0ac4605dc0ba53e0ab28645efccca3c8cd8e1a2d11b5c2bb411ca326df59066a75db974831828769a5166956e30a603b62c2f4801c67df
6
+ metadata.gz: ba4466092aede32b0161d0cb6dc10365dde94bd2ec31ba1a5c5c1f42dbc26cb8680c9eadf0758d525bb25428b9d99c8f5864fca88722b17c0a58a784cdfe39c5
7
+ data.tar.gz: 808e4b4a21329d741544a2241219a34449271607db408154f74a001509f9d682d1e736dfa7812b3795293450a36d6a499401ec44220653099aacb8ec825b2680
@@ -11,11 +11,11 @@ Metrics/MethodLength:
11
11
  Max: 25
12
12
 
13
13
  # Due to our @Properties style instance names
14
- Style/VariableName:
14
+ Naming/VariableName:
15
15
  Enabled: false
16
16
 
17
17
  # We are a DSL
18
- Style/MethodName:
18
+ Naming/MethodName:
19
19
  Enabled: false
20
20
 
21
21
  # Lone String
@@ -26,7 +26,7 @@ AllCops:
26
26
  Exclude:
27
27
  - 'tmp/**/*'
28
28
  - 'examples/**/*'
29
- - 'spec/*'
29
+ - 'spec/**/*'
30
30
  - Gemfile
31
31
  - Guardfile
32
32
  - Rakefile
data/Gemfile CHANGED
@@ -1,6 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
  repo_name = "cmaxwellau/cfndsl-pipeline"
3
- gem "rubocop", ">= 0.49.0"
4
3
 
5
4
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
6
5
 
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require 'optparse'
3
5
  require 'cfndsl-pipeline'
4
6
 
@@ -8,7 +10,7 @@ cli_options = {
8
10
  }
9
11
 
10
12
  pipe_options = CfnDslPipeline::Options.new
11
-
13
+ # rubocop:disable Metrics/BlockLength
12
14
  op = OptionParser.new do |opts|
13
15
  opts.banner = USAGE
14
16
 
@@ -66,6 +68,7 @@ op = OptionParser.new do |opts|
66
68
  exit
67
69
  end
68
70
  end
71
+ # rubocop:enable Metrics/BlockLength
69
72
 
70
73
  op.parse!
71
74
 
@@ -106,7 +109,7 @@ end
106
109
  cfndsl_extras = []
107
110
  ARGV.each do |arg|
108
111
  cfndsl_extras << [:yaml, arg]
109
- end if ARGV.length > 0
112
+ end
110
113
 
111
114
  pipeline = CfnDslPipeline::Pipeline.new(cli_options[:output], pipe_options)
112
115
  pipeline.build(cli_options[:template], cfndsl_extras)
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
30
30
 
31
31
  s.executables << 'cfndsl_pipeline'
32
32
 
33
- s.add_development_dependency "bundler", "~> 1.5"
33
+ s.add_development_dependency "bundler", "~> 2.0"
34
34
  s.add_development_dependency "rake"
35
35
  s.add_development_dependency "rspec"
36
36
  s.add_development_dependency "cfndsl"
@@ -1,5 +1,6 @@
1
- #!/usr/bin/env ruby
2
- #
1
+ # rubocop:disable Naming/FileName
2
+ # frozen_string_literal: true
3
+
3
4
  # The MIT License
4
5
  #
5
6
  # Copyright (c) 2019 Cam Maxwell (cameron.maxwell@gmail.com)
@@ -53,7 +54,7 @@ module CfnDslPipeline
53
54
 
54
55
  def build(input_filename, cfndsl_extras)
55
56
  abort "Input file #{input_filename} doesn't exist!" unless File.file?(input_filename)
56
- self.input_filename = "#{input_filename}"
57
+ self.input_filename = input_filename.to_s
57
58
  self.base_name = File.basename(input_filename, '.*')
58
59
  self.output_filename = File.expand_path("#{output_dir}/#{base_name}.yaml")
59
60
  exec_cfndsl cfndsl_extras
@@ -63,3 +64,4 @@ module CfnDslPipeline
63
64
  end
64
65
  end
65
66
  end
67
+ # rubocop:enable Naming/FileName
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'optparse'
3
4
 
@@ -19,6 +20,7 @@ module CfnDslPipeline
19
20
 
20
21
  # rubocop:disable Metrics/AbcSize
21
22
  # rubocop:disable Metrics/MethodLength
23
+ # rubocop:disable Metrics/BlockLength
22
24
  def parse
23
25
  @op = OptionParser.new do |opts|
24
26
  opts.banner = USAGE
@@ -47,8 +49,8 @@ module CfnDslPipeline
47
49
  pipeline.validate_cfn_nag = false
48
50
  end
49
51
 
50
- opts.on('--audit-rule-dir', 'cfn_nag audit custom rules directory') do
51
- pipeline.cfn_nag[:rule_directory] = true
52
+ opts.on('--audit-rule-dir', 'cfn_nag audit custom rules directory') do |rule_dir|
53
+ pipeline.cfn_nag[:rule_directory] = rule_dir
52
54
  end
53
55
 
54
56
  opts.on('--audit-report', 'Save cfn_nag audit report') do
@@ -86,15 +88,17 @@ module CfnDslPipeline
86
88
 
87
89
  # first non-dash parameter is the mandatory input file
88
90
  @template = ARGV.pop
89
-
91
+ # rubocop:disable Style/MultilineIfModifier
90
92
  ARGV.each do |arg|
91
93
  @cfndsl_extras << [:yaml, arg]
92
- end if ARGV.length > 0
94
+ end unless ARGV.empty?
95
+ # rubocop:enable Style/MultilineIfModifier
93
96
 
94
97
  pipeline
95
98
  end
96
99
  # rubocop:enable Metrics/AbcSize
97
100
  # rubocop:enable Metrics/MethodLength
101
+ # rubocop:enable Metrics/BlockLength
98
102
 
99
103
  def fatal(msg)
100
104
  puts msg
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cfn-nag'
2
4
  require 'logging'
3
5
  require 'colorize'
4
6
 
5
7
  module CfnDslPipeline
6
- # Add cfn_nag functions to pipeline
8
+ # Interface to cfn_nag auditing
7
9
  class Pipeline
8
10
  def exec_cfn_nag
9
11
  puts 'Auditing template with cfn-nag...'
@@ -22,23 +24,28 @@ module CfnDslPipeline
22
24
  end
23
25
 
24
26
  def display_report(result)
25
- ColoredStdoutResults.new.render([
26
- {
27
- filename: "#{@base_name}",
28
- file_results: result
29
- }
30
- ])
27
+ ColoredStdoutResults.new.render(
28
+ [
29
+ {
30
+ filename: @base_name.to_s,
31
+ file_results: result
32
+ }
33
+ ]
34
+ )
31
35
  end
32
36
 
33
37
  def save_report(result)
34
38
  return unless options.save_audit_report
39
+
35
40
  report_data = Capture.capture do
36
- SimpleStdoutResults.new.render([
37
- {
38
- filename: "#{@base_name}",
39
- file_results: result
40
- }
41
- ])
41
+ SimpleStdoutResults.new.render(
42
+ [
43
+ {
44
+ filename: @base_name.to_s,
45
+ file_results: result
46
+ }
47
+ ]
48
+ )
42
49
  end
43
50
  filename = "#{output_dir}/#{base_name}.audit"
44
51
  File.open(File.expand_path(filename), 'w').puts report_data['stdout']
@@ -46,9 +53,9 @@ module CfnDslPipeline
46
53
  end
47
54
 
48
55
  def show_summary(result)
49
- if result[:failure_count] > 0
56
+ if result[:failure_count].positive?
50
57
  puts "Audit failed. #{result[:failure_count]} error(s) found ( ಠ ʖ̯ ಠ) ".red
51
- elsif result[:violations].count > 0
58
+ elsif result[:violations].count.positive?
52
59
  puts "Audit passed with #{result[:warning_count]} warnings. (._.) ".yellow
53
60
  else
54
61
  puts 'Audit passed! ヽ( ゚ヮ゚)/ ヽ(´ー`)ノ'.green
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cfndsl'
2
4
  require 'cfndsl/globals'
3
5
  require 'cfndsl/version'
4
6
 
5
7
  module CfnDslPipeline
6
- #
8
+ # Interface to cfndsl
7
9
  class Pipeline
8
10
  def exec_cfndsl(cfndsl_extras)
9
11
  puts 'Generating CloudFormation template...'
10
12
 
11
- model = CfnDsl.eval_file_with_extras("#{@input_filename}", cfndsl_extras, (options.debug_cfndsl ? STDOUT : nil))
13
+ model = CfnDsl.eval_file_with_extras(@input_filename.to_s, cfndsl_extras, (options.debug_cfndsl ? STDOUT : nil))
12
14
  @template = JSON.parse(model.to_json).to_yaml
13
15
  File.open(@output_filename, 'w') do |file|
14
16
  file.puts @template
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'aws-sdk-cloudformation'
3
4
  require 'aws-sdk-s3'
4
5
  require 'uuid'
5
6
 
6
7
  module CfnDslPipeline
7
- #
8
+ # Interface to AWS SDK syntax checks
8
9
  class Pipeline
9
10
  attr_accessor :s3_client
10
11
 
11
12
  def initialize
12
13
  self.s3_client = Aws::S3::Client.new(region: aws_region)
13
14
  end
14
- # rubocop:disable Metrics/AbcSize
15
+
15
16
  def exec_syntax_validation
16
17
  puts 'Validating template syntax...'
17
18
  if options.estimate_cost || (output_file.size > 51_200)
@@ -31,7 +32,6 @@ module CfnDslPipeline
31
32
  end
32
33
  save_syntax_report
33
34
  end
34
- # rubocop:enable Metrics/AbcSize
35
35
 
36
36
  private
37
37
 
@@ -51,6 +51,7 @@ module CfnDslPipeline
51
51
 
52
52
  def save_syntax_report
53
53
  return unless options.save_syntax_report
54
+
54
55
  report_filename = "#{output_dir}/#{base_name}.report"
55
56
  puts "Syntax validation report written to #{report_filename}"
56
57
  File.open(File.expand_path(report_filename), 'w').puts syntax_report.to_hash.to_yaml
@@ -65,6 +66,7 @@ module CfnDslPipeline
65
66
 
66
67
  def estimate_cost(bucket, object_name)
67
68
  return unless options.estimate_cost
69
+
68
70
  puts 'Estimate cost of template...'
69
71
  client = Aws::CloudFormation::Client.new(region: options.aws_region)
70
72
  costing = client.estimate_template_cost(template_url: "https://#{bucket.url}/#{object_name}")
@@ -73,6 +75,7 @@ module CfnDslPipeline
73
75
 
74
76
  def s3_validate_syntax(bucket, object_name)
75
77
  return unless options.validate_syntax
78
+
76
79
  puts 'Validating template syntax in S3 Bucket...'
77
80
  client = Aws::CloudFormation::Client.new(region: options.aws_region)
78
81
  client.validate_template(template_url: "https://s3.amazonaws.com/#{bucket.url}/#{object_name}")
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cfndsl/globals'
3
4
  require 'cfndsl/version'
4
5
  require 'cfndsl/external_parameters'
@@ -13,7 +14,7 @@ HAS_MAPPED_TAGS = %w([CfnDsl::AWS::Types::AWS_Serverless_Function CfnDsl::AWS::T
13
14
  # Automatically add Parameters for Tag values
14
15
  CfnDsl::CloudFormationTemplate.class_eval do
15
16
  def initialize
16
- return unless defined? external_parameters[:TagStandard]
17
+ return unless external_parameters&.fetch(:TagStandard) && external_parameters[:TagStandard].is_a?(Hash)
17
18
 
18
19
  # parameters for tagging standard
19
20
  external_parameters[:TagStandard].each do |param_name, props|
@@ -25,7 +26,7 @@ CfnDsl::CloudFormationTemplate.class_eval do
25
26
  send(key, props[key]) if props[key]
26
27
  end
27
28
  end
28
- end if external_parameters[:TagStandard].is_a?(Hash)
29
+ end
29
30
  end
30
31
  end
31
32
 
@@ -48,9 +49,10 @@ module CfnDsl
48
49
 
49
50
  def fix_substitutions(val)
50
51
  return val unless defined? val.class.to_s.downcase
51
- meth = "fix_#{val.class.to_s.downcase}"
52
52
 
53
+ meth = "fix_#{val.class.to_s.downcase}"
53
54
  return send(meth, val) if respond_to?(meth.to_sym)
55
+
54
56
  val
55
57
  end
56
58
 
@@ -79,6 +81,7 @@ module CfnDsl
79
81
  def apply_tag_standard
80
82
  return unless defined? external_parameters[:TagStandard]
81
83
  return unless external_parameters[:TagStandard].is_a?(Hash)
84
+
82
85
  apply_tags(external_parameters[:TagStandard]) if defined? self.Tag
83
86
  apply_tags_map(external_parameters[:TagStandard]) if HAS_MAPPED_TAGS.include? self.class.to_s
84
87
  end
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cfn-nag/custom_rule_loader'
3
4
  require 'cfn-nag/cfn_nag_config'
4
5
 
5
6
  module CfnDslPipeline
6
- #
7
+ # Main pipeline options
7
8
  class Options
8
9
  attr_accessor :aws_region, :validation_bucket, :estimate_cost, :dump_deploy_params, :cfn_nag
9
10
  attr_accessor :validate_cfn_nag, :save_audit_report, :validate_syntax, :save_syntax_report, :validate_output
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'shellwords'
3
4
 
4
5
  module CfnDslPipeline
5
- #
6
+ # Dump stack parameters based on template
6
7
  class Pipeline
7
8
  def exec_dump_params
8
9
  param_filename = "#{output_dir}/#{base_name}.params"
@@ -1,4 +1,6 @@
1
- #
1
+ # frozen_string_literal: true
2
+
3
+ # set release version
2
4
  module CfnDslPipeline
3
- VERSION = '0.1.4'
5
+ VERSION = '0.1.5'
4
6
  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.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cam Maxwell
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.5'
103
+ version: '2.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.5'
110
+ version: '2.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -221,8 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  requirements: []
224
- rubyforge_project:
225
- rubygems_version: 2.7.10
224
+ rubygems_version: 3.0.6
226
225
  signing_key:
227
226
  specification_version: 4
228
227
  summary: Integrated build pipeline for building CloudFormation with CfnDsl