beaker 1.18.0 → 1.19.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzQxM2VhODU1MzlmN2Q3NjRmYmU0Y2ExM2QyMDBiYWNlNjg0ODAwMg==
4
+ YWJiZmFiYjMyZjkyZjc0ODE5ZWQ3NDJiY2MwOGY2ODQ3OTI0NDNkMw==
5
5
  data.tar.gz: !binary |-
6
- NjQ1YjA0NzYxMTllZDMxYWE1Yjk1MzVjNzY4NzA2NzQ5N2MyNjU2Ng==
6
+ NzljMGNhYmQwYTAyNDk1MDFjODAzMzBkMzZjMDM3ZTNhZmZmYmZkYQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NjViZjlhMDg2OWVmNzkzMTUwYmFkODc5MjBhNDJmNGZiNGFlZmMwZGFmMTY4
10
- NDkwMWMzMGMzYTE1NmFhMDllYjA4MTUzZmJlOGZhMzkxNjNhZDFjYjdkNDQ2
11
- NjRiMjNiZTBjMGI0Y2ZiY2E1NzViM2VmODE2ZGZjMGI5ZmY5OWU=
9
+ MDg2YTkwYzc3ODk5YTQyN2IxNWQzMmNiZDFkZTA3OGUwMmRmNGQyZWRlMTJk
10
+ NjI1MzMyYjA0YzAwNTA3ZmJlMWNmNmQ1ZTg2MDY1NWFjOTFiN2Y2OTg3ZTNl
11
+ ZDg4YTc4YmE5ZGM4YmUwODAwMjk3N2ZmMmYxZGUyOGI5MmEwYTc=
12
12
  data.tar.gz: !binary |-
13
- YTU0NWUzMDAyZjM0ODkzNzNlODU0MjZlMGQwZDVmZDA3MmFjOGYwMjA0OTI4
14
- ZTdmOGY5NjY5OTQ2OTU4NjI0NmEzYzFlNzRkZmI5YjEyYzNkNmUwODY1MTgy
15
- MTZkZjUwZGIxMzZlY2RjZDhkMjM4NDc3Y2JiNzg4OTNhMjM2YzA=
13
+ NzNiMjMzN2IzNDNhNGI2NTA1ODgxYjgxMDVlNjE1Mjg0MTlhOTYwZDNkNjdl
14
+ M2IzZTRkZDgyZjY5NTYxYWUzYzhiN2IyNzE1ZjVkOTI4MTJkNTM5Mzc1NzU1
15
+ MjFmNmRjOGNkMzBhYjM3M2NjNGEyMTU2MzdmNjA3ZTQ1NzJlMGQ=
data/HISTORY.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # beaker - History
2
2
  ## Tags
3
- * [LATEST - 18 Sep, 2014 (116ecd2e)](#LATEST)
3
+ * [LATEST - 18 Sep, 2014 (b4e69b83)](#LATEST)
4
+ * [beaker1.18.0 - 18 Sep, 2014 (b9171d9c)](#beaker1.18.0)
4
5
  * [beaker1.17.7 - 2 Sep, 2014 (e47881f0)](#beaker1.17.7)
5
6
  * [beaker1.17.6 - 27 Aug, 2014 (bfb257bf)](#beaker1.17.6)
6
7
  * [beaker1.17.5 - 22 Aug, 2014 (7e553089)](#beaker1.17.5)
@@ -60,7 +61,40 @@
60
61
  * [pe1.2 - 6 Sep, 2011 (ba3dadd2)](#pe1.2)
61
62
 
62
63
  ## Details
63
- ### <a name = "LATEST">LATEST - 18 Sep, 2014 (116ecd2e)
64
+ ### <a name = "LATEST">LATEST - 18 Sep, 2014 (b4e69b83)
65
+
66
+ * (GEM) version bump for beaker 1.19.0 gem (b4e69b83)
67
+
68
+ * Merge pull request #459 from justinstoller/bug/master/QENG-1212_better (c683a928)
69
+
70
+
71
+ ```
72
+ Merge pull request #459 from justinstoller/bug/master/QENG-1212_better
73
+
74
+ (QENG-1212) Improve module installation experience
75
+ ```
76
+ * (QENG-1212) Improve module installation experience (61f05e90)
77
+
78
+
79
+ ```
80
+ (QENG-1212) Improve module installation experience
81
+
82
+ Prior to this puppet module installation was carried out with either
83
+ `puppet_module_install` or `copy_module_to`. This replaces them with a
84
+ method `install_dev_puppet_module` that will install either via scp or
85
+ pmt from a staging forge depending on arguements and environment
86
+ ```
87
+ ### <a name = "beaker1.18.0">beaker1.18.0 - 18 Sep, 2014 (b9171d9c)
88
+
89
+ * Merge pull request #461 from anodelman/make-gem (b9171d9c)
90
+
91
+
92
+ ```
93
+ Merge pull request #461 from anodelman/make-gem
94
+
95
+ create beaker 1.18.0 gem
96
+ ```
97
+ * (HISTORY) update history for beaker 1.18.0 gem release (8f22c5c9)
64
98
 
65
99
  * (GEM) version bump for beaker 1.18.0 (116ecd2e)
66
100
 
@@ -28,8 +28,6 @@ module Beaker
28
28
  # @api dsl
29
29
  module Helpers
30
30
 
31
- PUPPET_MODULE_INSTALL_IGNORE = ['.bundle', '.git', '.idea', '.vagrant', '.vendor', 'acceptance', 'spec', 'tests', 'log']
32
-
33
31
  # @!macro common_opts
34
32
  # @param [Hash{Symbol=>String}] opts Options to alter execution.
35
33
  # @option opts [Boolean] :silent (false) Do not produce log output
@@ -206,36 +204,6 @@ module Beaker
206
204
  end
207
205
  end
208
206
 
209
- # Check to see if a package is installed on a remote host
210
- #
211
- # @param [Host] host A host object
212
- # @param [String] package_name Name of the package to check for.
213
- #
214
- # @return [Boolean] true/false if the package is found
215
- def check_for_package host, package_name
216
- host.check_for_package package_name
217
- end
218
-
219
- # Install a package on a host
220
- #
221
- # @param [Host] host A host object
222
- # @param [String] package_name Name of the package to install
223
- #
224
- # @return [Result] An object representing the outcome of *install command*.
225
- def install_package host, package_name, package_version = nil
226
- host.install_package package_name, '', package_version
227
- end
228
-
229
- # Upgrade a package on a host. The package must already be installed
230
- #
231
- # @param [Host] host A host object
232
- # @param [String] package_name Name of the package to install
233
- #
234
- # @return [Result] An object representing the outcome of *upgrade command*.
235
- def upgrade_package host, package_name
236
- host.upgrade_package package_name
237
- end
238
-
239
207
  # Deploy packaging configurations generated by
240
208
  # https://github.com/puppetlabs/packaging to a host.
241
209
  #
@@ -338,25 +306,6 @@ module Beaker
338
306
  run_script_on(default, script, opts, &block)
339
307
  end
340
308
 
341
- # Copy a puppet module from a given source to all hosts under test.
342
- # Assumes each host under test has an associated 'distmoduledir' (set in the
343
- # host configuration YAML file).
344
- #
345
- # @param opts [Hash]
346
- # @option opts [String] :source The location on the test runners box where the files are found
347
- # @option opts [String] :module_name The name of the module to be copied over
348
- def puppet_module_install_on(host, opts = {})
349
- block_on host do | h |
350
- on h, puppet("module install #{opts[:module_name]}")
351
- end
352
- end
353
-
354
- # Copy a puppet module from a given source to all hosts under test.
355
- # @see #puppet_module_install_on
356
- def puppet_module_install opts = {}
357
- puppet_module_install_on(hosts, opts)
358
- end
359
-
360
309
  # Limit the hosts a test case is run against
361
310
  # @note This will modify the {Beaker::TestCase#hosts} member
362
311
  # in place unless an array of hosts is passed into it and
@@ -1038,8 +987,8 @@ module Beaker
1038
987
  end
1039
988
  end
1040
989
 
1041
- # This method accepts a block and using the puppet resource 'host' will
1042
- # setup host aliases before and after that block.
990
+ # This method using the puppet resource 'host' will setup host aliases
991
+ # and register the remove of host aliases via Beaker::TestCase#teardown
1043
992
  #
1044
993
  # A teardown step is also added to make sure unstubbing of the host is
1045
994
  # removed always.
@@ -1066,6 +1015,36 @@ module Beaker
1066
1015
  end
1067
1016
  end
1068
1017
 
1018
+ # This method accepts a block and using the puppet resource 'host' will
1019
+ # setup host aliases before and after that block.
1020
+ #
1021
+ # @param [Host, Array<Host>, String, Symbol] host One or more hosts to act upon,
1022
+ # or a role (String or Symbol) that identifies one or more hosts.
1023
+ # @param ip_spec [Hash{String=>String}] a hash containing the host to ip
1024
+ # mappings
1025
+ # @example Stub puppetlabs.com on the master to 127.0.0.1
1026
+ # with_host_stubbed_on(master, 'forgeapi.puppetlabs.com' => '127.0.0.1') do
1027
+ # puppet( "module install puppetlabs-stdlib" )
1028
+ # end
1029
+ def with_host_stubbed_on(host, ip_spec, &block)
1030
+ begin
1031
+ block_on host do |host|
1032
+ ip_spec.each_pair do |address, ip|
1033
+ logger.notify("Stubbing address #{address} to IP #{ip} on machine #{host}")
1034
+ on( host, puppet('resource', 'host', address, 'ensure=present', "ip=#{ip}") )
1035
+ end
1036
+ end
1037
+
1038
+ block.call
1039
+
1040
+ ensure
1041
+ ip_spec.each do |address, ip|
1042
+ logger.notify("Unstubbing address #{address} to IP #{ip} on machine #{host}")
1043
+ on( host, puppet('resource', 'host', address, 'ensure=absent') )
1044
+ end
1045
+ end
1046
+ end
1047
+
1069
1048
  # This method accepts a block and using the puppet resource 'host' will
1070
1049
  # setup host aliases before and after that block on the default host
1071
1050
  #
@@ -1095,6 +1074,31 @@ module Beaker
1095
1074
  end
1096
1075
  end
1097
1076
 
1077
+ # This wraps the method `with_host_stubbed_on` and makes the stub specific to
1078
+ # the forge alias.
1079
+ #
1080
+ # forge api v1 canonical source is forge.puppetlabs.com
1081
+ # forge api v3 canonical source is forgeapi.puppetlabs.com
1082
+ #
1083
+ # @param host [String] the host to perform the stub on
1084
+ # @param forge_host [String] The URL to use as the forge alias, will default to using :forge_host in the
1085
+ # global options hash
1086
+ def with_forge_stubbed_on( host, forge_host = nil, &block )
1087
+ #use global options hash
1088
+ forge_host ||= options[:forge_host]
1089
+ @forge_ip ||= Resolv.getaddress(forge_host)
1090
+ with_host_stubbed_on( host,
1091
+ {'forge.puppetlabs.com' => @forge_ip,
1092
+ 'forgeapi.puppetlabs.com' => @forge_ip},
1093
+ &block )
1094
+ end
1095
+
1096
+ # This wraps `with_forge_stubbed_on` and provides it the default host
1097
+ # @see with_forge_stubbed_on
1098
+ def with_forge_stubbed( forge_host = nil, &block )
1099
+ with_forge_stubbed_on( default, forge_host, &block )
1100
+ end
1101
+
1098
1102
  # This wraps the method `stub_hosts` and makes the stub specific to
1099
1103
  # the forge alias.
1100
1104
  #
@@ -1296,130 +1300,6 @@ module Beaker
1296
1300
  on host, "curl %s" % cmd, opts, &block
1297
1301
  end
1298
1302
  end
1299
-
1300
-
1301
- # Install local module for acceptance testing
1302
- # should be used as a presuite to ensure local module is copied to the hosts you want, particularly masters
1303
- # @api dsl
1304
- # @param [Host, Array<Host>, String, Symbol] host
1305
- # One or more hosts to act upon,
1306
- # or a role (String or Symbol) that identifies one or more hosts.
1307
- # @option opts [String] :source ('./')
1308
- # The current directory where the module sits, otherwise will try
1309
- # and walk the tree to figure out
1310
- # @option opts [String] :module_name (nil)
1311
- # Name which the module should be installed under, please do not include author,
1312
- # if none is provided it will attempt to parse the metadata.json and then the Modulefile to determine
1313
- # the name of the module
1314
- # @option opts [String] :target_module_path (host['distmoduledir']/modules)
1315
- # Location where the module should be installed, will default
1316
- # to host['distmoduledir']/modules
1317
- # @option opts [Array] :ignore_list
1318
- # @raise [ArgumentError] if not host is provided or module_name is not provided and can not be found in Modulefile
1319
- #
1320
- def copy_module_to(host, opts = {})
1321
- opts = {:source => './',
1322
- :target_module_path => host['distmoduledir'],
1323
- :ignore_list => PUPPET_MODULE_INSTALL_IGNORE}.merge(opts)
1324
- ignore_list = build_ignore_list(opts)
1325
- target_module_dir = opts[:target_module_path]
1326
- if opts.has_key?(:module_name)
1327
- module_name = opts[:module_name]
1328
- else
1329
- module_name = parse_for_modulename(opts[:source])
1330
- end
1331
- scp_to host, File.join(opts[:source]), File.join(target_module_dir, module_name), {:ignore => ignore_list}
1332
- end
1333
- alias :copy_root_module_to :copy_module_to
1334
-
1335
-
1336
- #Recursive method for finding the module root
1337
- # Assumes that a Modulefile exists
1338
- # @param [String] possible_module_directory
1339
- # will look for Modulefile and if none found go up one level and try again until root is reached
1340
- #
1341
- # @return [String,nil]
1342
- def parse_for_moduleroot(possible_module_directory)
1343
- if File.exists?("#{possible_module_directory}/Modulefile")
1344
- possible_module_directory
1345
- elsif possible_module_directory === '/'
1346
- logger.error "At root, can't parse for another directory"
1347
- nil
1348
- else
1349
- logger.debug "No Modulefile found at #{possible_module_directory}, moving up"
1350
- parse_for_moduleroot File.expand_path(File.join(possible_module_directory,'..'))
1351
- end
1352
- end
1353
-
1354
-
1355
- #Parse root directory of a module for module name
1356
- # Searches for metadata.json and then if none found, Modulefile and parses for the Name attribute
1357
- # @param [String] root_module_dir
1358
- # @return [String] module name
1359
- def parse_for_modulename(root_module_dir)
1360
- module_name = nil
1361
- if File.exists?("#{root_module_dir}/metadata.json")
1362
- logger.debug "Attempting to parse Modulename from metadata.json"
1363
- module_json = JSON.parse(File.read "#{root_module_dir}/metadata.json")
1364
- if(module_json.has_key?('name'))
1365
- module_name = get_module_name(module_json['name'])
1366
- end
1367
- end
1368
- if !module_name && File.exists?("#{root_module_dir}/Modulefile")
1369
- logger.debug "Attempting to parse Modulename from Modulefile"
1370
- if /^name\s+'?(\w+-\w+)'?\s*$/i.match(File.read("#{root_module_dir}/Modulefile"))
1371
- module_name = get_module_name(Regexp.last_match[1])
1372
- end
1373
- end
1374
- if !module_name
1375
- logger.debug "Unable to determine name, returning null"
1376
- end
1377
- module_name
1378
- end
1379
-
1380
- #Parse modulename from the pattern 'Auther-ModuleName'
1381
- #
1382
- # @param [String] author_module_name <Author>-<ModuleName> pattern
1383
- #
1384
- # @return [String,nil]
1385
- #
1386
- def get_module_name(author_module_name)
1387
- split_name = split_author_modulename(author_module_name)
1388
- if split_name
1389
- split_name[:module]
1390
- end
1391
- end
1392
-
1393
- #Split the Author-Name into a hash
1394
- # @param [String] author_module_attr
1395
- #
1396
- # @return [Hash<Symbol,String>,nil] :author and :module symbols will be returned
1397
- #
1398
- def split_author_modulename(author_module_attr)
1399
- result = /(\w+)-(\w+)/.match(author_module_attr)
1400
- if result
1401
- {:author => result[1], :module => result[2]}
1402
- else
1403
- nil
1404
- end
1405
- end
1406
-
1407
- # Build an array list of files/directories to ignore when pushing to remote host
1408
- # Automatically adds '..' and '.' to array. If not opts of :ignore list is provided
1409
- # it will use the static variable PUPPET_MODULE_INSTALL_IGNORE
1410
- #
1411
- # @param opts [Hash]
1412
- # @option opts [Array] :ignore_list A list of files/directories to ignore
1413
- def build_ignore_list(opts = {})
1414
- ignore_list = opts[:ignore_list] || PUPPET_MODULE_INSTALL_IGNORE
1415
- if !ignore_list.kind_of?(Array) || ignore_list.nil?
1416
- raise ArgumentError "Ignore list must be an Array"
1417
- end
1418
- ignore_list << '.' unless ignore_list.include? '.'
1419
- ignore_list << '..' unless ignore_list.include? '..'
1420
- ignore_list
1421
- end
1422
-
1423
1303
  end
1424
1304
  end
1425
1305
  end
@@ -25,6 +25,9 @@ module Beaker
25
25
  # Github's ssh signature for cloning via ssh
26
26
  GitHubSig = 'github.com,207.97.227.239 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=='
27
27
 
28
+ # The directories in the module directory that will not be scp-ed to the test system when using `copy_module_to`
29
+ PUPPET_MODULE_INSTALL_IGNORE = ['.bundle', '.git', '.idea', '.vagrant', '.vendor', 'acceptance', 'spec', 'tests', 'log']
30
+
28
31
  # @param [String] uri A uri in the format of <git uri>#<revision>
29
32
  # the `git://`, `http://`, `https://`, and ssh
30
33
  # (if cloning as the remote git user) protocols
@@ -1078,6 +1081,219 @@ module Beaker
1078
1081
  do_higgs_install higgs_host, options
1079
1082
  end
1080
1083
 
1084
+ # Install the desired module on all hosts using either the PMT or a
1085
+ # staging forge
1086
+ #
1087
+ # @see install_dev_puppet_module
1088
+ def install_dev_puppet_module_on( host, opts )
1089
+ if options[:forge_host]
1090
+ with_forge_stubbed_on( host ) do
1091
+ install_puppet_module_via_pmt_on( host, opts )
1092
+ end
1093
+ else
1094
+ copy_module_to( host, opts )
1095
+ end
1096
+ end
1097
+ alias :puppet_module_install_on :install_dev_puppet_module_on
1098
+
1099
+ # Install the desired module on all hosts using either the PMT or a
1100
+ # staging forge
1101
+ #
1102
+ # Passes options through to either `install_puppet_module_via_pmt_on`
1103
+ # or `copy_module_to`
1104
+ #
1105
+ # @param opts [Hash]
1106
+ #
1107
+ # @example Installing a module from the local directory
1108
+ # install_dev_puppet_module( :source => './', :module_name => 'concat' )
1109
+ #
1110
+ # @example Installing a module from a staging forge
1111
+ # options[:forge_host] = 'my-forge-api.example.com'
1112
+ # install_dev_puppet_module( :source => './', :module_name => 'concat' )
1113
+ #
1114
+ # @see install_puppet_module_via_pmt
1115
+ # @see copy_module_to
1116
+ def install_dev_puppet_module( opts )
1117
+ block_on( hosts ) {|h| install_dev_puppet_module_on( h, opts ) }
1118
+ end
1119
+ alias :puppet_module_install :install_dev_puppet_module
1120
+
1121
+ # Install the desired module with the PMT on a given host
1122
+ #
1123
+ # @param opts [Hash]
1124
+ # @option opts [String] :module_name The short name of the module to be installed
1125
+ # @option opts [String] :version The version of the module to be installed
1126
+ def install_puppet_module_via_pmt_on( host, opts = {} )
1127
+ block_on host do |h|
1128
+ version_info = opts[:version] ? "-v #{opts[:version]}" : ""
1129
+ if opts[:source]
1130
+ author_name, module_name = parse_for_modulename( opts[:source] )
1131
+ modname = "#{author_name}-#{module_name}"
1132
+ else
1133
+ modname = opts[:module_name]
1134
+ end
1135
+
1136
+ on h, puppet("module install #{modname} #{version_info}")
1137
+ end
1138
+ end
1139
+
1140
+ # Install the desired module with the PMT on all known hosts
1141
+ # @see #install_puppet_module_via_pmt_on
1142
+ def install_puppet_module_via_pmt( opts = {} )
1143
+ install_puppet_module_via_pmt_on(hosts, opts)
1144
+ end
1145
+
1146
+ # Install local module for acceptance testing
1147
+ # should be used as a presuite to ensure local module is copied to the hosts you want, particularly masters
1148
+ # @api dsl
1149
+ # @param [Host, Array<Host>, String, Symbol] host
1150
+ # One or more hosts to act upon,
1151
+ # or a role (String or Symbol) that identifies one or more hosts.
1152
+ # @option opts [String] :source ('./')
1153
+ # The current directory where the module sits, otherwise will try
1154
+ # and walk the tree to figure out
1155
+ # @option opts [String] :module_name (nil)
1156
+ # Name which the module should be installed under, please do not include author,
1157
+ # if none is provided it will attempt to parse the metadata.json and then the Modulefile to determine
1158
+ # the name of the module
1159
+ # @option opts [String] :target_module_path (host['distmoduledir']/modules)
1160
+ # Location where the module should be installed, will default
1161
+ # to host['distmoduledir']/modules
1162
+ # @option opts [Array] :ignore_list
1163
+ # @raise [ArgumentError] if not host is provided or module_name is not provided and can not be found in Modulefile
1164
+ #
1165
+ def copy_module_to(host, opts = {})
1166
+ opts = {:source => './',
1167
+ :target_module_path => host['distmoduledir'],
1168
+ :ignore_list => PUPPET_MODULE_INSTALL_IGNORE}.merge(opts)
1169
+ ignore_list = build_ignore_list(opts)
1170
+ target_module_dir = on( host, "echo #{opts[:target_module_path]}" ).stdout.chomp
1171
+ source = File.expand_path( opts[:source] )
1172
+ if opts.has_key?(:module_name)
1173
+ module_name = opts[:module_name]
1174
+ else
1175
+ _, module_name = parse_for_modulename( source )
1176
+ end
1177
+ scp_to host, source, File.join(target_module_dir, module_name), {:ignore => ignore_list}
1178
+ end
1179
+ alias :copy_root_module_to :copy_module_to
1180
+
1181
+ # Install a package on a host
1182
+ #
1183
+ # @param [Host] host A host object
1184
+ # @param [String] package_name Name of the package to install
1185
+ #
1186
+ # @return [Result] An object representing the outcome of *install command*.
1187
+ def install_package host, package_name, package_version = nil
1188
+ host.install_package package_name, '', package_version
1189
+ end
1190
+
1191
+ # Check to see if a package is installed on a remote host
1192
+ #
1193
+ # @param [Host] host A host object
1194
+ # @param [String] package_name Name of the package to check for.
1195
+ #
1196
+ # @return [Boolean] true/false if the package is found
1197
+ def check_for_package host, package_name
1198
+ host.check_for_package package_name
1199
+ end
1200
+
1201
+ # Upgrade a package on a host. The package must already be installed
1202
+ #
1203
+ # @param [Host] host A host object
1204
+ # @param [String] package_name Name of the package to install
1205
+ #
1206
+ # @return [Result] An object representing the outcome of *upgrade command*.
1207
+ def upgrade_package host, package_name
1208
+ host.upgrade_package package_name
1209
+ end
1210
+
1211
+ #Recursive method for finding the module root
1212
+ # Assumes that a Modulefile exists
1213
+ # @param [String] possible_module_directory
1214
+ # will look for Modulefile and if none found go up one level and try again until root is reached
1215
+ #
1216
+ # @return [String,nil]
1217
+ def parse_for_moduleroot(possible_module_directory)
1218
+ if File.exists?("#{possible_module_directory}/Modulefile")
1219
+ possible_module_directory
1220
+ elsif possible_module_directory === '/'
1221
+ logger.error "At root, can't parse for another directory"
1222
+ nil
1223
+ else
1224
+ logger.debug "No Modulefile found at #{possible_module_directory}, moving up"
1225
+ parse_for_moduleroot File.expand_path(File.join(possible_module_directory,'..'))
1226
+ end
1227
+ end
1228
+
1229
+
1230
+ #Parse root directory of a module for module name
1231
+ # Searches for metadata.json and then if none found, Modulefile and parses for the Name attribute
1232
+ # @param [String] root_module_dir
1233
+ # @return [String] module name
1234
+ def parse_for_modulename(root_module_dir)
1235
+ author_name, module_name = nil, nil
1236
+ if File.exists?("#{root_module_dir}/metadata.json")
1237
+ logger.debug "Attempting to parse Modulename from metadata.json"
1238
+ module_json = JSON.parse(File.read "#{root_module_dir}/metadata.json")
1239
+ if(module_json.has_key?('name'))
1240
+ author_name, module_name = get_module_name(module_json['name'])
1241
+ end
1242
+ end
1243
+ if !module_name && File.exists?("#{root_module_dir}/Modulefile")
1244
+ logger.debug "Attempting to parse Modulename from Modulefile"
1245
+ if /^name\s+'?(\w+-\w+)'?\s*$/i.match(File.read("#{root_module_dir}/Modulefile"))
1246
+ author_name, module_name = get_module_name(Regexp.last_match[1])
1247
+ end
1248
+ end
1249
+ if !module_name && !author_name
1250
+ logger.debug "Unable to determine name, returning null"
1251
+ end
1252
+ return author_name, module_name
1253
+ end
1254
+
1255
+ #Parse modulename from the pattern 'Auther-ModuleName'
1256
+ #
1257
+ # @param [String] author_module_name <Author>-<ModuleName> pattern
1258
+ #
1259
+ # @return [String,nil]
1260
+ #
1261
+ def get_module_name(author_module_name)
1262
+ split_name = split_author_modulename(author_module_name)
1263
+ if split_name
1264
+ return split_name[:author], split_name[:module]
1265
+ end
1266
+ end
1267
+
1268
+ #Split the Author-Name into a hash
1269
+ # @param [String] author_module_attr
1270
+ #
1271
+ # @return [Hash<Symbol,String>,nil] :author and :module symbols will be returned
1272
+ #
1273
+ def split_author_modulename(author_module_attr)
1274
+ result = /(\w+)-(\w+)/.match(author_module_attr)
1275
+ if result
1276
+ {:author => result[1], :module => result[2]}
1277
+ else
1278
+ nil
1279
+ end
1280
+ end
1281
+
1282
+ # Build an array list of files/directories to ignore when pushing to remote host
1283
+ # Automatically adds '..' and '.' to array. If not opts of :ignore list is provided
1284
+ # it will use the static variable PUPPET_MODULE_INSTALL_IGNORE
1285
+ #
1286
+ # @param opts [Hash]
1287
+ # @option opts [Array] :ignore_list A list of files/directories to ignore
1288
+ def build_ignore_list(opts = {})
1289
+ ignore_list = opts[:ignore_list] || PUPPET_MODULE_INSTALL_IGNORE
1290
+ if !ignore_list.kind_of?(Array) || ignore_list.nil?
1291
+ raise ArgumentError "Ignore list must be an Array"
1292
+ end
1293
+ ignore_list << '.' unless ignore_list.include? '.'
1294
+ ignore_list << '..' unless ignore_list.include? '..'
1295
+ ignore_list
1296
+ end
1081
1297
  end
1082
1298
  end
1083
1299
  end
@@ -94,7 +94,6 @@ module Beaker
94
94
  :department => ENV['USER'] || ENV['USERNAME'] || 'unknown',
95
95
  :validate => true,
96
96
  :jenkins_build_url => nil,
97
- :forge_host => 'vulcan-acceptance.delivery.puppetlabs.net',
98
97
  :log_level => 'verbose',
99
98
  :trace_limit => 10,
100
99
  :"master-start-curl-retries" => 120,
@@ -1,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '1.18.0'
3
+ STRING = '1.19.0'
4
4
  end
5
5
  end
@@ -304,25 +304,6 @@ describe ClassMixedWithDSLHelpers do
304
304
  end
305
305
  end
306
306
 
307
- describe '#puppet_module_install_on' do
308
- it 'scps the module to the module dir' do
309
- subject.stub( :hosts ).and_return( hosts )
310
-
311
- subject.should_receive( :puppet ).with('module install test' ).once
312
- subject.puppet_module_install_on( master, {:source => '/module', :module_name => 'test'} )
313
- end
314
- end
315
-
316
- describe '#puppet_module_install' do
317
- it 'delegates to #puppet_module_install_on with the hosts list' do
318
- subject.stub( :hosts ).and_return( hosts )
319
-
320
- subject.should_receive( :puppet_module_install_on ).with( hosts, {:source => '/module', :module_name => 'test'}).once
321
-
322
- subject.puppet_module_install( {:source => '/module', :module_name => 'test'} )
323
- end
324
- end
325
-
326
307
  describe 'confine' do
327
308
  let(:logger) { double.as_null_object }
328
309
  before do
@@ -1226,109 +1207,6 @@ describe ClassMixedWithDSLHelpers do
1226
1207
  end
1227
1208
  include_examples('modify-tk-config-without-error')
1228
1209
  end
1229
-
1230
- end
1231
-
1232
- end
1233
-
1234
- describe 'copy_module_to' do
1235
- let(:ignore_list) { Beaker::DSL::Helpers::PUPPET_MODULE_INSTALL_IGNORE }
1236
- let(:source){'./'}
1237
- let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
1238
- let(:module_parse_name){'testmodule'}
1239
-
1240
- shared_examples 'copy_module_to' do |opts|
1241
- it{
1242
- host = double("host")
1243
- host.stub(:[]).with('distmoduledir').and_return('/etc/puppetlabs/puppet/modules')
1244
- Dir.stub(:getpwd).and_return(source)
1245
-
1246
- subject.stub(:parse_for_moduleroot).and_return(source)
1247
- if module_parse_name
1248
- subject.stub(:parse_for_modulename).with(any_args()).and_return(module_parse_name)
1249
- else
1250
- subject.should_not_receive(:parse_for_modulename)
1251
- end
1252
-
1253
- File.stub(:exists?).with(any_args()).and_return(false)
1254
- File.stub(:directory?).with(any_args()).and_return(false)
1255
-
1256
- subject.should_receive(:scp_to).with(host,source, target, {:ignore => ignore_list})
1257
- if opts.nil?
1258
- subject.copy_module_to(host)
1259
- else
1260
- subject.copy_module_to(host,opts)
1261
- end
1262
- }
1263
- end
1264
- describe 'should call scp with the correct info, with only providing host' do
1265
- let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
1266
-
1267
- it_should_behave_like 'copy_module_to'
1268
- end
1269
- describe 'should call scp with the correct info, when specifying the modulename' do
1270
- let(:target){'/etc/puppetlabs/puppet/modules/bogusmodule'}
1271
- let(:module_parse_name){false}
1272
- it_should_behave_like 'copy_module_to', {:module_name =>'bogusmodule'}
1273
- end
1274
- describe 'should call scp with the correct info, when specifying the target to a different path' do
1275
- target = '/opt/shared/puppet/modules'
1276
- let(:target){"#{target}/testmodule"}
1277
- it_should_behave_like 'copy_module_to', {:target_module_path => target}
1278
- end
1279
- end
1280
-
1281
- describe 'split_author_modulename' do
1282
- it 'should return a correct modulename' do
1283
- result = subject.split_author_modulename('myname-test_43_module')
1284
- expect(result[:author]).to eq('myname')
1285
- expect(result[:module]).to eq('test_43_module')
1286
- end
1287
- end
1288
-
1289
- describe 'get_module_name' do
1290
- it 'should return a has of author and modulename' do
1291
- expect(subject.get_module_name('myname-test_43_module')).to eq('test_43_module')
1292
- end
1293
- it 'should return nil for invalid names' do
1294
- expect(subject.get_module_name('myname-')).to eq(nil)
1295
- end
1296
- end
1297
-
1298
- describe 'parse_for_modulename' do
1299
- directory = '/testfilepath/myname-testmodule'
1300
- it 'should return name from metadata.json' do
1301
- File.stub(:exists?).with("#{directory}/metadata.json").and_return(true)
1302
- File.stub(:read).with("#{directory}/metadata.json").and_return(" {\"name\":\"myname-testmodule\"} ")
1303
- subject.logger.should_receive(:debug).with("Attempting to parse Modulename from metadata.json")
1304
- subject.logger.should_not_receive(:debug).with('Unable to determine name, returning null')
1305
- subject.parse_for_modulename(directory).should eq('testmodule')
1306
- end
1307
- it 'should return name from Modulefile' do
1308
- File.stub(:exists?).with("#{directory}/metadata.json").and_return(false)
1309
- File.stub(:exists?).with("#{directory}/Modulefile").and_return(true)
1310
- File.stub(:read).with("#{directory}/Modulefile").and_return("name 'myname-testmodule' \nauthor 'myname'")
1311
- subject.logger.should_receive(:debug).with("Attempting to parse Modulename from Modulefile")
1312
- subject.logger.should_not_receive(:debug).with("Unable to determine name, returning null")
1313
- expect(subject.parse_for_modulename(directory)).to eq('testmodule')
1314
1210
  end
1315
1211
  end
1316
-
1317
- describe 'parse_for_module_root' do
1318
- directory = '/testfilepath/myname-testmodule'
1319
- it 'should recersively go up the directory to find the module files' do
1320
- File.stub(:exists?).with("#{directory}/acceptance/Modulefile").and_return(false)
1321
- File.stub(:exists?).with("#{directory}/Modulefile").and_return(true)
1322
- subject.logger.should_not_receive(:debug).with("At root, can't parse for another directory")
1323
- subject.logger.should_receive(:debug).with("No Modulefile found at #{directory}/acceptance, moving up")
1324
- expect(subject.parse_for_moduleroot("#{directory}/acceptance")).to eq(directory)
1325
- end
1326
- it 'should recersively go up the directory to find the module files' do
1327
- File.stub(:exists?).and_return(false)
1328
- subject.logger.should_receive(:debug).with("No Modulefile found at #{directory}, moving up")
1329
- subject.logger.should_receive(:error).with("At root, can't parse for another directory")
1330
- expect(subject.parse_for_moduleroot(directory)).to eq(nil)
1331
- end
1332
-
1333
- end
1334
1212
  end
@@ -2,9 +2,15 @@ require 'spec_helper'
2
2
 
3
3
  class ClassMixedWithDSLInstallUtils
4
4
  include Beaker::DSL::InstallUtils
5
+ include Beaker::DSL::Wrappers
6
+ include Beaker::DSL::Helpers
5
7
  include Beaker::DSL::Structure
6
8
  include Beaker::DSL::Roles
7
9
  include Beaker::DSL::Patterns
10
+
11
+ def logger
12
+ @logger ||= RSpec::Mocks::Mock.new('logger').as_null_object
13
+ end
8
14
  end
9
15
 
10
16
  describe ClassMixedWithDSLInstallUtils do
@@ -724,4 +730,175 @@ describe ClassMixedWithDSLInstallUtils do
724
730
 
725
731
  end
726
732
 
733
+ describe '#install_dev_puppet_module_on' do
734
+ context 'having set a stub forge' do
735
+ it 'stubs the forge on the host' do
736
+ master = hosts.first
737
+ subject.stub( :options ).and_return( {:forge_host => 'ahost.com'} )
738
+
739
+ subject.should_receive( :with_forge_stubbed_on )
740
+
741
+ subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
742
+ end
743
+
744
+ it 'installs via #install_puppet_module_via_pmt' do
745
+ master = hosts.first
746
+ subject.stub( :options ).and_return( {:forge_host => 'ahost.com'} )
747
+ subject.stub( :with_forge_stubbed_on ).and_yield
748
+
749
+ subject.should_receive( :install_puppet_module_via_pmt_on )
750
+
751
+ subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
752
+ end
753
+ end
754
+ context 'without a stub forge (default)' do
755
+ it 'calls copy_module_to to get the module on the SUT' do
756
+ master = hosts.first
757
+ subject.stub( :options ).and_return( {} )
758
+
759
+ subject.should_receive( :copy_module_to )
760
+
761
+ subject.install_dev_puppet_module_on( master, {:source => '/module', :module_name => 'test'} )
762
+ end
763
+ end
764
+ end
765
+
766
+ describe '#install_dev_puppet_module' do
767
+ it 'delegates to #install_dev_puppet_module_on with the hosts list' do
768
+ subject.stub( :hosts ).and_return( hosts )
769
+ subject.stub( :options ).and_return( {} )
770
+
771
+ hosts.each do |host|
772
+ subject.should_receive( :install_dev_puppet_module_on ).
773
+ with( host, {:source => '/module', :module_name => 'test'})
774
+ end
775
+
776
+ subject.install_dev_puppet_module( {:source => '/module', :module_name => 'test'} )
777
+ end
778
+ end
779
+
780
+ describe '#install_puppet_module_via_pmt_on' do
781
+ it 'installs module via puppet module tool' do
782
+ subject.stub( :hosts ).and_return( hosts )
783
+ master = hosts.first
784
+
785
+ subject.should_receive( :puppet ).with('module install test ' ).once
786
+
787
+ subject.install_puppet_module_via_pmt_on( master, {:module_name => 'test'} )
788
+ end
789
+ end
790
+
791
+ describe '#install_puppet_module_via_pmt' do
792
+ it 'delegates to #install_puppet_module_via_pmt with the hosts list' do
793
+ subject.stub( :hosts ).and_return( hosts )
794
+
795
+ subject.should_receive( :install_puppet_module_via_pmt_on ).with( hosts, {:source => '/module', :module_name => 'test'}).once
796
+
797
+ subject.install_puppet_module_via_pmt( {:source => '/module', :module_name => 'test'} )
798
+ end
799
+ end
800
+
801
+ describe 'copy_module_to' do
802
+ let(:ignore_list) { Beaker::DSL::InstallUtils::PUPPET_MODULE_INSTALL_IGNORE }
803
+ let(:source){ File.expand_path('./')}
804
+ let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
805
+ let(:module_parse_name){'testmodule'}
806
+
807
+ shared_examples 'copy_module_to' do |opts|
808
+ it{
809
+ host = double("host")
810
+ host.stub(:[]).with('distmoduledir').and_return('/etc/puppetlabs/puppet/modules')
811
+ result = double
812
+ stdout = target.split('/')[0..-2].join('/') + "\n"
813
+ result.stub(:stdout).and_return( stdout )
814
+ host.stub(:exec).with( any_args ).and_return( result )
815
+ Dir.stub(:getpwd).and_return(source)
816
+
817
+ subject.stub(:parse_for_moduleroot).and_return(source)
818
+ if module_parse_name
819
+ subject.stub(:parse_for_modulename).with(any_args()).and_return(module_parse_name)
820
+ else
821
+ subject.should_not_receive(:parse_for_modulename)
822
+ end
823
+
824
+ File.stub(:exists?).with(any_args()).and_return(false)
825
+ File.stub(:directory?).with(any_args()).and_return(false)
826
+
827
+ subject.should_receive(:scp_to).with(host,source, target, {:ignore => ignore_list})
828
+ if opts.nil?
829
+ subject.copy_module_to(host)
830
+ else
831
+ subject.copy_module_to(host,opts)
832
+ end
833
+ }
834
+ end
835
+ describe 'should call scp with the correct info, with only providing host' do
836
+ let(:target){'/etc/puppetlabs/puppet/modules/testmodule'}
837
+
838
+ it_should_behave_like 'copy_module_to', :module_name => 'testmodule'
839
+ end
840
+ describe 'should call scp with the correct info, when specifying the modulename' do
841
+ let(:target){'/etc/puppetlabs/puppet/modules/bogusmodule'}
842
+ let(:module_parse_name){false}
843
+ it_should_behave_like 'copy_module_to', {:module_name =>'bogusmodule'}
844
+ end
845
+ describe 'should call scp with the correct info, when specifying the target to a different path' do
846
+ target = '/opt/shared/puppet/modules'
847
+ let(:target){"#{target}/testmodule"}
848
+ it_should_behave_like 'copy_module_to', {:target_module_path => target, :module_name => 'testmodule'}
849
+ end
850
+ end
851
+
852
+ describe 'split_author_modulename' do
853
+ it 'should return a correct modulename' do
854
+ result = subject.split_author_modulename('myname-test_43_module')
855
+ expect(result[:author]).to eq('myname')
856
+ expect(result[:module]).to eq('test_43_module')
857
+ end
858
+ end
859
+
860
+ describe 'get_module_name' do
861
+ it 'should return an array of author and modulename' do
862
+ expect(subject.get_module_name('myname-test_43_module')).to eq(['myname', 'test_43_module'])
863
+ end
864
+ it 'should return nil for invalid names' do
865
+ expect(subject.get_module_name('myname-')).to eq(nil)
866
+ end
867
+ end
868
+
869
+ describe 'parse_for_modulename' do
870
+ directory = '/testfilepath/myname-testmodule'
871
+ it 'should return name from metadata.json' do
872
+ File.stub(:exists?).with("#{directory}/metadata.json").and_return(true)
873
+ File.stub(:read).with("#{directory}/metadata.json").and_return(" {\"name\":\"myname-testmodule\"} ")
874
+ subject.logger.should_receive(:debug).with("Attempting to parse Modulename from metadata.json")
875
+ subject.logger.should_not_receive(:debug).with('Unable to determine name, returning null')
876
+ subject.parse_for_modulename(directory).should eq(['myname', 'testmodule'])
877
+ end
878
+ it 'should return name from Modulefile' do
879
+ File.stub(:exists?).with("#{directory}/metadata.json").and_return(false)
880
+ File.stub(:exists?).with("#{directory}/Modulefile").and_return(true)
881
+ File.stub(:read).with("#{directory}/Modulefile").and_return("name 'myname-testmodule' \nauthor 'myname'")
882
+ subject.logger.should_receive(:debug).with("Attempting to parse Modulename from Modulefile")
883
+ subject.logger.should_not_receive(:debug).with("Unable to determine name, returning null")
884
+ expect(subject.parse_for_modulename(directory)).to eq(['myname', 'testmodule'])
885
+ end
886
+ end
887
+
888
+ describe 'parse_for_module_root' do
889
+ directory = '/testfilepath/myname-testmodule'
890
+ it 'should recersively go up the directory to find the module files' do
891
+ File.stub(:exists?).with("#{directory}/acceptance/Modulefile").and_return(false)
892
+ File.stub(:exists?).with("#{directory}/Modulefile").and_return(true)
893
+ subject.logger.should_not_receive(:debug).with("At root, can't parse for another directory")
894
+ subject.logger.should_receive(:debug).with("No Modulefile found at #{directory}/acceptance, moving up")
895
+ expect(subject.parse_for_moduleroot("#{directory}/acceptance")).to eq(directory)
896
+ end
897
+ it 'should recersively go up the directory to find the module files' do
898
+ File.stub(:exists?).and_return(false)
899
+ subject.logger.should_receive(:debug).with("No Modulefile found at #{directory}, moving up")
900
+ subject.logger.should_receive(:error).with("At root, can't parse for another directory")
901
+ expect(subject.parse_for_moduleroot(directory)).to eq(nil)
902
+ end
903
+ end
727
904
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.18.0
4
+ version: 1.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppetlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-18 00:00:00.000000000 Z
11
+ date: 2014-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest