diff --git a/app/assets/javascripts/host_edit_interfaces.js b/app/assets/javascripts/host_edit_interfaces.js index f27c2760f97..e8bbb5e3840 100644 --- a/app/assets/javascripts/host_edit_interfaces.js +++ b/app/assets/javascripts/host_edit_interfaces.js @@ -391,9 +391,6 @@ $(document).on('change', '.virtual', function() { function construct_host_name() { var host_name_el = $('#host_name') var host_name = host_name_el.val(); - if (host_name_el.data('appendDomainNameForHosts') === false) { - return host_name; - } var domain_name = primary_nic_form() .find('.interface_domain option:selected') .text(); diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7b47676899f..364622423cc 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -414,6 +414,7 @@ def ui_settings destroyVmOnHostDelete: Setting['destroy_vm_on_host_delete'], labFeatures: Setting[:lab_features], safeMode: Setting[:safemode_render], + displayFqdnForHosts: Setting[:display_fqdn_for_hosts], } end diff --git a/app/models/host/base.rb b/app/models/host/base.rb index 6aa7c02df09..213d38a5bd2 100644 --- a/app/models/host/base.rb +++ b/app/models/host/base.rb @@ -115,6 +115,7 @@ def dup :domain=, :domain_id=, :domain_name=, :to => :primary_interface attr_writer :updated_virtuals + def updated_virtuals @updated_virtuals ||= [] end @@ -351,6 +352,14 @@ def render_template(template:, **params) template.render(host: self, **params) end + def to_label + if Setting[:display_fqdn_for_hosts] + name + else + name.split('.')[0] + end + end + private def parse_ip_address(address, ignore_link_local: true) diff --git a/app/registries/foreman/settings/general.rb b/app/registries/foreman/settings/general.rb index 96b41976375..a30a0b7eb30 100644 --- a/app/registries/foreman/settings/general.rb +++ b/app/registries/foreman/settings/general.rb @@ -51,11 +51,11 @@ description: N_("Whether or not to show a menu to access experimental lab features (requires reload of page)"), default: false, full_name: N_('Show Experimental Labs')) - setting('append_domain_name_for_hosts', + setting('display_fqdn_for_hosts', type: :boolean, - description: N_('Foreman will append domain names when new hosts are provisioned'), + description: N_('Display names of hosts as FQDNs. If disabled, only display names of hosts as hostnames.'), default: true, - full_name: N_('Append domain names to the host')) + full_name: N_('Display FQDN for hosts')) setting('outofsync_interval', type: :integer, description: N_('Duration in minutes after servers are classed as out of sync. ' \ diff --git a/app/services/name_synchronizer.rb b/app/services/name_synchronizer.rb index dc00a585d5b..91715c41c8b 100644 --- a/app/services/name_synchronizer.rb +++ b/app/services/name_synchronizer.rb @@ -25,6 +25,6 @@ def sync_required? private def interface_name - Setting[:append_domain_name_for_hosts] ? @interface.name : @interface.shortname + @interface.name end end diff --git a/app/views/api/v2/hosts/base.json.rabl b/app/views/api/v2/hosts/base.json.rabl index 417623b7092..838c0753be6 100644 --- a/app/views/api/v2/hosts/base.json.rabl +++ b/app/views/api/v2/hosts/base.json.rabl @@ -1,3 +1,7 @@ object @host attributes :name, :id + +node :display_name do |host| + host.to_label +end diff --git a/app/views/dashboard/_hosts_in_build_mode_widget_host_list.html.erb b/app/views/dashboard/_hosts_in_build_mode_widget_host_list.html.erb index c482f20851b..8735d60cdd9 100644 --- a/app/views/dashboard/_hosts_in_build_mode_widget_host_list.html.erb +++ b/app/views/dashboard/_hosts_in_build_mode_widget_host_list.html.erb @@ -8,7 +8,7 @@ <% hosts.each do |host| %> - <%= host_build_status_icon(host) %> <%= link_to host.name, current_host_details_path(host) %> + <%= host_build_status_icon(host) %> <%= link_to host, current_host_details_path(host) %> <%= host.owner %> <%= build_duration(host) %> <%= date_time_relative(host.token&.expires)%> diff --git a/app/views/dashboard/_new_hosts_widget_host_list.html.erb b/app/views/dashboard/_new_hosts_widget_host_list.html.erb index def3da40e60..bf85cc97e0c 100644 --- a/app/views/dashboard/_new_hosts_widget_host_list.html.erb +++ b/app/views/dashboard/_new_hosts_widget_host_list.html.erb @@ -9,7 +9,7 @@ <% hosts.each do |host| %> - <%= link_to host.name, current_host_details_path(host) %> + <%= link_to host, current_host_details_path(host) %> <%= safe_join([icon(host.operatingsystem, :size => '16x16'), host.operatingsystem.to_label]) if host.operatingsystem.present? %> <%= host.owner %> <%= date_time_relative(host.created_at) %> diff --git a/app/views/hosts/_form.html.erb b/app/views/hosts/_form.html.erb index b7416c42651..5283423b3b0 100644 --- a/app/views/hosts/_form.html.erb +++ b/app/views/hosts/_form.html.erb @@ -32,7 +32,7 @@ <%= text_f f, :name, :size => "col-md-4", :value => name_field(@host), :input_group_btn => randomize_mac_link, :help_inline => _("This value is used also as the host's primary interface name."), - :data => { 'append_domain_name_for_hosts' => Setting[:append_domain_name_for_hosts] } + :data => {} %> <% if show_organization_tab? %> diff --git a/db/migrate/20230414091257_rename_append_domain_setting.rb b/db/migrate/20230414091257_rename_append_domain_setting.rb new file mode 100644 index 00000000000..2547b496a2f --- /dev/null +++ b/db/migrate/20230414091257_rename_append_domain_setting.rb @@ -0,0 +1,5 @@ +class RenameAppendDomainSetting < ActiveRecord::Migration[6.1] + def change + Setting.find_by(name: 'append_domain_name_for_hosts')&.update_attribute(:name, 'display_fqdn_for_hosts') + end +end diff --git a/db/migrate/20230418075940_assign_fqdn_to_host_name.rb b/db/migrate/20230418075940_assign_fqdn_to_host_name.rb new file mode 100644 index 00000000000..42248a7f753 --- /dev/null +++ b/db/migrate/20230418075940_assign_fqdn_to_host_name.rb @@ -0,0 +1,9 @@ +class AssignFqdnToHostName < ActiveRecord::Migration[6.1] + def up + Host.find_in_batches(batch_size: 1000) do |hosts| + hosts.each do |host| + host.update_attribute(:name, host.fqdn) + end + end + end +end diff --git a/test/controllers/api/v2/settings_controller_test.rb b/test/controllers/api/v2/settings_controller_test.rb index 6df02ea4be4..de8a446c7bf 100644 --- a/test/controllers/api/v2/settings_controller_test.rb +++ b/test/controllers/api/v2/settings_controller_test.rb @@ -8,7 +8,7 @@ def setup end test "should get all settings through index" do - Setting['append_domain_name_for_hosts'] = false + Setting['display_fqdn_for_hosts'] = false get :index, params: { per_page: 'all' } assert_response :success settings = ActiveSupport::JSON.decode(@response.body)['results'] @@ -16,8 +16,8 @@ def setup foreman_url = settings.detect { |s| s['name'] == 'foreman_url' } assert_equal Setting['foreman_url'], foreman_url['value'] assert_equal Foreman.settings.find('foreman_url').default, foreman_url['default'] - append_domain_name_for_hosts = settings.detect { |s| s['name'] == 'append_domain_name_for_hosts' } - assert_equal false, append_domain_name_for_hosts['value'] + display_fqdn_for_hosts = settings.detect { |s| s['name'] == 'display_fqdn_for_hosts' } + assert_equal false, display_fqdn_for_hosts['value'] end test "should get index with organization and location params" do @@ -68,8 +68,8 @@ def setup end test "properly show overriden false value" do - Setting['append_domain_name_for_hosts'] = value = false - get :show, params: { :id => 'append_domain_name_for_hosts' } + Setting['display_fqdn_for_hosts'] = value = false + get :show, params: { :id => 'display_fqdn_for_hosts' } assert_response :success show_response = ActiveSupport::JSON.decode(@response.body) assert_equal value, show_response['value'] diff --git a/test/integration/host_js_test.rb b/test/integration/host_js_test.rb index 930e5ae883c..dab16c91dfd 100644 --- a/test/integration/host_js_test.rb +++ b/test/integration/host_js_test.rb @@ -173,8 +173,8 @@ class HostJSTest < IntegrationTestWithJavascript find('h5', :text => /newhost2.*/) # wait for the new host details page end - test "redirects correctly with append_domain_name_for_hosts turned off" do - Setting['append_domain_name_for_hosts'] = false + test "redirects correctly with display_fqdn_for_hosts turned off" do + Setting['display_fqdn_for_hosts'] = false compute_resource = FactoryBot.create(:compute_resource, :libvirt) os = FactoryBot.create(:ubuntu14_10, :with_associations) Nic::Managed.any_instance.stubs(:dns_conflict_detected?).returns(true) diff --git a/test/models/lookup_value_test.rb b/test/models/lookup_value_test.rb index 1bfab0e68ab..3a254e138ab 100644 --- a/test/models/lookup_value_test.rb +++ b/test/models/lookup_value_test.rb @@ -56,19 +56,6 @@ def valid_attrs2 end end - test "can create lookup value if match fqdn= does match existing host" do - as_admin do - Setting[:append_domain_name_for_hosts] = false - domain = FactoryBot.create(:domain) - host = FactoryBot.create(:host, interfaces: [FactoryBot.build(:nic_managed, identifier: 'fqdn_test', primary: true, domain: domain)]) - attrs = { :match => "fqdn=#{host.primary_interface.fqdn}", :value => "123", :lookup_key_id => lookup_key.id } - refute_match /#{domain.name}/, host.name, "#{host.name} shouldn't be FQDN" - assert_difference('LookupValue.count') do - LookupValue.create!(attrs) - end - end - end - test "can create lookup value if user has matching hostgroup " do attrs = valid_attrs2 # create key outside as_user as_user :one do diff --git a/test/unit/name_synchronizer_test.rb b/test/unit/name_synchronizer_test.rb index ad002f8447d..520e72c7614 100644 --- a/test/unit/name_synchronizer_test.rb +++ b/test/unit/name_synchronizer_test.rb @@ -27,7 +27,7 @@ def setup context "synchronizer build from host on shortnames" do before do - Setting[:append_domain_name_for_hosts] = false + Setting[:display_fqdn_for_hosts] = false end test "#sync_required? detects difference between names" do refute_equal @host.name, @host.primary_interface.shortname diff --git a/webpack/assets/javascripts/react_app/components/HostDetails/Tabs/Details/Cards/SystemProperties/index.js b/webpack/assets/javascripts/react_app/components/HostDetails/Tabs/Details/Cards/SystemProperties/index.js index c1b7e0b3e09..713caf973e1 100644 --- a/webpack/assets/javascripts/react_app/components/HostDetails/Tabs/Details/Cards/SystemProperties/index.js +++ b/webpack/assets/javascripts/react_app/components/HostDetails/Tabs/Details/Cards/SystemProperties/index.js @@ -14,8 +14,10 @@ import Slot from '../../../../../common/Slot'; import SkeletonLoader from '../../../../../common/SkeletonLoader'; import DefaultLoaderEmptyState from '../../../../DetailsCard/DefaultLoaderEmptyState'; import { STATUS } from '../../../../../../constants'; +import { useForemanSettings } from '../../../../../../Root/Context/ForemanContext'; const SystemPropertiesCard = ({ status, hostDetails }) => { + const { displayFqdnForHosts } = useForemanSettings(); const { name, model_name: model, @@ -48,7 +50,7 @@ const SystemPropertiesCard = ({ status, hostDetails }) => { hoverTip={__('Copy to clipboard')} clickTip={__('Copied to clipboard')} > - {name} + {displayFqdnForHosts ? name : name?.replace(`.${domain}`, '')} )} diff --git a/webpack/assets/javascripts/react_app/components/HostDetails/index.js b/webpack/assets/javascripts/react_app/components/HostDetails/index.js index aa6bc20f367..282d20cf801 100644 --- a/webpack/assets/javascripts/react_app/components/HostDetails/index.js +++ b/webpack/assets/javascripts/react_app/components/HostDetails/index.js @@ -43,6 +43,7 @@ import BreadcrumbBar from '../BreadcrumbBar'; import { foremanUrl } from '../../common/helpers'; import { CardExpansionContextWrapper } from './CardExpansionContext'; import Head from '../Head'; +import { useForemanSettings } from '../../Root/Context/ForemanContext'; const HostDetails = ({ match: { @@ -51,6 +52,7 @@ const HostDetails = ({ location: { hash }, history, }) => { + const { displayFqdnForHosts } = useForemanSettings(); const { response, status } = useAPI( 'get', `/api/hosts/${id}?show_hidden_parameters=true`, @@ -112,7 +114,11 @@ const HostDetails = ({ }} breadcrumbItems={[ { caption: __('Hosts'), url: foremanUrl('/hosts') }, - { caption: response.name }, + { + caption: displayFqdnForHosts + ? response.name + : response.name?.replace(`.${response.domain_name}`, ''), + }, ]} /> )} @@ -136,7 +142,12 @@ const HostDetails = ({ headingLevel="h5" size="2xl" > - {response.name} + {displayFqdnForHosts + ? response.name + : response.name?.replace( + `.${response.domain_name}`, + '' + )} )} diff --git a/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/SettingRecords.fixtures.js b/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/SettingRecords.fixtures.js index e4cffa296a7..8cff673b36e 100644 --- a/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/SettingRecords.fixtures.js +++ b/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/SettingRecords.fixtures.js @@ -58,7 +58,7 @@ export const settings = [ updatedAt: '2018-01-22 14:03:38 +0100', readonly: false, id: 177, - name: 'append_domain_name_for_hosts', + name: 'display_fqdn_for_hosts', fullName: 'Append domain names to the host', selectValues: null, value: true, @@ -250,7 +250,7 @@ export const withHashSelection = settings.find( item => item.name === 'global_PXELinux' ); export const boolSetting = settings.find( - item => item.name === 'append_domain_name_for_hosts' + item => item.name === 'display_fqdn_for_hosts' ); export const arraySetting = settings.find( item => item.name === 'http_proxy_except_list' diff --git a/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsReducer.test.js.snap b/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsReducer.test.js.snap index 426570e3b6b..4d12e0eb2ef 100644 --- a/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsReducer.test.js.snap +++ b/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsReducer.test.js.snap @@ -30,7 +30,7 @@ Object { "encrypted": false, "fullName": "Append domain names to the host", "id": 177, - "name": "append_domain_name_for_hosts", + "name": "display_fqdn_for_hosts", "readonly": false, "selectValues": null, "settingsType": "boolean", @@ -296,7 +296,7 @@ Object { "encrypted": false, "fullName": "Append domain names to the host", "id": 177, - "name": "append_domain_name_for_hosts", + "name": "display_fqdn_for_hosts", "readonly": false, "selectValues": null, "settingsType": "boolean", diff --git a/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsSelectors.test.js.snap b/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsSelectors.test.js.snap index 1698947d4a0..244ca6edcc3 100644 --- a/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsSelectors.test.js.snap +++ b/webpack/assets/javascripts/react_app/components/SettingRecords/__tests__/__snapshots__/SettingRecordsSelectors.test.js.snap @@ -47,7 +47,7 @@ Object { "encrypted": false, "fullName": "Append domain names to the host", "id": 177, - "name": "append_domain_name_for_hosts", + "name": "display_fqdn_for_hosts", "readonly": false, "selectValues": null, "settingsType": "boolean", @@ -299,7 +299,7 @@ Array [ "encrypted": false, "fullName": "Append domain names to the host", "id": 177, - "name": "append_domain_name_for_hosts", + "name": "display_fqdn_for_hosts", "readonly": false, "selectValues": null, "settingsType": "boolean", diff --git a/webpack/assets/javascripts/react_app/components/SettingsTable/__tests__/__snapshots__/SettingsTable.test.js.snap b/webpack/assets/javascripts/react_app/components/SettingsTable/__tests__/__snapshots__/SettingsTable.test.js.snap index ca0f5bb7829..4d2628c75ad 100644 --- a/webpack/assets/javascripts/react_app/components/SettingsTable/__tests__/__snapshots__/SettingsTable.test.js.snap +++ b/webpack/assets/javascripts/react_app/components/SettingsTable/__tests__/__snapshots__/SettingsTable.test.js.snap @@ -88,7 +88,7 @@ exports[`SettingsTable should render 1`] = ` "encrypted": false, "fullName": "Append domain names to the host", "id": 177, - "name": "append_domain_name_for_hosts", + "name": "display_fqdn_for_hosts", "readonly": false, "selectValues": null, "settingsType": "boolean",