voxpupuli-acceptance 0.1.1 → 0.2.0

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: 5703585055ce98b5b167311675cef06877eca43a25d888f24c304f9dd3cc9e48
4
- data.tar.gz: 998637dd8ed80052df9988eba800bd6601fe6b90512b1b29572b1aa8d6546925
3
+ metadata.gz: 2cca558c11482ae56a56730bfb6f7cf338832496721011e9ab0a632925c30ecf
4
+ data.tar.gz: 9e7d7bb02cea97d8a8e0c76d55f0ae206e63906485816aaaef9714b5ec583482
5
5
  SHA512:
6
- metadata.gz: bc2449b163a0c21a8394242b4ddd6ca920573ebd13b4cad7d2e76a87a379272b8a68ca1f1cab75f53aa2d62335bbccb6b78d1ae5bfaf61eb66e471d14978ab98
7
- data.tar.gz: f7ef10e75b2f31605e8ac942a1c917f0cc86ed080bb6dc0f6d1346013a2e4b05afb64706dc665fc03f4c52bc75f1c038b41bb810f5855a36aefa18e4dbf4e331
6
+ metadata.gz: a655542ad8013e3d68411fa0acc005be3355c92787ef710a78e0861ae68ade67b7e7cedc13073cb2cc1c0055897e7f5c22edff62bf25dcff7d18694198b81580
7
+ data.tar.gz: 7d634ac527d99123981ddd1a21be72e5cc588ed55e9445941c1e080aa701eaab845b6524d3fc1c0a097f39f92ba11359520249b84aac999100b64f9a1063c828
@@ -0,0 +1,143 @@
1
+ require 'tmpdir'
2
+ require 'puppet/modulebuilder'
3
+
4
+ module Voxpupupli
5
+ module Acceptance
6
+ class Fixtures
7
+ class << self
8
+ # Install fixture modules on the given hosts
9
+ #
10
+ # @param [Host, Array<Host>, String, Symbol] hosts
11
+ # The beaker hosts to run on
12
+ # @param [Array<String>, String] modulepath
13
+ # A modulepath as Puppet uses it. Typically spec/fixtures/modules
14
+ # @param [Logger, nil] logger
15
+ # An optional logger
16
+ def install_fixture_modules_on(hosts, modulepath, logger = nil)
17
+ Dir.mktmpdir do |destination|
18
+ modules = build_modules(modulepath, destination, logger)
19
+
20
+ install_modules_on(hosts, modules, logger)
21
+ end
22
+
23
+ nil
24
+ end
25
+
26
+ # Build modules in the given sources.
27
+ #
28
+ # @param [Array<String>, String] modulepath
29
+ # A modulepath as Puppet uses it
30
+ # @param [String] destination
31
+ # The target directory to build modules into
32
+ # @param [Logger, nil] logger
33
+ # An optional logger
34
+ #
35
+ # @return [Hash<String=>String>]
36
+ # A mapping of module names and the path to their tarball
37
+ def build_modules(modulepath, destination, logger = nil)
38
+ modulepath = [modulepath] if modulepath.is_a?(String)
39
+
40
+ modules = {}
41
+
42
+ modulepath.each do |dir|
43
+ Dir[File.join(dir, '*', 'metadata.json')].each do |metadata|
44
+ path = File.dirname(metadata)
45
+ name = File.basename(path)
46
+ next if modules.include?(name)
47
+
48
+ builder = Puppet::Modulebuilder::Builder.new(File.realpath(path), destination, logger)
49
+
50
+ unless valid_directory_name?(name, builder.metadata['name'])
51
+ warning = "Directory name of #{path} doesn't match metadata name #{builder.metadata['name']}"
52
+ if logger
53
+ logger.warn(warning)
54
+ else
55
+ STDERR.puts(warning)
56
+ end
57
+ end
58
+
59
+ modules[name] = builder.build
60
+ end
61
+ end
62
+
63
+ modules
64
+ end
65
+
66
+ # Install modules on a number of hosts
67
+ #
68
+ # This is done by iterating over every host. On that host a temporary
69
+ # directory is created. Each module is copied there and installed by
70
+ # force.
71
+ #
72
+ # @param [Host, Array<Host>, String, Symbol] hosts
73
+ # The beaker hosts to run on
74
+ # @param [Hash<String=>String>] modules
75
+ # A mapping between module names and their tarball
76
+ # @param [Logger, nil] logger
77
+ # An optional logger
78
+ def install_modules_on(hosts, modules, logger = nil)
79
+ hosts.each do |host|
80
+ logger.debug("Installing modules on #{host}") if logger
81
+
82
+ temp_dir_on(host) do |target_dir|
83
+ modules.each do |name, source_path|
84
+ target_file = File.join(target_dir, File.basename(source_path))
85
+ logger.debug("Copying module #{name} from #{source_path} to #{target_file}") if logger
86
+
87
+ scp_to(host, source_path, target_file)
88
+ on host, puppet("module install --force --ignore-dependencies '#{target_file}'")
89
+ end
90
+ end
91
+ end
92
+
93
+ nil
94
+ end
95
+
96
+ # Create a temporay directory on the host, similar to Dir.mktmpdir but
97
+ # on a remote host.
98
+ #
99
+ # @example
100
+ # temp_dir_on(host) { |dir| puts dir }
101
+ #
102
+ # @param [Host, String, Symbol] host
103
+ # The beaker host to run on
104
+ def temp_dir_on(host, &block)
105
+ result = on host, "mktemp -d"
106
+ raise "Could not create directory" unless result.success?
107
+
108
+ dir = result.stdout.strip
109
+
110
+ begin
111
+ yield dir
112
+ ensure
113
+ on host, "rm -rf #{dir}"
114
+ end
115
+
116
+ nil
117
+ end
118
+
119
+ # Validate a directory name matches its metadata name.
120
+ #
121
+ # This is useful to detect misconfigurations in fixture set ups.
122
+ #
123
+ # @example
124
+ # assert valid_directory_name?('tftp', 'theforeman-tftp')
125
+ # @example
126
+ # refute valid_directory_name?('puppet-tftp', 'theforeman-tftp')
127
+ #
128
+ # @param [String] directory_name
129
+ # Name of the directory. Not the full path
130
+ # @param [String] metadata_name
131
+ # Name as it shows up in the metadata. It is normalized and accepts
132
+ # both / and - as separators.
133
+ #
134
+ # @return [Boolean] Wether the directory name is valid with the given
135
+ # metadata name
136
+ def valid_directory_name?(directory_name, metadata_name)
137
+ normalized = metadata_name.tr('/', '-').split('-').last
138
+ normalized == directory_name
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -1,4 +1,4 @@
1
- def configure_beaker(&block)
1
+ def configure_beaker(modules: :metadata, &block)
2
2
  ENV['PUPPET_INSTALL_TYPE'] ||= 'agent'
3
3
  ENV['BEAKER_PUPPET_COLLECTION'] ||= 'puppet6'
4
4
  ENV['BEAKER_debug'] ||= 'true'
@@ -7,8 +7,14 @@ def configure_beaker(&block)
7
7
  require 'beaker-rspec'
8
8
  require 'beaker-puppet'
9
9
  require 'beaker/puppet_install_helper'
10
- require 'beaker/module_install_helper'
11
- $module_source_dir = get_module_source_directory caller
10
+
11
+ case modules
12
+ when :metadata
13
+ require 'beaker/module_install_helper'
14
+ $module_source_dir = get_module_source_directory caller
15
+ when :fixtures
16
+ require_relative 'fixtures'
17
+ end
12
18
 
13
19
  run_puppet_install_helper unless ENV['BEAKER_provision'] == 'no'
14
20
 
@@ -18,8 +24,14 @@ def configure_beaker(&block)
18
24
 
19
25
  # Configure all nodes in nodeset
20
26
  c.before :suite do
21
- install_module
22
- install_module_dependencies
27
+ case modules
28
+ when :metadata
29
+ install_module
30
+ install_module_dependencies
31
+ when :fixtures
32
+ fixture_modules = File.join(Dir.pwd, 'spec', 'fixtures', 'modules')
33
+ Voxpupupli::Acceptance::Fixtures.install_fixture_modules_on(hosts, fixture_modules)
34
+ end
23
35
 
24
36
  if block
25
37
  hosts.each do |host|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voxpupuli-acceptance
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vox Pupuli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-06 00:00:00.000000000 Z
11
+ date: 2020-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt_pbkdf
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: puppet-modulebuilder
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.1'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.1'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: rbnacl
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -215,6 +229,7 @@ extensions: []
215
229
  extra_rdoc_files: []
216
230
  files:
217
231
  - lib/voxpupuli/acceptance.rb
232
+ - lib/voxpupuli/acceptance/fixtures.rb
218
233
  - lib/voxpupuli/acceptance/spec_helper_acceptance.rb
219
234
  homepage: http://github.com/voxpupuli/voxpupuli-acceptance
220
235
  licenses:
@@ -235,8 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
250
  - !ruby/object:Gem::Version
236
251
  version: '0'
237
252
  requirements: []
238
- rubyforge_project:
239
- rubygems_version: 2.7.10
253
+ rubygems_version: 3.0.6
240
254
  signing_key:
241
255
  specification_version: 4
242
256
  summary: Helpers for acceptance testing Vox Pupuli modules