puppetbox 0.3.0 → 0.3.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
  SHA1:
3
- metadata.gz: f0b4270e3681f985ebb627e7126987337345963f
4
- data.tar.gz: aa5f16dd84a2f10e25abe4e23c73a03082316fb6
3
+ metadata.gz: 466cebb037b7d3d05647c4c6edb2276cdc27cf20
4
+ data.tar.gz: d2b111a894e2acff93367e270e5b7291550d2c62
5
5
  SHA512:
6
- metadata.gz: af4ca9d3108b2d81150d53ea25473f4a5ddb722e14a76814f37e433c698c073919d3fbcaf228044740040651342de8fcc7146a912dafa7e5387864c61d29df1e
7
- data.tar.gz: fa61ab2481c0fb6d49681168eb44b9917c5320f244b0d130123a6a140d0e1916c795bd986f6e1e8fbc5cf23179b8f7f4ddbb97dfe8c785f7e5e5b1f2f72477b8
6
+ metadata.gz: be79a33ae71e23acb18c040028923f4057e30dadfba4aac33d64b9bc06a84e5cb29cd96efee3ebca5b3c75aa622ea980c1308cdd0a1892126994687f97086c21
7
+ data.tar.gz: dc4054fe17680fd977ac4f872491a73773780c45177bd5133ca54878376b045ad62688cb0ff2477f5ddb46065a9af3bed4353eaeaa52667614bf4403df654424
data/Gemfile CHANGED
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in puppetbox.gemspec
4
- gem 'derelict', :git => 'https://github.com/GeoffWilliams/derelict', :ref => 'preserve_real_status'
5
4
  #gem 'vagrantomatic', :path => '/home/geoff/github/vagrantomatic'
6
5
 
7
6
  gemspec
@@ -6,48 +6,53 @@ require "puppetbox/logger"
6
6
  module PuppetBox
7
7
  module Driver
8
8
  class Vagrant
9
- # fixme - seems abandoned, might need to make my own :(
10
- # DEFAULT_VAGRANT_BOX = "puppetlabs/centos-7.2-64-puppet"
9
+ WORKING_DIR_VAGRANT = "vagrant"
11
10
  PUPPET_CODE_MOUNT = "/etc/puppetlabs/code/environments/production"
12
11
 
13
12
  def node_name
14
13
  @name
15
14
  end
16
15
 
17
- # def initialize(name, codedir, keep_vm:true, working_dir:nil, config:{'box'=> DEFAULT_VAGRANT_BOX}, logger: nil)
18
16
  def initialize(name, codedir, config, keep_vm:false, working_dir:nil, logger: nil)
19
17
 
20
18
  @name = name
21
19
  @keep_vm = keep_vm
22
- @working_dir = working_dir || File.join(Dir.home, '.puppetbox')
20
+ @working_dir = File.join((working_dir || PuppetBox::WORKING_DIR), WORKING_DIR_VAGRANT)
23
21
  @config = config
24
22
  @result = Result.new
25
23
  @logger = Logger.new(logger).logger
26
24
 
27
- if ! @config.has_key?("box")
28
- raise "Node #{node_name} must specify box"
29
- end
25
+ # setup the instance
26
+ @vom = Vagrantomatic::Vagrantomatic.new(vagrant_vm_dir:@working_dir, logger:@logger)
27
+ @logger.debug("creating instance metadata for #{@name}")
28
+ @vm = @vom.instance(@name, config:@config)
29
+ @vm.add_shared_folder("#{codedir}:#{PUPPET_CODE_MOUNT}")
30
+
31
+
32
+ # if ! @config.has_key?("box")
33
+ # raise "Node #{node_name} must specify box"
34
+ # end
30
35
 
31
36
  # Add the code dir to the config has so that it will automatically become
32
37
  # a shared folder when the VM boots
33
38
 
34
39
  # can't use dig() might not be ruby 2.3
35
- if @config.has_key?("folders")
36
- @config["folders"] = Array(@config["folders"])
37
-
38
- # all paths must be fully qualified. If we were asked to do a relative path, change
39
- # it to the current directory since that's probably what the user wanted. Not right?
40
- # user supply correct path!
41
- @config["folders"] = @config["folders"].map { |folder|
42
- if ! folder.start_with? '/'
43
- folder = "#{Dir.pwd}/#{folder}"
44
- end
45
- folder
46
- }
47
- else
48
- @config["folders"] = []
49
- end
50
- @config["folders"] << "#{codedir}:#{PUPPET_CODE_MOUNT}"
40
+ # if @config.has_key?("folders")
41
+ # @config["folders"] = Array(@config["folders"])
42
+ #
43
+ # # all paths must be fully qualified. If we were asked to do a relative path, change
44
+ # # it to the current directory since that's probably what the user wanted. Not right?
45
+ # # user supply correct path!
46
+ # @config["folders"] = @config["folders"].map { |folder|
47
+ # if ! folder.start_with? '/'
48
+ # folder = "#{Dir.pwd}/#{folder}"
49
+ # end
50
+ # folder
51
+ # }
52
+ # else
53
+ # @config["folders"] = []
54
+ # end
55
+ # @config["folders"] << "#{codedir}:#{PUPPET_CODE_MOUNT}"
51
56
  @logger.debug "instance #{name} initialised"
52
57
  end
53
58
 
@@ -77,15 +82,17 @@ module PuppetBox
77
82
  # make sure working dir exists...
78
83
  FileUtils.mkdir_p(@working_dir)
79
84
 
80
- vom = Vagrantomatic::Vagrantomatic.new(vagrant_vm_dir: @working_dir, logger: @logger)
85
+ # vom = Vagrantomatic::Vagrantomatic.new(vagrant_vm_dir:@working_dir, logger:@logger)
81
86
 
82
- @logger.debug("reading instance metadata for #{@name}")
83
- @vm = vom.instance(@name)
87
+ # @logger.debug("creating instance metadata for #{@name}")
88
+ # @vm = vom.instance(@name, config:@config)
84
89
 
85
- @logger.debug("...setting instance config and saving")
86
-
87
- @vm.config=(@config)
90
+ # obtain 'fixed' metadata from instance
91
+ # @config = @vm.config
92
+ # add in our mandatory shared folder
93
+ # @vm.add_shared_folder("#{codedir}:#{PUPPET_CODE_MOUNT}")
88
94
  @vm.save
95
+
89
96
  @logger.debug("Instance saved and ready for starting")
90
97
  started = @vm.start
91
98
  end
@@ -103,6 +110,10 @@ module PuppetBox
103
110
  @vm.reset
104
111
  end
105
112
 
113
+ def validate_config
114
+ @vm.validate_config
115
+ end
116
+
106
117
  # Test that a VM is operational and able to run puppet
107
118
  def self_test()
108
119
  status_code, messages = @vm.run("sudo -i puppet --version")
@@ -2,11 +2,14 @@ require "puppetbox/result_set"
2
2
  require "puppetbox/logger"
3
3
  require "puppetbox/nodeset"
4
4
  require "puppetbox/driver/vagrant"
5
+ require "puppetbox/report"
5
6
 
6
7
  module PuppetBox
7
8
  class PuppetBox
8
9
 
9
- def initialize(logger:nil, nodeset_file: nil)
10
+ WORKING_DIR = File.join(Dir.home, '.puppetbox')
11
+
12
+ def initialize(logger:nil, nodeset_file: nil, working_dir: nil)
10
13
  # The results of all tests on all driver instances
11
14
  @result_set = ResultSet.new
12
15
 
@@ -20,6 +23,8 @@ module PuppetBox
20
23
  # talk to use about nodes of particular name and puppetbox will sort out
21
24
  # the how and why of what this exactly should involve
22
25
  @nodeset = NodeSet.new(nodeset_file)
26
+
27
+ @working_dir = working_dir || WORKING_DIR
23
28
  end
24
29
 
25
30
 
@@ -70,8 +75,11 @@ module PuppetBox
70
75
  config,
71
76
  # "#{repo.tempdir}/etc/puppetlabs/code/environments/production",
72
77
  logger: @logger,
73
-
78
+ working_dir: @working_dir,
74
79
  )
80
+
81
+ # immediately validate the configuration to allow us to fail-fast
82
+ di.validate_config
75
83
  else
76
84
  raise "PuppetBox only supports driver: 'vagrant' at the moment (requested: #{driver})"
77
85
  end
@@ -123,29 +131,16 @@ module PuppetBox
123
131
 
124
132
  # Print all results to STDOUT
125
133
  def print_results
126
- # print the report summary
127
- indent = " "
128
- puts "\n\n\nSummary\n======="
129
- summary.each { |node, class_results|
130
- puts node
131
- if class_results.class == String
132
- puts "#{indent}#{class_results}"
133
- else
134
- class_results.each { |puppet_class, passed|
135
- line = "#{indent}#{puppet_class}: #{passed ? "OK": "FAILED"}"
136
- if passed
137
- puts line.green
138
- else
139
- puts line.red
140
- end
141
- }
142
- end
143
- }
144
-
145
- puts "Overall acceptance testing result #{overall}"
134
+ Report::print(@result_set)
146
135
  end
147
136
 
137
+ def result_set
138
+ @result_set
139
+ end
148
140
 
141
+ def passed?
142
+ @result_set.passed?
143
+ end
149
144
 
150
145
  # Run puppet using `driver_instance` to execute
151
146
  def run_puppet(driver_instance, puppet_classes, logger:nil, reset_after_run:true)
@@ -153,32 +148,29 @@ module PuppetBox
153
148
  logger = logger || @logger
154
149
  logger.debug("#{driver_instance.node_name} running test for #{puppet_classes}")
155
150
  puppet_classes = Array(puppet_classes)
156
- results = ResultSet.new
151
+
157
152
  if driver_instance.open
158
153
  logger.debug("#{driver_instance.node_name} started")
159
154
  if driver_instance.self_test
160
155
  logger.debug("#{driver_instance.node_name} self_test OK, running puppet")
161
156
  puppet_classes.each{ |puppet_class|
162
- if results.class_size(driver_instance.node_name) > 0 and reset_after_run
157
+ if @result_set.class_size(driver_instance.node_name) > 0 and reset_after_run
163
158
  # purge and reboot the vm - this will save approximately 1 second
164
159
  # per class on the self-test which we now know will succeed
165
160
  driver_instance.reset
166
161
  end
167
162
  driver_instance.run_puppet_x2(puppet_class)
168
- results.save(driver_instance.node_name, puppet_class, driver_instance.result)
163
+ @result_set.save(driver_instance.node_name, puppet_class, driver_instance.result)
169
164
  }
170
165
  logger.debug("#{driver_instance.node_name} test completed, closing instance")
171
- driver_instance.close
172
166
  else
173
- driver_instance.close
174
167
  raise "#{driver_instance.node_name} self test failed, unable to continue"
175
168
  end
176
169
  else
177
- driver_instance.close
178
170
  raise "#{driver_instance.node_name} failed to start, unable to continue"
179
171
  end
180
172
 
181
- results
173
+ driver_instance.close
182
174
  end
183
175
 
184
176
  end
@@ -1,27 +1,27 @@
1
+ require 'colorize'
1
2
  module PuppetBox
2
3
  module Report
3
- def self.printstuff(stream=$STDOUT)
4
+ def self.pretty_status(passed)
5
+ passed ? 'OK'.green: 'FAILED'.red
6
+ end
7
+
8
+ def self.print(result_set, stream=$stdout)
4
9
  # print the report summary
5
10
  indent = " "
6
11
  stream.puts "\n\n\nSummary\n======="
7
- summary.each { |node, class_results|
8
- puts node
12
+ result_set.results.each { |node, class_results|
13
+ stream.puts node
9
14
  if class_results.class == String
10
15
  stream.puts "#{indent}#{class_results}"
11
16
  else
12
- class_results.each { |puppet_class, passed|
13
- line = "#{indent}#{puppet_class}: #{passed ? "OK": "FAILED"}"
14
- if passed
15
- stream.puts line.green
16
- else
17
- stream.puts line.red
18
- end
17
+ class_results.each { |puppet_class, result|
18
+ stream.puts "#{indent}#{puppet_class}: #{pretty_status(result.passed?)}"
19
19
  }
20
20
  end
21
21
  }
22
22
 
23
- stream.puts "OVERALL STATUS #{overall}"
24
- overall
23
+ stream.puts "\n\nOVERALL STATUS: #{pretty_status(result_set.passed?)}"
25
24
  end
25
+
26
26
  end
27
27
  end
@@ -46,7 +46,6 @@ module PuppetBox
46
46
  def passed?
47
47
  passed = nil
48
48
  @report.each { |r|
49
- puts "...REPORT"
50
49
  if passed == nil
51
50
  passed = (r[:status] == PS_OK)
52
51
  else
@@ -27,6 +27,7 @@ module PuppetBox
27
27
  end
28
28
 
29
29
  def passed?
30
+ ! @results.empty? and
30
31
  @results.map { |node_name, class_results_hash|
31
32
  class_results_hash.map { |class_name, class_results|
32
33
  class_results.passed?
@@ -34,7 +35,7 @@ module PuppetBox
34
35
  }.all?
35
36
  end
36
37
 
37
- def data
38
+ def results
38
39
  @results
39
40
  end
40
41
 
@@ -59,7 +60,7 @@ module PuppetBox
59
60
  def test_size
60
61
  @results.map {|node_name, classes|
61
62
  classes.size
62
- }.reduce(:+)
63
+ }.reduce(:+) || 0
63
64
  end
64
65
 
65
66
 
@@ -1,3 +1,3 @@
1
1
  module PuppetBox
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
data/puppetbox.gemspec CHANGED
@@ -23,5 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
25
 
26
- spec.add_dependency "vagrantomatic", "0.2.1"
26
+ spec.add_dependency "vagrantomatic", "0.3.2"
27
+ spec.add_dependency "colorize"
27
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppetbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geoff Williams
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-15 00:00:00.000000000 Z
11
+ date: 2017-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,28 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.2.1
61
+ version: 0.3.2
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: 0.2.1
68
+ version: 0.3.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: colorize
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description:
70
84
  email:
71
85
  - geoff@geoffwilliams.me.uk