puppet_litmus 0.18.0 → 0.19.0
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/README.md +1 -1
- data/exe/matrix_from_metadata +62 -0
- data/lib/puppet_litmus.rb +0 -1
- data/lib/puppet_litmus/inventory_manipulation.rb +16 -8
- data/lib/puppet_litmus/puppet_helpers.rb +51 -15
- data/lib/puppet_litmus/rake_helper.rb +94 -58
- data/lib/puppet_litmus/rake_tasks.rb +120 -94
- data/lib/puppet_litmus/spec_helper_acceptance.rb +4 -1
- data/lib/puppet_litmus/version.rb +1 -1
- data/spec/lib/puppet_litmus/inventory_manipulation_spec.rb +16 -16
- data/spec/lib/puppet_litmus/puppet_helpers_spec.rb +135 -106
- data/spec/lib/puppet_litmus/rake_helper_spec.rb +23 -23
- data/spec/lib/puppet_litmus/rake_tasks_spec.rb +11 -10
- data/spec/spec_helper.rb +7 -6
- metadata +28 -22
- data/lib/puppet_litmus/honeycomb_utils.rb +0 -13
| @@ -17,15 +17,15 @@ namespace :litmus do | |
| 17 17 | 
             
              end
         | 
| 18 18 |  | 
| 19 19 | 
             
              # Provisions a list of OSes from provision.yaml file e.g. 'bundle exec rake litmus:provision_list[default]'.
         | 
| 20 | 
            -
              # @See https://github. | 
| 20 | 
            +
              # @See https://puppetlabs.github.io/litmus/Litmus-core-commands.html#provisioning-via-yaml
         | 
| 21 21 | 
             
              #
         | 
| 22 22 | 
             
              # @param :key [String] key that maps to a value for a provisioner and an image to be used for each OS provisioned.
         | 
| 23 | 
            -
              desc  | 
| 23 | 
            +
              desc 'provision list of machines from provision.yaml file'
         | 
| 24 24 | 
             
              task :provision_list, [:key] do |_task, args|
         | 
| 25 25 | 
             
                raise 'Cannot find provision.yaml file' unless File.file?('./provision.yaml')
         | 
| 26 26 |  | 
| 27 27 | 
             
                provision_hash = YAML.load_file('./provision.yaml')
         | 
| 28 | 
            -
                raise "No key #{args[:key]} in ./provision.yaml, see https://github. | 
| 28 | 
            +
                raise "No key #{args[:key]} in ./provision.yaml, see https://puppetlabs.github.io/litmus/Litmus-core-commands.html#provisioning-via-yaml for examples" if provision_hash[args[:key]].nil?
         | 
| 29 29 |  | 
| 30 30 | 
             
                Rake::Task['spec_prep'].invoke
         | 
| 31 31 |  | 
| @@ -59,7 +59,7 @@ namespace :litmus do | |
| 59 59 | 
             
                  if result.first['status'] != 'success'
         | 
| 60 60 | 
             
                    failed_image_message += "=====\n#{result.first['target']}\n#{result.first['value']['_output']}\n#{result.inspect}"
         | 
| 61 61 | 
             
                  else
         | 
| 62 | 
            -
                     | 
| 62 | 
            +
                    $stdout.puts "#{result.first['value']['node_name']}, #{image}"
         | 
| 63 63 | 
             
                  end
         | 
| 64 64 | 
             
                  results << result
         | 
| 65 65 | 
             
                end
         | 
| @@ -71,7 +71,7 @@ namespace :litmus do | |
| 71 71 | 
             
              #
         | 
| 72 72 | 
             
              # @param :provisioner [String] provisioner to use in provisioning given platform.
         | 
| 73 73 | 
             
              # @param :platform [String] OS platform for container or VM to use.
         | 
| 74 | 
            -
              desc  | 
| 74 | 
            +
              desc 'provision a test system using the given provisioner and platform name. See the puppetlabs-provision module tasks for more documentation'
         | 
| 75 75 | 
             
              task :provision, [:provisioner, :platform, :inventory_vars] do |_task, args|
         | 
| 76 76 | 
             
                Rake::Task['spec_prep'].invoke
         | 
| 77 77 | 
             
                if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
         | 
| @@ -103,7 +103,7 @@ namespace :litmus do | |
| 103 103 | 
             
              #
         | 
| 104 104 | 
             
              # @param :collection [String] parameters to pass to the puppet agent install command.
         | 
| 105 105 | 
             
              # @param :target_node_name [Array] nodes on which to install puppet agent.
         | 
| 106 | 
            -
              desc 'install puppet agent | 
| 106 | 
            +
              desc 'install a puppet agent to all or a specified set of targets'
         | 
| 107 107 | 
             
              task :install_agent, [:collection, :target_node_name] do |_task, args|
         | 
| 108 108 | 
             
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 109 109 | 
             
                targets = find_targets(inventory_hash, args[:target_node_name])
         | 
| @@ -122,28 +122,41 @@ namespace :litmus do | |
| 122 122 | 
             
                    command_to_run = "bolt task run puppet_agent::install --targets #{result['target']} --inventoryfile inventory.yaml --modulepath #{DEFAULT_CONFIG_DATA['modulepath']}"
         | 
| 123 123 | 
             
                    raise "Failed on #{result['target']}\n#{result}\ntry running '#{command_to_run}'"
         | 
| 124 124 | 
             
                  else
         | 
| 125 | 
            +
                    # validate successful install
         | 
| 126 | 
            +
                    puts "Successfull install result: #{result.inspect}" if ENV['DEBUG'] == true
         | 
| 127 | 
            +
                    retries = 0
         | 
| 128 | 
            +
                    begin
         | 
| 129 | 
            +
                      responses = run_command('puppet --version', targets, options: {}, config: DEFAULT_CONFIG_DATA, inventory: inventory_hash.clone)
         | 
| 130 | 
            +
                      responses.each do |response|
         | 
| 131 | 
            +
                        raise "Error checking puppet version on #{response.to_json}" if response['status'] != 'success'
         | 
| 132 | 
            +
                      end
         | 
| 133 | 
            +
                    rescue StandardError => e
         | 
| 134 | 
            +
                      puts "ERROR:#{e}"
         | 
| 135 | 
            +
                      # fix the path
         | 
| 136 | 
            +
                      path_changes = configure_path(inventory_hash)
         | 
| 137 | 
            +
                      path_changes.each do |change|
         | 
| 138 | 
            +
                        puts "Configuring puppet path result: #{change.inspect}"
         | 
| 139 | 
            +
                      end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                      retries += 1
         | 
| 142 | 
            +
                      sleep 3
         | 
| 143 | 
            +
                      retry if retries <= 300
         | 
| 144 | 
            +
                      raise 'Failed to detect installed puppet version after 5 minutes'
         | 
| 145 | 
            +
                    end
         | 
| 146 | 
            +
             | 
| 125 147 | 
             
                    # add puppet-agent feature to successful nodes
         | 
| 126 148 | 
             
                    inventory_hash = add_feature_to_node(inventory_hash, 'puppet-agent', result['target'])
         | 
| 127 149 | 
             
                  end
         | 
| 128 150 | 
             
                end
         | 
| 129 151 | 
             
                # update the inventory with the puppet-agent feature set per node
         | 
| 130 152 | 
             
                write_to_inventory_file(inventory_hash, 'inventory.yaml')
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                # fix the path on ssh_nodes
         | 
| 133 | 
            -
                results = configure_path(inventory_hash)
         | 
| 134 | 
            -
             | 
| 135 | 
            -
                results.each do |result|
         | 
| 136 | 
            -
                  if result['status'] != 'success'
         | 
| 137 | 
            -
                    puts "Failed on #{result['target']}\n#{result}"
         | 
| 138 | 
            -
                  end
         | 
| 139 | 
            -
                end
         | 
| 140 153 | 
             
              end
         | 
| 141 154 |  | 
| 142 155 | 
             
              # Add a given feature to a selection of nodes
         | 
| 143 156 | 
             
              #
         | 
| 144 157 | 
             
              # @param :target_node_name [Array] nodes on which to add the feature.
         | 
| 145 158 | 
             
              # @param :added_feature [String] the feature which you wish to add.
         | 
| 146 | 
            -
              desc ' | 
| 159 | 
            +
              desc 'add a feature tag to a node'
         | 
| 147 160 | 
             
              task :add_feature, [:added_feature, :target_node_name] do |_task, args|
         | 
| 148 161 | 
             
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 149 162 | 
             
                targets = find_targets(inventory_hash, args[:target_node_name])
         | 
| @@ -166,83 +179,118 @@ namespace :litmus do | |
| 166 179 | 
             
                puts 'Feature added'
         | 
| 167 180 | 
             
              end
         | 
| 168 181 |  | 
| 182 | 
            +
              # Install the puppet module under test on a collection of nodes
         | 
| 183 | 
            +
              #
         | 
| 184 | 
            +
              # @param :target_node_name [Array] nodes on which to install a puppet module for testing.
         | 
| 185 | 
            +
              desc 'build the module under test and install it onto targets'
         | 
| 186 | 
            +
              task :install_module, [:target_node_name, :module_repository] do |_task, args|
         | 
| 187 | 
            +
                args.with_defaults(target_node_name: nil, module_repository: nil)
         | 
| 188 | 
            +
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 189 | 
            +
                target_nodes = find_targets(inventory_hash, args[:target_node_name])
         | 
| 190 | 
            +
                if target_nodes.empty?
         | 
| 191 | 
            +
                  puts 'No targets found'
         | 
| 192 | 
            +
                  exit 0
         | 
| 193 | 
            +
                end
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                module_tar = build_module
         | 
| 196 | 
            +
                puts "Built '#{module_tar}'"
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                # module_tar = Dir.glob('pkg/*.tar.gz').max_by { |f| File.mtime(f) }
         | 
| 199 | 
            +
                raise "Unable to find package in 'pkg/*.tar.gz'" if module_tar.nil?
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                install_module(inventory_hash, args[:target_node_name], module_tar, args[:module_repository])
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                puts "Installed '#{module_tar}' on #{args[:target_node_name]}"
         | 
| 204 | 
            +
              end
         | 
| 205 | 
            +
             | 
| 169 206 | 
             
              # Install the puppet modules from a source directory to nodes. It does not install dependencies.
         | 
| 170 207 | 
             
              #
         | 
| 171 208 | 
             
              # @param :source [String] source directory to look in (ignores symlinks) defaults do './spec/fixtures/modules'.
         | 
| 172 209 | 
             
              # @param :target_node_name [Array] nodes on which to install a puppet module for testing.
         | 
| 173 | 
            -
              desc ' | 
| 174 | 
            -
              task :install_modules_from_directory, [:source, :target_node_name, :module_repository] do |_task, args|
         | 
| 175 | 
            -
                args.with_defaults(source: nil, target_node_name: nil, module_repository:  | 
| 210 | 
            +
              desc 'build and install all modules from a directory'
         | 
| 211 | 
            +
              task :install_modules_from_directory, [:source, :target_node_name, :module_repository, :ignore_dependencies] do |_task, args|
         | 
| 212 | 
            +
                args.with_defaults(source: nil, target_node_name: nil, module_repository: nil, ignore_dependencies: false)
         | 
| 176 213 | 
             
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 177 214 | 
             
                target_nodes = find_targets(inventory_hash, args[:target_node_name])
         | 
| 178 215 | 
             
                if target_nodes.empty?
         | 
| 179 216 | 
             
                  puts 'No targets found'
         | 
| 180 217 | 
             
                  exit 0
         | 
| 181 218 | 
             
                end
         | 
| 182 | 
            -
                 | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
             | 
| 187 | 
            -
                raise "Source  | 
| 188 | 
            -
             | 
| 189 | 
            -
                puts  | 
| 190 | 
            -
                module_tars =  | 
| 219 | 
            +
                source_dir = if args[:source].nil?
         | 
| 220 | 
            +
                               './spec/fixtures/modules'
         | 
| 221 | 
            +
                             else
         | 
| 222 | 
            +
                               File.expand_path(args[:source])
         | 
| 223 | 
            +
                             end
         | 
| 224 | 
            +
                raise "Source directory doesn't exist #{source_dir}" unless File.directory?(source_dir)
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                puts "Building all modules in #{source_dir.inspect}"
         | 
| 227 | 
            +
                module_tars = build_modules_in_dir(source_dir)
         | 
| 191 228 | 
             
                require 'bolt_spec/run'
         | 
| 192 229 | 
             
                include BoltSpec::Run
         | 
| 193 | 
            -
                puts "\nInstalling"
         | 
| 194 230 | 
             
                module_tars.each do |module_tar|
         | 
| 231 | 
            +
                  puts "Installing '#{module_tar}'"
         | 
| 195 232 | 
             
                  target_nodes.each do |target_node_name|
         | 
| 196 | 
            -
                    install_module(inventory_hash, target_node_name, module_tar, args[:module_repository])
         | 
| 233 | 
            +
                    install_module(inventory_hash, target_node_name, module_tar, args[:module_repository], args[:ignore_dependencies])
         | 
| 234 | 
            +
                    puts "Installed '#{module_tar}' on #{target_node_name}"
         | 
| 197 235 | 
             
                  end
         | 
| 198 236 | 
             
                end
         | 
| 199 237 | 
             
              end
         | 
| 200 238 |  | 
| 201 | 
            -
              #  | 
| 239 | 
            +
              # Uninstall the puppet module under test on a collection of nodes
         | 
| 202 240 | 
             
              #
         | 
| 203 | 
            -
              # @param :target_node_name [Array] nodes on which to  | 
| 204 | 
            -
               | 
| 205 | 
            -
               | 
| 241 | 
            +
              # @param :target_node_name [Array] nodes on which to install a puppet module for testing.
         | 
| 242 | 
            +
              # @param :module_name [String] module name to be uninstalled
         | 
| 243 | 
            +
              desc 'uninstall a specific module'
         | 
| 244 | 
            +
              task :uninstall_module, [:target_node_name, :module_name] do |_task, args|
         | 
| 206 245 | 
             
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 207 246 | 
             
                target_nodes = find_targets(inventory_hash, args[:target_node_name])
         | 
| 208 247 | 
             
                if target_nodes.empty?
         | 
| 209 248 | 
             
                  puts 'No targets found'
         | 
| 210 249 | 
             
                  exit 0
         | 
| 211 250 | 
             
                end
         | 
| 212 | 
            -
             | 
| 251 | 
            +
             | 
| 252 | 
            +
                result = uninstall_module(inventory_hash, args[:target_node_name], args[:module_name])
         | 
| 253 | 
            +
             | 
| 254 | 
            +
                raise "Failed trying to run 'puppet module uninstall #{module_name}' against inventory." unless result.is_a?(Array)
         | 
| 255 | 
            +
             | 
| 256 | 
            +
                result.each do |node|
         | 
| 257 | 
            +
                  puts "#{node['target']} failed #{node['value']}" if node['status'] != 'success'
         | 
| 258 | 
            +
                end
         | 
| 259 | 
            +
             | 
| 260 | 
            +
                puts 'Uninstalled'
         | 
| 213 261 | 
             
              end
         | 
| 214 262 |  | 
| 215 | 
            -
              #  | 
| 263 | 
            +
              # Reinstall the puppet module under test on a collection of nodes
         | 
| 216 264 | 
             
              #
         | 
| 217 265 | 
             
              # @param :target_node_name [Array] nodes on which to install a puppet module for testing.
         | 
| 218 | 
            -
              desc ' | 
| 219 | 
            -
              task : | 
| 220 | 
            -
                args.with_defaults(target_node_name: nil, module_repository:  | 
| 266 | 
            +
              desc 'reinstall the module under test'
         | 
| 267 | 
            +
              task :reinstall_module, [:target_node_name, :module_repository] do |_task, args|
         | 
| 268 | 
            +
                args.with_defaults(target_node_name: nil, module_repository: nil)
         | 
| 269 | 
            +
                Rake::Task['litmus:uninstall_module'].invoke(args[:target_node_name])
         | 
| 270 | 
            +
                Rake::Task['litmus:install_module'].invoke(args[:target_node_name], args[:module_repository])
         | 
| 271 | 
            +
              end
         | 
| 272 | 
            +
             | 
| 273 | 
            +
              # Check that the nodes in the inventory are still contactable
         | 
| 274 | 
            +
              #
         | 
| 275 | 
            +
              # @param :target_node_name [Array] nodes on which to check connnectivity
         | 
| 276 | 
            +
              desc 'check the connectivity to all provisioned targets'
         | 
| 277 | 
            +
              task :check_connectivity, [:target_node_name] do |_task, args|
         | 
| 221 278 | 
             
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 222 279 | 
             
                target_nodes = find_targets(inventory_hash, args[:target_node_name])
         | 
| 223 280 | 
             
                if target_nodes.empty?
         | 
| 224 281 | 
             
                  puts 'No targets found'
         | 
| 225 282 | 
             
                  exit 0
         | 
| 226 283 | 
             
                end
         | 
| 227 | 
            -
             | 
| 228 | 
            -
                module_tar = build_module
         | 
| 229 | 
            -
                puts 'Built'
         | 
| 230 | 
            -
             | 
| 231 | 
            -
                # module_tar = Dir.glob('pkg/*.tar.gz').max_by { |f| File.mtime(f) }
         | 
| 232 | 
            -
                raise "Unable to find package in 'pkg/*.tar.gz'" if module_tar.nil?
         | 
| 233 | 
            -
             | 
| 234 | 
            -
                install_module(inventory_hash, args[:target_node_name], module_tar, args[:module_repository])
         | 
| 235 | 
            -
             | 
| 236 | 
            -
                puts 'Installed'
         | 
| 284 | 
            +
                check_connectivity?(inventory_hash, args[:target_node_name])
         | 
| 237 285 | 
             
              end
         | 
| 238 286 |  | 
| 239 287 | 
             
              # Provision a list of machines, install a puppet agent, and install the puppet module under test on a collection of nodes
         | 
| 240 288 | 
             
              #
         | 
| 241 289 | 
             
              # @param :key [String] key that maps to a value for a provisioner and an image to be used for each OS provisioned.
         | 
| 242 290 | 
             
              # @param :collection [String] parameters to pass to the puppet agent install command.
         | 
| 243 | 
            -
              desc ' | 
| 291 | 
            +
              desc 'provision a list of machines, install an agent, and the module.'
         | 
| 244 292 | 
             
              task :provision_install, [:key, :collection, :module_repository] do |_task, args|
         | 
| 245 | 
            -
                args.with_defaults(module_repository:  | 
| 293 | 
            +
                args.with_defaults(module_repository: nil)
         | 
| 246 294 | 
             
                Rake::Task['spec_prep'].invoke
         | 
| 247 295 | 
             
                Rake::Task['litmus:provision_list'].invoke(args[:key])
         | 
| 248 296 | 
             
                Rake::Task['litmus:install_agent'].invoke(args[:collection])
         | 
| @@ -252,7 +300,7 @@ namespace :litmus do | |
| 252 300 | 
             
              # Decommissions test machines.
         | 
| 253 301 | 
             
              #
         | 
| 254 302 | 
             
              # @param :target [Array] nodes to remove from test environemnt and decommission.
         | 
| 255 | 
            -
              desc ' | 
| 303 | 
            +
              desc 'destroy provisioned targets'
         | 
| 256 304 | 
             
              task :tear_down, [:target] do |_task, args|
         | 
| 257 305 | 
             
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 258 306 | 
             
                targets = find_targets(inventory_hash, args[:target])
         | 
| @@ -278,40 +326,6 @@ namespace :litmus do | |
| 278 326 | 
             
                end
         | 
| 279 327 | 
             
              end
         | 
| 280 328 |  | 
| 281 | 
            -
              # Uninstall the puppet module under test on a collection of nodes
         | 
| 282 | 
            -
              #
         | 
| 283 | 
            -
              # @param :target_node_name [Array] nodes on which to install a puppet module for testing.
         | 
| 284 | 
            -
              # @param :module_name [String] module name to be uninstalled
         | 
| 285 | 
            -
              desc 'uninstall_module - uninstall module'
         | 
| 286 | 
            -
              task :uninstall_module, [:target_node_name, :module_name] do |_task, args|
         | 
| 287 | 
            -
                inventory_hash = inventory_hash_from_inventory_file
         | 
| 288 | 
            -
                target_nodes = find_targets(inventory_hash, args[:target_node_name])
         | 
| 289 | 
            -
                if target_nodes.empty?
         | 
| 290 | 
            -
                  puts 'No targets found'
         | 
| 291 | 
            -
                  exit 0
         | 
| 292 | 
            -
                end
         | 
| 293 | 
            -
             | 
| 294 | 
            -
                result = uninstall_module(inventory_hash, args[:target_node_name], args[:module_name])
         | 
| 295 | 
            -
             | 
| 296 | 
            -
                raise "Failed trying to run 'puppet module uninstall #{module_name}' against inventory." unless result.is_a?(Array)
         | 
| 297 | 
            -
             | 
| 298 | 
            -
                result.each do |node|
         | 
| 299 | 
            -
                  puts "#{node['target']} failed #{node['value']}" if node['status'] != 'success'
         | 
| 300 | 
            -
                end
         | 
| 301 | 
            -
             | 
| 302 | 
            -
                puts 'Uninstalled'
         | 
| 303 | 
            -
              end
         | 
| 304 | 
            -
             | 
| 305 | 
            -
              # Reinstall the puppet module under test on a collection of nodes
         | 
| 306 | 
            -
              #
         | 
| 307 | 
            -
              # @param :target_node_name [Array] nodes on which to install a puppet module for testing.
         | 
| 308 | 
            -
              desc 'reinstall_module - reinstall module'
         | 
| 309 | 
            -
              task :reinstall_module, [:target_node_name, :module_repository] do |_task, args|
         | 
| 310 | 
            -
                args.with_defaults(target_node_name: nil, module_repository: 'https://forgeapi.puppetlabs.com')
         | 
| 311 | 
            -
                Rake::Task['litmus:uninstall_module'].invoke(args[:target_node_name])
         | 
| 312 | 
            -
                Rake::Task['litmus:install_module'].invoke(args[:target_node_name], args[:module_repository])
         | 
| 313 | 
            -
              end
         | 
| 314 | 
            -
             | 
| 315 329 | 
             
              namespace :acceptance do
         | 
| 316 330 | 
             
                require 'rspec/core/rake_task'
         | 
| 317 331 | 
             
                if File.file?('inventory.yaml')
         | 
| @@ -320,15 +334,21 @@ namespace :litmus do | |
| 320 334 |  | 
| 321 335 | 
             
                  # Run acceptance tests against all machines in the inventory file in parallel.
         | 
| 322 336 | 
             
                  desc 'Run tests in parallel against all machines in the inventory file'
         | 
| 323 | 
            -
                  task :parallel do
         | 
| 337 | 
            +
                  task :parallel, [:tag] do |_task, args|
         | 
| 338 | 
            +
                    args.with_defaults(tag: nil)
         | 
| 324 339 | 
             
                    if targets.empty?
         | 
| 325 340 | 
             
                      puts 'No targets found'
         | 
| 326 341 | 
             
                      exit 0
         | 
| 327 342 | 
             
                    end
         | 
| 343 | 
            +
                    tag_value = if args[:tag].nil?
         | 
| 344 | 
            +
                                  nil
         | 
| 345 | 
            +
                                else
         | 
| 346 | 
            +
                                  "--tag #{args[:tag]}"
         | 
| 347 | 
            +
                                end
         | 
| 328 348 | 
             
                    payloads = []
         | 
| 329 349 | 
             
                    # Generate list of targets to provision
         | 
| 330 350 | 
             
                    targets.each do |target|
         | 
| 331 | 
            -
                      test =  | 
| 351 | 
            +
                      test = "bundle exec rspec ./spec/acceptance #{tag_value} --format progress --require rspec_honeycomb_formatter --format RSpecHoneycombFormatter"
         | 
| 332 352 | 
             
                      title = "#{target}, #{facts_from_node(inventory_hash, target)['platform']}"
         | 
| 333 353 | 
             
                      options = {
         | 
| 334 354 | 
             
                        env: {
         | 
| @@ -354,17 +374,21 @@ namespace :litmus do | |
| 354 374 |  | 
| 355 375 | 
             
                      require 'parallel'
         | 
| 356 376 | 
             
                      results = Parallel.map(payloads) do |title, test, options|
         | 
| 377 | 
            +
                        # avoid sending the parent process' main span in the sub-processes
         | 
| 378 | 
            +
                        # https://www.ruby-forum.com/t/at-exit-inherited-across-fork/122473/2
         | 
| 379 | 
            +
                        at_exit { exit! }
         | 
| 380 | 
            +
             | 
| 357 381 | 
             
                        env = options[:env].nil? ? {} : options[:env]
         | 
| 358 | 
            -
                         | 
| 382 | 
            +
                        env['HTTP_X_HONEYCOMB_TRACE'] = Honeycomb.current_span.to_trace_header
         | 
| 359 383 | 
             
                        stdout, stderr, status = Open3.capture3(env, test)
         | 
| 360 384 | 
             
                        ["\n================\n#{title}\n", stdout, stderr, status]
         | 
| 361 385 | 
             
                      end
         | 
| 362 386 | 
             
                      # because we cannot modify variables inside of Parallel
         | 
| 363 387 | 
             
                      results.each do |result|
         | 
| 364 388 | 
             
                        if result.last.to_i.zero?
         | 
| 365 | 
            -
                          success_list.push(result.first.scan(%r{.*})[ | 
| 389 | 
            +
                          success_list.push(result.first.scan(%r{.*})[3])
         | 
| 366 390 | 
             
                        else
         | 
| 367 | 
            -
                          failure_list.push(result.first.scan(%r{.*})[ | 
| 391 | 
            +
                          failure_list.push(result.first.scan(%r{.*})[3])
         | 
| 368 392 | 
             
                        end
         | 
| 369 393 | 
             
                      end
         | 
| 370 394 | 
             
                      Thread.kill(progress)
         | 
| @@ -373,8 +397,8 @@ namespace :litmus do | |
| 373 397 | 
             
                      spinners = TTY::Spinner::Multi.new("[:spinner] Running against #{targets.size} targets.")
         | 
| 374 398 | 
             
                      payloads.each do |title, test, options|
         | 
| 375 399 | 
             
                        env = options[:env].nil? ? {} : options[:env]
         | 
| 400 | 
            +
                        env['HTTP_X_HONEYCOMB_TRACE'] = Honeycomb.current_span.to_trace_header
         | 
| 376 401 | 
             
                        spinners.register("[:spinner] #{title}") do |sp|
         | 
| 377 | 
            -
                          ENV['HTTP_X_HONEYCOMB_TRACE'] = Honecomb.current_span.to_trace_header unless ENV['HTTP_X_HONEYCOMB_TRACE']
         | 
| 378 402 | 
             
                          stdout, stderr, status = Open3.capture3(env, test)
         | 
| 379 403 | 
             
                          if status.to_i.zero?
         | 
| 380 404 | 
             
                            sp.success
         | 
| @@ -406,8 +430,9 @@ namespace :litmus do | |
| 406 430 | 
             
                    desc "Run serverspec against #{target}"
         | 
| 407 431 | 
             
                    next if target == 'litmus_localhost'
         | 
| 408 432 |  | 
| 409 | 
            -
                    RSpec::Core::RakeTask.new(target.to_sym) do |t|
         | 
| 433 | 
            +
                    RSpec::Core::RakeTask.new(target.to_sym, :tag) do |t, args|
         | 
| 410 434 | 
             
                      t.pattern = 'spec/acceptance/**{,/*/**}/*_spec.rb'
         | 
| 435 | 
            +
                      t.rspec_opts = "--tag #{args[:tag]}" unless args[:tag].nil?
         | 
| 411 436 | 
             
                      ENV['TARGET_HOST'] = target
         | 
| 412 437 | 
             
                    end
         | 
| 413 438 | 
             
                  end
         | 
| @@ -416,8 +441,9 @@ namespace :litmus do | |
| 416 441 | 
             
                # add localhost separately
         | 
| 417 442 | 
             
                desc 'Run serverspec against localhost, USE WITH CAUTION, this action can be potentially dangerous.'
         | 
| 418 443 | 
             
                host = 'localhost'
         | 
| 419 | 
            -
                RSpec::Core::RakeTask.new(host.to_sym) do |t|
         | 
| 444 | 
            +
                RSpec::Core::RakeTask.new(host.to_sym, :tag) do |t, args|
         | 
| 420 445 | 
             
                  t.pattern = 'spec/acceptance/**{,/*/**}/*_spec.rb'
         | 
| 446 | 
            +
                  t.rspec_opts = "--tag #{args[:tag]}" unless args[:tag].nil?
         | 
| 421 447 | 
             
                  Rake::Task['spec_prep'].invoke
         | 
| 422 448 | 
             
                  ENV['TARGET_HOST'] = host
         | 
| 423 449 | 
             
                end
         | 
| @@ -35,6 +35,7 @@ module PuppetLitmus | |
| 35 35 | 
             
                    options[:port] = node_config.dig('ssh', 'port') unless node_config.dig('ssh', 'port').nil?
         | 
| 36 36 | 
             
                    options[:keys] = node_config.dig('ssh', 'private-key') unless node_config.dig('ssh', 'private-key').nil?
         | 
| 37 37 | 
             
                    options[:password] = node_config.dig('ssh', 'password') unless node_config.dig('ssh', 'password').nil?
         | 
| 38 | 
            +
                    run_as = node_config.dig('ssh', 'run-as') unless node_config.dig('ssh', 'run-as').nil?
         | 
| 38 39 | 
             
                    # Support both net-ssh 4 and 5.
         | 
| 39 40 | 
             
                    # rubocop:disable Metrics/BlockNesting
         | 
| 40 41 | 
             
                    options[:verify_host_key] = if node_config.dig('ssh', 'host-key-check').nil?
         | 
| @@ -66,7 +67,9 @@ module PuppetLitmus | |
| 66 67 | 
             
                           end
         | 
| 67 68 | 
             
                    set :host,        options[:host_name] || host
         | 
| 68 69 | 
             
                    set :ssh_options, options
         | 
| 69 | 
            -
                    set :request_pty,  | 
| 70 | 
            +
                    set :request_pty, false
         | 
| 71 | 
            +
                    set :sudo_password, options[:password] if run_as
         | 
| 72 | 
            +
                    puts "Running tests as #{run_as}" if run_as
         | 
| 70 73 | 
             
                  elsif target_in_group(inventory_hash, ENV['TARGET_HOST'], 'winrm_nodes')
         | 
| 71 74 | 
             
                    require 'winrm'
         | 
| 72 75 |  | 
| @@ -92,70 +92,70 @@ RSpec.describe PuppetLitmus::InventoryManipulation do | |
| 92 92 | 
             
                end
         | 
| 93 93 |  | 
| 94 94 | 
             
                it 'no matching node, raises' do
         | 
| 95 | 
            -
                  expect {  | 
| 95 | 
            +
                  expect { config_from_node(config_hash, 'not.here') }.to raise_error('No config was found for not.here')
         | 
| 96 96 | 
             
                end
         | 
| 97 97 |  | 
| 98 98 | 
             
                it 'no config section, returns nil' do
         | 
| 99 | 
            -
                  expect( | 
| 99 | 
            +
                  expect(config_from_node(no_config_hash, 'test.delivery.puppetlabs.net')).to eq(nil)
         | 
| 100 100 | 
             
                end
         | 
| 101 101 |  | 
| 102 102 | 
             
                it 'config exists, and returns' do
         | 
| 103 | 
            -
                  expect( | 
| 103 | 
            +
                  expect(config_from_node(config_hash, 'test.delivery.puppetlabs.net')).to eq('transport' => 'ssh', 'ssh' =>
         | 
| 104 104 | 
             
            { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false })
         | 
| 105 105 | 
             
                end
         | 
| 106 106 |  | 
| 107 107 | 
             
                it 'facts exists, and returns' do
         | 
| 108 | 
            -
                  expect( | 
| 108 | 
            +
                  expect(facts_from_node(config_hash, 'test.delivery.puppetlabs.net')).to eq('provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64')
         | 
| 109 109 | 
             
                end
         | 
| 110 110 |  | 
| 111 111 | 
             
                it 'vars exists, and returns' do
         | 
| 112 | 
            -
                  expect( | 
| 112 | 
            +
                  expect(vars_from_node(config_hash, 'test.delivery.puppetlabs.net')).to eq('role' => 'agent')
         | 
| 113 113 | 
             
                end
         | 
| 114 114 |  | 
| 115 115 | 
             
                it 'no feature exists for the group, and returns hash with feature added' do
         | 
| 116 | 
            -
                  expect( | 
| 116 | 
            +
                  expect(add_feature_to_group(no_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'targets' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'uri' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'targets' => [] }]) # rubocop:disable Layout/LineLength: Line is too long
         | 
| 117 117 | 
             
                end
         | 
| 118 118 |  | 
| 119 119 | 
             
                it 'feature exists for the group, and returns hash with feature removed' do
         | 
| 120 | 
            -
                  expect( | 
| 120 | 
            +
                  expect(remove_feature_from_group(feature_hash_group, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => [], 'name' => 'ssh_nodes', 'targets' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'uri' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'targets' => [] }]) # rubocop:disable Layout/LineLength: Line is too long
         | 
| 121 121 | 
             
                end
         | 
| 122 122 |  | 
| 123 123 | 
             
                it 'write from inventory_hash to inventory_yaml file feature_hash_group' do
         | 
| 124 | 
            -
                  expect {  | 
| 124 | 
            +
                  expect { write_to_inventory_file(feature_hash_group, inventory_full_path) }.not_to raise_error
         | 
| 125 125 | 
             
                end
         | 
| 126 126 |  | 
| 127 127 | 
             
                it 'empty feature exists for the group, and returns hash with feature added' do
         | 
| 128 | 
            -
                  expect( | 
| 128 | 
            +
                  expect(add_feature_to_group(empty_feature_hash_group, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'targets' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'uri' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'targets' => [] }]) # rubocop:disable Layout/LineLength: Line is too long
         | 
| 129 129 | 
             
                end
         | 
| 130 130 |  | 
| 131 131 | 
             
                it 'no feature exists for the node, and returns hash with feature added' do
         | 
| 132 | 
            -
                  expect( | 
| 132 | 
            +
                  expect(add_feature_to_node(no_feature_hash, 'puppet-agent', 'test.delivery.puppetlabs.net')).to eq('groups' => [{ 'name' => 'ssh_nodes', 'targets' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'uri' => 'test.delivery.puppetlabs.net', 'features' => ['puppet-agent'] }] }, { 'name' => 'winrm_nodes', 'targets' => [] }]) # rubocop:disable Layout/LineLength: Line is too long
         | 
| 133 133 | 
             
                end
         | 
| 134 134 |  | 
| 135 135 | 
             
                it 'feature exists for the node, and returns hash with feature removed' do
         | 
| 136 | 
            -
                  expect( | 
| 136 | 
            +
                  expect(remove_feature_from_node(feature_hash_node, 'puppet-agent', 'test.delivery.puppetlabs.net')).to eq('groups' => [{ 'name' => 'ssh_nodes', 'targets' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'uri' => 'test.delivery.puppetlabs.net', 'features' => [] }] }, { 'name' => 'winrm_nodes', 'targets' => [] }]) # rubocop:disable Layout/LineLength: Line is too long
         | 
| 137 137 | 
             
                end
         | 
| 138 138 |  | 
| 139 139 | 
             
                it 'write from inventory_hash to inventory_yaml file feature_hash_node' do
         | 
| 140 | 
            -
                  expect {  | 
| 140 | 
            +
                  expect { write_to_inventory_file(feature_hash_node, inventory_full_path) }.not_to raise_error
         | 
| 141 141 | 
             
                end
         | 
| 142 142 |  | 
| 143 143 | 
             
                it 'empty feature exists for the node, and returns hash with feature added' do
         | 
| 144 | 
            -
                  expect( | 
| 144 | 
            +
                  expect(add_feature_to_node(empty_feature_hash_node, 'puppet-agent', 'test.delivery.puppetlabs.net')).to eq('groups' => [{ 'name' => 'ssh_nodes', 'targets' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'uri' => 'test.delivery.puppetlabs.net', 'features' => ['puppet-agent'] }] }, { 'name' => 'winrm_nodes', 'targets' => [] }]) # rubocop:disable Layout/LineLength: Line is too long
         | 
| 145 145 | 
             
                end
         | 
| 146 146 |  | 
| 147 147 | 
             
                it 'write from inventory_hash to inventory_yaml file no feature_hash' do
         | 
| 148 148 | 
             
                  expect(File).to exist(inventory_full_path)
         | 
| 149 | 
            -
                  expect {  | 
| 149 | 
            +
                  expect { write_to_inventory_file(no_feature_hash, inventory_full_path) }.not_to raise_error
         | 
| 150 150 | 
             
                end
         | 
| 151 151 |  | 
| 152 152 | 
             
                it 'group does not exist in inventory, and returns hash with group added' do
         | 
| 153 | 
            -
                  expect( | 
| 153 | 
            +
                  expect(add_node_to_group(no_docker_hash, foo_node, 'docker_nodes')).to eq('groups' =>
         | 
| 154 154 | 
             
                    [{ 'name' => 'ssh_nodes', 'targets' => [] }, { 'name' => 'winrm_nodes', 'targets' => [] }, { 'name' => 'docker_nodes', 'targets' => [foo_node] }])
         | 
| 155 155 | 
             
                end
         | 
| 156 156 |  | 
| 157 157 | 
             
                it 'group exists in inventory, and returns hash with node added' do
         | 
| 158 | 
            -
                  expect( | 
| 158 | 
            +
                  expect(add_node_to_group(no_docker_hash, foo_node, 'ssh_nodes')).to eq('groups' =>
         | 
| 159 159 | 
             
                    [{ 'name' => 'ssh_nodes', 'targets' => [foo_node] }, { 'name' => 'winrm_nodes', 'targets' => [] }])
         | 
| 160 160 | 
             
                end
         | 
| 161 161 | 
             
              end
         |