From 4c39102720bf02019f45a7531c2d0eb5a7da54e7 Mon Sep 17 00:00:00 2001 From: Dmitry Ilyin Date: Fri, 10 Apr 2015 17:51:52 +0300 Subject: [PATCH] Improve Noop tests * Many fixes and improvements Related blueprint: deployment-dryrun Change-Id: I7cdb4ea455866480a773b803f4dddd66f0fd56d1 Fuel-CI: disable --- tests/noop/Gemfile | 1 + tests/noop/Rakefile | 3 +- tests/noop/fixtures/hiera.yaml | 12 - tests/noop/rspec.sh | 4 - .../spec/hosts/astute/enable_cinder_spec.rb | 21 + .../spec/hosts/astute/enable_compute_spec.rb | 23 + .../spec/hosts/ceilometer/controller_spec.rb | 13 +- .../cluster-haproxy/cluster-haproxy_spec.rb | 9 +- .../spec/hosts/fuel_pkgs/fuel_pkgs_spec.rb | 8 + .../globals_spec.rb} | 2 +- tests/noop/spec/hosts/horizon/horizon_spec.rb | 5 +- .../noop/spec/hosts/keystone/keystone_spec.rb | 10 +- tests/noop/spec/hosts/murano/murano_spec.rb | 13 +- .../openstack-controller_spec.rb | 15 +- .../openstack-network-compute_spec.rb | 8 +- .../openstack-network-controller_spec.rb | 32 +- tests/noop/spec/hosts/roles/compute_spec.rb | 6 +- .../noop/spec/hosts/roles/controller_spec.rb | 2 +- tests/noop/spec/hosts/sahara/sahara_spec.rb | 14 +- tests/noop/spec/hosts/swift/swift_spec.rb | 12 +- tests/noop/spec/shared-examples.rb | 105 ++-- tests/noop/spec/spec_helper.rb | 219 ++++++-- utils/jenkins/fuel_noop_tests.rb | 470 ++++++++++++++++++ utils/jenkins/fuel_noop_tests.sh | 66 +-- 24 files changed, 828 insertions(+), 245 deletions(-) delete mode 100644 tests/noop/fixtures/hiera.yaml delete mode 100755 tests/noop/rspec.sh create mode 100644 tests/noop/spec/hosts/astute/enable_cinder_spec.rb create mode 100644 tests/noop/spec/hosts/astute/enable_compute_spec.rb create mode 100644 tests/noop/spec/hosts/fuel_pkgs/fuel_pkgs_spec.rb rename tests/noop/spec/hosts/{010_globals_spec.rb => globals/globals_spec.rb} (94%) create mode 100755 utils/jenkins/fuel_noop_tests.rb diff --git a/tests/noop/Gemfile b/tests/noop/Gemfile index 0769ab9e84..19428f1e2d 100644 --- a/tests/noop/Gemfile +++ b/tests/noop/Gemfile @@ -6,6 +6,7 @@ group :development, :test do gem 'rspec-puppet', '~> 2.0.0' gem 'openstack', :require => false gem 'netaddr', :require => false + gem 'pry' end if puppetversion = ENV['PUPPET_GEM_VERSION'] diff --git a/tests/noop/Rakefile b/tests/noop/Rakefile index da34ce4b00..4d6e464780 100644 --- a/tests/noop/Rakefile +++ b/tests/noop/Rakefile @@ -1,7 +1,7 @@ require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) do |t| - t.rspec_opts = '--deprecation-out deprecations.log --color --format documentation' + t.rspec_opts = '--deprecation-out deprecations.log --color --tty --format documentation' if ENV['NOOP_TEST'] t.pattern = 'spec/*/' + ENV['NOOP_TEST'] + '_spec.rb' else @@ -10,4 +10,3 @@ RSpec::Core::RakeTask.new(:spec) do |t| end task :default => :spec - diff --git a/tests/noop/fixtures/hiera.yaml b/tests/noop/fixtures/hiera.yaml deleted file mode 100644 index 722fd312b4..0000000000 --- a/tests/noop/fixtures/hiera.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -:backends: - - yaml - -:hierarchy: - - "%{::hiera_data_globals}" - - "%{::hiera_data_astute}" - -:yaml: - :datadir: "%{::hiera_data_path}" - -:logger: noop diff --git a/tests/noop/rspec.sh b/tests/noop/rspec.sh deleted file mode 100755 index 693732c8bc..0000000000 --- a/tests/noop/rspec.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -DIR=`dirname $0` -cd "${DIR}" || exit 1 -rspec spec/hosts/*_spec.rb spec/hosts/*/*_spec.rb diff --git a/tests/noop/spec/hosts/astute/enable_cinder_spec.rb b/tests/noop/spec/hosts/astute/enable_cinder_spec.rb new file mode 100644 index 0000000000..40d8872529 --- /dev/null +++ b/tests/noop/spec/hosts/astute/enable_cinder_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' +require 'shared-examples' +manifest = 'astute/enable_cinder.pp' + +describe manifest do + shared_examples 'catalog' do + + it "should contain cinder-volume service" do + case facts[:operatingsystem] + when 'Ubuntu' + service_name = 'cinder-volume' + when 'CentOS' + service_name = 'openstack-cinder-volume' + else + service_name = 'cinder-volume' + end + should contain_service(service_name) + end + end + test_ubuntu_and_centos manifest +end diff --git a/tests/noop/spec/hosts/astute/enable_compute_spec.rb b/tests/noop/spec/hosts/astute/enable_compute_spec.rb new file mode 100644 index 0000000000..d37562ae4e --- /dev/null +++ b/tests/noop/spec/hosts/astute/enable_compute_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' +require 'shared-examples' +manifest = 'astute/enable_compute.pp' + +describe manifest do + shared_examples 'catalog' do + + it "should contain nova-compute service" do + case facts[:operatingsystem] + when 'Ubuntu' + service_name = 'nova-compute' + when 'CentOS' + service_name = 'openstack-nova-compute' + else + service_name = 'nova-compute' + end + + should contain_service(service_name) + end + + end + test_ubuntu_and_centos manifest +end diff --git a/tests/noop/spec/hosts/ceilometer/controller_spec.rb b/tests/noop/spec/hosts/ceilometer/controller_spec.rb index 6cd102927e..43c68bd88d 100644 --- a/tests/noop/spec/hosts/ceilometer/controller_spec.rb +++ b/tests/noop/spec/hosts/ceilometer/controller_spec.rb @@ -3,22 +3,21 @@ require 'shared-examples' manifest = 'ceilometer/controller.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do # TODO All this stuff should be moved to shared examples controller* tests. - settings = Noop.fuel_settings - internal_address = Noop.node_hash['internal_address'] - rabbit_user = settings['rabbit']['user'] || 'nova' - use_neutron = settings['quantum'].to_s + rabbit_user = Noop.hiera_structure 'rabbit/user', 'nova' + rabbit_password = Noop.hiera_structure 'rabbit/password' + enabled = Noop.hiera_structure 'ceilometer/enabled' rabbit_ha_queues = 'true' # Ceilometer - if settings['ceilometer']['enabled'] + if enabled it 'should declare openstack::ceilometer class with correct parameters' do should contain_class('openstack::ceilometer').with( 'amqp_user' => rabbit_user, - 'amqp_password' => settings['rabbit']['password'], + 'amqp_password' => rabbit_password, 'rabbit_ha_queues' => rabbit_ha_queues, 'on_controller' => 'true', ) diff --git a/tests/noop/spec/hosts/cluster-haproxy/cluster-haproxy_spec.rb b/tests/noop/spec/hosts/cluster-haproxy/cluster-haproxy_spec.rb index 314a585388..6c2919b4dc 100644 --- a/tests/noop/spec/hosts/cluster-haproxy/cluster-haproxy_spec.rb +++ b/tests/noop/spec/hosts/cluster-haproxy/cluster-haproxy_spec.rb @@ -3,13 +3,14 @@ require 'shared-examples' manifest = 'cluster-haproxy/cluster-haproxy.pp' describe manifest do - shared_examples 'puppet catalogue' do - settings = Noop.fuel_settings + shared_examples 'catalog' do + networks = [] - settings['network_scheme']['endpoints'].each{ |k,v| + endpoints = Noop.hiera_structure 'network_scheme/endpoints' + endpoints.each{ |k,v| if v['IP'].is_a?(Array) v['IP'].each { |ip| - networks << IPAddr.new(ip).to_s + "/" + ip.split('/')[1] + networks << IPAddr.new(ip).to_s + '/' + ip.split('/')[1] } end } diff --git a/tests/noop/spec/hosts/fuel_pkgs/fuel_pkgs_spec.rb b/tests/noop/spec/hosts/fuel_pkgs/fuel_pkgs_spec.rb new file mode 100644 index 0000000000..db754fd797 --- /dev/null +++ b/tests/noop/spec/hosts/fuel_pkgs/fuel_pkgs_spec.rb @@ -0,0 +1,8 @@ +require 'spec_helper' +require 'shared-examples' +manifest = 'fuel_pkgs/fuel_pkgs.pp' + +describe manifest do + test_ubuntu_and_centos manifest +end + diff --git a/tests/noop/spec/hosts/010_globals_spec.rb b/tests/noop/spec/hosts/globals/globals_spec.rb similarity index 94% rename from tests/noop/spec/hosts/010_globals_spec.rb rename to tests/noop/spec/hosts/globals/globals_spec.rb index 37ffc56085..85e990038e 100644 --- a/tests/noop/spec/hosts/010_globals_spec.rb +++ b/tests/noop/spec/hosts/globals/globals_spec.rb @@ -4,7 +4,7 @@ manifest = 'globals/globals.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do it { should contain_file '/etc/hiera/globals.yaml' } it 'should save the globals yaml file' do catalog = subject diff --git a/tests/noop/spec/hosts/horizon/horizon_spec.rb b/tests/noop/spec/hosts/horizon/horizon_spec.rb index 6d89ff85af..81b3845da1 100644 --- a/tests/noop/spec/hosts/horizon/horizon_spec.rb +++ b/tests/noop/spec/hosts/horizon/horizon_spec.rb @@ -3,11 +3,10 @@ require 'shared-examples' manifest = 'horizon/horizon.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do - settings = Noop.fuel_settings horizon_bind_address = Noop.node_hash['internal_address'] - nova_quota = settings['nova_quota'] + nova_quota = Noop.hiera 'nova_quota' # Horizon it 'should declare openstack::horizon class' do diff --git a/tests/noop/spec/hosts/keystone/keystone_spec.rb b/tests/noop/spec/hosts/keystone/keystone_spec.rb index e737c7cd44..b405b77b7e 100644 --- a/tests/noop/spec/hosts/keystone/keystone_spec.rb +++ b/tests/noop/spec/hosts/keystone/keystone_spec.rb @@ -3,18 +3,18 @@ require 'shared-examples' manifest = 'keystone/keystone.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do # TODO All this stuff should be moved to shared examples controller* tests. - settings = Noop.fuel_settings + nodes = Noop.hiera 'nodes' internal_address = Noop.node_hash['internal_address'] - primary_controller_nodes = filter_nodes(settings['nodes'],'role','primary-controller') - controllers = primary_controller_nodes + filter_nodes(settings['nodes'],'role','controller') + primary_controller_nodes = filter_nodes(nodes,'role','primary-controller') + controllers = primary_controller_nodes + filter_nodes(nodes,'role','controller') controller_internal_addresses = nodes_to_hash(controllers,'name','internal_address') controller_nodes = ipsort(controller_internal_addresses.values) memcached_servers = controller_nodes.map{ |n| n = n + ':11211' }.join(',') - admin_token = settings['keystone']['admin_token'] + admin_token = Noop.hiera_structure 'keystone/admin_token' # Keystone it 'should declare keystone class with admin_token' do diff --git a/tests/noop/spec/hosts/murano/murano_spec.rb b/tests/noop/spec/hosts/murano/murano_spec.rb index a2dcb2f487..496acd92cb 100644 --- a/tests/noop/spec/hosts/murano/murano_spec.rb +++ b/tests/noop/spec/hosts/murano/murano_spec.rb @@ -3,16 +3,17 @@ require 'shared-examples' manifest = 'murano/murano.pp' describe manifest do - shared_examples 'puppet catalogue' do - settings = Noop.fuel_settings - rabbit_user = settings['rabbit']['user'] || 'nova' - use_neutron = settings['quantum'].to_s + shared_examples 'catalog' do + rabbit_user = Noop.hiera_structure 'rabbit/user', 'nova' + rabbit_password = Noop.hiera_structure 'rabbit/password' + use_neutron = Noop.hiera 'use_neutron' + enabled = Noop.hiera_structure 'murano/enabled' - if settings['murano']['enabled'] + if enabled it 'should declare murano class correctly' do should contain_class('murano').with( 'murano_os_rabbit_userid' => rabbit_user, - 'murano_os_rabbit_passwd' => settings['rabbit']['password'], + 'murano_os_rabbit_passwd' => rabbit_password, 'use_neutron' => use_neutron, ) end diff --git a/tests/noop/spec/hosts/openstack-controller/openstack-controller_spec.rb b/tests/noop/spec/hosts/openstack-controller/openstack-controller_spec.rb index e8f7ac1f5b..bc19db9571 100644 --- a/tests/noop/spec/hosts/openstack-controller/openstack-controller_spec.rb +++ b/tests/noop/spec/hosts/openstack-controller/openstack-controller_spec.rb @@ -3,23 +3,10 @@ require 'shared-examples' manifest = 'openstack-controller/openstack-controller.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do # TODO All this stuff should be moved to shared examples controller* tests. - settings = Noop.fuel_settings - internal_address = Noop.node_hash['internal_address'] - rabbit_user = settings['rabbit']['user'] || 'nova' - use_neutron = settings['quantum'].to_s - role = settings['role'] - rabbit_ha_queues = 'true' - primary_controller_nodes = filter_nodes(settings['nodes'],'role','primary-controller') - controllers = primary_controller_nodes + filter_nodes(settings['nodes'],'role','controller') - controller_internal_addresses = nodes_to_hash(controllers,'name','internal_address') - controller_nodes = ipsort(controller_internal_addresses.values) - memcached_servers = controller_nodes.map{ |n| n = n + ':11211' }.join(',') - admin_token = settings['keystone']['admin_token'] - # Nova config options it 'nova config should have report_interval set to 60' do should contain_nova_config('DEFAULT/report_interval').with( diff --git a/tests/noop/spec/hosts/openstack-network/openstack-network-compute_spec.rb b/tests/noop/spec/hosts/openstack-network/openstack-network-compute_spec.rb index 6682c249fe..364100b9e2 100644 --- a/tests/noop/spec/hosts/openstack-network/openstack-network-compute_spec.rb +++ b/tests/noop/spec/hosts/openstack-network/openstack-network-compute_spec.rb @@ -3,15 +3,15 @@ require 'shared-examples' manifest = 'openstack-network/openstack-network-compute.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do # TODO All this stuff should be moved to shared examples controller* tests. - settings = Noop.fuel_settings internal_address = Noop.node_hash['internal_address'] + use_neutron = Noop.hiera 'use_neutron' # Network - if settings['quantum'] + if use_neutron it 'should declare openstack::network with neutron_server parameter set to false' do should contain_class('openstack::network').with( 'neutron_server' => 'false', @@ -25,7 +25,7 @@ describe manifest do end end - if settings['quantum'] + if use_neutron it 'should create /etc/libvirt/qemu.conf file that notifies libvirt service' do should contain_file('/etc/libvirt/qemu.conf').with( 'ensure' => 'present', diff --git a/tests/noop/spec/hosts/openstack-network/openstack-network-controller_spec.rb b/tests/noop/spec/hosts/openstack-network/openstack-network-controller_spec.rb index 002e123263..a7b613d310 100644 --- a/tests/noop/spec/hosts/openstack-network/openstack-network-controller_spec.rb +++ b/tests/noop/spec/hosts/openstack-network/openstack-network-controller_spec.rb @@ -3,27 +3,15 @@ require 'shared-examples' manifest = 'openstack-network/openstack-network-controller.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do # TODO All this stuff should be moved to shared examples controller* tests. - settings = Noop.fuel_settings - internal_address = Noop.node_hash['internal_address'] - rabbit_user = settings['rabbit']['user'] || 'nova' - use_neutron = settings['quantum'].to_s - role = settings['role'] - rabbit_ha_queues = 'true' - primary_controller_nodes = filter_nodes(settings['nodes'],'role','primary-controller') - controllers = primary_controller_nodes + filter_nodes(settings['nodes'],'role','controller') - controller_internal_addresses = nodes_to_hash(controllers,'name','internal_address') - controller_nodes = ipsort(controller_internal_addresses.values) - memcached_servers = controller_nodes.map{ |n| n = n + ':11211' }.join(',') - horizon_bind_address = internal_address - admin_token = settings['keystone']['admin_token'] - nova_quota = settings['nova_quota'] + use_neutron = Noop.hiera 'use_neutron' + ceilometer_enabled = Noop.hiera_structure 'ceilometer/enabled' # Network - if settings['quantum'] + if use_neutron it 'should declare openstack::network with neutron enabled' do should contain_class('openstack::network').with( 'neutron_server' => 'true', @@ -38,13 +26,11 @@ describe manifest do end # Ceilometer - if settings['ceilometer']['enabled'] - if use_neutron == 'true' - it 'should configure notification_driver for neutron' do - should contain_neutron_config('DEFAULT/notification_driver').with( - 'value' => 'messaging', - ) - end + if ceilometer_enabled and use_neutron + it 'should configure notification_driver for neutron' do + should contain_neutron_config('DEFAULT/notification_driver').with( + 'value' => 'messaging', + ) end end end # end of shared_examples diff --git a/tests/noop/spec/hosts/roles/compute_spec.rb b/tests/noop/spec/hosts/roles/compute_spec.rb index 51e0599402..d294181e32 100644 --- a/tests/noop/spec/hosts/roles/compute_spec.rb +++ b/tests/noop/spec/hosts/roles/compute_spec.rb @@ -3,11 +3,7 @@ require 'shared-examples' manifest = 'roles/compute.pp' describe manifest do - - shared_examples 'puppet catalogue' do - - use_neutron = Noop.fuel_settings['quantum'].to_s - internal_address = Noop.node_hash['internal_address'] + shared_examples 'catalog' do # Libvirtd.conf it 'should configure listen_tls, listen_tcp and auth_tcp in libvirtd.conf' do diff --git a/tests/noop/spec/hosts/roles/controller_spec.rb b/tests/noop/spec/hosts/roles/controller_spec.rb index f3fffc1747..cd5ee0e46a 100644 --- a/tests/noop/spec/hosts/roles/controller_spec.rb +++ b/tests/noop/spec/hosts/roles/controller_spec.rb @@ -3,7 +3,7 @@ require 'shared-examples' manifest = 'roles/controller.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do it 'should set vm.swappiness sysctl to 10' do should contain_sysctl('vm.swappiness').with( diff --git a/tests/noop/spec/hosts/sahara/sahara_spec.rb b/tests/noop/spec/hosts/sahara/sahara_spec.rb index 7f94ec036d..b1e61ab29d 100644 --- a/tests/noop/spec/hosts/sahara/sahara_spec.rb +++ b/tests/noop/spec/hosts/sahara/sahara_spec.rb @@ -3,17 +3,19 @@ require 'shared-examples' manifest = 'sahara/sahara.pp' describe manifest do - shared_examples 'puppet catalogue' do + shared_examples 'catalog' do - settings = Noop.fuel_settings - use_neutron = settings['quantum'].to_s + use_neutron = Noop.hiera 'use_neutron' + enabled = Noop.hiera_structure 'sahara/enabled' + db_password = Noop.hiera_structure 'sahara/db_password' + user_password = Noop.hiera_structure 'sahara/user_password' # Sahara - if settings['sahara']['enabled'] + if enabled it 'should declare sahara class correctly' do should contain_class('sahara').with( - 'db_password' => settings['sahara']['db_password'], - 'keystone_password' => settings['sahara']['user_password'], + 'db_password' => db_password, + 'keystone_password' => user_password, 'use_neutron' => use_neutron, 'rpc_backend' => 'rabbit', 'rabbit_ha_queues' => 'true', diff --git a/tests/noop/spec/hosts/swift/swift_spec.rb b/tests/noop/spec/hosts/swift/swift_spec.rb index ed53999b3a..4ce8348e5f 100644 --- a/tests/noop/spec/hosts/swift/swift_spec.rb +++ b/tests/noop/spec/hosts/swift/swift_spec.rb @@ -3,12 +3,12 @@ require 'shared-examples' manifest = 'swift/swift.pp' describe manifest do - shared_examples 'puppet catalogue' do - settings = Noop.fuel_settings - role = settings['role'] - storage_hash = Noop.fuel_settings['storage'] - primary_controller_nodes = filter_nodes(settings['nodes'],'role','primary-controller') - controllers = primary_controller_nodes + filter_nodes(settings['nodes'],'role','controller') + shared_examples 'catalog' do + role = Noop.hiera 'role' + storage_hash = Noop.hiera['storage'] + nodes = Noop.hiera 'nodes' + primary_controller_nodes = filter_nodes(nodes,'role','primary-controller') + controllers = primary_controller_nodes + filter_nodes(nodes,'role','controller') controller_internal_addresses = nodes_to_hash(controllers,'name','internal_address') controller_nodes = ipsort(controller_internal_addresses.values) memcached_servers = controller_nodes.map{ |n| n = n + ':11211' } diff --git a/tests/noop/spec/shared-examples.rb b/tests/noop/spec/shared-examples.rb index f756be4cb4..7bde347dd4 100644 --- a/tests/noop/spec/shared-examples.rb +++ b/tests/noop/spec/shared-examples.rb @@ -19,9 +19,9 @@ def ipsort (ips) ips.sort { |a,b| IPAddr.new( a ) <=> IPAddr.new( b ) } end -def test_ubuntu_and_centos(manifest) +def test_ubuntu_and_centos(manifest, force_manifest = false) # check if task is present in the task list - unless Noop.manifest_present? manifest + unless force_manifest or Noop.manifest_present? manifest # puts "Manifest '#{manifest}' is not enabled on the node '#{Noop.hostname}'. Skipping tests." return end @@ -37,9 +37,8 @@ def test_ubuntu_and_centos(manifest) os end - shared_examples 'should_compile' do - # it { puts "OS: '#{os}'\nYAML: '#{Noop.astute_yaml_base}'\nManifest: '#{Noop.manifest}'"} - it { + shared_examples 'compile' do + it do File.stubs(:exists?).with('/var/lib/astute/ceph/ceph').returns(true) File.stubs(:exists?).with('/var/lib/astute/mongodb/mongodb.key').returns(true) File.stubs(:exists?).with('/var/lib/astute/mongodb/mongodb.key').returns(true) @@ -47,8 +46,8 @@ def test_ubuntu_and_centos(manifest) File.stubs(:exists?).with('/var/lib/astute/nova/nova').returns(true) File.stubs(:exists?).with('/var/lib/astute/ceph/ceph').returns(true) File.stubs(:exists?).returns(false) - should compile - } + should compile.with_all_deps + end end shared_examples 'save_files_list' do @@ -58,7 +57,7 @@ def test_ubuntu_and_centos(manifest) file_resources = {} catalog.resources.each do |resource| next unless resource.type == 'File' - next unless %w(present file).include? resource[:ensure] or not resource[:ensure] + next unless %w(present file directory).include? resource[:ensure] or not resource[:ensure] if resource[:source] content = resource[:source] @@ -92,36 +91,78 @@ def test_ubuntu_and_centos(manifest) end end + shared_examples 'debug' do + it 'shows catalog contents' do + Noop.show_catalog subject + end + end + + shared_examples 'generate' do + it 'shows catalog contents' do + Noop.catalog_to_spec subject + end + end + + shared_examples 'status' do + it 'shows status' do + puts <<-eos + ============================================= + OS: #{os} + YAML: #{Noop.astute_yaml_base} + Manifest: #{Noop.manifest} + Node: #{Noop.fqdn} + Role: #{Noop.hiera 'role'} + ============================================= + eos + end + end + ####################################### # Testing on different operating systems - # Ubuntu - context 'on Ubuntu platforms' do - let(:facts) { Noop.ubuntu_facts } - it_behaves_like 'should_compile' - if ENV['NOOP_SAVE_RESOURCES_DIR'] and File.directory?(ENV['NOOP_SAVE_RESOURCES_DIR']) - it_behaves_like 'save_files_list' - it_behaves_like 'save_packages_list' - end - begin - it_behaves_like 'puppet catalogue' - rescue ArgumentError - true + + if Noop.test_ubuntu? + context 'on Ubuntu platforms' do + let(:facts) { Noop.ubuntu_facts } + + it_behaves_like 'compile' + + it_behaves_like 'status' if ENV['SPEC_SHOW_STATUS'] + it_behaves_like 'debug' if ENV['SPEC_CATALOG_DEBUG'] + it_behaves_like 'generate' if ENV['SPEC_SPEC_GENERATE'] + it_behaves_like 'save_files_list' if ENV['SPEC_SAVE_FILE_RESOURCES'] + it_behaves_like 'save_packages_list'if ENV['SPEC_SAVE_PACKAGE_RESOURCES'] + + begin + it_behaves_like 'catalog' + rescue ArgumentError + true + end + + at_exit { RSpec::Puppet::Coverage.report! } if ENV['SPEC_COVERAGE'] end end - # CentOS - context 'on CentOS platforms' do - let(:facts) { Noop.centos_facts } - it_behaves_like 'should_compile' - if ENV['NOOP_SAVE_RESOURCES_DIR'] and File.directory?(ENV['NOOP_SAVE_RESOURCES_DIR']) - it_behaves_like 'save_files_list' - it_behaves_like 'save_packages_list' - end - begin - it_behaves_like 'puppet catalogue' - rescue ArgumentError - true + if Noop.test_centos? + context 'on CentOS platforms' do + let(:facts) { Noop.centos_facts } + + it_behaves_like 'compile' + + it_behaves_like 'status' if ENV['SPEC_SHOW_STATUS'] + it_behaves_like 'debug' if ENV['SPEC_CATALOG_DEBUG'] + it_behaves_like 'generate' if ENV['SPEC_SPEC_GENERATE'] + it_behaves_like 'save_files_list' if ENV['SPEC_SAVE_FILE_RESOURCES'] + it_behaves_like 'save_packages_list'if ENV['SPEC_SAVE_PACKAGE_RESOURCES'] + + begin + it_behaves_like 'catalog' + rescue ArgumentError + true + end + + at_exit { RSpec::Puppet::Coverage.report! } if ENV['SPEC_COVERAGE'] end end + end diff --git a/tests/noop/spec/spec_helper.rb b/tests/noop/spec/spec_helper.rb index 6c08ac1502..81986f6738 100644 --- a/tests/noop/spec/spec_helper.rb +++ b/tests/noop/spec/spec_helper.rb @@ -1,9 +1,11 @@ require 'rubygems' +require 'puppet' +require 'hiera_puppet' require 'rspec-puppet' require 'puppetlabs_spec_helper/module_spec_helper' require 'yaml' - -puppet_logs_dir = ENV['PUPPET_LOGS_DIR'] || 'none' +require 'fileutils' +require 'find' module Noop def self.module_path @@ -12,6 +14,7 @@ module Noop end def self.hiera_data_path + return ENV['SPEC_YAML_DIR'] if ENV['SPEC_YAML_DIR'] and File.directory? ENV['SPEC_YAML_DIR'] return @hiera_data_path if @hiera_data_path @hiera_data_path = File.expand_path(File.join(__FILE__, '..', '..', 'astute.yaml')) end @@ -22,7 +25,16 @@ module Noop end def self.astute_yaml_name - ENV['astute_filename'] || 'neut_vlan.primary-controller.yaml' + ENV['astute_filename'] || 'novanet-primary-controller.yaml' + end + + def self.puppet_logs_dir + ENV['PUPPET_LOGS_DIR'] + end + + def self.puppet_log_file + name = manifest.gsub(/\s+|\//, '_').gsub(/\(|\)/, '') + '.log' + File.join puppet_logs_dir, name end def self.astute_yaml_base @@ -37,6 +49,18 @@ module Noop File.expand_path File.join(self.hiera_data_path, self.globlas_prefix + self.astute_yaml_name) end + def self.tasks + return @tasks if @tasks + @tasks = [] + Find.find(self.module_path) do |file| + next unless File.file? file + next unless file.end_with? 'tasks.yaml' + task = YAML.load_file(file) + @tasks += task if task.is_a? Array + end + @tasks + end + def self.globlas_prefix 'globals_yaml_for_' end @@ -49,16 +73,14 @@ module Noop self.globlas_prefix + self.hiera_data_astute end - def self.hiera_config_file - File.join self.fixtures_path, 'hiera.yaml' - end - - def self.fuel_settings - YAML.load_file self.astute_yaml_path - end - def self.fqdn - self.fuel_settings['fqdn'] + fqdn = hiera 'fqdn' + raise 'Unable to get FQDN from Hiera!' unless fqdn + fqdn + end + + def self.role + hiera 'role' end def self.hostname @@ -66,20 +88,85 @@ module Noop end def self.node_hash - Noop.fuel_settings['nodes'].find { |node| node['fqdn'] == Noop.fqdn } || {} + hiera('nodes').find { |node| node['fqdn'] == fqdn } || {} end def self.manifest_present?(manifest) manifest_path = File.join self.modular_manifests_node_dir, manifest - self.fuel_settings['tasks'].find do |task| - task['parameters']['puppet_manifest'] == manifest_path + tasks.each do |task| + next unless task['type'] == 'puppet' + next unless task['parameters']['puppet_manifest'] == manifest_path + if task['role'] + return true if task['role'] == '*' + return true if task['role'].include?(role) + end + if task['groups'] + return true if task['groups'] == '*' + return true if task['groups'].include?(role) + end + end + false + end + + def self.hiera_config + { + :backends=> [ + 'yaml', + ], + :yaml=>{ + :datadir => hiera_data_path, + }, + :hierarchy=> [ + hiera_data_globals, + hiera_data_astute, + ], + :logger => 'noop', + } + end + + def self.hiera_object + Hiera.new(:config => hiera_config) + end + + def self.hiera(key, default = nil) + hiera_object.lookup key, default, {} + end + + def self.hiera_structure(key, default=nil) + path_lookup = lambda do |data, path, default_value| + break default_value unless data + break data unless path.is_a? Array and path.any? + break default_value unless data.is_a? Hash or data.is_a? Array + + key = path.shift + if data.is_a? Array + begin + key = Integer key + rescue ArgumentError + break default_value + end + end + path_lookup.call data[key], path, default_value + end + + path = key.split '/' + key = path.shift + data = hiera key + path_lookup.call data, path, default + end + + def self.hiera_puppet_override + class << HieraPuppet + def hiera + Noop.hiera_object + end end end def self.ubuntu_facts { - :fqdn => self.fqdn, - :hostname => self.hostname, + :fqdn => fqdn, + :hostname => hostname, :processorcount => '4', :memorysize_mb => '32138.66', :memorysize => '31.39 GB', @@ -88,21 +175,17 @@ module Noop :operatingsystem => 'Ubuntu', :operatingsystemrelease => '14.04', :lsbdistid => 'Ubuntu', - :l3_fqdn_hostname => self.hostname, + :l3_fqdn_hostname => hostname, :l3_default_route => '172.16.1.1', :concat_basedir => '/tmp/', - :hiera_data_path => self.hiera_data_path, - :hiera_data_globals => self.hiera_data_globals, - :hiera_data_astute => self.hiera_data_astute, - :hiera_config_file => self.hiera_config_file, :l23_os => 'ubuntu', } end def self.centos_facts { - :fqdn => self.fqdn, - :hostname => self.hostname, + :fqdn => fqdn, + :hostname => hostname, :processorcount => '4', :memorysize_mb => '32138.66', :memorysize => '31.39 GB', @@ -111,13 +194,9 @@ module Noop :operatingsystem => 'CentOS', :operatingsystemrelease => '6.5', :lsbdistid => 'CentOS', - :l3_fqdn_hostname => self.hostname, + :l3_fqdn_hostname => hostname, :l3_default_route => '172.16.1.1', :concat_basedir => '/tmp/', - :hiera_data_path => self.hiera_data_path, - :hiera_data_globals => self.hiera_data_globals, - :hiera_data_astute => self.hiera_data_astute, - :hiera_config_file => self.hiera_config_file, :l23_os => 'centos6', } end @@ -132,16 +211,31 @@ module Noop def self.manifest=(manifest) RSpec.configuration.manifest = File.join self.modular_manifests_local_dir, manifest + @manifest = manifest + end + + def self.manifest_path + RSpec.configuration.manifest end def self.manifest - RSpec.configuration.manifest + @manifest + end + + def self.test_ubuntu? + return true unless ENV['SPEC_TEST_UBUNTU'] or ENV['SPEC_TEST_CENTOS'] + true if ENV['SPEC_TEST_UBUNTU'] + end + + def self.test_centos? + return true unless ENV['SPEC_TEST_UBUNTU'] or ENV['SPEC_TEST_CENTOS'] + true if ENV['SPEC_TEST_CENTOS'] end ## File resources list ## def self.file_resources_lists_dir - File.expand_path File.join ENV['NOOP_SAVE_RESOURCES_DIR'], 'file_resources', self.astute_yaml_base + File.expand_path File.join ENV['SPEC_SAVE_FILE_RESOURCES'], self.astute_yaml_base end def self.file_resources_list_file(manifest, os) @@ -151,8 +245,8 @@ module Noop def self.save_file_resources_list(data, manifest, os) begin - Dir.mkdir file_resources_lists_dir unless File.directory? file_resources_lists_dir file_path = file_resources_list_file manifest, os + FileUtils.mkdir_p file_resources_lists_dir unless File.directory? file_resources_lists_dir File.open(file_path, 'w') do |list_file| YAML.dump(data, list_file) end @@ -166,7 +260,7 @@ module Noop ## Package resources list ## def self.package_resources_lists_dir - File.expand_path File.join ENV['NOOP_SAVE_RESOURCES_DIR'], 'package_resources', self.astute_yaml_base + File.expand_path File.join ENV['SPEC_SAVE_PACKAGE_RESOURCES'], self.astute_yaml_base end def self.package_resources_list_file(manifest, os) @@ -176,8 +270,8 @@ module Noop def self.save_package_resources_list(data, manifest, os) begin - Dir.mkdir package_resources_lists_dir unless File.directory? package_resources_lists_dir file_path = package_resources_list_file manifest, os + FileUtils.mkdir_p package_resources_lists_dir unless File.directory? package_resources_lists_dir File.open(file_path, 'w') do |list_file| YAML.dump(data, list_file) end @@ -188,6 +282,40 @@ module Noop end end + def self.show_catalog(subject) + catalog = subject + catalog = subject.call if subject.is_a? Proc + catalog.resources.each do |resource| + puts '=' * 70 + puts resource.to_manifest + end + end + + def self.resource_test_template(binding) + template = <<-'eof' + it do + expect(subject).to contain_<%= resource.type.gsub('::', '__').downcase %>('<%= resource.title %>').with( +<% max_length = resource.to_hash.keys.inject(0) { |ml, key| key = key.to_s; ml = key.size if key.size > ml; ml } -%> +<% resource.each do |parameter, value| -%> + <%= ":#{parameter}".to_s.ljust(max_length + 1) %> => <%= value.inspect %>, +<% end -%> + ) + end + + eof + ERB.new(template, nil, '-').result(binding) + end + + def self.catalog_to_spec(subject) + catalog = subject + catalog = subject.call if subject.is_a? Proc + catalog.resources.each do |resource| + next if %w(Stage Anchor).include? resource.type + next if resource.type == 'Class' and %w(Settings main).include? resource.title.to_s + puts resource_test_template binding + end + end + end # Add fixture lib dirs to LOAD_PATH. Work-around for PUP-3336 @@ -199,38 +327,37 @@ end RSpec.configure do |c| c.module_path = Noop.module_path - c.hiera_config = Noop.hiera_config_file c.expose_current_running_example_as :example c.pattern = 'hosts/**' - c.before :each do |test| + c.before :each do # avoid "Only root can execute commands as other users" Puppet.features.stubs(:root? => true) # clear cached facts Facter::Util::Loader.any_instance.stubs(:load_all) Facter.clear Facter.clear_messages + # Puppet logs creation - if puppet_logs_dir != 'none' - descr = test.metadata[:example_group][:full_description].gsub(/\s+|\//, '_').gsub(/\(|\)/, '') - @file = "#{puppet_logs_dir}/#{descr}.log" - Puppet::Util::Log.newdestination(@file) + if Noop.puppet_logs_dir + Puppet::Util::Log.newdestination(Noop.puppet_log_file) Puppet::Util::Log.level = :debug end end - c.after :each do |test| + c.after :each do # Puppet logs cleanup - if puppet_logs_dir != 'none' + if Noop.puppet_logs_dir Puppet::Util::Log.close_all - descr = test.metadata[:example_group][:full_description].gsub(/\s+|\//, '_').gsub(/\(|\)|/, '') - if example.exception == nil - # Remove puppet log if there are no compilation errors - File.delete("#{puppet_logs_dir}/#{descr}.log") + # Remove puppet log if there are no compilation errors + unless example.exception + File.unlink Noop.puppet_log_file if File.file? Noop.puppet_log_file end end end end +Noop.hiera_puppet_override + diff --git a/utils/jenkins/fuel_noop_tests.rb b/utils/jenkins/fuel_noop_tests.rb new file mode 100755 index 0000000000..a945694c05 --- /dev/null +++ b/utils/jenkins/fuel_noop_tests.rb @@ -0,0 +1,470 @@ +#!/usr/bin/env ruby + +# Copyright 2015 Mirantis, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +require 'rubygems' +require 'find' +require 'optparse' + +module NoopTests + GLOBALS_SPEC = 'globals/globals_spec.rb' + RSPEC_OPTIONS = '--format documentation --color --tty --backtrace' + ASTUTE_YAML_VAR = 'astute_filename' + BUNDLE_DIR = '.bundled_gems' + BUNDLE_VAR = 'GEM_HOME' + GLOBALS_PREFIX = 'globals_yaml_for_' + PUPPET_GEM_VERSION = '~> 3.4.0' + TEST_LIBRARY_DIR = 'spec/hosts' + + def self.options + return @options if @options + @options = {} + optparse = OptionParser.new do|opts| + opts.separator 'Main options:' + opts.on('-b', '--bundle', 'Use bundle to setup environment') do + @options[:bundle] = true + end + opts.on('-m', '--missing', 'Find missing spec files') do + @options[:missing_specs] = true + end + opts.on('-i', '--individually', 'Run each spec individually') do + @options[:run_individually] = true + end + opts.on('-p', '--purge_globals', 'Purge globals yaml files') do + @options[:purge_globals] = true + end + opts.on('-a', '--astute_yaml_dir DIR', 'Path to astute_yaml folder') do |dir| + @options[:astute_yaml_dir] = dir + ENV['SPEC_YAML_DIR'] = dir + end + opts.on('-Y', '--list_yamls', 'List all astute yaml files') do + @options[:list_yamls] = true + end + opts.on('-S', '--list_specs', 'List all noop spec files') do + @options[:list_specs] = true + end + opts.separator 'Filter options:' + opts.on('-s', '--specs SPEC1,SPEC2', Array, 'Run only these specs') do |specs| + @options[:filter_specs] = specs + end + opts.on('-y', '--yamls YAML1,YAML2', Array, 'Run only these yamls') do |yamls| + @options[:filter_yamls] = yamls + end + opts.on('-e', '--examples STR1,STR2', Array, 'Run only these exemples') do |examples| + @options[:filter_examples] = examples + end + opts.separator 'Debug options:' + opts.on('-c', '--console', 'Run PRY console') do + @options[:console] = true + end + opts.on('-d', '--debug', 'Show debug') do + @options[:debug] = true + end + opts.separator 'Spec options:' + opts.on('-F', '--file_resources DIR', 'Save file resources to this dir') do |dir| + ENV['SPEC_SAVE_FILE_RESOURCES'] = dir + end + opts.on('-P', '--package_resources DIR', 'Save package resources to this dir') do |dir| + ENV['SPEC_SAVE_PACKAGE_RESOURCES'] = dir + end + opts.on('-C', '--catalog_debug', 'Show catalog debug output') do + ENV['SPEC_CATALOG_DEBUG'] = 'YES' + end + opts.on('-G', '--spec_generate', 'Generate specs for catalogs') do + ENV['SPEC_SPEC_GENERATE'] = 'YES' + end + opts.on('-T', '--spec_status', 'Show spec status blocks') do + ENV['SPEC_SHOW_STATUS'] = 'YES' + end + opts.on('-O', '--spec_coverage', 'Show spec coverage statistics') do + ENV['SPEC_COVERAGE'] = 'YES' + end + opts.on('-D', '--test_ubuntu', 'Run tests for Ubuntu facts') do + ENV['SPEC_TEST_UBUNTU'] = 'YES' + end + opts.on('-R', '--test_centos', 'Run tests for CentOS facts') do + ENV['SPEC_TEST_CENTOS'] = 'YES' + end + opts.on('-L', '--puppet_logs_dir DIR', 'Save Puppet logs in this directory') do |dir| + ENV['PUPPET_LOGS_DIR'] = dir + @options[:puppet_logs_dir] = dir + end + end + optparse.parse! + @options + end + + # PATHS # + + # workspace directory where gem bundle will be created + # is passed from Jenkins or default value is used + # @@return [String] + def self.workspace + workspace = ENV['WORKSPACE'] + unless workspace + workspace = '/tmp/noop' + Dir.mkdir workspace unless File.directory? workspace + end + unless File.directory? workspace + raise "Workspace '#{workspace}' is not a directory!" + end + workspace + end + + # the root directory of noop tests + # @return [String] + def self.noop_tests_directory + return @noop_tests_directory if @noop_tests_directory + @noop_tests_directory = File.expand_path File.absolute_path File.join File.dirname(__FILE__), '..', '..', 'tests', 'noop' + end + + # the folder where astute yaml files are found + # can be overridden by options + # @return [String] + def self.astute_yaml_directory + return options[:astute_yaml_dir] if options[:astute_yaml_dir] and File.directory? options[:astute_yaml_dir] + File.join noop_tests_directory, 'astute.yaml' + end + + # the directory where actual tests library is found + # @return [String] + def self.test_spec_directory + File.join noop_tests_directory, TEST_LIBRARY_DIR + end + + # the directory where the library of modular tasks can be found + # @return [String] + def self.modular_tasks_directory + File.expand_path File.join File.dirname(__FILE__), '..', '..', 'deployment', 'puppet', 'osnailyfacter', 'modular' + end + + # LISTERS # + + # find all modular task files + # @return [Array] + def self.modular_puppet_task_files + files = [] + Find.find(modular_tasks_directory) do |file| + next unless File.file? file + next unless file.end_with? '.pp' + file.gsub! modular_tasks_directory + '/', '' + files << file + end + files + end + + # find all astute yaml files + # @return [Array] + def self.astute_yaml_files + files = [] + Dir.new(astute_yaml_directory).each do |file| + next if file.start_with? GLOBALS_PREFIX + next unless file.end_with? '.yaml' + files << file + end + files + end + + # find all noop spec files + # @return [Array] + def self.noop_spec_files + files = [] + Find.find(test_spec_directory) do |file| + next unless File.file? file + next unless file.end_with? '_spec.rb' + file.gsub! test_spec_directory + '/', '' + files << file + end + files + end + + # ACTIONS # + + # run the code block inside the tests directory + # and then return back + def self.inside_noop_tests_directory + current_directory = Dir.pwd + Dir.chdir noop_tests_directory + result = yield + Dir.chdir current_directory if current_directory + result + end + + # find all modular tasks that have no corresponding specs + # @return [Array] + def self.puppet_tasks_without_specs + tasks = [] + modular_puppet_task_files.each do |task| + spec = task.gsub '.pp', '_spec.rb' + spec_path = File.join test_spec_directory, spec + tasks << task unless File.exist? spec_path + end + tasks + end + + # append relative path prefix to a spec name + # @param [String] spec Spec name + # @return [String] + def self.spec_path(spec) + "'#{File.join TEST_LIBRARY_DIR, spec}'" + end + + # run the rspec commands with some options + # return: [ success, report ] + # @param [String] spec Spec file or pattern + # @return [Array] success and empty report array + def self.rspec(spec) + inside_noop_tests_directory do + command = "rspec #{RSPEC_OPTIONS} #{spec}" + command = 'bundle exec ' + command if options[:bundle] + if options[:filter_examples] + options[:filter_examples].each do |example| + command = command + " -e #{example}" + end + end + if options[:puppet_logs_dir] + command = command + " --deprecation-out #{File.join options[:puppet_logs_dir], 'deprecations.log'}" + end + debug "RUN: #{command}" + system command + [ $?.exitstatus == 0, nil ] + end + end + + # run all specs together using pattern + # return: [ success, report ] + # @return [Array] success and empty report array + def self.run_all_specs + include_prefix = '--pattern' + exclude_prefix = '--exclude-pattern' + exclude_pattern = "#{exclude_prefix} #{spec_path GLOBALS_SPEC}" + if options[:filter_specs] + include_pattern = "#{include_prefix} #{options[:filter_specs].map { |s| spec_path s }.join ','}" + else + include_pattern = "#{include_prefix} #{spec_path '**/*_spec.rb'}" + end + + rspec "#{exclude_pattern} #{include_pattern}" + end + + # run the globals task for the given yaml file + # if there is no globals yaml already present + # @param [String] astute_yaml YAML file + def self.globals(astute_yaml) + globals_file = File.join astute_yaml_directory, GLOBALS_PREFIX + astute_yaml + return true if File.file? globals_file + rspec spec_path(GLOBALS_SPEC) + end + + # output a debug line is debug is enabled + # @param [String] msg The message line + def self.debug(msg) + puts msg if options[:debug] + end + + # decide if this spec should be included + # @param [String] spec Spec file + # @return [TrueClass,FalseClass] + def self.filter_specs(spec) + return false if spec == GLOBALS_SPEC + return true unless options[:filter_specs] + options[:filter_specs].include? spec + end + + # decide if this yaml should be included + # @param [String] yaml Yaml file + # @return [TrueClass,FalseClass] + def self.filter_yamls(yaml) + return true unless options[:filter_yamls] + options[:filter_yamls].map { |y| y.gsub('.yaml', '') }.include? yaml.gsub('.yaml', '') + end + + # trigger skip of the current yaml file + # when individual run is enabled + # second trigger forces exit + def self.skip + raise SystemExit if @skip + @skip = true + end + + # run the code block for every astute yaml file + # return [ global success, Hash of reports for every yaml ] + # @return [Array] + def self.for_every_astute_yaml + prepare_bundle if options[:bundle] + results = {} + errors = 0 + astute_yaml_files.each do |astute_yaml| + next unless filter_yamls astute_yaml + ENV[ASTUTE_YAML_VAR] = astute_yaml + debug "=== YAML: '#{astute_yaml}' ===" + globals astute_yaml + success, report = yield + errors += 1 unless success + results[astute_yaml] = { + :success => success, + :report => report, + } + end + [ errors == 0, results ] + end + + # run every spec file individually + # return report for every spec + # return [ global success, Hash of reports for every spec ] + # @return [Array] + def self.run_all_specs_individually + results = {} + errors = 0 + trap('SIGINT') do + skip + end + noop_spec_files.each do |spec| + if @skip + @skip = false + debug color(31, 'Skipping current yaml file!') + return [ errors == 0, results ] + end + next if spec == GLOBALS_SPEC + next unless filter_specs spec + debug "--- SPEC: '#{spec}' ---" + success, report = rspec spec_path(spec) + errors += 1 unless success + results[spec] = { + :success => success, + :report => report, + } + end + [ errors == 0, results ] + end + + # setup the bundle directory + def self.prepare_bundle + ENV['PUPPET_GEM_VERSION'] = PUPPET_GEM_VERSION unless ENV['PUPPET_GEM_VERSION'] + inside_noop_tests_directory do + `bundle --version` + raise 'Bundle is not installed!' if $?.exitstatus != 0 + ENV[BUNDLE_VAR] = File.join workspace, BUNDLE_DIR + system 'bundle update' + raise 'Could not prepare bundle environment!' if $?.exitstatus != 0 + end + end + + # add color codes to a line + # @param [Integer] code Color code + # @param [String] string Text string + def self.color(code, string) + "\033[#{code}m#{string}\033[0m" + end + + def self.status_string(success) + if success + color 32, 'OK' + else + color 31, 'FAIL' + end + end + + # calculate the maximum length of the hash keys + # used to align columns + # @param [Hash] + # @return [Integer] + def self.max_key_length(hash) + hash.keys.inject(0) do |ml, key| + key = key.to_s + ml = key.size if key.size > ml + ml + end + end + + # output the test results + # @param [Hash] + def self.show_results(results) + max_astute_yaml_length = max_key_length results + results.each do |astute_yaml, yaml_result| + puts "-> #{astute_yaml.ljust max_astute_yaml_length} #{status_string yaml_result[:success]}" + if yaml_result[:report].is_a? Hash + max_spec_length = max_key_length yaml_result[:report] + yaml_result[:report].each do |spec, spec_result| + puts " * #{spec.ljust max_spec_length} #{status_string spec_result[:success]}" + end + end + end + end + + # remove all globals yaml files + def self.purge_globals + Dir.new(astute_yaml_directory).each do |file| + path = File.join astute_yaml_directory, file + next unless File.file? path + next unless file.start_with? GLOBALS_PREFIX + next unless file.end_with? '.yaml' + debug "Remove: '#{path}'" + File.unlink path + end + end + + # the main function + def self.main + if options[:console] + require 'pry' + self.pry + exit 0 + end + + if options[:missing_specs] + missing_specs = puppet_tasks_without_specs + if missing_specs.any? + puts color(31, "Missing specs for tasks: #{missing_specs.join ', '}") + exit missing_specs.length + end + end + + if options[:list_yamls] + astute_yaml_files.each do |file| + puts file + end + exit 0 + end + + if options[:list_specs] + noop_spec_files.each do |file| + puts file + end + exit 0 + end + + if options[:purge_globals] + purge_globals + exit 0 + end + + success, result = for_every_astute_yaml do + if options[:run_individually] + run_all_specs_individually + else + run_all_specs + end + end + + show_results result + + success + end + +end + +NoopTests.main if __FILE__ == $0 + diff --git a/utils/jenkins/fuel_noop_tests.sh b/utils/jenkins/fuel_noop_tests.sh index 4f7cbac12b..e43046a910 100755 --- a/utils/jenkins/fuel_noop_tests.sh +++ b/utils/jenkins/fuel_noop_tests.sh @@ -1,67 +1,5 @@ #!/bin/bash -MODULAR_BASE='deployment/puppet/osnailyfacter/modular/' - -if ! [ -d "$WORKSPACE" ] ; then - echo "ERROR: WORKSPACE not found" - exit 1 -fi - -if [ -z "$PUPPET_GEM_VERSION" ] ; then - export PUPPET_GEM_VERSION='~> 3.4.0' -fi - -if [ -z "$NOOP_YAMLS" ] ; then - NOOP_YAMLS=`ls ./tests/noop/astute.yaml/*yaml` -fi - -# Check for bundle and exit if failed -bundle --version || exit 1 - -export GEM_HOME=$WORKSPACE/.bundled_gems - -# Prepare gems -pushd ./tests/noop -bundle update -popd - -failed_yamls="" -untested_tasks="" - -# Check that all tasks have spec tests -for i in `find $MODULAR_BASE -name *\.pp | sed -e "s#$MODULAR_BASE##"` ; do - spec="${i/\.pp/_spec.rb}" - if ! [ -f "tests/noop/spec/hosts/$spec" ] && [ "$i" != "globals/globals.pp" ] ; then - untested_tasks="${untested_tasks}\n${MODULAR_BASE}${i}" - fi -done -if ! [ -z "$untested_tasks" ] ; then - echo -e "\nFAILED. No modular rspec tests found for the following tasks:" - echo -e "$untested_tasks\n" - exit 1 -fi - -# Iterate over astute.yaml files we have and run tests -for YAML in $NOOP_YAMLS ; do - echo "${YAML}" | grep -q 'globals_yaml_for_' - if [ $? -eq 0 ]; then - continue - fi - export astute_filename=`basename $YAML` - echo -e "\n\n======== Running modular noop tests for $astute_filename ========\n" - pushd ./tests/noop - echo "Starting test for YAML '${astute_filename} at directory '`pwd`'" - bundle exec rake spec || failed_yamls="$failed_yamls\n$astute_filename" - popd -done - -# Report and exit -if [ -z "$failed_yamls" ] ; then - echo -e "\nRSpec Noop Tests SUCCEEDED: No errors found.\n" - exit 0 -else - echo -e "\nRSpec Noop Tests FAILED for the following astute.yaml files:" - echo -e "$failed_yamls\n" - exit 1 -fi +DIR=`dirname $0` +"${DIR}/fuel_noop_tests.rb" -b -d -m ${@}