cloudspin-stack-rake 0.1.0 → 0.1.1

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