Description of problem:
Failed to create a host using a nested hostgroup because all values that inherited from the parent host group are not set, such has content_view_id, content_source_id, lifecycle_environment_id and kickstart_repository_id.
Steps to Reproduce:
1. Create a parent hostgroup. Set the content source, content_view, lifecycle environment and the synced content.
2. Create a nested hostgroup that inherit the above values.
3. Create a host using the nested hostgroup.
hammer host create --name "my-test-client1" --hostgroup-id <the nested hostgroup id> --location "Default Location" --organization "MYORG" --mac="xx:xx:xx:xx:xx:xx" --domain-id 1 --ask-root-password yes --subnet apac-mps --ip xxx.xxx.xxx.xxx
Actual results:
Could not create the host:
Medium can't be blank
Content view can't be blank
Lifecycle environment can't be blank
Expected results:
host created successfully
Additional info:
The "inherited_#{attribute}" method returns an array so rails is unable to set the nested attribute.
# foreman-rake console
Satellite 6.8 output: Hostgroup.find(21).inherited_kickstart_repository_id
=> 707 <========== Correct
Satellite 6.9 output: Hostgroup.find(21).inherited_kickstart_repository_id
=> [707] <========= Wrong
Make the following change in "/opt/theforeman/tfm/root/usr/share/gems/gems/katello-3.18.1.27/app/models/katello/concerns/hostgroup_extensions.rb" fixed the issue.
@@ -126,7 +126,7 @@
facet_model = Facets.registered_facets[facet].hostgroup_configuration.model
value = facet_model.where.not(attribute => nil).joins(:hostgroup).merge(
::Hostgroup.where(id: self.ancestor_ids).reorder(ancestry: :desc)
- ).limit(1).pluck(attribute)
+ ).limit(1).pluck(attribute).first
end
value
end
Comment 3Tasos Papaioannou
2021-06-07 16:55:06 UTC
Verified on 6.9.3 snap 1.0.
1. Enable and sync Red Hat Enterprise Linux 7 Server Kickstart x86_64 7.9 (rhel-7-server-kickstart).
2. Create a parent hostgroup, selecting content source, content view, lifecycle environment, and Operating System fields.
3. Create a nested hostgroup that inherits those values from the parent hostgroup.
4. Create a host using the nested hostgroup:
# hammer host create --name test-host --hostgroup-id 2 --location-id 2 --organization-id 1 --mac '0e:05:fb:8f:22:d8'
Host created.
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.
For information on the advisory (Satellite 6.9.3 Async Bug Fix Update), and where to find the updated
files, follow the link below.
If the solution does not work for you, open a new bug report.
https://access.redhat.com/errata/RHBA-2021:2636
Description of problem: Failed to create a host using a nested hostgroup because all values that inherited from the parent host group are not set, such has content_view_id, content_source_id, lifecycle_environment_id and kickstart_repository_id. Steps to Reproduce: 1. Create a parent hostgroup. Set the content source, content_view, lifecycle environment and the synced content. 2. Create a nested hostgroup that inherit the above values. 3. Create a host using the nested hostgroup. hammer host create --name "my-test-client1" --hostgroup-id <the nested hostgroup id> --location "Default Location" --organization "MYORG" --mac="xx:xx:xx:xx:xx:xx" --domain-id 1 --ask-root-password yes --subnet apac-mps --ip xxx.xxx.xxx.xxx Actual results: Could not create the host: Medium can't be blank Content view can't be blank Lifecycle environment can't be blank Expected results: host created successfully Additional info: The "inherited_#{attribute}" method returns an array so rails is unable to set the nested attribute. # foreman-rake console Satellite 6.8 output: Hostgroup.find(21).inherited_kickstart_repository_id => 707 <========== Correct Satellite 6.9 output: Hostgroup.find(21).inherited_kickstart_repository_id => [707] <========= Wrong Make the following change in "/opt/theforeman/tfm/root/usr/share/gems/gems/katello-3.18.1.27/app/models/katello/concerns/hostgroup_extensions.rb" fixed the issue. @@ -126,7 +126,7 @@ facet_model = Facets.registered_facets[facet].hostgroup_configuration.model value = facet_model.where.not(attribute => nil).joins(:hostgroup).merge( ::Hostgroup.where(id: self.ancestor_ids).reorder(ancestry: :desc) - ).limit(1).pluck(attribute) + ).limit(1).pluck(attribute).first end value end