From 70cc84a12cb4d47c4665ec3b62a2e3bd2bee2606 Mon Sep 17 00:00:00 2001 From: Rastislav Wagner Date: Tue, 25 Feb 2025 10:37:12 +0100 Subject: [PATCH] MGMT-19591: Update BMH hostname annotation instead of Agent's spec (#2770) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Julie Gyselová --- .../ClusterDeploymentHostDiscoveryTable.tsx | 23 +++++--------- .../ClusterDeploymentHostsDiscovery.tsx | 26 ++++++++++------ .../ClusterDeploymentWizard.tsx | 9 +++--- .../cim/components/ClusterDeployment/types.ts | 13 ++++---- .../InfraEnv/InfraEnvAgentTable.tsx | 23 +++++--------- .../lib/cim/components/helpers/agents.ts | 31 ++++++++++++++++++- .../cim/components/modals/EditAgentModal.tsx | 3 +- .../cim/components/modals/ScaleUpModal.tsx | 14 +++++++-- .../common/components/hosts/EditHostForm.tsx | 1 + 9 files changed, 86 insertions(+), 57 deletions(-) diff --git a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.tsx b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.tsx index 7bbad63b3d..d0f299e03a 100644 --- a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.tsx +++ b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostDiscoveryTable.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import noop from 'lodash-es/noop.js'; import { Stack, StackItem } from '@patternfly/react-core'; import { Host } from '@openshift-assisted/types/assisted-installer-service'; import { @@ -28,13 +27,13 @@ import { } from '../../../common'; import { ClusterDeploymentHostDiscoveryTableProps } from '../ClusterDeployment/types'; import MassApproveAgentModal from '../modals/MassApproveAgentModal'; -import { MassChangeHostnameModalProps } from '../../../common/components/hosts/MassChangeHostnameModal'; import MassApproveAction from '../modals/MassApproveAction'; import { usePagination } from '../../../common/components/hosts/usePagination'; import { useTranslation } from '../../../common/hooks/use-translation-wrapper'; import { ExpandComponent } from '../Agent/AgentsSelectionTable'; import { HostsTableDetailContextProvider } from '../../../common/components/hosts/HostsTableDetailContext'; import { agentStatus, bmhStatus } from '../helpers/agentStatus'; +import { onAgentChangeHostname } from '../helpers'; const ClusterDeploymentHostDiscoveryTable: React.FC = ({ agents, @@ -126,19 +125,6 @@ const ClusterDeploymentHostDiscoveryTable: React.FC, ]; - const onAgentChangeHostname: MassChangeHostnameModalProps['onChangeHostname'] = async ( - host, - hostname, - ) => { - const agent = agents.find((a) => a.metadata?.uid === host.id); - if (agent) { - return onChangeHostname(agent, hostname); - } else { - const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === host.id); - return bmh ? onChangeBMHHostname(bmh, hostname) : noop; - } - }; - const paginationProps = usePagination(hosts.length); const itemIDs = hosts.map((h) => h.id); @@ -185,7 +171,12 @@ const ClusterDeploymentHostDiscoveryTable: React.FC setMassChangeHostOpen(false)} canChangeHostname={canChangeHostname(agents, agentStatuses, bareMetalHosts, t)} /> diff --git a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.tsx b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.tsx index 8ce68912f3..c6f8a783d9 100644 --- a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.tsx +++ b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentHostsDiscovery.tsx @@ -15,7 +15,7 @@ import { HostsNotShowingLink, VMRebootConfigurationInfo, } from '../../../common'; -import { getIsSNOCluster } from '../helpers'; +import { getIsSNOCluster, onAgentChangeHostname } from '../helpers'; import MinimalHWRequirements from '../Agent/MinimalHWRequirements'; import { ClusterDeploymentHostsDiscoveryProps } from './types'; import { EditBMHModal, EditAgentModal } from '../modals'; @@ -57,7 +57,7 @@ const ClusterDeploymentHostsDiscovery: React.FC - setEditAgent(undefined)} - usedHostnames={usedHostnames} - agent={editAgent} - onSave={onSaveAgent} - /> + {editAgent && ( + setEditAgent(undefined)} + usedHostnames={usedHostnames} + agent={editAgent} + onSave={onAgentChangeHostname( + agents, + bareMetalHosts, + onChangeHostname, + onChangeBMHHostname, + )} + /> + )} = ({ clusterDeployment, agentClusterInstall, agents, + bareMetalHosts, clusterImages, aiConfigMap, infraEnv, @@ -37,6 +38,7 @@ const ClusterDeploymentWizard: React.FC = ({ onSaveISOParams, onCreateBMH, isNutanix, + onChangeBMHHostname, ...rest }) => { const [currentStepId, setCurrentStepId] = React.useState( @@ -83,15 +85,12 @@ const ClusterDeploymentWizard: React.FC = ({ clusterDeployment={clusterDeployment} agentClusterInstall={agentClusterInstall} agents={agents} - bareMetalHosts={[] /* TODO(mlibra) */} + bareMetalHosts={bareMetalHosts} aiConfigMap={aiConfigMap} infraEnv={infraEnv} fetchSecret={fetchSecret} onClose={onClose} - onChangeBMHHostname={(bmh, _hostname) => { - // console.log('onChangeBMHHostname is not implemented: ', hostname); - return Promise.resolve(bmh); - }} + onChangeBMHHostname={onChangeBMHHostname} onEditRole={hostActions.onEditRole} onSetInstallationDiskId={hostActions.onSetInstallationDiskId} onDeleteHost={hostActions.onDeleteHost} diff --git a/libs/ui-lib/lib/cim/components/ClusterDeployment/types.ts b/libs/ui-lib/lib/cim/components/ClusterDeployment/types.ts index 01e3770a73..6e6e1cc619 100644 --- a/libs/ui-lib/lib/cim/components/ClusterDeployment/types.ts +++ b/libs/ui-lib/lib/cim/components/ClusterDeployment/types.ts @@ -17,14 +17,13 @@ import { BMCFormProps } from '../Agent/types'; import { AgentMachineK8sResource } from '../Hypershift/types'; import { AddHostDropdownProps, ProvisioningConfigResult } from '../InfraEnv/types'; import { AddHostModalProps, EditBMHModalProps, UploadActionModalProps } from '../modals/types'; +import { Host } from '@openshift-assisted/types/assisted-installer-service'; export type EditAgentModalProps = { - agent: AgentK8sResource | undefined; - isOpen: boolean; + agent: AgentK8sResource; usedHostnames: string[] | undefined; onClose: () => void; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onSave: (agent: AgentK8sResource, hostname: string) => Promise; + onSave: (host: Host, hostname: string) => Promise; }; export type AgentTableActions = { @@ -146,6 +145,7 @@ export type ClusterDeploymentWizardProps = { clusterDeployment: ClusterDeploymentK8sResource; agentClusterInstall: AgentClusterInstallK8sResource; agents: AgentK8sResource[]; + bareMetalHosts: BareMetalHostK8sResource[]; aiConfigMap?: ConfigMapK8sResource; infraEnv?: InfraEnvK8sResource; infraNMStates: NMStateK8sResource[]; @@ -155,7 +155,8 @@ export type ClusterDeploymentWizardProps = { setPreviewOpen: (open: boolean) => void; fetchManagedClusters: () => Promise; fetchKlusterletAddonConfig: () => Promise; - onSaveAgent: EditAgentModalProps['onSave']; + onChangeHostname: ClusterDeploymentHostsDiscoveryStepProps['onChangeHostname']; + onChangeBMHHostname: ClusterDeploymentHostsDiscoveryStepProps['onChangeBMHHostname']; onSaveBMH: EditBMHModalProps['onEdit']; onSaveISOParams?: AddHostModalProps['onSaveISOParams']; onSaveHostsDiscovery: ClusterDeploymentHostsDiscoveryStepProps['onSaveHostsDiscovery']; @@ -225,7 +226,7 @@ export type ClusterDeploymentHostsDiscoveryProps = AddHostDropdownProps & { aiConfigMap?: ConfigMapK8sResource; infraNMStates: NMStateK8sResource[]; - onSaveAgent: EditAgentModalProps['onSave']; + onChangeHostname: InfraEnvAgentTableProps['onChangeHostname']; onEditRole: ClusterDeploymentHostDiscoveryTableProps['onEditRole']; onSetInstallationDiskId: AgentTableActions['onSetInstallationDiskId']; onSaveBMH: EditBMHModalProps['onEdit']; diff --git a/libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx b/libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx index 6ee0db9656..957b8dd5eb 100644 --- a/libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx +++ b/libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvAgentTable.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; import { Button, Stack, StackItem } from '@patternfly/react-core'; import { DropdownItem } from '@patternfly/react-core/deprecated'; -import noop from 'lodash-es/noop.js'; import { Host } from '@openshift-assisted/types/assisted-installer-service'; import { @@ -33,12 +32,12 @@ import { } from '../../../common'; import { InfraEnvAgentTableProps } from '../ClusterDeployment/types'; import { MassApproveAgentModal, MassDeleteAgentModal } from '../modals'; -import { MassChangeHostnameModalProps } from '../../../common/components/hosts/MassChangeHostnameModal'; import MassApproveAction from '../modals/MassApproveAction'; import { usePagination } from '../../../common/components/hosts/usePagination'; import InfraTableToolbar from './InfraTableToolbar'; import { useTranslation } from '../../../common/hooks/use-translation-wrapper'; import { agentStatus, bmhStatus } from '../helpers/agentStatus'; +import { onAgentChangeHostname } from '../helpers'; type NoFilterMatchStateProps = { onClearFilters: VoidFunction; @@ -205,19 +204,6 @@ const InfraEnvAgentTable: React.FC = ({ setMassDeleteOpen(!isMassDeleteOpen)} />, ]; - const onAgentChangeHostname: MassChangeHostnameModalProps['onChangeHostname'] = async ( - host, - hostname, - ) => { - const agent = agents.find((a) => a.metadata?.uid === host.id); - if (agent) { - return onChangeHostname(agent, hostname); - } else { - const bmh = bareMetalHosts.find((bmh) => bmh.metadata?.uid === host.id); - return bmh ? onChangeBMHHostname(bmh, hostname) : noop; - } - }; - const paginationProps = usePagination(hosts.length); return ( @@ -272,7 +258,12 @@ const InfraEnvAgentTable: React.FC = ({ isOpen={isMassChangeHostOpen} hosts={hosts} selectedHostIDs={selectedHostIDs} - onChangeHostname={onAgentChangeHostname} + onChangeHostname={onAgentChangeHostname( + agents, + bareMetalHosts, + onChangeHostname, + onChangeBMHHostname, + )} onClose={() => setMassChangeHostOpen(false)} canChangeHostname={canChangeHostname(agents, agentStatuses, bareMetalHosts, t)} /> diff --git a/libs/ui-lib/lib/cim/components/helpers/agents.ts b/libs/ui-lib/lib/cim/components/helpers/agents.ts index 707fa1713d..41cad091a6 100644 --- a/libs/ui-lib/lib/cim/components/helpers/agents.ts +++ b/libs/ui-lib/lib/cim/components/helpers/agents.ts @@ -1,7 +1,7 @@ import { AgentStatus, getAgentStatusKey } from './status'; import { Host } from '@openshift-assisted/types/assisted-installer-service'; import { AgentK8sResource, BareMetalHostK8sResource } from '../../types'; -import { INFRAENV_AGENTINSTALL_LABEL_KEY } from '../common/constants'; +import { AGENT_BMH_NAME_LABEL_KEY, INFRAENV_AGENTINSTALL_LABEL_KEY } from '../common/constants'; const AGENT_FOR_SELECTION_STATUSES: AgentStatus[] = [ 'known', @@ -33,3 +33,32 @@ export const getInfraEnvNameOfAgent = (resource?: AgentK8sResource | BareMetalHo export const getClusterNameOfAgent = (agent?: AgentK8sResource) => agent?.spec?.clusterDeploymentName?.name; + +type OnAgentChangeHostname = ( + agents: A[], + bmhs: B[], + onChangeHostname: (agent: A, hostname: string) => Promise, + onChangeBMHHostname: (bmh: B, hostname: string) => Promise, +) => (host: Host, hostname: string) => Promise; + +export const onAgentChangeHostname: OnAgentChangeHostname< + AgentK8sResource, + BareMetalHostK8sResource +> = (agents, bmhs, onChangeHostname, onChangeBMHHostname) => (host, hostname) => { + const agent = agents.find((a) => a.metadata?.uid === host.id); + let bmh: BareMetalHostK8sResource | undefined; + if (agent) { + const bmhName = agent.metadata?.labels?.[AGENT_BMH_NAME_LABEL_KEY]; + if (!bmhName) { + return onChangeHostname(agent, hostname); + } + // If Agent is backed by BMH, we need to update hostname on BMH + bmh = bmhs.find( + (bmh) => + bmh.metadata?.namespace === agent.metadata?.namespace && bmh.metadata?.name === bmhName, + ); + } else { + bmh = bmhs.find((bmh) => bmh.metadata?.uid === host.id); + } + return bmh ? onChangeBMHHostname(bmh, hostname) : Promise.resolve(undefined); +}; diff --git a/libs/ui-lib/lib/cim/components/modals/EditAgentModal.tsx b/libs/ui-lib/lib/cim/components/modals/EditAgentModal.tsx index 7a56d099aa..73ae706627 100644 --- a/libs/ui-lib/lib/cim/components/modals/EditAgentModal.tsx +++ b/libs/ui-lib/lib/cim/components/modals/EditAgentModal.tsx @@ -7,11 +7,12 @@ const EditAgentModal: React.FC = ({ agent, onSave, ...rest const [host] = agent ? getAIHosts([agent]) : []; return ( { - agent && (await onSave(agent, hostname)); + agent && (await onSave(host, hostname)); rest.onClose(); }} /> diff --git a/libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx b/libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx index 999a777769..9654631db4 100644 --- a/libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx +++ b/libs/ui-lib/lib/cim/components/modals/ScaleUpModal.tsx @@ -25,6 +25,8 @@ import EditAgentModal from './EditAgentModal'; import { getAgentsHostsNames } from '../ClusterDeployment/helpers'; import { getErrorMessage } from '../../../common/utils'; import { useTranslation } from '../../../common/hooks/use-translation-wrapper'; +import { onAgentChangeHostname } from '../helpers'; +import { BareMetalHostK8sResource } from '../../types'; const getAgentsToAdd = ( selectedHostIds: ScaleUpFormValues['selectedHostIds'] | ScaleUpFormValues['autoSelectedHostIds'], @@ -56,7 +58,9 @@ type ScaleUpModalProps = { addHostsToCluster: (agentsToAdd: AgentK8sResource[]) => Promise; clusterDeployment: ClusterDeploymentK8sResource; agents: AgentK8sResource[]; + bareMetalHosts: BareMetalHostK8sResource[]; onChangeHostname: (agent: AgentK8sResource, hostname: string) => Promise; + onChangeBMHHostname: (bmh: BareMetalHostK8sResource, hostname: string) => Promise; onSetInstallationDiskId: AgentTableActions['onSetInstallationDiskId']; isNutanix: boolean; }; @@ -67,7 +71,9 @@ const ScaleUpModal: React.FC = ({ addHostsToCluster, clusterDeployment, agents, + bareMetalHosts, onChangeHostname, + onChangeBMHHostname, onSetInstallationDiskId, isNutanix, }) => { @@ -176,9 +182,13 @@ const ScaleUpModal: React.FC = ({ {editAgent && ( setEditAgent(undefined)} - onSave={onChangeHostname} + onSave={onAgentChangeHostname( + agents, + bareMetalHosts, + onChangeHostname, + onChangeBMHHostname, + )} usedHostnames={getAgentsHostsNames(clusterAgents)} /> )} diff --git a/libs/ui-lib/lib/common/components/hosts/EditHostForm.tsx b/libs/ui-lib/lib/common/components/hosts/EditHostForm.tsx index 65e990aee5..762af6b606 100644 --- a/libs/ui-lib/lib/common/components/hosts/EditHostForm.tsx +++ b/libs/ui-lib/lib/common/components/hosts/EditHostForm.tsx @@ -134,6 +134,7 @@ const EditHostForm = ({ data-testid="change-hostname-form__button-change" type={ButtonType.submit} isDisabled={isSubmitting || !isValid || !dirty} + isLoading={isSubmitting} > {t('ai:Change')}