diff --git a/README.md b/README.md index c3e0ab3..6a23d2b 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,56 @@ java::download { 'jdk8' : } ``` +The defined type `java::adopt` installs one or more versions of AdoptOpenJDK Java. `java::adopt` depends on [puppet/archive](https://github.com/voxpupuli/puppet-archive). + +```puppet +java::adopt { 'jdk8' : + ensure => 'present', + version => '8', + java => 'jdk', +} + +java::adopt { 'jdk11' : + ensure => 'present', + version => '11', + java => 'jdk', +} +``` +#TODO +To install a specific release of a AdoptOpenJDK Java version, e.g. 8u202-b08, provide both parameters `version_major` and `version_minor` as follows: + +```puppet +java::adopt { 'jdk8' : + ensure => 'present', + version_major => '8u202', + version_minor => 'b08', + java => 'jdk', +} +``` + +To install AdoptOpenJDK Java to a non-default basedir (defaults: /usr/lib/jvm for Debian; /usr/java for RedHat): +```puppet +java::adopt { 'jdk8' : + ensure => 'present', + version_major => '8u202', + version_minor => 'b08', + java => 'jdk', + basedir => '/custom/java', +} +``` + +To ensure that a custom basedir is a directory before AdoptOpenJDK Java is installed (note: manage separately for custom ownership or perms): +```puppet +java::adopt { 'jdk8' : + ensure => 'present', + version_major => '8u202', + version_minor => 'b08', + java => 'jdk', + manage_basedir => true, + basedir => '/custom/java', +} +``` + ## Reference For information on the classes and types, see the [REFERENCE.md](https://github.com/puppetlabs/puppetlabs-java/blob/master/REFERENCE.md). For information on the facts, see below. @@ -104,6 +154,13 @@ Oracle Java is supported on: * CentOS 7 * Red Hat Enterprise Linux (RHEL) 7 +AdoptOpenJDK Java is supported on: + +* CentOS +* Red Hat Enterprise Linux (RHEL) +* Amazon Linux +* Debian + ### Known issues Where Oracle change the format of the URLs to different installer packages, the curl to fetch the package may fail with a HTTP/404 error. In this case, passing a full known good URL using the `url` parameter will allow the module to still be able to install specific versions of the JRE/JDK. Note the `version_major` and `version_minor` parameters must be passed and must match the version downloaded using the known URL in the `url` parameter. diff --git a/lib/facter/java_libjvm_path.rb b/lib/facter/java_libjvm_path.rb index 95ae61a..7ae549f 100644 --- a/lib/facter/java_libjvm_path.rb +++ b/lib/facter/java_libjvm_path.rb @@ -7,6 +7,7 @@ # # Caveats: # Needs to list files recursively. Returns the first match +# Needs working java_major_version fact # # Notes: # None @@ -14,13 +15,18 @@ Facter.add(:java_libjvm_path) do confine kernel: ['Linux', 'OpenBSD'] setcode do java_default_home = Facter.value(:java_default_home) - if java_default_home - java_libjvm_file = Dir.glob("#{java_default_home}/**/lib/**/libjvm.so") - end - if java_libjvm_file.nil? || java_libjvm_file.empty? - nil - else - File.dirname(java_libjvm_file[0]) + java_major_version = Facter.value(:java_major_version) + unless java_major_version.nil? + java_libjvm_file = if java_major_version.to_i >= 11 + Dir.glob("#{java_default_home}/lib/**/libjvm.so") + else + Dir.glob("#{java_default_home}/jre/lib/**/libjvm.so") + end + if java_libjvm_file.nil? || java_libjvm_file.empty? + nil + else + File.dirname(java_libjvm_file[0]) + end end end end diff --git a/lib/facter/java_major_version.rb b/lib/facter/java_major_version.rb index 3c3c99f..3afd994 100644 --- a/lib/facter/java_major_version.rb +++ b/lib/facter/java_major_version.rb @@ -17,12 +17,10 @@ Facter.add(:java_major_version) do setcode do java_version = Facter.value(:java_version) unless java_version.nil? - # First part > 1, use the first part as major version - java_version_first_number = java_version.strip.split('.')[0] - java_major_version = if java_version_first_number.to_i > 1 - java_version_first_number - else + java_major_version = if java_version.strip[0..1] == '1.' java_version.strip.split('_')[0].split('.')[1] + else + java_version.strip.split('.')[0] end end end diff --git a/lib/facter/java_patch_level.rb b/lib/facter/java_patch_level.rb index d3acded..2722d0b 100644 --- a/lib/facter/java_patch_level.rb +++ b/lib/facter/java_patch_level.rb @@ -3,7 +3,7 @@ # Purpose: get Java's patch level # # Resolution: -# Uses java_version fact splits on the patch number (after _) +# Uses java_version fact splits on the patch number (after _ for 1.x and patch number for semver'ed javas) # # Caveats: # none @@ -15,13 +15,11 @@ Facter.add(:java_patch_level) do setcode do java_version = Facter.value(:java_version) unless java_version.nil? - # First part > 1, use . as seperator to get patch level - java_version_first_number = java_version.strip.split('.')[0] - java_patch_level = if java_version_first_number.to_i > 1 - java_version.strip.split('.')[2] - else - java_version.strip.split('_')[1] - end + if java_version.strip[0..1] == '1.' + java_patch_level = java_version.strip.split('_')[1] unless java_version.nil? + else + java_patch_level = java_version.strip.split('.')[2] unless java_version.nil? + end end end java_patch_level diff --git a/lib/facter/java_version.rb b/lib/facter/java_version.rb index c5b92d8..6de4bb4 100644 --- a/lib/facter/java_version.rb +++ b/lib/facter/java_version.rb @@ -4,7 +4,7 @@ # # Resolution: # Tests for presence of java, returns nil if not present -# returns output of "java -version" and splits on \n + '"' +# returns output of "java -version" and splits on '"' # # Caveats: # none @@ -24,8 +24,7 @@ Facter.add(:java_version) do unless ['darwin'].include? Facter.value(:operatingsystem).downcase version = nil if Facter::Util::Resolution.which('java') - Facter::Util::Resolution.exec('java -Xmx12m -version 2>&1').lines.each { |line| version = $LAST_MATCH_INFO[1] if %r{^.+ version \"(.+)\".*$} =~ line } - + Facter::Util::Resolution.exec('java -Xmx12m -version 2>&1').lines.each { |line| version = Regexp.last_match(1) if %r{^.+ version \"(.+)\"} =~ line } end version end @@ -38,7 +37,7 @@ Facter.add(:java_version) do setcode do unless %r{Unable to find any JVMs matching version} =~ Facter::Util::Resolution.exec('/usr/libexec/java_home --failfast 2>&1') version = nil - Facter::Util::Resolution.exec('java -Xmx12m -version 2>&1').lines.each { |line| version = $LAST_MATCH_INFO[1] if %r{^.+ version \"(.+)\"$} =~ line } + Facter::Util::Resolution.exec('java -Xmx12m -version 2>&1').lines.each { |line| version = Regexp.last_match(1) if %r{^.+ version \"(.+)\"} =~ line } version end end diff --git a/manifests/adopt.pp b/manifests/adopt.pp new file mode 100644 index 0000000..5931ecc --- /dev/null +++ b/manifests/adopt.pp @@ -0,0 +1,371 @@ +# Defined Type java::adopt +# +# Description +# Installs OpenJDK Java built with AdoptOpenJDK with the Hotspot JVM. +# +# Install one or more versions of AdoptOpenJDK Java. +# +# Currently only Linux RedHat, Amazon and Debian are supported. +# +# Parameters +# [*version*] +# Version of Java to install, e.g. '8' or '9'. Default values for major and minor +# versions will be used. +# +# [*version_major*] +# Major version which should be installed, e.g. '8u101' or '9.0.4'. Must be used together with +# version_minor. +# +# [*version_minor*] +# Minor version which should be installed, e.g. 'b12' (for version = '8') or '11' (for version != '8'). +# Must be used together with version_major. +# +# [*java_edition*] +# Type of Java Edition to install, jdk or jre. +# +# [*ensure*] +# Install or remove the package. +# +# [*proxy_server*] +# Specify a proxy server, with port number if needed. ie: https://example.com:8080. (passed to archive) +# +# [*proxy_type*] +# Proxy server type (none|http|https|ftp). (passed to archive) +# +# [*basedir*] +# Directory under which the installation will occur. If not set, defaults to +# /usr/lib/jvm for Debian and /usr/java for RedHat. +# +# [*manage_basedir*] +# Whether to manage the basedir directory. Defaults to false. +# Note: /usr/lib/jvm is managed for Debian by default, separate from this parameter. +# +# [*package_type*] +# Type of installation package for specified version of java. java 6 comes +# in a few installation package flavors and we need to account for them. +# Optional forced package types: rpm, rpmbin, tar.gz +# +# Variables +# [*release_major*] +# Major version release number for java. Used to construct download URL. +# +# [*release_minor*] +# Minor version release number for java. Used to construct download URL. +# +# [*install_path*] +# Base install path for specified version of java. Used to determine if java +# has already been installed. +# +# [*os*] +# java OS type. +# +# [*destination*] +# Destination directory to save java installer to. Usually /tmp on Linux and +# C:\TEMP on Windows. +# +# [*creates_path*] +# Fully qualified path to java after it is installed. Used to determine if +# java is already installed. +# +# [*arch*] +# java architecture type. +# +# [*package_name*] +# Name of the java installation package to download from github. +# +# [*install_command*] +# Installation command used to install java. Installation commands +# differ by package_type. 'bin' types are installed via shell command. 'rpmbin' +# types have the rpms extracted and then forcibly installed. 'rpm' types are +# forcibly installed. +# +# [*spacer*] +# Spacer to be used in github download url. In major version 8 this is a simple dash +# in later versions they use a crazy plus sign, which needs to be used in urlencoded +# format +# +# [*download_folder_prefix*] +# Download folder name begins differently depending on the release. After major release +# 8, they have given it a dash. Be aware that even if you want to have a JRE, the folder +# still begins with "jdk" +# +# [*release_minor_url*] +# filled depending on major release. Until major release 8 the minor part needs to be given +# with a 'b' for build, in later versions it is a underscore or a plus sign, which needs +# to be stripped for the download url and is replaced with the given spaces (see above) +# +# [*_package_type*] +# Helper variable which gets filled depending on parameter package_type +# +# [*_basedir*] +# Helper variable which gets filled depending on parameter basedir +# +# [*_version*] +# Helper variable which gets filled depending on parameter version +# +# [*_version_int*] +# Helper variable which gets the value of $_version converted to integer +# +# [*_append_jre*] +# Helper variable which gets filled with the string "-jre" if jre was selected to build the correct install path +# +# [*_release_minor_package_name*] +# Helper variable which gets filled with the right minor string depending on the major version +# +define java::adopt ( + $ensure = 'present', + $version = '8', + $version_major = undef, + $version_minor = undef, + $java = 'jdk', + $proxy_server = undef, + $proxy_type = undef, + $basedir = undef, + $manage_basedir = true, + $package_type = undef, +) { + + # archive module is used to download the java package + include ::archive + + # validate java Standard Edition to download + if $java !~ /(jre|jdk)/ { + fail('java must be either jre or jdk.') + } + + # determine AdoptOpenJDK Java major and minor version, and installation path + if $version_major and $version_minor { + + $release_major = $version_major + $release_minor = $version_minor + + if ( $version_major[0] == '8' or $version_major[0] == '9' ) { + $_version = $version_major[0] + } else { + $_version = $version_major[0,2] + } + + $_version_int = Numeric($_version) + + if ( $java == 'jre' ) { + $_append_jre = '-jre' + } else { + $_append_jre = '' + } + + # extracted folders look like this: + # jdk8u202-b08 + # jdk-9.0.4+11 + # jdk-10.0.2+13 + # jdk-11.0.2+9 + # jdk-12.0.1+12 + # jdk8u202-b08-jre + # jdk-9.0.4+11-jre + # hence we need to check for the major version and build the install path according to it + if ( $_version_int == 8 ) { + $install_path = "jdk${release_major}-${release_minor}${_append_jre}" + } elsif ( $_version_int > 8 ) { + $install_path = "jdk-${release_major}+${release_minor}${_append_jre}" + } else { + fail ("unsupported version ${_version}") + } + + } else { + $_version = $version + $_version_int = Numeric($_version) + # use default versions if no specific major and minor version parameters are provided + case $version { + '8' : { + $release_major = '8u202' + $release_minor = 'b08' + $install_path = "${java}8u202-b08" + } + '9' : { + $release_major = '9.0.4' + $release_minor = '11' + $install_path = "${java}-9.0.4+11" + } + # minor release is given with +, however package etc. works with underscore, so we use underscore here + '10' : { + $release_major = '10.0.2' + $release_minor = '13' + $install_path = "${java}-10.0.2+13" + } + '11' : { + $release_major = '11.0.2' + $release_minor = '9' + $install_path = "${java}-11.0.2+9" + } + # minor release is given with +, however package etc. works with underscore, so we use underscore here + '12' : { + $release_major = '12.0.1' + $release_minor = '12' + $install_path = "${java}-12.0.1+12" + } + default : { + $release_major = '8u202' + $release_minor = 'b08' + $install_path = "${java}8u202-b08" + } + } + } + + # determine package type (exe/tar/rpm), destination directory based on OS + case $facts['kernel'] { + 'Linux' : { + case $facts['os']['family'] { + 'RedHat', 'Amazon' : { + if $package_type { + $_package_type = $package_type + } else { + $_package_type = 'tar.gz' + } + if $basedir { + $_basedir = $basedir + } else { + $_basedir = '/usr/java' + } + } + 'Debian' : { + if $package_type { + $_package_type = $package_type + } else { + $_package_type = 'tar.gz' + } + if $basedir { + $_basedir = $basedir + } else { + $_basedir = '/usr/lib/jvm' + } + } + default : { + fail ("unsupported platform ${$facts['os']['name']}") } + } + + $creates_path = "${_basedir}/${install_path}" + $os = 'linux' + $destination_dir = '/tmp/' + } + default : { + fail ( "unsupported platform ${$facts['kernel']}" ) } + } + + # set java architecture nomenclature + $os_architecture = $facts['os']['architecture'] ? { + undef => $facts['architecture'], + default => $facts['os']['architecture'] + } + + case $os_architecture { + 'i386' : { $arch = 'x86-32' } + 'x86_64' : { $arch = 'x64' } + 'amd64' : { $arch = 'x64' } + default : { + fail ("unsupported platform ${$os_architecture}") + } + } + + # package name and path for download from github + # + # following are build based on this real life example full URLs: + # + # https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u202-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz + # https://github.com/AdoptOpenJDK/openjdk9-binaries/releases/download/jdk-9.0.4%2B11/OpenJDK9U-jdk_x64_linux_hotspot_9.0.4_11.tar.gz + # https://github.com/AdoptOpenJDK/openjdk10-binaries/releases/download/jdk-10.0.2%2B13/OpenJDK10U-jdk_x64_linux_hotspot_10.0.2_13.tar.gz + # https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.2%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_9.tar.gz + # https://github.com/AdoptOpenJDK/openjdk12-binaries/releases/download/jdk-12.0.1%2B12/OpenJDK12U-jdk_x64_linux_hotspot_12.0.1_12.tar.gz + # jre just replaces jdk with jre in the archive name, but not in the path name! + # https://github.com/AdoptOpenJDK/openjdk9-binaries/releases/download/jdk-9.0.4%2B11/OpenJDK9U-jre_x64_linux_hotspot_9.0.4_11.tar.gz + + if ( $_version_int == 8 ) { + $_release_minor_package_name = $release_minor + } else { + $_release_minor_package_name = "_${release_minor}" + } + + case $_package_type { + 'tar.gz': { + $package_name = "OpenJDK${_version}U-${java}_${arch}_${os}_hotspot_${release_major}${_release_minor_package_name}.tar.gz" + } + default: { + $package_name = "OpenJDK${_version}U-${java}_${arch}_${os}_hotspot_${release_major}${_release_minor_package_name}.tar.gz" + } + } + + # naming convention changed after major version 8, setting variables to consider that + # download_folder_prefix always begins with "jdk", even for jre! see comments for package_name above + if ( $_version_int == 8 ) { + $spacer = '-' + $download_folder_prefix = 'jdk' + } else { + $spacer = '%2B' + $download_folder_prefix = 'jdk-' + } + $source = "https://github.com/AdoptOpenJDK/openjdk${_version}-binaries/releases/download/${download_folder_prefix}${release_major}${spacer}${release_minor}/${package_name}" + + # full path to the installer + $destination = "${destination_dir}${package_name}" + notice ("Destination is ${destination}") + + case $_package_type { + 'tar.gz' : { + $install_command = "tar -zxf ${destination} -C ${_basedir}" + } + default : { + $install_command = "tar -zxf ${destination} -C ${_basedir}" + } + } + + case $ensure { + 'present' : { + archive { $destination : + ensure => present, + source => $source, + extract_path => '/tmp', + cleanup => false, + creates => $creates_path, + proxy_server => $proxy_server, + proxy_type => $proxy_type, + } + case $facts['kernel'] { + 'Linux' : { + case $facts['os']['family'] { + 'Debian' : { + ensure_resource('file', $_basedir, { + ensure => directory, + }) + $install_requires = [Archive[$destination], File[$_basedir]] + } + default : { + $install_requires = [Archive[$destination]] + } + } + + if $manage_basedir { + if (!defined(File[$_basedir])) { + file { $_basedir: + ensure => 'directory', + before => Exec["Install AdoptOpenJDK java ${java} ${_version} ${release_major} ${release_minor}"], + } + } + } + + exec { "Install AdoptOpenJDK java ${java} ${_version} ${release_major} ${release_minor}" : + path => '/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin', + command => $install_command, + creates => $creates_path, + require => $install_requires + } + + } + default : { + fail ("unsupported platform ${$facts['kernel']}") + } + } + } + default : { + notice ("Action ${ensure} not supported.") + } + } + +} diff --git a/spec/acceptance/install_spec.rb b/spec/acceptance/install_spec.rb index 9fddc8c..2ea2885 100644 --- a/spec/acceptance/install_spec.rb +++ b/spec/acceptance/install_spec.rb @@ -1,4 +1,5 @@ require 'spec_helper_acceptance' +require 'pry' java_class_jre = "class { 'java':\n"\ " distribution => 'jre',\n"\ @@ -41,6 +42,102 @@ bogus_alternative = "class { 'java':\n"\ " java_alternative_path => '/whatever',\n"\ '}' +# Oracle installs are disabled by default, because the links to valid oracle installations +# change often. Look the parameters up from the Oracle download URLs at https://java.oracle.com and +# enable the tests: + +oracle_enabled = false +oracle_version_major = '8' +oracle_version_minor = '201' +oracle_version_build = '09' +oracle_hash = '42970487e3af4f5aa5bca3f542482c60' + +install_oracle_jdk_jre = < '#{oracle_version_major}', + version_major => '#{oracle_version_major}u#{oracle_version_minor}', + version_minor => 'b#{oracle_version_build}', + url_hash => '#{oracle_hash}', + java_se => 'jre', + } + java::oracle { + 'test_oracle_jdk': + version => '#{oracle_version_major}', + version_major => '#{oracle_version_major}u#{oracle_version_minor}', + version_minor => 'b#{oracle_version_build}', + url_hash => '#{oracle_hash}', + java_se => 'jdk', + } +EOL + +install_oracle_jre_jce = < '#{oracle_version_major}', + version_major => '#{oracle_version_major}u#{oracle_version_minor}', + version_minor => 'b#{oracle_version_build}', + url_hash => '#{oracle_hash}', + java_se => 'jre', + jce => true, + } + +EOL + +install_oracle_jdk_jce = < '#{oracle_version_major}', + version_major => '#{oracle_version_major}u#{oracle_version_minor}', + version_minor => 'b#{oracle_version_build}', + url_hash => '#{oracle_hash}', + java_se => 'jdk', + jce => true, + } +EOL + +# AdoptOpenJDK URLs are quite generic, so tests are enabled by default +# We need to test version 8 and >8 (here we use 9), because namings are different after version 8 + +adopt_enabled = true +adopt_version8_major = '8' +adopt_version8_minor = '202' +adopt_version8_build = '08' +adopt_version9_major = '9' +adopt_version9_full = '9.0.4' +adopt_version9_build = '11' + +install_adopt_jdk_jre = < '#{adopt_version8_major}', + version_major => '#{adopt_version8_major}u#{adopt_version8_minor}', + version_minor => 'b#{adopt_version8_build}', + java => 'jre', + } + java::adopt { + 'test_adopt_jdk_version8': + version => '#{adopt_version8_major}', + version_major => '#{adopt_version8_major}u#{adopt_version8_minor}', + version_minor => 'b#{adopt_version8_build}', + java => 'jdk', + } + java::adopt { + 'test_adopt_jre_version9': + version => '#{adopt_version9_major}', + version_major => '#{adopt_version9_full}', + version_minor => '#{adopt_version9_build}', + java => 'jre', + } + java::adopt { + 'test_adopt_jdk_version9': + version => '#{adopt_version9_major}', + version_major => '#{adopt_version9_full}', + version_minor => '#{adopt_version9_build}', + java => 'jdk', + } +EOL + context 'installing java jre', unless: UNSUPPORTED_PLATFORMS.include?(os[:family]) do it 'installs jre' do idempotent_apply(java_class_jre) @@ -78,3 +175,47 @@ context 'with failure cases' do end end end + +context 'java::oracle', if: oracle_enabled, unless: UNSUPPORTED_PLATFORMS.include?(os[:family]) do + let(:install_path) do + (os[:family] == 'redhat') ? '/usr/java' : '/usr/lib/jvm' + end + + let(:version_suffix) do + (os[:family] == 'redhat') ? '-amd64' : '' + end + + it 'installs oracle jdk and jre' do + idempotent_apply(install_oracle_jdk_jre) + jdk_result = shell("test ! -e #{install_path}/jdk1.#{oracle_version_major}.0_#{oracle_version_minor}#{version_suffix}/jre/lib/security/local_policy.jar") + jre_result = shell("test ! -e #{install_path}/jre1.#{oracle_version_major}.0_#{oracle_version_minor}#{version_suffix}/lib/security/local_policy.jar") + expect(jdk_result.exit_code).to eq(0) + expect(jre_result.exit_code).to eq(0) + end + + it 'installs oracle jdk with jce' do + idempotent_apply(install_oracle_jdk_jce) + result = shell("test -e #{install_path}/jdk1.#{oracle_version_major}.0_#{oracle_version_minor}#{version_suffix}/jre/lib/security/local_policy.jar") + expect(result.exit_code).to eq(0) + end + + it 'installs oracle jre with jce' do + idempotent_apply(install_oracle_jre_jce) + result = shell("test -e #{install_path}/jre1.#{oracle_version_major}.0_#{oracle_version_minor}#{version_suffix}/lib/security/local_policy.jar") + expect(result.exit_code).to eq(0) + end +end + +context 'java::adopt', if: adopt_enabled, unless: UNSUPPORTED_PLATFORMS.include?(os[:family]) do + let(:install_path) do + (os[:family] == 'redhat') ? '/usr/java' : '/usr/lib/jvm' + end + + let(:version_suffix) do + (os[:family] == 'redhat') ? '-amd64' : '' + end + + it 'installs adopt jdk and jre' do + idempotent_apply(install_adopt_jdk_jre) + end +end diff --git a/spec/defines/adopt_spec.rb b/spec/defines/adopt_spec.rb new file mode 100644 index 0000000..4cb01d3 --- /dev/null +++ b/spec/defines/adopt_spec.rb @@ -0,0 +1,335 @@ +require 'spec_helper' + +describe 'java::adopt', type: :define do + context 'with CentOS 64-bit' do + let(:facts) { { kernel: 'Linux', os: { family: 'RedHat', architecture: 'x86_64', name: 'CentOS', release: { full: '6.0' } } } } + + context 'when AdoptOpenJDK Java 8 JDK' do + let(:params) { { ensure: 'present', version: '8', java: 'jdk' } } + let(:title) { 'jdk8' } + + it { is_expected.to contain_archive('/tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 8 8u202 b08').with_command('tar -zxf /tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 8 8u202 b08').that_requires('Archive[/tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 9 JDK' do + let(:params) { { ensure: 'present', version: '9', java: 'jdk' } } + let(:title) { 'jdk9' } + + it { is_expected.to contain_archive('/tmp/OpenJDK9U-jdk_x64_linux_hotspot_9.0.4_11.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 9 9.0.4 11').with_command('tar -zxf /tmp/OpenJDK9U-jdk_x64_linux_hotspot_9.0.4_11.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 9 9.0.4 11').that_requires('Archive[/tmp/OpenJDK9U-jdk_x64_linux_hotspot_9.0.4_11.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 10 JDK' do + let(:params) { { ensure: 'present', version: '10', java: 'jdk' } } + let(:title) { 'jdk10' } + + it { is_expected.to contain_archive('/tmp/OpenJDK10U-jdk_x64_linux_hotspot_10.0.2_13.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 10 10.0.2 13').with_command('tar -zxf /tmp/OpenJDK10U-jdk_x64_linux_hotspot_10.0.2_13.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 10 10.0.2 13').that_requires('Archive[/tmp/OpenJDK10U-jdk_x64_linux_hotspot_10.0.2_13.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 11 JDK' do + let(:params) { { ensure: 'present', version: '11', java: 'jdk' } } + let(:title) { 'jdk11' } + + it { is_expected.to contain_archive('/tmp/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_9.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 11 11.0.2 9').with_command('tar -zxf /tmp/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_9.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 11 11.0.2 9').that_requires('Archive[/tmp/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_9.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 12 JDK' do + let(:params) { { ensure: 'present', version: '12', java: 'jdk' } } + let(:title) { 'jdk12' } + + it { is_expected.to contain_archive('/tmp/OpenJDK12U-jdk_x64_linux_hotspot_12.0.1_12.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 12 12.0.1 12').with_command('tar -zxf /tmp/OpenJDK12U-jdk_x64_linux_hotspot_12.0.1_12.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 12 12.0.1 12').that_requires('Archive[/tmp/OpenJDK12U-jdk_x64_linux_hotspot_12.0.1_12.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 8 JRE' do + let(:params) { { ensure: 'present', version: '8', java: 'jre' } } + let(:title) { 'jre8' } + + it { is_expected.to contain_archive('/tmp/OpenJDK8U-jre_x64_linux_hotspot_8u202b08.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 8 8u202 b08').with_command('tar -zxf /tmp/OpenJDK8U-jre_x64_linux_hotspot_8u202b08.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 8 8u202 b08').that_requires('Archive[/tmp/OpenJDK8U-jre_x64_linux_hotspot_8u202b08.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 9 JRE' do + let(:params) { { ensure: 'present', version: '9', java: 'jre' } } + let(:title) { 'jre9' } + + it { is_expected.to contain_archive('/tmp/OpenJDK9U-jre_x64_linux_hotspot_9.0.4_11.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 9 9.0.4 11').with_command('tar -zxf /tmp/OpenJDK9U-jre_x64_linux_hotspot_9.0.4_11.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 9 9.0.4 11').that_requires('Archive[/tmp/OpenJDK9U-jre_x64_linux_hotspot_9.0.4_11.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 10 JRE' do + let(:params) { { ensure: 'present', version: '10', java: 'jre' } } + let(:title) { 'jre11' } + + it { is_expected.to contain_archive('/tmp/OpenJDK10U-jre_x64_linux_hotspot_10.0.2_13.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 10 10.0.2 13').with_command('tar -zxf /tmp/OpenJDK10U-jre_x64_linux_hotspot_10.0.2_13.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 10 10.0.2 13').that_requires('Archive[/tmp/OpenJDK10U-jre_x64_linux_hotspot_10.0.2_13.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 11 JRE' do + let(:params) { { ensure: 'present', version: '11', java: 'jre' } } + let(:title) { 'jre11' } + + it { is_expected.to contain_archive('/tmp/OpenJDK11U-jre_x64_linux_hotspot_11.0.2_9.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 11 11.0.2 9').with_command('tar -zxf /tmp/OpenJDK11U-jre_x64_linux_hotspot_11.0.2_9.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 11 11.0.2 9').that_requires('Archive[/tmp/OpenJDK11U-jre_x64_linux_hotspot_11.0.2_9.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 12 JRE' do + let(:params) { { ensure: 'present', version: '12', java: 'jre' } } + let(:title) { 'jre12' } + + it { is_expected.to contain_archive('/tmp/OpenJDK12U-jre_x64_linux_hotspot_12.0.1_12.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 12 12.0.1 12').with_command('tar -zxf /tmp/OpenJDK12U-jre_x64_linux_hotspot_12.0.1_12.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 12 12.0.1 12').that_requires('Archive[/tmp/OpenJDK12U-jre_x64_linux_hotspot_12.0.1_12.tar.gz]') } + end + + context 'when installing multiple versions' do + let(:params) do + { + ensure: 'present', + version_major: '8u202', + version_minor: 'b08', + java: 'jdk', + } + end + let(:title) { 'jdk8' } + + let(:pre_condition) do + <<-EOL + java::adopt { + 'jdk8172': + ensure => 'present', + version_major => '8u172', + version_minor => 'b11', + java => 'jdk', + } + EOL + end + + it { is_expected.to compile } + end + + context 'when specifying package_type tar.gz and basedir' do + let(:params) do + { + ensure: 'present', + version: '8', + java: 'jdk', + basedir: '/usr/java', + package_type: 'tar.gz', + } + end + let(:title) { 'jdk8' } + + it { is_expected.to contain_archive('/tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 8 8u202 b08').with_command('tar -zxf /tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz -C /usr/java') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 8 8u202 b08').that_requires('Archive[/tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz]') } + end + context 'when manage_basedir is set to true' do + let(:params) do + { + ensure: 'present', + version: '8', + java: 'jdk', + basedir: '/usr/java', + manage_basedir: true, + } + end + let(:title) { 'jdk8' } + + it { is_expected.to contain_file('/usr/java') } + end + end + + context 'with Ubuntu 64-bit' do + let(:facts) { { kernel: 'Linux', os: { family: 'Debian', architecture: 'amd64', name: 'Ubuntu', release: { full: '16.04' } } } } + + context 'when AdoptOpenJDK Java 8 JDK' do + let(:params) { { ensure: 'present', version: '8', java: 'jdk' } } + let(:title) { 'jdk8' } + + it { is_expected.to contain_archive('/tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 8 8u202 b08').with_command('tar -zxf /tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 8 8u202 b08').that_requires('Archive[/tmp/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 9 JDK' do + let(:params) { { ensure: 'present', version: '9', java: 'jdk' } } + let(:title) { 'jdk9' } + + it { is_expected.to contain_archive('/tmp/OpenJDK9U-jdk_x64_linux_hotspot_9.0.4_11.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 9 9.0.4 11').with_command('tar -zxf /tmp/OpenJDK9U-jdk_x64_linux_hotspot_9.0.4_11.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 9 9.0.4 11').that_requires('Archive[/tmp/OpenJDK9U-jdk_x64_linux_hotspot_9.0.4_11.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 10 JDK' do + let(:params) { { ensure: 'present', version: '10', java: 'jdk' } } + let(:title) { 'jdk10' } + + it { is_expected.to contain_archive('/tmp/OpenJDK10U-jdk_x64_linux_hotspot_10.0.2_13.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 10 10.0.2 13').with_command('tar -zxf /tmp/OpenJDK10U-jdk_x64_linux_hotspot_10.0.2_13.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 10 10.0.2 13').that_requires('Archive[/tmp/OpenJDK10U-jdk_x64_linux_hotspot_10.0.2_13.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 11 JDK' do + let(:params) { { ensure: 'present', version: '11', java: 'jdk' } } + let(:title) { 'jdk11' } + + it { is_expected.to contain_archive('/tmp/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_9.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 11 11.0.2 9').with_command('tar -zxf /tmp/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_9.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 11 11.0.2 9').that_requires('Archive[/tmp/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_9.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 12 JDK' do + let(:params) { { ensure: 'present', version: '12', java: 'jdk' } } + let(:title) { 'jdk12' } + + it { is_expected.to contain_archive('/tmp/OpenJDK12U-jdk_x64_linux_hotspot_12.0.1_12.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 12 12.0.1 12').with_command('tar -zxf /tmp/OpenJDK12U-jdk_x64_linux_hotspot_12.0.1_12.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jdk 12 12.0.1 12').that_requires('Archive[/tmp/OpenJDK12U-jdk_x64_linux_hotspot_12.0.1_12.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 8 JRE' do + let(:params) { { ensure: 'present', version: '8', java: 'jre' } } + let(:title) { 'jre8' } + + it { is_expected.to contain_archive('/tmp/OpenJDK8U-jre_x64_linux_hotspot_8u202b08.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 8 8u202 b08').with_command('tar -zxf /tmp/OpenJDK8U-jre_x64_linux_hotspot_8u202b08.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 8 8u202 b08').that_requires('Archive[/tmp/OpenJDK8U-jre_x64_linux_hotspot_8u202b08.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 9 JRE' do + let(:params) { { ensure: 'present', version: '9', java: 'jre' } } + let(:title) { 'jre9' } + + it { is_expected.to contain_archive('/tmp/OpenJDK9U-jre_x64_linux_hotspot_9.0.4_11.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 9 9.0.4 11').with_command('tar -zxf /tmp/OpenJDK9U-jre_x64_linux_hotspot_9.0.4_11.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 9 9.0.4 11').that_requires('Archive[/tmp/OpenJDK9U-jre_x64_linux_hotspot_9.0.4_11.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 10 JRE' do + let(:params) { { ensure: 'present', version: '10', java: 'jre' } } + let(:title) { 'jre11' } + + it { is_expected.to contain_archive('/tmp/OpenJDK10U-jre_x64_linux_hotspot_10.0.2_13.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 10 10.0.2 13').with_command('tar -zxf /tmp/OpenJDK10U-jre_x64_linux_hotspot_10.0.2_13.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 10 10.0.2 13').that_requires('Archive[/tmp/OpenJDK10U-jre_x64_linux_hotspot_10.0.2_13.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 11 JRE' do + let(:params) { { ensure: 'present', version: '11', java: 'jre' } } + let(:title) { 'jre11' } + + it { is_expected.to contain_archive('/tmp/OpenJDK11U-jre_x64_linux_hotspot_11.0.2_9.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 11 11.0.2 9').with_command('tar -zxf /tmp/OpenJDK11U-jre_x64_linux_hotspot_11.0.2_9.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 11 11.0.2 9').that_requires('Archive[/tmp/OpenJDK11U-jre_x64_linux_hotspot_11.0.2_9.tar.gz]') } + end + + context 'when AdoptOpenJDK Java 12 JRE' do + let(:params) { { ensure: 'present', version: '12', java: 'jre' } } + let(:title) { 'jre12' } + + it { is_expected.to contain_archive('/tmp/OpenJDK12U-jre_x64_linux_hotspot_12.0.1_12.tar.gz') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 12 12.0.1 12').with_command('tar -zxf /tmp/OpenJDK12U-jre_x64_linux_hotspot_12.0.1_12.tar.gz -C /usr/lib/jvm') } + it { is_expected.to contain_exec('Install AdoptOpenJDK java jre 12 12.0.1 12').that_requires('Archive[/tmp/OpenJDK12U-jre_x64_linux_hotspot_12.0.1_12.tar.gz]') } + end + + context 'when installing multiple versions' do + let(:params) do + { + ensure: 'present', + version_major: '8u202', + version_minor: 'b08', + java: 'jdk', + } + end + let(:title) { 'jdk8' } + + let(:pre_condition) do + <<-EOL + java::adopt { + 'jdk8172': + ensure => 'present', + version_major => '8u172', + version_minor => 'b11', + java => 'jdk', + } + EOL + end + + it { is_expected.to compile } + end + end + describe 'incompatible OSes' do + [ + { + kernel: 'Windows', + os: { + family: 'Windows', + name: 'Windows', + release: { + full: '8.1', + }, + }, + }, + { + kernel: 'Darwin', + os: { + family: 'Darwin', + name: 'Darwin', + release: { + full: '13.3.0', + }, + }, + }, + { + kernel: 'AIX', + os: { + family: 'AIX', + name: 'AIX', + release: { + full: '7100-02-00-000', + }, + }, + }, + { + kernel: 'AIX', + os: { + family: 'AIX', + name: 'AIX', + release: { + full: '6100-07-04-1216', + }, + }, + }, + { + kernel: 'AIX', + os: { + family: 'AIX', + name: 'AIX', + release: { + full: '5300-12-01-1016', + }, + }, + }, + ].each do |facts| + let(:facts) { facts } + let(:title) { 'jdk' } + + it "is_expected.to fail on #{facts[:os][:name]} #{facts[:os][:release][:full]}" do + expect { catalogue }.to raise_error Puppet::Error, %r{unsupported platform} + end + end + end +end diff --git a/spec/unit/facter/java_libjvm_path_spec.rb b/spec/unit/facter/java_libjvm_path_spec.rb index 1b1a2e2..3efcb47 100644 --- a/spec/unit/facter/java_libjvm_path_spec.rb +++ b/spec/unit/facter/java_libjvm_path_spec.rb @@ -5,20 +5,21 @@ describe 'java_libjvm_path' do before(:each) do Facter.clear - allow(Facter.fact(:kernel)).to receive(:value).once.and_return('Linux') - allow(Facter.fact(:java_default_home)).to receive(:value).once.and_return(java_default_home) + allow(Facter.fact(:kernel)).to receive(:value).and_return('Linux') + allow(Facter.fact(:java_default_home)).to receive(:value).and_return(java_default_home) end context 'when libjvm exists' do it do - allow(Dir).to receive(:glob).with("#{java_default_home}/**/lib/**/libjvm.so").and_return(['/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so']) + allow(Facter.fact(:java_major_version)).to receive(:value).and_return(8) + allow(Dir).to receive(:glob).with("#{java_default_home}/jre/lib/**/libjvm.so").and_return(['/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so']) expect(Facter.value(:java_libjvm_path)).to eql '/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server' end end context 'when libjvm does not exist' do it do - allow(Dir).to receive(:glob).with("#{java_default_home}/**/lib/**/libjvm.so").and_return([]) + allow(Dir).to receive(:glob).with("#{java_default_home}/lib/**/libjvm.so").and_return([]) expect(Facter.value(:java_libjvm_path)).to be nil end end diff --git a/spec/unit/facter/java_major_version_spec.rb b/spec/unit/facter/java_major_version_spec.rb index b9ead12..3b50e00 100644 --- a/spec/unit/facter/java_major_version_spec.rb +++ b/spec/unit/facter/java_major_version_spec.rb @@ -16,7 +16,7 @@ describe 'java_major_version' do context 'when java not present, returns nil' do before :each do - allow(Facter.fact(:java_version)).to receive(:value).and_return('nil') + allow(Facter.fact(:java_version)).to receive(:value).and_return(nil) end it do expect(Facter.fact(:java_major_version).value).to be_nil