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 +4 -4
- data/cloudspin-stack-rake.gemspec +1 -0
- data/lib/cloudspin/stack/rake/inspec_task.rb +102 -0
- data/lib/cloudspin/stack/rake/stack_task.rb +16 -15
- data/lib/cloudspin/stack/rake/version.rb +1 -1
- data/lib/cloudspin/stack/rake.rb +1 -0
- metadata +17 -3
- data/lib/cloudspin/stack/rake/tasklib.rb +0 -104
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a156d40067c77fd2b857f1df3c7802d07b8d76263ed5a632adf13fa7c1db65b5
|
4
|
+
data.tar.gz: 55e696f2c5516b67b73ce489760652238232be9c8749b0f6b58c54b0f9934711
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
@
|
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
|
-
@
|
19
|
-
@
|
20
|
-
@
|
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 #{@
|
28
|
+
desc "Create or update stack #{@instance.id}"
|
28
29
|
task :up do
|
29
|
-
puts @
|
30
|
-
puts @
|
30
|
+
puts @instance.up_dry
|
31
|
+
puts @instance.up
|
31
32
|
end
|
32
33
|
|
33
|
-
desc "Plan changes to stack #{@
|
34
|
+
desc "Plan changes to stack #{@instance.id}"
|
34
35
|
task :plan do
|
35
|
-
puts @
|
36
|
-
puts @
|
36
|
+
puts @instance.plan_dry
|
37
|
+
puts @instance.plan
|
37
38
|
end
|
38
39
|
|
39
|
-
desc "Show command line to be run for stack #{@
|
40
|
+
desc "Show command line to be run for stack #{@instance.id}"
|
40
41
|
task :dry do
|
41
|
-
puts @
|
42
|
+
puts @instance.up_dry
|
42
43
|
end
|
43
44
|
|
44
|
-
desc "Destroy stack #{@
|
45
|
+
desc "Destroy stack #{@instance.id}"
|
45
46
|
task :down do
|
46
|
-
puts @
|
47
|
-
puts @
|
47
|
+
puts @instance.down_dry
|
48
|
+
puts @instance.down
|
48
49
|
end
|
49
50
|
|
50
51
|
end
|
data/lib/cloudspin/stack/rake.rb
CHANGED
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.
|
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-
|
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
|