Module: Beaker::DSL::Helpers::PuppetHelpers
- Included in:
- BeakerPuppet
- Defined in:
- lib/beaker-puppet/helpers/puppet_helpers.rb
Overview
Methods that help you interact with your puppet installation, puppet must be installed for these methods to execute correctly
Instance Method Summary collapse
-
#apply_manifest(manifest, opts = {}, &block) ⇒ Object
Runs ‘puppet apply’ on default host, piping manifest through stdin.
-
#apply_manifest_on(host, manifest, opts = {}, &block) ⇒ Array<Result>, ...
Runs ‘puppet apply’ on a remote host, piping manifest through stdin.
-
#create_tmpdir_for_user(host, name = '/tmp/beaker', user = nil) ⇒ String
Create a temp directory on remote host with a user.
-
#create_tmpdir_on(hosts, path_prefix = '', user = nil, group = nil) ⇒ String+
Create a temp directory on remote host, optionally owned by specified user and group.
-
#ipv4_regex ⇒ Object
Return the regular expression pattern for an IPv4 address.
-
#puppet_config(host, setting, section: nil) ⇒ Object
Read a setting from the puppet master config.
-
#puppet_group(host) ⇒ Object
Return the name of the puppet group.
-
#puppet_user(host) ⇒ Object
Return the name of the puppet user.
-
#resolve_hostname_on(host, hostname) ⇒ String?
Return the IP address that given hostname returns when resolved on the given host.
- #run_agent_on(host, arg = '--no-daemonize --verbose --onetime --test', options = {}, &block) ⇒ Object deprecated Deprecated.
-
#sign_certificate ⇒ Object
prompt the master to sign certs then check to confirm the cert for the default host is signed.
-
#sign_certificate_for(host = []) ⇒ Object
Ensure the host has requested a cert, then sign it.
-
#sleep_until_nc_started(host, port = nil) ⇒ Result
Waits until a successful curl check has happaned against node classifier.
-
#sleep_until_puppetdb_started(host, nonssl_port = nil, ssl_port = nil) ⇒ Result
Waits until a successful curl check has happened against puppetdb.
-
#sleep_until_puppetserver_started(host, port = nil) ⇒ Result
Waits until a successful curl check has happened against puppetserver.
-
#stop_agent ⇒ Object
stops the puppet agent running on the default host.
-
#stop_agent_on(agent, opts = {}) ⇒ Object
stops the puppet agent running on the host.
-
#stub_forge(forge_host = nil) ⇒ Object
deprecated
Deprecated.
this method should not be used because stubbing the host
-
#stub_forge_on(machine, forge_host = nil) ⇒ Object
deprecated
Deprecated.
this method should not be used because stubbing the host
-
#stub_hosts(ip_spec) ⇒ Object
This method accepts a block and using the puppet resource ‘host’ will setup host aliases before and after that block on the default host.
-
#stub_hosts_on(machine, ip_spec, alias_spec = {}) ⇒ Object
This method using the puppet resource ‘host’ will setup host aliases and register the remove of host aliases via Beaker::TestCase#teardown.
-
#wait_for_host_in_dashboard(host) ⇒ Object
deprecated
Deprecated.
this method should be removed in the next release since we don’t believe the check is necessary.
-
#with_forge_stubbed(forge_host = nil, &block) ⇒ Object
deprecated
Deprecated.
this method should not be used because stubbing the host
-
#with_forge_stubbed_on(host, forge_host = nil, &block) ⇒ Object
deprecated
Deprecated.
this method should not be used because stubbing the host
-
#with_host_stubbed_on(host, ip_spec, alias_spec = {}, &block) ⇒ Object
This method accepts a block and using the puppet resource ‘host’ will setup host aliases before and after that block.
-
#with_puppet_running(conf_opts, testdir = host.tmpdir(File.basename(@path)), &block) ⇒ Object
Test Puppet running in a certain run mode with specific options, on the default host.
-
#with_puppet_running_on(host, conf_opts, testdir = host.tmpdir(File.basename(@path)), &block) ⇒ Object
Test Puppet running in a certain run mode with specific options.
Instance Method Details
#apply_manifest(manifest, opts = {}, &block) ⇒ Object
Runs ‘puppet apply’ on default host, piping manifest through stdin
535 536 537 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 535 def apply_manifest(manifest, opts = {}, &block) apply_manifest_on(default, manifest, opts, &block) end |
#apply_manifest_on(host, manifest, opts = {}, &block) ⇒ Array<Result>, ...
Runs ‘puppet apply’ on a remote host, piping manifest through stdin
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 456 def apply_manifest_on(host, manifest, opts = {}, &block) block_on host, opts do | host | = {} [:acceptable_exit_codes] = Array(opts[:acceptable_exit_codes]) puppet_apply_opts = {} if opts[:debug] puppet_apply_opts[:debug] = nil else puppet_apply_opts[:verbose] = nil end puppet_apply_opts[:parseonly] = nil if opts[:parseonly] puppet_apply_opts[:trace] = nil if opts[:trace] puppet_apply_opts[:parser] = 'future' if opts[:future_parser] puppet_apply_opts[:modulepath] = opts[:modulepath] if opts[:modulepath] puppet_apply_opts[:hiera_config] = opts[:hiera_config] if opts[:hiera_config] puppet_apply_opts[:noop] = nil if opts[:noop] # From puppet help: # "... an exit code of '2' means there were changes, an exit code of # '4' means there were failures during the transaction, and an exit # code of '6' means there were both changes and failures." if [opts[:catch_changes],opts[:catch_failures],opts[:expect_failures],opts[:expect_changes]].compact.length > 1 raise(ArgumentError, 'Cannot specify more than one of `catch_failures`, ' + '`catch_changes`, `expect_failures`, or `expect_changes` ' + 'for a single manifest') end if opts[:catch_changes] puppet_apply_opts['detailed-exitcodes'] = nil # We're after idempotency so allow exit code 0 only. [:acceptable_exit_codes] |= [0] elsif opts[:catch_failures] puppet_apply_opts['detailed-exitcodes'] = nil # We're after only complete success so allow exit codes 0 and 2 only. [:acceptable_exit_codes] |= [0, 2] elsif opts[:expect_failures] puppet_apply_opts['detailed-exitcodes'] = nil # We're after failures specifically so allow exit codes 1, 4, and 6 only. [:acceptable_exit_codes] |= [1, 4, 6] elsif opts[:expect_changes] puppet_apply_opts['detailed-exitcodes'] = nil # We're after changes specifically so allow exit code 2 only. [:acceptable_exit_codes] |= [2] else # Either use the provided acceptable_exit_codes or default to [0] [:acceptable_exit_codes] |= [0] end # Not really thrilled with this implementation, might want to improve it # later. Basically, there is a magic trick in the constructor of # PuppetCommand which allows you to pass in a Hash for the last value in # the *args Array; if you do so, it will be treated specially. So, here # we check to see if our caller passed us a hash of environment variables # that they want to set for the puppet command. If so, we set the final # value of *args to a new hash with just one entry (the value of which # is our environment variables hash) if opts.has_key?(:environment) puppet_apply_opts['ENV'] = opts[:environment] end file_path = host.tmpfile('apply_manifest.pp') create_remote_file(host, file_path, manifest + "\n") if host[:default_apply_opts].respond_to? :merge puppet_apply_opts = host[:default_apply_opts].merge( puppet_apply_opts ) end on host, puppet('apply', file_path, puppet_apply_opts), , &block end end |
#create_tmpdir_for_user(host, name = '/tmp/beaker', user = nil) ⇒ String
Create a temp directory on remote host with a user. Default user is puppet master user.
the ownership of a temp directory. directory. Default value is ‘/tmp/beaker’ directory. If no username is specified, use ‘puppet config print user –section master` to obtain username from master. Raise RuntimeError if this puppet command returns a non-zero exit code.
956 957 958 959 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 956 def create_tmpdir_for_user(host, name='/tmp/beaker', user=nil) user ||= puppet_config(host, 'user', section: 'master') create_tmpdir_on(host, name, user) end |
#create_tmpdir_on(hosts, path_prefix = '', user = nil, group = nil) ⇒ String+
While tempting, this method should not be “optimized” to coalesce calls to
Create a temp directory on remote host, optionally owned by specified user and group.
or a role (String or Symbol) that identifies one or more hosts. not specified, uses default permissions from tmpdir creation. If not specified, uses default permissions from tmpdir creation.
an array of names of newly-created dirs per-host
chown user:group when both options are passed, as doing so will muddy the spec.
909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 909 def create_tmpdir_on(hosts, path_prefix = '', user = nil, group = nil) block_on hosts do | host | # create the directory dir = host.tmpdir(path_prefix) # only chown if explicitly passed; don't make assumptions about perms # only `chown user` for cleaner codepaths if user # ensure user exists if not host.user_get(user).success? # clean up host.rm_rf("#{dir}") raise "User #{user} does not exist on #{host}." end # chown only user host.chown(user, dir) # on host, "chown #{user} #{dir}" end # only chgrp if explicitly passed; don't make assumptions about perms if group # ensure group exists if not host.group_get(group).success? # clean up # on host, "rmdir #{dir}" host.rm_rf(dir) raise "Group #{group} does not exist on #{host}." end # chgrp # on host, "chgrp #{group} #{dir}" host.chgrp(group, dir) end dir end end |
#ipv4_regex ⇒ Object
Return the regular expression pattern for an IPv4 address
14 15 16 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 14 def ipv4_regex return /(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/ end |
#puppet_config(host, setting, section: nil) ⇒ Object
Read a setting from the puppet master config
56 57 58 59 60 61 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 56 def puppet_config(host, setting, section: nil) command = "config print #{setting}" command += " --section #{section}" if section on(host, puppet(command)).stdout.strip end |
#puppet_group(host) ⇒ Object
This method assumes puppet is installed on the host.
Return the name of the puppet group.
79 80 81 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 79 def puppet_group(host) puppet_config(host, 'group', section: 'master') end |
#puppet_user(host) ⇒ Object
This method assumes puppet is installed on the host.
Return the name of the puppet user.
69 70 71 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 69 def puppet_user(host) puppet_config(host, 'user', section: 'master') end |
#resolve_hostname_on(host, hostname) ⇒ String?
Return the IP address that given hostname returns when resolved on the given host.
@ param [Host] host One object that acts like a Beaker::Host @ param [String] hostname The hostname to perform a DNS resolution on
25 26 27 28 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 25 def resolve_hostname_on(host, hostname) match = curl_on(host, "--verbose #{hostname}", :accept_all_exit_codes => true).stderr.match(ipv4_regex) return match ? match[0] : nil end |
#run_agent_on(host, arg = '--no-daemonize --verbose --onetime --test', options = {}, &block) ⇒ Object
540 541 542 543 544 545 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 540 def run_agent_on(host, arg='--no-daemonize --verbose --onetime --test', ={}, &block) block_on host do | host | on host, puppet_agent(arg), , &block end end |
#sign_certificate ⇒ Object
prompt the master to sign certs then check to confirm the cert for the default host is signed
890 891 892 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 890 def sign_certificate sign_certificate_for(default) end |
#sign_certificate_for(host = []) ⇒ Object
Ensure the host has requested a cert, then sign it
828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 828 def sign_certificate_for(host = []) hostnames = [] hosts = host.is_a?(Array) ? host : [host] puppet_version = on(master, puppet('--version')).stdout.chomp hosts.each{ |current_host| if [master, dashboard, database].include? current_host on current_host, puppet( 'agent -t' ), :acceptable_exit_codes => [0,1,2] if version_is_less(puppet_version, '5.99') on master, puppet("cert --allow-dns-alt-names sign #{current_host}" ), :acceptable_exit_codes => [0,24] else on master, "puppetserver ca sign --certname #{current_host}" end else hostnames << Regexp.escape( current_host.node_name ) end } if hostnames.size < 1 if version_is_less(puppet_version, '5.99') on master, puppet("cert --sign --all --allow-dns-alt-names"), :acceptable_exit_codes => [0,24] else on master, 'puppetserver ca sign --all', :acceptable_exit_codes => [0, 24] end return end while hostnames.size > 0 last_sleep = 0 next_sleep = 1 (0..10).each do |i| if i == 10 fail_test("Failed to sign cert for #{hostnames}") hostnames.clear end if version_is_less(puppet_version, '5.99') on master, puppet("cert --sign --all --allow-dns-alt-names"), :acceptable_exit_codes => [0,24] out = on(master, puppet("cert --list --all")).stdout if hostnames.all? { |hostname| out =~ /\+ "?#{hostname}"?/ } hostnames.clear break end else on master, 'puppetserver ca sign --all', :acceptable_exit_codes => [0, 24] out = on(master, 'puppetserver ca list --all').stdout if out !~ /.*Requested.*/ && hostnames.all? { |hostname| out =~ /\b#{hostname}\b/ } hostnames.clear break end end sleep next_sleep (last_sleep, next_sleep) = next_sleep, last_sleep+next_sleep end end host end |
#sleep_until_nc_started(host, port = nil) ⇒ Result
Waits until a successful curl check has happaned against node classifier
751 752 753 754 755 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 751 def sleep_until_nc_started(host, port = nil) port = [:nodeclassifier_port] if port.nil? curl_with_retries("start nodeclassifier (ssl)", host, "https://#{host.node_name}:#{port}", [35, 60]) end |
#sleep_until_puppetdb_started(host, nonssl_port = nil, ssl_port = nil) ⇒ Result
Waits until a successful curl check has happened against puppetdb
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 713 def sleep_until_puppetdb_started(host, nonssl_port = nil, ssl_port = nil) nonssl_port = [:puppetdb_port_nonssl] if nonssl_port.nil? ssl_port = [:puppetdb_port_ssl] if ssl_port.nil? pe_ver = host['pe_ver'] || '0' if version_is_less(pe_ver, '2016.1.0') then # the status endpoint was introduced in puppetdb 4.0. The earliest # PE release with the 4.x pdb version was 2016.1.0 endpoint = 'pdb/meta/v1/version' expected_regex = '\"version\" \{0,\}: \{0,\}\"[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\"' else endpoint = 'status/v1/services/puppetdb-status' expected_regex = '\"state\" \{0,\}: \{0,\}\"running\"' end retry_on(host, "curl -m 1 http://localhost:#{nonssl_port}/#{endpoint} | grep '#{expected_regex}'", {:max_retries => 120}) curl_with_retries("start puppetdb (ssl)", host, "https://#{host.node_name}:#{ssl_port}", [35, 60]) end |
#sleep_until_puppetserver_started(host, port = nil) ⇒ Result
Waits until a successful curl check has happened against puppetserver
739 740 741 742 743 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 739 def sleep_until_puppetserver_started(host, port = nil) port = [:puppetserver_port] if port.nil? curl_with_retries("start puppetserver (ssl)", host, "https://#{host.node_name}:#{port}", [35, 60]) end |
#stop_agent ⇒ Object
stops the puppet agent running on the default host
804 805 806 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 804 def stop_agent stop_agent_on(default) end |
#stop_agent_on(agent, opts = {}) ⇒ Object
stops the puppet agent running on the host
762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 762 def stop_agent_on(agent, opts = {}) block_on agent, opts do | host | vardir = host.puppet_configprint['vardir'] # In 4.0 this was changed to just be `puppet` agent_service = 'puppet' if !aio_version?(host) # The agent service is `pe-puppet` everywhere EXCEPT certain linux distros on PE 2.8 # In all the case that it is different, this init script will exist. So we can assume # that if the script doesn't exist, we should just use `pe-puppet` agent_service = 'pe-puppet-agent' agent_service = 'pe-puppet' unless host.file_exist?('/etc/init.d/pe-puppet-agent') end # Under a number of stupid circumstances, we can't stop the # agent using puppet. This is usually because of issues with # the init script or system on that particular configuration. avoid_puppet_at_all_costs = false avoid_puppet_at_all_costs ||= host['platform'] =~ /el-4/ avoid_puppet_at_all_costs ||= host['pe_ver'] && version_is_less(host['pe_ver'], '3.2') && host['platform'] =~ /sles/ if avoid_puppet_at_all_costs # When upgrading, puppet is already stopped. On EL4, this causes an exit code of '1' on host, "/etc/init.d/#{agent_service} stop", :acceptable_exit_codes => [0, 1] else on host, puppet_resource('service', agent_service, 'ensure=stopped') end #Ensure that a puppet run that was started before the last lock check is completed agent_running = true while agent_running agent_running = host.file_exist?("#{vardir}/state/agent_catalog_run.lock") if agent_running sleep 2 end end end end |
#stub_forge(forge_host = nil) ⇒ Object
this method should not be used because stubbing the host
This wraps the method ‘stub_hosts` and makes the stub specific to the forge alias.
breaks TLS validation.
700 701 702 703 704 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 700 def stub_forge(forge_host = nil) #use global options hash forge_host ||= [:forge_host] stub_forge_on(default, forge_host) end |
#stub_forge_on(machine, forge_host = nil) ⇒ Object
this method should not be used because stubbing the host
This wraps the method ‘stub_hosts_on` and makes the stub specific to the forge alias.
forge api v1 canonical source is forge.puppetlabs.com forge api v3 canonical source is forgeapi.puppetlabs.com
breaks TLS validation.
650 651 652 653 654 655 656 657 658 659 660 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 650 def stub_forge_on(machine, forge_host = nil) #use global options hash primary_forge_name = 'forge.puppetlabs.com' forge_host ||= [:forge_host] forge_ip = resolve_hostname_on(machine, forge_host) raise "Failed to resolve forge host '#{forge_host}'" unless forge_ip @forge_ip ||= forge_ip block_on machine do | host | stub_hosts_on(host, {primary_forge_name => @forge_ip}, {primary_forge_name => ['forge.puppet.com','forgeapi.puppetlabs.com','forgeapi.puppet.com']}) end end |
#stub_hosts(ip_spec) ⇒ Object
This method accepts a block and using the puppet resource ‘host’ will setup host aliases before and after that block on the default host
634 635 636 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 634 def stub_hosts(ip_spec) stub_hosts_on(default, ip_spec) end |
#stub_hosts_on(machine, ip_spec, alias_spec = {}) ⇒ Object
This method using the puppet resource ‘host’ will setup host aliases and register the remove of host aliases via Beaker::TestCase#teardown
A teardown step is also added to make sure unstubbing of the host is removed always.
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 560 def stub_hosts_on(machine, ip_spec, alias_spec={}) block_on machine do | host | ip_spec.each do |address, ip| aliases = alias_spec[address] || [] manifest =<<-EOS.gsub /^\s+/, "" host { '#{address}': \tensure => present, \tip => '#{ip}', \thost_aliases => #{aliases}, } EOS logger.notify("Stubbing address #{address} to IP #{ip} on machine #{host}") apply_manifest_on( host, manifest ) end teardown do ip_spec.each do |address, ip| logger.notify("Unstubbing address #{address} to IP #{ip} on machine #{host}") on( host, puppet('resource', 'host', address, 'ensure=absent') ) end end end end |
#wait_for_host_in_dashboard(host) ⇒ Object
this method should be removed in the next release since we don’t believe the check is necessary.
wait for a given host to appear in the dashboard
810 811 812 813 814 815 816 817 818 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 810 def wait_for_host_in_dashboard(host) hostname = host.node_name hostcert = dashboard.puppet['hostcert'] key = dashboard.puppet['hostprivkey'] cacert = dashboard.puppet['localcacert'] retry_on(dashboard, "curl --cert #{hostcert} --key #{key} --cacert #{cacert}\ https://#{dashboard}:4433/classifier-api/v1/nodes | grep '\"name\":\"#{hostname}\"'") end |
#with_forge_stubbed(forge_host = nil, &block) ⇒ Object
this method should not be used because stubbing the host
This wraps ‘with_forge_stubbed_on` and provides it the default host breaks TLS validation.
689 690 691 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 689 def with_forge_stubbed( forge_host = nil, &block ) with_forge_stubbed_on( default, forge_host, &block ) end |
#with_forge_stubbed_on(host, forge_host = nil, &block) ⇒ Object
this method should not be used because stubbing the host
This wraps the method ‘with_host_stubbed_on` and makes the stub specific to the forge alias.
forge api v1 canonical source is forge.puppetlabs.com forge api v3 canonical source is forgeapi.puppetlabs.com
breaks TLS validation.
674 675 676 677 678 679 680 681 682 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 674 def with_forge_stubbed_on( host, forge_host = nil, &block ) #use global options hash primary_forge_name = 'forge.puppetlabs.com' forge_host ||= [:forge_host] forge_ip = resolve_hostname_on(host, forge_host) raise "Failed to resolve forge host '#{forge_host}'" unless forge_ip @forge_ip ||= forge_ip with_host_stubbed_on( host, {primary_forge_name => @forge_ip}, {primary_forge_name => ['forge.puppet.com','forgeapi.puppetlabs.com','forgeapi.puppet.com']}, &block ) end |
#with_host_stubbed_on(host, ip_spec, alias_spec = {}, &block) ⇒ Object
This method accepts a block and using the puppet resource ‘host’ will setup host aliases before and after that block.
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 596 def with_host_stubbed_on(host, ip_spec, alias_spec={}, &block) begin block_on host do |host| # this code is duplicated from the `stub_hosts_on` method. The # `stub_hosts_on` method itself is not used here because this # method is used by modules tests using `beaker-rspec`. Since # the `stub_hosts_on` method contains a `teardown` step, it is # incompatible with `beaker_rspec`. ip_spec.each do |address, ip| aliases = alias_spec[address] || [] manifest =<<-EOS.gsub /^\s+/, "" host { '#{address}': \tensure => present, \tip => '#{ip}', \thost_aliases => #{aliases}, } EOS logger.notify("Stubbing address #{address} to IP #{ip} on machine #{host}") apply_manifest_on( host, manifest ) end end block.call ensure ip_spec.each do |address, ip| logger.notify("Unstubbing address #{address} to IP #{ip} on machine #{host}") on( host, puppet('resource', 'host', address, 'ensure=absent') ) end end end |
#with_puppet_running(conf_opts, testdir = host.tmpdir(File.basename(@path)), &block) ⇒ Object
Test Puppet running in a certain run mode with specific options, on the default host
268 269 270 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 268 def with_puppet_running conf_opts, testdir = host.tmpdir(File.basename(@path)), &block with_puppet_running_on(default, conf_opts, testdir, &block) end |
#with_puppet_running_on(host, conf_opts, testdir = host.tmpdir(File.basename(@path)), &block) ⇒ Object
Whether Puppet is started or restarted depends on what kind of server you’re running. Passenger and puppetserver are restarted before. Webrick is started before and stopped after yielding, unless you’re using service scripts, then it’ll behave like passenger & puppetserver. Passenger and puppetserver (or webrick using service scripts) restart after yielding by default. You can stop this from happening by setting the :restart_when_done flag of the conf_opts argument.
Test Puppet running in a certain run mode with specific options. This ensures the following steps are performed:
-
The pre-test Puppet configuration is backed up
-
A new Puppet configuraton file is layed down
-
Puppet is started or restarted in the specified run mode
-
Ensure Puppet has started correctly
-
Further tests are yielded to
-
Revert Puppet to the pre-test state
-
Testing artifacts are saved in a folder named for the test
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/beaker-puppet/helpers/puppet_helpers.rb', line 154 def with_puppet_running_on(host, conf_opts, testdir = host.tmpdir(File.basename(@path)), &block) raise(ArgumentError, "with_puppet_running_on's conf_opts must be a Hash. You provided a #{conf_opts.class}: '#{conf_opts}'") if !conf_opts.kind_of?(Hash) cmdline_args = conf_opts[:__commandline_args__] service_args = conf_opts[:__service_args__] || {} restart_when_done = true restart_when_done = host[:restart_when_done] if host.has_key?(:restart_when_done) restart_when_done = conf_opts.fetch(:restart_when_done, restart_when_done) conf_opts = conf_opts.reject { |k,v| [:__commandline_args__, :__service_args__, :restart_when_done].include?(k) } curl_retries = host['master-start-curl-retries'] || ['master-start-curl-retries'] logger.debug "Setting curl retries to #{curl_retries}" if [:is_puppetserver] || host[:is_puppetserver] confdir = puppet_config(host, 'confdir', section: 'master') vardir = puppet_config(host, 'vardir', section: 'master') if cmdline_args split_args = cmdline_args.split() split_args.each do |arg| case arg when /--confdir=(.*)/ confdir = $1 when /--vardir=(.*)/ vardir = $1 end end end puppetserver_opts = { "jruby-puppet" => { "master-conf-dir" => confdir, "master-var-dir" => vardir, }, "certificate-authority" => { "allow-subject-alt-names" => true } } puppetserver_conf = File.join("#{host['puppetserver-confdir']}", "puppetserver.conf") modify_tk_config(host, puppetserver_conf, puppetserver_opts) end begin backup_file = backup_the_file(host, puppet_config(host, 'confdir', section: 'master'), testdir, 'puppet.conf') lay_down_new_puppet_conf host, conf_opts, testdir if host.use_service_scripts? && !service_args[:bypass_service_script] bounce_service( host, host['puppetservice'], curl_retries ) else puppet_master_started = start_puppet_from_source_on!( host, cmdline_args ) end yield self if block_given? # FIXME: these test-flow-control exceptions should be using throw # they can be caught in test_case. current layout dows not allow it rescue Beaker::DSL::Outcomes::PassTest => early_assertion pass_test(early_assertion) rescue Beaker::DSL::Outcomes::FailTest => early_assertion fail_test(early_assertion) rescue Beaker::DSL::Outcomes::PendingTest => early_assertion pending_test(early_assertion) rescue Beaker::DSL::Outcomes::SkipTest => early_assertion skip_test(early_assertion) rescue Beaker::DSL::Assertions, Minitest::Assertion => early_assertion fail_test(early_assertion) rescue Exception => early_exception original_exception = RuntimeError.new("PuppetAcceptance::DSL::Helpers.with_puppet_running_on failed (check backtrace for location) because: #{early_exception}\n#{early_exception.backtrace.join("\n")}\n") raise(original_exception) ensure begin if host.use_service_scripts? && !service_args[:bypass_service_script] restore_puppet_conf_from_backup( host, backup_file ) if restart_when_done bounce_service( host, host['puppetservice'], curl_retries ) else host.exec puppet_resource('service', host['puppetservice'], 'ensure=stopped') end else if puppet_master_started stop_puppet_from_source_on( host ) else dump_puppet_log(host) end restore_puppet_conf_from_backup( host, backup_file ) end rescue Exception => teardown_exception begin if !host.is_pe? dump_puppet_log(host) end rescue Exception => dumping_exception logger.error("Raised during attempt to dump puppet logs: #{dumping_exception}") end if original_exception logger.error("Raised during attempt to teardown with_puppet_running_on: #{teardown_exception}\n---\n") raise original_exception else raise teardown_exception end end end end |