diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 49cd4b5bb96..4125d1c3601 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -275,7 +275,7 @@ function filter_by_level(item) { } function show_release(element) { var os_family = $(element).val(); - if ($.inArray(os_family, ['Debian', 'Solaris', 'Coreos']) != -1) { + if ($.inArray(os_family, ['Debian', 'Solaris', 'Coreos', 'Fcos', 'Rhcos']) != -1) { $('#release_name').show(); } else { $('#release_name').hide(); diff --git a/app/helpers/operatingsystems_helper.rb b/app/helpers/operatingsystems_helper.rb index 7c926f1ab1e..1e5639ed816 100644 --- a/app/helpers/operatingsystems_helper.rb +++ b/app/helpers/operatingsystems_helper.rb @@ -13,8 +13,10 @@ def icon(record, opts = {}) return "" if record.blank? || record.name.blank? size = opts[:size] ||= '16x16' name = case record.name.downcase - when /fedora/ + when /fedora|fcos|coreos/i "fedora" + when /redhat|rhcos/i + "redhat" when /ubuntu/ "ubuntu" when /solaris|sunos/ @@ -45,7 +47,7 @@ def icon(record, opts = {}) "stub/firebrick-h" when /oraclelinux/ "stub/firebrick-o" - when /coreos|containerlinux|container linux/ + when /flatcar|containerlinux|container linux/ "coreos" when /flatcar/ "stub/darkblue-f" diff --git a/app/models/operatingsystem.rb b/app/models/operatingsystem.rb index 1198174e94f..5445d4c0bb8 100644 --- a/app/models/operatingsystem.rb +++ b/app/models/operatingsystem.rb @@ -23,7 +23,8 @@ class Operatingsystem < ApplicationRecord accepts_nested_attributes_for :os_default_templates, :allow_destroy => true, :reject_if => :reject_empty_provisioning_template - validates :major, :numericality => {:greater_than_or_equal_to => 0}, :presence => { :message => N_("Operating System version is required") } + validates :major, numericality: true, presence: { message: N_("Operating System version is required") } + validates :minor, format: { with: /\A\d+(\.\d+)*\z/, message: "Operating System minor version must be in N or N.N format" }, allow_blank: true has_many :os_parameters, :dependent => :destroy, :foreign_key => :reference_id, :inverse_of => :operatingsystem has_many :parameters, :dependent => :destroy, :foreign_key => :reference_id, :class_name => "OsParameter" accepts_nested_attributes_for :os_parameters, :allow_destroy => true @@ -32,7 +33,6 @@ class Operatingsystem < ApplicationRecord include ParameterSearch attr_name :to_label - validates :minor, :numericality => {:greater_than_or_equal_to => 0}, :allow_nil => true, :allow_blank => true validates :name, :presence => true, :no_whitespace => true, :uniqueness => { :scope => [:major, :minor], :message => N_("Operating system version already exists")} validates :description, :uniqueness => true, :allow_blank => true @@ -65,6 +65,8 @@ class Operatingsystem < ApplicationRecord 'Altlinux' => %r{Altlinux}i, 'Archlinux' => %r{Archlinux}i, 'Coreos' => %r{CoreOS|Flatcar}i, + 'Fcos' => %r{FCOS|FedoraCoreOS|FedoraCOS}i, + 'Rhcos' => %r{RHCOS|RedHatCoreOS|RedHatCOS}i, 'Rancheros' => %r{RancherOS}i, 'Gentoo' => %r{Gentoo}i, 'Solaris' => %r{Solaris}i, @@ -269,6 +271,21 @@ def use_release_name? false end + # Helper text shown next to major version (do not use i18n) + def major_version_help + '7' + end + + # Helper text shown next to minor version (do not use i18n) + def minor_version_help + 'e.g. 0 or 6.1810 (CentOS scheme)' + end + + # Helper text shown next to release name (do not use i18n) + def release_name_help + 'karmic, lucid, hw0910...' + end + def image_extension raise ::Foreman::Exception.new(N_("Attempting to construct an operating system image filename but %s cannot be built from an image"), family) end @@ -319,6 +336,7 @@ def pxe_file_names(medium_provider) def boot_file_sources(medium_provider, &block) @boot_file_sources ||= pxe_file_names(medium_provider).transform_values do |img| + img = medium_provider.interpolate_vars(img) "#{medium_provider.medium_uri(pxedir(medium_provider), &block)}/#{img}" end end @@ -348,7 +366,7 @@ def set_title end def stringify_major_and_minor - # Cast major and minor to strings. see db/schema.rb around lines 560-562 (Or https://github.com/theforeman/foreman/blob/develop/db/migrate/20090720134126_create_operatingsystems.rb#L4). + # Cast major and minor to strings. # Need to ensure type when using major and minor as scopes for name uniqueness. self.major = major.to_s self.minor = minor.to_s diff --git a/app/models/operatingsystems/coreos.rb b/app/models/operatingsystems/coreos.rb index 5f4ad0b8297..83a0c9859df 100644 --- a/app/models/operatingsystems/coreos.rb +++ b/app/models/operatingsystems/coreos.rb @@ -1,5 +1,17 @@ class Coreos < Operatingsystem - PXEFILES = {:kernel => 'coreos_production_pxe.vmlinuz', :initrd => 'coreos_production_pxe_image.cpio.gz'} + # + # Original CoreOS example PXE URLs: + # https://stable-temporary-archive.release.core-os.net/amd64-usr/2512.3.0/coreos_production_pxe.vmlinuz + # https://stable-temporary-archive.release.core-os.net/amd64-usr/2512.3.0/coreos_production_pxe_image.cpio.gz + # + # Flatcar example PXE URLs: + # https://stable.release.flatcar-linux.net/amd64-usr/current/flatcar_production_image.vmlinuz + # https://stable.release.flatcar-linux.net/amd64-usr/current/flatcar_production_pxe_image.cpio.gz + # + PXEFILES = { + kernel: 'coreos_production_pxe.vmlinuz', + initrd: 'coreos_production_pxe_image.cpio.gz', + } def pxe_type 'coreos' @@ -40,6 +52,21 @@ def use_release_name? true end + # Helper text shown next to major version (do not use i18n) + def major_version_help + '2512.3' + end + + # Helper text shown next to minor version (do not use i18n) + def minor_version_help + '0' + end + + # Helper text shown next to release name (do not use i18n) + def release_name_help + 'stable, beta, alpha, edge' + end + private # tries to guess if this a flatcar or original coreos container linux diff --git a/app/models/operatingsystems/debian.rb b/app/models/operatingsystems/debian.rb index c4f441cddf7..2c5fc9aa5b5 100644 --- a/app/models/operatingsystems/debian.rb +++ b/app/models/operatingsystems/debian.rb @@ -39,6 +39,11 @@ def use_release_name? true end + # Helper text shown next to release name (do not use i18n) + def release_name_help + 'bullseye, focal, buster, bionic, stretch, xenial...' + end + def display_family "Debian" end diff --git a/app/models/operatingsystems/fcos.rb b/app/models/operatingsystems/fcos.rb new file mode 100644 index 00000000000..8286f1b3428 --- /dev/null +++ b/app/models/operatingsystems/fcos.rb @@ -0,0 +1,47 @@ +class Fcos < Operatingsystem + # + # Example PXE URLs: + # https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/32.20200907.3.0/x86_64/fedora-coreos-32.20200907.3.0-live-kernel-x86_64 + # https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/32.20200907.3.0/x86_64/fedora-coreos-32.20200907.3.0-live-initramfs.x86_64.img + # + PXEFILES = { + kernel: 'fedora-coreos-$major.$minor-live-kernel-$arch', + initrd: 'fedora-coreos-$major.$minor-live-initramfs.$arch.img', + } + + def pxe_type + 'fcos' + end + + def bootfile(medium_provider, type) + medium_provider.interpolate_vars(super).to_s + end + + def pxedir(medium_provider = nil) + medium_provider.interpolate_vars('prod/streams/$release/builds/$major.$minor/$arch').to_s + end + + def display_family + 'Fedora CoreOS' + end + + # Does this OS family use release_name in its naming scheme + def use_release_name? + true + end + + # Helper text shown next to major version (do not use i18n) + def major_version_help + '32' + end + + # Helper text shown next to minor version (do not use i18n) + def minor_version_help + '20200907.3.0' + end + + # Helper text shown next to release name (do not use i18n) + def release_name_help + 'stable, testing, next' + end +end diff --git a/app/models/operatingsystems/nxos.rb b/app/models/operatingsystems/nxos.rb index 8a2275c7e80..0e8f2258581 100644 --- a/app/models/operatingsystems/nxos.rb +++ b/app/models/operatingsystems/nxos.rb @@ -35,6 +35,11 @@ def use_release_name? true end + # Helper text shown next to release name + def release_name_help + _('auxiliary field') + end + # release_name can have upper case letters and we want to keep it that way def downcase_release_name release_name diff --git a/app/models/operatingsystems/redhat.rb b/app/models/operatingsystems/redhat.rb index 942c55cb9af..c55dee7ce73 100644 --- a/app/models/operatingsystems/redhat.rb +++ b/app/models/operatingsystems/redhat.rb @@ -67,4 +67,9 @@ def pxe_kernel_options(params) options << "modprobe.blacklist=#{params['blacklist'].delete(' ')}" if params['blacklist'] options end + + # Helper text shown next to minor version (do not use i18n) + def minor_version_help + '0, 6.1810' + end end diff --git a/app/models/operatingsystems/rhcos.rb b/app/models/operatingsystems/rhcos.rb new file mode 100644 index 00000000000..e8d906d1867 --- /dev/null +++ b/app/models/operatingsystems/rhcos.rb @@ -0,0 +1,50 @@ +class Rhcos < Operatingsystem + # + # Example PXE URLs: + # http://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.5/4.5.6/rhcos-installer-kernel-x86_64 + # http://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.5/4.5.6/rhcos-installer-initramfs.x86_64.img + # + # Version 4.6+ changed: + # http://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.6/4.6.1/rhcos-live-initramfs.x86_64.img + # http://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.6/4.6.1/rhcos-live-kernel-x86_64 + PXEFILES = { + kernel: 'rhcos-live-kernel-$arch', + initrd: 'rhcos-live-initramfs.$arch.img', + } + + def pxe_type + 'rhcos' + end + + def bootfile(medium_provider, type) + medium_provider.interpolate_vars(super).to_s + end + + def pxedir(medium_provider = nil) + medium_provider.interpolate_vars('pub/openshift-v$major/$arch/dependencies/rhcos/$major.$minor/$major.$minor.$release').to_s + end + + def display_family + 'Red Hat CoreOS' + end + + # Does this OS family use release_name in its naming scheme + def use_release_name? + true + end + + # Helper text shown next to major version (do not use i18n) + def major_version_help + '4 (*X*.Y.Z)' + end + + # Helper text shown next to minor version (do not use i18n) + def minor_version_help + '5 (X.*Y*.Z)' + end + + # Helper text shown next to release name (do not use i18n) + def release_name_help + '6 (X.Y.*Z*)' + end +end diff --git a/app/models/operatingsystems/solaris.rb b/app/models/operatingsystems/solaris.rb index 8e902eaae84..43ca16f6f4a 100644 --- a/app/models/operatingsystems/solaris.rb +++ b/app/models/operatingsystems/solaris.rb @@ -76,6 +76,11 @@ def use_release_name? true end + # Helper text shown next to release name + def release_name_help + _('auxiliary field') + end + def jumpstart_params(host, vendor) medium_provider = Foreman::Plugin.medium_providers_registry.find_provider(host) # root server and install server are always the same under Foreman diff --git a/app/services/medium_providers/provider.rb b/app/services/medium_providers/provider.rb index 8a59f71f281..76ef109e41b 100644 --- a/app/services/medium_providers/provider.rb +++ b/app/services/medium_providers/provider.rb @@ -74,6 +74,10 @@ def architecture_name architecture.try(:name) end + def interpolate_vars(pattern) + pattern + end + private def parse_media(media) diff --git a/app/views/operatingsystems/_form.html.erb b/app/views/operatingsystems/_form.html.erb index d93d1496873..140b5822cc7 100644 --- a/app/views/operatingsystems/_form.html.erb +++ b/app/views/operatingsystems/_form.html.erb @@ -17,12 +17,12 @@
<%= text_f f, :name, :help_inline => _("OS name from facter; e.g. RedHat") %> - <%= text_f f, :major, :help_inline => _("OS major version from facter; e.g. 7"), :class => "col-md-2" %> - <%= text_f f, :minor, :help_inline => _("OS minor version from facter; e.g. 0 or 6.1810 (CentOS scheme)"), :class => "col-md-2" %> + <%= text_f f, :major, :help_inline => _("OS major version from facter; e.g. %s") % @operatingsystem.major_version_help, :class => "col-md-2" %> + <%= text_f f, :minor, :help_inline => _("OS minor version from facter; e.g. %s") % @operatingsystem.minor_version_help, :class => "col-md-2" %> <%= text_f f, :description, :help_inline => _("OS friendly name; e.g. RHEL 6.5") %> <%= select_f f, :family, Operatingsystem.families_as_collection, :value, :name, { :include_blank => _("Choose a family") }, { :label => _("Family"), :onchange => 'show_release(this);' } %>
> - <%= text_f f, :release_name, :help_inline => _("e.g. karmic, lucid, hw0910 etc") %> + <%= text_f f, :release_name, :help_inline => @operatingsystem.release_name_help %>
<%= select_f f, :password_hash, PasswordCrypt::ALGORITHMS.keys, :to_s, :to_s, {}, { :label => _("Root Password Hash"), :help_inline => _("Hash function to use. Change takes effect for new or updated hosts.")} %> <%= multiple_checkboxes f, :architectures, @operatingsystem, Architecture, :label => _("Architectures") %> diff --git a/db/seeds.d/100-installation_media.rb b/db/seeds.d/100-installation_media.rb index 8f1bdba7f0e..d5831f6aa28 100644 --- a/db/seeds.d/100-installation_media.rb +++ b/db/seeds.d/100-installation_media.rb @@ -5,18 +5,76 @@ # Installation media: default mirrors Medium.without_auditing do [ - { :name => "CentOS 7 mirror", :os_family => "Redhat", :path => "http://mirror.centos.org/centos/$major/os/$arch" }, - { :name => "CentOS 8 mirror", :os_family => "Redhat", :path => "http://mirror.centos.org/centos/$major/BaseOS/$arch/kickstart" }, - { :name => "CentOS Stream", :os_family => "Redhat", :path => "http://mirror.centos.org/centos/$major-stream/BaseOS/$arch/os" }, - { :name => "Debian mirror", :os_family => "Debian", :path => "http://ftp.debian.org/debian" }, - { :name => "Fedora mirror", :os_family => "Redhat", :path => "http://dl.fedoraproject.org/pub/fedora/linux/releases/$major/Server/$arch/os/" }, - { :name => "Fedora Atomic mirror", :os_family => "Redhat", :path => "http://dl.fedoraproject.org/pub/alt/atomic/stable/Cloud_Atomic/$arch/os/" }, - { :name => "FreeBSD mirror", :os_family => "Freebsd", :path => "http://ftp.freebsd.org/pub/FreeBSD/releases/$arch/$version-RELEASE/" }, - { :name => "OpenSUSE mirror", :os_family => "Suse", :path => "http://download.opensuse.org/distribution/leap/$version/repo/oss", :operatingsystems => os_suse }, - { :name => "Ubuntu mirror", :os_family => "Debian", :path => "http://archive.ubuntu.com/ubuntu" }, - { :name => "CoreOS mirror", :os_family => "Coreos", :path => "http://$release.release.core-os.net" }, - { :name => "Flatcar mirror", :os_family => "Coreos", :path => "http://$release.release.flatcar-linux.net" }, - { :name => "RancherOS mirror", :os_family => "Rancheros", :path => "https://github.com/rancher/os/releases/download/v$version" }, + { + :name => "CentOS 7 mirror", + :os_family => "Redhat", + :path => "http://mirror.centos.org/centos/$major/os/$arch", + }, + { + :name => "CentOS 8 mirror", + :os_family => "Redhat", + :path => "http://mirror.centos.org/centos/$major/BaseOS/$arch/kickstart", + }, + { + :name => "CentOS Stream", + :os_family => "Redhat", + :path => "http://mirror.centos.org/centos/$major-stream/BaseOS/$arch/os", + }, + { + :name => "Debian mirror", + :os_family => "Debian", + :path => "http://ftp.debian.org/debian", + }, + { + :name => "Fedora mirror", + :os_family => "Redhat", + :path => "http://dl.fedoraproject.org/pub/fedora/linux/releases/$major/Server/$arch/os/", + }, + { + :name => "Fedora Atomic mirror", + :os_family => "Redhat", + :path => "http://dl.fedoraproject.org/pub/alt/atomic/stable/Cloud_Atomic/$arch/os/", + }, + { + :name => "FreeBSD mirror", + :os_family => "Freebsd", + :path => "http://ftp.freebsd.org/pub/FreeBSD/releases/$arch/$version-RELEASE/", + }, + { + :name => "OpenSUSE mirror", + :os_family => "Suse", + :path => "http://download.opensuse.org/distribution/leap/$version/repo/oss", :operatingsystems => os_suse + }, + { + :name => "Ubuntu mirror", + :os_family => "Debian", + :path => "http://archive.ubuntu.com/ubuntu", + }, + { + :name => "RancherOS mirror", + :os_family => "Rancheros", + :path => "https://github.com/rancher/os/releases/download/v$version", + }, + { + :name => "CoreOS mirror", + :os_family => "Coreos", + :path => "http://$release-temporary-archive.release.core-os.net", + }, + { + :name => "Flatcar mirror", + :os_family => "Coreos", + :path => "http://$release.release.flatcar-linux.net", + }, + { + :name => "Fedora CoreOS mirror", + :os_family => "Fcos", + :path => "https://builds.coreos.fedoraproject.org", + }, + { + :name => "Red Hat CoreOS mirror", + :os_family => "Rhcos", + :path => "http://mirror.openshift.com", + }, ].each do |input| next if Medium.unscoped.where(['name = ? OR path = ?', input[:name], input[:path]]).any? next if SeedHelper.audit_modified? Medium, input[:name] diff --git a/lib/foreman/renderer/scope/variables/base.rb b/lib/foreman/renderer/scope/variables/base.rb index cc320d8cb7f..ec8abb8d558 100644 --- a/lib/foreman/renderer/scope/variables/base.rb +++ b/lib/foreman/renderer/scope/variables/base.rb @@ -36,7 +36,7 @@ def load_variables_base @template_url = params['url'] end - %w(coreos aif memdisk ZTP).each do |name| + %w(coreos fcos rhcos aif memdisk ZTP).each do |name| define_method("#{name}_attributes") do @mediapath = mediumpath(@medium_provider) if medium end diff --git a/test/controllers/api/v2/operatingsystems_controller_test.rb b/test/controllers/api/v2/operatingsystems_controller_test.rb index 6daed1c465e..b6e4cc4d3fe 100644 --- a/test/controllers/api/v2/operatingsystems_controller_test.rb +++ b/test/controllers/api/v2/operatingsystems_controller_test.rb @@ -94,22 +94,6 @@ class Api::V2::OperatingsystemsControllerTest < ActionController::TestCase assert_response :unprocessable_entity end - test "should not create os with invalid major version" do - os_params = minimum_required_os_params.merge(:major => '') - assert_difference('Operatingsystem.count', 0) do - post :create, params: { :operatingsystem => os_params } - end - assert_response :unprocessable_entity - end - - test "should not create os with invalid minor version" do - os_params = minimum_required_os_params.merge(:minor => '-5') - assert_difference('Operatingsystem.count', 0) do - post :create, params: { :operatingsystem => os_params } - end - assert_response :unprocessable_entity - end - test "should not create os with invalid password_hash" do os_params = minimum_required_os_params.merge(:password_hash => 'INVALID_HASH') assert_difference('Operatingsystem.count', 0) do @@ -160,12 +144,6 @@ class Api::V2::OperatingsystemsControllerTest < ActionController::TestCase assert_equal response['minor'], new_minor end - test "should not update os with invalid minor version" do - os = operatingsystems(:redhat) - put :update, params: { :id => os.id, :operatingsystem => { :minor => '-30' } } - assert_response :unprocessable_entity - end - test "should update os major version" do os = operatingsystems(:redhat) new_major = '7' @@ -176,12 +154,6 @@ class Api::V2::OperatingsystemsControllerTest < ActionController::TestCase assert_equal response['major'], new_major end - test "should not update os with invalid major version" do - os = operatingsystems(:redhat) - put :update, params: { :id => os.id, :operatingsystem => { :major => '-1' } } - assert_response :unprocessable_entity - end - test "should update os family" do os = operatingsystems(:redhat) new_family = 'Coreos' diff --git a/test/factories/medium.rb b/test/factories/medium.rb index 9401b6645c5..d8576e224f6 100644 --- a/test/factories/medium.rb +++ b/test/factories/medium.rb @@ -28,6 +28,18 @@ os_family { 'Coreos' } end + trait :fcos do + sequence(:name) { |n| "Fedora CoreOS Mirror #{n}" } + sequence(:path) { 'http://builds.coreos.fedoraproject.org' } + os_family { 'Fcos' } + end + + trait :rhcos do + sequence(:name) { |n| "Red Hat CoreOS Mirror #{n}" } + sequence(:path) { 'http://mirror.openshift.com' } + os_family { 'Rhcos' } + end + trait :ubuntu do sequence(:name) { |n| "Ubuntu Mirror #{n}" } sequence(:path) { 'http://archive.ubuntu.com/ubuntu' } diff --git a/test/factories/operatingsystem.rb b/test/factories/operatingsystem.rb index e65c0de8046..c0c3db54f0e 100644 --- a/test/factories/operatingsystem.rb +++ b/test/factories/operatingsystem.rb @@ -81,6 +81,24 @@ title { 'Flatcar 2345.3.0' } end + factory :fcos, class: Fcos do + sequence(:name) { 'FedoraCoreOS' } + major { '32' } + minor { '20200907.3.0' } + type { 'Fcos' } + release_name { 'stable' } + title { 'FedoraCoreOS 32.20200907.3.0' } + end + + factory :rhcos, class: Rhcos do + sequence(:name) { 'RedHatCoreOS' } + major { '4' } + minor { '5' } + release_name { '6' } + type { 'Rhcos' } + title { 'RedHatCoreOS 4.5.6' } + end + factory :ubuntu14_10, class: Debian do sequence(:name) { 'Ubuntu' } major { '14' } diff --git a/test/models/operatingsystem_test.rb b/test/models/operatingsystem_test.rb index 4e36771cf65..b2b8aa69895 100644 --- a/test/models/operatingsystem_test.rb +++ b/test/models/operatingsystem_test.rb @@ -11,17 +11,15 @@ class OperatingsystemTest < ActiveSupport::TestCase end should validate_presence_of(:name) - should validate_numericality_of(:major).is_greater_than_or_equal_to(0) - should validate_numericality_of(:minor).is_greater_than_or_equal_to(0) should allow_value(*valid_name_list).for(:name) should_not allow_value(*invalid_name_list).for(:name) - should allow_value('1' * 5).for(:major) - should_not allow_values('1' * 6, '', -33).for(:major) + should allow_value('11111').for(:major) + should allow_value(11111).for(:major) - should allow_value('1' * 16).for(:minor) - should_not allow_values('1' * 17, -50).for(:minor) + should allow_value('11111').for(:minor) + should allow_value(11111).for(:minor) should allow_values('Base64', 'SHA256', 'SHA512').for(:password_hash) should_not allow_value('INVALID_HASH').for(:password_hash) @@ -161,8 +159,8 @@ class OperatingsystemTest < ActiveSupport::TestCase test "families_as_collection contains correct names and values" do families = Operatingsystem.families_as_collection - assert_equal ["AIX", "Altlinux", "Arch Linux", "CoreOS", "Debian", "FreeBSD", "Gentoo", "Junos", "NX-OS", 'RancherOS', "Red Hat", "SUSE", "Solaris", "VRP", "Windows", "XenServer"], families.map(&:name).sort - assert_equal ["AIX", "Altlinux", "Archlinux", "Coreos", "Debian", "Freebsd", "Gentoo", "Junos", "NXOS", 'Rancheros', "Redhat", "Solaris", "Suse", "VRP", "Windows", "Xenserver"], families.map(&:value).sort + assert_equal ["AIX", "Altlinux", "Arch Linux", "CoreOS", "Debian", "Fedora CoreOS", "FreeBSD", "Gentoo", "Junos", "NX-OS", 'RancherOS', "Red Hat", "Red Hat CoreOS", "SUSE", "Solaris", "VRP", "Windows", "XenServer"], families.map(&:name).sort + assert_equal ["AIX", "Altlinux", "Archlinux", "Coreos", "Debian", "Fcos", "Freebsd", "Gentoo", "Junos", "NXOS", 'Rancheros', "Redhat", "Rhcos", "Solaris", "Suse", "VRP", "Windows", "Xenserver"], families.map(&:value).sort end end diff --git a/test/models/operatingsystems/operatingsystems_test.rb b/test/models/operatingsystems/operatingsystems_test.rb index f71cb535dbf..1772e0c64bd 100644 --- a/test/models/operatingsystems/operatingsystems_test.rb +++ b/test/models/operatingsystems/operatingsystems_test.rb @@ -101,20 +101,58 @@ class OperatingsystemsTest < ActiveSupport::TestCase end end - { :coreos => { 'os' => :coreos, 'arch' => :x86_64, 'medium' => :coreos, - 'kernel' => 'http://stable.release.core-os.net/amd64-usr/494.5.0/coreos_production_pxe.vmlinuz', - 'initrd' => 'http://stable.release.core-os.net/amd64-usr/494.5.0/coreos_production_pxe_image.cpio.gz'}, - :debian7_0 => { 'os' => :debian7_0, 'arch' => :x86_64, 'medium' => :debian, - 'kernel' => 'http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux', - 'initrd' => 'http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz'}, - :ubuntu14_10 => { 'os' => :ubuntu14_10, 'arch' => :x86_64, 'medium' => :ubuntu, - 'kernel' => 'http://archive.ubuntu.com/ubuntu/dists/utopic/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/linux', - 'initrd' => 'http://archive.ubuntu.com/ubuntu/dists/utopic/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz'}, - :suse => { 'os' => :suse, 'arch' => :x86_64, 'medium' => :suse, - 'kernel' => 'http://mirror.isoc.org.il/pub/opensuse/distribution/11.4/repo/oss/boot/x86_64/loader/linux', - 'initrd' => 'http://mirror.isoc.org.il/pub/opensuse/distribution/11.4/repo/oss/boot/x86_64/loader/initrd' } }. - each do |os, config| - test "pxe files for #{os}" do + dists = { + :debian7_0 => { + 'os' => :debian7_0, + 'arch' => :x86_64, + 'medium' => :debian, + 'kernel' => 'http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux', + 'initrd' => 'http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz', + }, + :ubuntu14_10 => { + 'os' => :ubuntu14_10, + 'arch' => :x86_64, + 'medium' => :ubuntu, + 'kernel' => 'http://archive.ubuntu.com/ubuntu/dists/utopic/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/linux', + 'initrd' => 'http://archive.ubuntu.com/ubuntu/dists/utopic/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz', + }, + :suse => { + 'os' => :suse, + 'arch' => :x86_64, + 'medium' => :suse, + 'kernel' => 'http://mirror.isoc.org.il/pub/opensuse/distribution/11.4/repo/oss/boot/x86_64/loader/linux', + 'initrd' => 'http://mirror.isoc.org.il/pub/opensuse/distribution/11.4/repo/oss/boot/x86_64/loader/initrd', + }, + :coreos => { + 'os' => :coreos, + 'arch' => :x86_64, + 'medium' => :coreos, + 'kernel' => 'http://stable.release.core-os.net/amd64-usr/494.5.0/coreos_production_pxe.vmlinuz', + 'initrd' => 'http://stable.release.core-os.net/amd64-usr/494.5.0/coreos_production_pxe_image.cpio.gz', + }, + :fcos => { + 'os' => :fcos, + 'arch' => :x86_64, + 'medium' => :fcos, + 'major' => '32', + 'minor' => '20200907.3.0', + 'release_name' => 'stable', + 'kernel' => 'http://builds.coreos.fedoraproject.org/prod/streams/stable/builds/32.20200907.3.0/x86_64/fedora-coreos-32.20200907.3.0-live-kernel-x86_64', + 'initrd' => 'http://builds.coreos.fedoraproject.org/prod/streams/stable/builds/32.20200907.3.0/x86_64/fedora-coreos-32.20200907.3.0-live-initramfs.x86_64.img', + }, + :rhcos => { + 'os' => :rhcos, + 'arch' => :x86_64, + 'medium' => :rhcos, + 'major' => '4', + 'minor' => '5', + 'release_name' => '6', + 'kernel' => 'http://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.5/4.5.6/rhcos-live-kernel-x86_64', + 'initrd' => 'http://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.5/4.5.6/rhcos-live-initramfs.x86_64.img', + }, + } + dists.each do |os, config| + test "pxe files for #{os}" do medium = FactoryBot.build(:medium, config['medium']) arch = architectures(config['arch']) @@ -122,6 +160,9 @@ class OperatingsystemsTest < ActiveSupport::TestCase :architectures => [arch], :ptables => [FactoryBot.create(:ptable)], :media => [medium]) + operatingsystem.major = config['major'] if config['major'] + operatingsystem.minor = config['minor'] if config['minor'] + operatingsystem.release_name = config['release_name'] if config['release_name'] host = FactoryBot.build(:host, :operatingsystem => operatingsystem, :architecture => arch, @@ -131,10 +172,9 @@ class OperatingsystemsTest < ActiveSupport::TestCase host.arch.operatingsystems << host.operatingsystem medium_provider = Foreman::Plugin.medium_providers_registry.find_provider(host) - prefix = host.operatingsystem.pxe_prefix(medium_provider).to_sym - pxe_files = host.operatingsystem.pxe_files(medium_provider) - assert pxe_files.include?({ prefix => config['kernel'] }) - assert pxe_files.include?({ prefix => config['initrd'] }) + pxe_files = host.operatingsystem.pxe_files(medium_provider).map { |x| x.values }.flatten + assert_includes pxe_files, config['kernel'] + assert_includes pxe_files, config['initrd'] end end end