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