diff --git a/cookbooks/aws-parallelcluster-platform/resources/install_packages/install_packages_amazon2.rb b/cookbooks/aws-parallelcluster-platform/resources/install_packages/install_packages_amazon2.rb index ca395dd790..a467c96d84 100644 --- a/cookbooks/aws-parallelcluster-platform/resources/install_packages/install_packages_amazon2.rb +++ b/cookbooks/aws-parallelcluster-platform/resources/install_packages/install_packages_amazon2.rb @@ -22,7 +22,7 @@ def default_packages # environment-modules required by EFA, Intel MPI and ARM PL # iptables needed for IMDS setup - packages = %w(vim ksh tcsh zsh openssl-devel ncurses-devel pam-devel net-tools openmotif-devel + packages = %w(vim ksh tcsh zsh openssl11-devel ncurses-devel pam-devel net-tools openmotif-devel libXmu-devel hwloc-devel libdb-devel tcl-devel automake autoconf pyparted libtool httpd boost-devel system-lsb mlocate atlas-devel glibc-static iproute libffi-devel dkms libedit-devel sendmail cmake byacc libglvnd-devel libgcrypt-devel libevent-devel diff --git a/cookbooks/aws-parallelcluster-platform/spec/unit/resources/install_packages_spec.rb b/cookbooks/aws-parallelcluster-platform/spec/unit/resources/install_packages_spec.rb index da87f3d3e0..530f424f00 100644 --- a/cookbooks/aws-parallelcluster-platform/spec/unit/resources/install_packages_spec.rb +++ b/cookbooks/aws-parallelcluster-platform/spec/unit/resources/install_packages_spec.rb @@ -10,6 +10,87 @@ def self.setup(chef_run) end end +describe 'install_packages default_packages' do + EXPECTED_PACKAGES = { + 'amazon2' => %w(vim ksh tcsh zsh openssl11-devel ncurses-devel pam-devel net-tools openmotif-devel + libXmu-devel hwloc-devel libdb-devel tcl-devel automake autoconf pyparted libtool + httpd boost-devel system-lsb mlocate atlas-devel glibc-static iproute + libffi-devel dkms libedit-devel sendmail cmake byacc libglvnd-devel libgcrypt-devel libevent-devel + libxml2-devel perl-devel tar gzip bison flex gcc gcc-c++ patch + rpm-build rpm-sign system-rpm-config cscope ctags diffstat doxygen elfutils + gcc-gfortran git indent intltool patchutils rcs subversion swig systemtap curl + jq wget python-pip NetworkManager-config-routing-rules + python3 python3-pip iptables libcurl-devel yum-plugin-versionlock + coreutils moreutils environment-modules bzip2 dos2unix), + 'amazon2023' => %w(ksh tcsh zsh openssl-devel ncurses-devel pam-devel net-tools + libXmu-devel hwloc-devel libdb-devel tcl-devel automake autoconf libtool + httpd boost-devel mlocate R atlas-devel + blas-devel libffi-devel dkms libedit-devel jq + libical-devel sendmail libxml2-devel libglvnd-devel + libgcrypt-devel libevent-devel glibc-static bind-utils + iproute python3 python3-pip libcurl-devel git + coreutils environment-modules gcc gcc-c++ bzip2 iptables vim yum-plugin-versionlock dos2unix), + 'redhat' => %w(vim ksh tcsh zsh openssl-devel ncurses-devel pam-devel net-tools openmotif-devel + libXmu-devel hwloc-devel libdb-devel tcl-devel automake autoconf libtool + httpd boost-devel mlocate R atlas-devel + blas-devel libffi-devel dkms libedit-devel jq + libical-devel sendmail libxml2-devel libglvnd-devel + libgcrypt-devel libevent-devel glibc-static bind-utils + iproute NetworkManager-config-routing-rules python3 python3-pip iptables libcurl-devel yum-plugin-versionlock + coreutils moreutils curl environment-modules gcc gcc-c++ bzip2 dos2unix), + 'rocky' => %w(vim ksh tcsh zsh openssl-devel ncurses-devel pam-devel net-tools openmotif-devel + libXmu-devel hwloc-devel libdb-devel tcl-devel automake autoconf libtool + httpd boost-devel mlocate R atlas-devel + blas-devel libffi-devel dkms libedit-devel jq + libical-devel sendmail libxml2-devel libglvnd-devel + libgcrypt-devel libevent-devel glibc-static bind-utils + iproute NetworkManager-config-routing-rules python3 python3-pip iptables libcurl-devel yum-plugin-versionlock + moreutils curl environment-modules gcc gcc-c++ bzip2 dos2unix coreutils), + 'ubuntu' => %w(vim ksh tcsh zsh libssl-dev ncurses-dev libpam-dev net-tools libhwloc-dev dkms + tcl-dev automake autoconf libtool librrd-dev libapr1-dev libconfuse-dev + apache2 libboost-dev libdb-dev libncurses5-dev libpam0g-dev libxt-dev + libmotif-dev libxmu-dev libxft-dev man-db jq + r-base libblas-dev libffi-dev libxml2-dev + libgcrypt20-dev libevent-dev iproute2 python3 python3-pip + libatlas-base-dev libglvnd-dev iptables libcurl4-openssl-dev + coreutils moreutils curl python3-parted environment-modules libdbus-1-dev dos2unix), + }.freeze + + for_all_oses do |platform, version| + context "on #{platform}#{version}" do + cached(:chef_run) do + runner = runner(platform: platform, version: version, step_into: ['install_packages']) + ConvergeInstallPackages.setup(runner) + end + cached(:resource) do + chef_run.find_resource('install_packages', 'setup') + end + + it 'returns expected packages' do + expected_key = %(amazon).include?(platform) ? "#{platform}#{version}" : "#{platform}" + expect(resource.default_packages).to eq(EXPECTED_PACKAGES[expected_key]) + end + + case "#{platform}#{version}" + when 'amazon2' + it 'excludes moreutils for us-iso regions' do + allow(resource).to receive(:aws_region).and_return('us-iso-WHATEVER') + expect(resource.default_packages).not_to include('moreutils') + end + when 'redhat8' + it 'excludes multiple packages for us-iso regions' do + allow(resource).to receive(:aws_region).and_return('us-iso-WHATEVER') + packages = resource.default_packages + %w(openmotif-devel hwloc-devel R blas-devel dkms libedit-devel glibc-static + NetworkManager-config-routing-rules yum-plugin-versionlock moreutils).each do |pkg| + expect(packages).not_to include(pkg) + end + end + end + end + end +end + describe 'install_packages:setup' do for_all_oses do |platform, version| context "on #{platform}#{version}" do diff --git a/cookbooks/aws-parallelcluster-slurm/resources/munge/munge_amazon2.rb b/cookbooks/aws-parallelcluster-slurm/resources/munge/munge_amazon2.rb index 139d27d026..595c2b72d2 100644 --- a/cookbooks/aws-parallelcluster-slurm/resources/munge/munge_amazon2.rb +++ b/cookbooks/aws-parallelcluster-slurm/resources/munge/munge_amazon2.rb @@ -12,3 +12,7 @@ use 'partial/_munge_actions' use 'partial/_munge_rhel' + +def prerequisites + %w(automake autoconf libtool openssl11-devel) +end diff --git a/cookbooks/aws-parallelcluster-slurm/spec/unit/resources/munge_spec.rb b/cookbooks/aws-parallelcluster-slurm/spec/unit/resources/munge_spec.rb new file mode 100644 index 0000000000..7456f30b4d --- /dev/null +++ b/cookbooks/aws-parallelcluster-slurm/spec/unit/resources/munge_spec.rb @@ -0,0 +1,212 @@ +require 'spec_helper' + +class ConvergeMunge + def self.setup(chef_run) + chef_run.converge_dsl('aws-parallelcluster-slurm') do + munge 'setup' do + action :setup + end + end + end + + def self.purge_packages(chef_run) + chef_run.converge_dsl('aws-parallelcluster-slurm') do + munge 'purge_packages' do + action :purge_packages + end + end + end + + def self.download_source_code(chef_run) + chef_run.converge_dsl('aws-parallelcluster-slurm') do + munge 'download_source_code' do + action :download_source_code + end + end + end + + def self.compile_and_install(chef_run) + chef_run.converge_dsl('aws-parallelcluster-slurm') do + munge 'compile_and_install' do + action :compile_and_install + end + end + end + + def self.set_user_and_group(chef_run) + chef_run.converge_dsl('aws-parallelcluster-slurm') do + munge 'set_user_and_group' do + action :set_user_and_group + end + end + end + + def self.create_required_directories(chef_run) + chef_run.converge_dsl('aws-parallelcluster-slurm') do + munge 'create_required_directories' do + action :create_required_directories + end + end + end +end + +describe 'munge:setup' do + for_all_oses do |platform, version| + context "on #{platform}#{version}" do + cached(:munge_version) { '0.5.16' } + cached(:munge_libdir) do + case platform + when 'ubuntu' + '/usr/lib' + else + '/usr/lib64' + end + end + cached(:chef_run) do + allow_any_instance_of(Object).to receive(:redhat_on_docker?).and_return(false) + stub_command("/usr/sbin/munged --version | grep -q munge-#{munge_version} && ls #{munge_libdir}/libmunge*").and_return(false) + runner = runner(platform: platform, version: version, step_into: ['munge']) + ConvergeMunge.setup(runner) + end + + it 'sets up munge' do + is_expected.to setup_munge('setup') + end + + it 'creates sources directory' do + is_expected.to create_directory('/opt/parallelcluster/sources').with(recursive: true) + end + + it 'updates package repos' do + is_expected.to update_package_repos('update package repos') + end + + it 'installs build tools' do + is_expected.to setup_build_tools('Prerequisite: build tools') + end + + it 'installs prerequisite packages' do + expected_packages = case platform + when 'ubuntu' + %w(automake autoconf libtool libssl-dev) + when 'amazon' + if version == '2' + %w(automake autoconf libtool openssl11-devel) + else + %w(automake autoconf libtool openssl-devel) + end + else + %w(automake autoconf libtool openssl-devel) + end + is_expected.to install_install_packages('prerequisites').with(packages: expected_packages) + end + end + end +end + +describe 'munge:purge_packages' do + for_all_oses do |platform, version| + context "on #{platform}#{version}" do + cached(:chef_run) do + runner = runner(platform: platform, version: version, step_into: ['munge']) + ConvergeMunge.purge_packages(runner) + end + + it 'purges munge packages' do + is_expected.to purge_package(%w(munge* libmunge*)) + end + end + end +end + +describe 'munge:download_source_code' do + for_all_oses do |platform, version| + context "on #{platform}#{version}" do + cached(:chef_run) do + runner = runner(platform: platform, version: version, step_into: ['munge']) + ConvergeMunge.download_source_code(runner) + end + + it 'downloads munge source code' do + is_expected.to create_if_missing_remote_file('/opt/parallelcluster/sources/munge-0.5.16.tar.gz') + .with(mode: '0644') + .with(retries: 3) + .with(retry_delay: 5) + end + end + end +end + +describe 'munge:compile_and_install' do + for_all_oses do |platform, version| + context "on #{platform}#{version}" do + cached(:munge_libdir) do + case platform + when 'ubuntu' + '/usr/lib' + else + '/usr/lib64' + end + end + cached(:chef_run) do + stub_command("/usr/sbin/munged --version | grep -q munge-0.5.16 && ls #{munge_libdir}/libmunge*").and_return(false) + runner = runner(platform: platform, version: version, step_into: ['munge']) + ConvergeMunge.compile_and_install(runner) + end + + it 'compiles and installs munge' do + is_expected.to run_bash('make install') + .with(user: 'root') + .with(group: 'root') + .with(cwd: Chef::Config[:file_cache_path]) + end + end + end +end + +describe 'munge:set_user_and_group' do + for_all_oses do |platform, version| + context "on #{platform}#{version}" do + cached(:chef_run) do + runner = runner(platform: platform, version: version, step_into: ['munge']) + ConvergeMunge.set_user_and_group(runner) + end + + it 'creates munge group' do + is_expected.to create_group('munge') + .with(comment: 'munge group') + .with(gid: 402) + .with(system: true) + end + + it 'creates munge user' do + is_expected.to create_user('munge') + .with(uid: 402) + .with(gid: 402) + .with(manage_home: false) + .with(comment: 'munge user') + .with(system: true) + .with(shell: '/sbin/nologin') + end + end + end +end + +describe 'munge:create_required_directories' do + for_all_oses do |platform, version| + context "on #{platform}#{version}" do + cached(:chef_run) do + runner = runner(platform: platform, version: version, step_into: ['munge']) + ConvergeMunge.create_required_directories(runner) + end + + it 'creates required munge directories' do + %w(/var/log/munge /etc/munge /var/run/munge).each do |dir| + is_expected.to create_directory(dir) + .with(owner: 'munge') + .with(group: 'munge') + end + end + end + end +end