cloudspin-stack-rake 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: 9706d01ee93e3fec3c351e91c7cce282b5d03220f4f5f0a37dfe1c0831c7e7f2
4
- data.tar.gz: b5794ffd285ef71e7634ea4259660a942d1aa57fe36a65b7dd5eeb4d2ee413cc
3
+ metadata.gz: a156d40067c77fd2b857f1df3c7802d07b8d76263ed5a632adf13fa7c1db65b5
4
+ data.tar.gz: 55e696f2c5516b67b73ce489760652238232be9c8749b0f6b58c54b0f9934711
5
5
  SHA512:
6
- metadata.gz: ff56997526cf646746a882e6f3644b536539d3675eb8a64cbfb5cd768f05a5ffc0e7af31ea5c3de28c0c4f6f3d0f0341e95c16bf9939e66cbe8091b853ba733f
7
- data.tar.gz: 6b6550b35fb916f8c863b3bd95110b714fc975ff12a258b4e4ee0f7f460abb0d34be2bdd433d72c133eca2c979ed956dd4ec0b43d866d42a796ee2049b3fe32d
6
+ metadata.gz: 886628fd35467467dc091b9345fa8d02762492a04d56f7906c2466f43a34c16484a1e9f48885083fc247bca0a04c0cfc31e4af1fd2078425a3002f6245de3c94
7
+ data.tar.gz: e36aa1a1269fb5e44548929f8a34e463c741226bde59ed3c90b53140c355dad91a124e959e8a36a323d8afc4f521035a6642e0d5464614da4180a072f38b91b8
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.required_ruby_version = '>= 2.4.3'
25
25
 
26
26
  spec.add_dependency 'cloudspin-stack'
27
+ spec.add_dependency 'inspec'
27
28
 
28
29
  spec.add_development_dependency 'bundler', '~> 1.16'
29
30
  spec.add_development_dependency 'rake', '~> 10.0'
@@ -0,0 +1,102 @@
1
+ module Cloudspin
2
+ module Stack
3
+ module Rake
4
+
5
+ class InspecTask < ::Rake::TaskLib
6
+
7
+ attr_reader :stack_instance_id
8
+ attr_reader :work_folder
9
+ attr_reader :inspec_folder
10
+ attr_reader :inspec_target
11
+ attr_reader :inspec_parameters
12
+
13
+ def initialize(stack_instance:,
14
+ inspec_folder: './inspec',
15
+ work_folder: nil,
16
+ inspec_target: nil,
17
+ inspec_parameters: {})
18
+ @stack_instance = stack_instance
19
+ @stack_instance_id = stack_instance.id
20
+ @inspec_target = inspec_target
21
+ @inspec_parameters = inspec_parameters
22
+
23
+ @work_folder = work_folder || @stack_instance.working_folder
24
+ @inspec_folder = inspec_folder
25
+ if Dir.exists?(inspec_folder)
26
+ define
27
+ else
28
+ puts "No directory found: #{inspec_folder}"
29
+ end
30
+ end
31
+
32
+ def define
33
+ desc 'Run inspec tests'
34
+ task :inspec do |t, args|
35
+ build_attributes_file
36
+ run_inspec_profile
37
+ end
38
+ end
39
+
40
+ def build_attributes_file
41
+ ensure_path(inspec_attributes_file)
42
+ File.open(inspec_attributes_file, 'w') {|f|
43
+ f.write(inspec_parameters.merge(
44
+ { 'stack_instance_id' => stack_instance_id }
45
+ ).to_yaml)
46
+ }
47
+ end
48
+
49
+ def inspec_attributes_file
50
+ "#{work_folder}/inspec/attributes-for-stack-#{stack_instance_id}.yml"
51
+ end
52
+
53
+ def ensure_path(file_path)
54
+ mkpath(File.dirname(file_path))
55
+ end
56
+
57
+ def run_inspec_profile
58
+ puts "Run inspec"
59
+ inspec_profiles_in(@inspec_folder).each { |inspec_profile_subfolder|
60
+ cmd = inspec_command(inspec_profile_subfolder)
61
+ puts cmd
62
+ return if system(cmd)
63
+ $stderr.puts "#{cmd} failed"
64
+ exit $?.exitstatus || 1
65
+ }
66
+ end
67
+
68
+ def inspec_command(inspec_profile_subfolder)
69
+ command_parts = [
70
+ 'inspec',
71
+ 'exec',
72
+ "#{@inspec_folder}/#{inspec_profile_subfolder}",
73
+ '--attrs',
74
+ inspec_attributes_file,
75
+ '--reporter',
76
+ "json-rspec:#{inspec_profile_results_file(inspec_profile_name(inspec_profile_subfolder))}",
77
+ 'cli']
78
+
79
+ command_parts << ['-t', inspec_target] if inspec_target
80
+ command_parts.join(' ')
81
+ end
82
+
83
+ def inspec_profile_results_file(profile_name)
84
+ "#{work_folder}/inspec/results-for-stack-#{stack_instance_id}-profile-#{profile_name}.json"
85
+ end
86
+
87
+ def inspec_profile_name(subfolder_name)
88
+ profile_spec = YAML.load_file("#{@inspec_folder}/#{subfolder_name}/inspec.yml") || {}
89
+ profile_spec['name'] || 'default'
90
+ end
91
+
92
+ def inspec_profiles_in(folder)
93
+ Dir.entries(folder).select { |possible_profile|
94
+ possible_profile != '..' &&
95
+ File.exists?("#{folder}/#{possible_profile}/inspec.yml")
96
+ }
97
+ end
98
+
99
+ end
100
+ end
101
+ end
102
+ end
@@ -6,45 +6,46 @@ module Cloudspin
6
6
  class StackTask < ::Rake::TaskLib
7
7
 
8
8
  attr_reader :id
9
+ attr_reader :instance
9
10
  attr_reader :definition_folder
10
11
  attr_reader :instance_folder
11
12
 
12
13
  def initialize(id:, definition_folder: './src', instance_folder: '.')
13
- @stack_instance = Cloudspin::Stack::Instance.from_definition_folder(
14
+ @instance = Cloudspin::Stack::Instance.from_definition_folder(
14
15
  id: id,
15
16
  definition_folder: definition_folder,
16
17
  instance_folder: instance_folder
17
18
  )
18
- @stack_instance.add_config_from_yaml("#{instance_folder}/spin-default.yaml")
19
- @stack_instance.add_config_from_yaml("#{instance_folder}/spin-local.yaml")
20
- @stack_instance.add_parameter_values({ :deployment_identifier => id })
19
+ @instance.add_config_from_yaml("#{instance_folder}/spin-default.yaml")
20
+ @instance.add_config_from_yaml("#{instance_folder}/spin-local.yaml")
21
+ @instance.add_parameter_values({ :deployment_identifier => id })
21
22
 
22
23
  define
23
24
  end
24
25
 
25
26
  def define
26
27
 
27
- desc "Create or update stack #{@stack_instance.id}"
28
+ desc "Create or update stack #{@instance.id}"
28
29
  task :up do
29
- puts @stack_instance.up_dry
30
- puts @stack_instance.up
30
+ puts @instance.up_dry
31
+ puts @instance.up
31
32
  end
32
33
 
33
- desc "Plan changes to stack #{@stack_instance.id}"
34
+ desc "Plan changes to stack #{@instance.id}"
34
35
  task :plan do
35
- puts @stack_instance.plan_dry
36
- puts @stack_instance.plan
36
+ puts @instance.plan_dry
37
+ puts @instance.plan
37
38
  end
38
39
 
39
- desc "Show command line to be run for stack #{@stack_instance.id}"
40
+ desc "Show command line to be run for stack #{@instance.id}"
40
41
  task :dry do
41
- puts @stack_instance.up_dry
42
+ puts @instance.up_dry
42
43
  end
43
44
 
44
- desc "Destroy stack #{@stack_instance.id}"
45
+ desc "Destroy stack #{@instance.id}"
45
46
  task :down do
46
- puts @stack_instance.down_dry
47
- puts @stack_instance.down
47
+ puts @instance.down_dry
48
+ puts @instance.down
48
49
  end
49
50
 
50
51
  end
@@ -1,7 +1,7 @@
1
1
  module Cloudspin
2
2
  module Stack
3
3
  module Rake
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
6
6
  end
7
7
  end
@@ -2,3 +2,4 @@ require 'cloudspin/stack/rake/version'
2
2
  require 'rake/tasklib'
3
3
  require 'cloudspin/stack'
4
4
  require 'cloudspin/stack/rake/stack_task'
5
+ require 'cloudspin/stack/rake/inspec_task'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudspin-stack-rake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - 'kief '
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-22 00:00:00.000000000 Z
11
+ date: 2018-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cloudspin-stack
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: inspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -85,8 +99,8 @@ files:
85
99
  - bin/setup
86
100
  - cloudspin-stack-rake.gemspec
87
101
  - lib/cloudspin/stack/rake.rb
102
+ - lib/cloudspin/stack/rake/inspec_task.rb
88
103
  - lib/cloudspin/stack/rake/stack_task.rb
89
- - lib/cloudspin/stack/rake/tasklib.rb
90
104
  - lib/cloudspin/stack/rake/version.rb
91
105
  homepage: https://github.com/cloudspinners
92
106
  licenses:
@@ -1,104 +0,0 @@
1
- require 'rake/tasklib'
2
- require_relative 'exceptions'
3
-
4
- module Cloudspin
5
- module Stack
6
- module Rake
7
-
8
- class TaskLib < ::Rake::TaskLib
9
- class << self
10
- def parameter_definitions
11
- @parameter_definitions ||= {}
12
- end
13
-
14
- def parameter(name, options = {})
15
- parameter_definition = ParameterDefinition.new(
16
- name, options[:default], options[:required])
17
- name = parameter_definition.name
18
-
19
- attr_accessor(name)
20
-
21
- parameter_definitions[name] = parameter_definition
22
- end
23
-
24
- def setup_defaults_for(instance)
25
- parameter_definitions.values.each do |parameter_definition|
26
- parameter_definition.apply_default_to(instance)
27
- end
28
- end
29
-
30
- def check_required_for(instance)
31
- dissatisfied = parameter_definitions.values.reject do |definition|
32
- definition.satisfied_by?(instance)
33
- end
34
- unless dissatisfied.empty?
35
- names = dissatisfied.map(&:name)
36
- raise RequiredParameterUnset,
37
- "Required parameter#{names.length > 1 ? 's' : ''} #{names.join(',')} unset."
38
- end
39
- end
40
- end
41
-
42
- def initialize(*args, &block)
43
- setup_defaults
44
- process_arguments(args)
45
- process_block(block)
46
- check_required
47
- define
48
- end
49
-
50
- def setup_defaults
51
- self.class.setup_defaults_for(self)
52
- end
53
-
54
- def process_arguments(_)
55
- end
56
-
57
- def process_block(block)
58
- block.call(self) if block
59
- end
60
-
61
- def check_required
62
- self.class.check_required_for(self)
63
- end
64
-
65
- def define
66
- end
67
-
68
- private
69
-
70
- class ParameterDefinition
71
- attr_reader :name
72
-
73
- def initialize(name, default = nil, required = false)
74
- @name = name.to_sym
75
- @default = default
76
- @required = required
77
- end
78
-
79
- def writer_method
80
- "#{name}="
81
- end
82
-
83
- def reader_method
84
- name
85
- end
86
-
87
- def apply_default_to(instance)
88
- instance.__send__(writer_method, @default) if @default
89
- end
90
-
91
- def dissatisfied_by?(instance)
92
- value = instance.__send__(reader_method)
93
- @required && value.nil?
94
- end
95
-
96
- def satisfied_by?(instance)
97
- !dissatisfied_by?(instance)
98
- end
99
- end
100
- end
101
-
102
- end
103
- end
104
- end