Skip to content

Commit

Permalink
Merge pull request #984 from avivtur/fix-os-name-win
Browse files Browse the repository at this point in the history
Bug 2136425: Windows 11 is detected as Windows 10
  • Loading branch information
openshift-merge-robot committed Nov 27, 2022
2 parents 5b24f55 + 1f25246 commit 3f7f88d
Show file tree
Hide file tree
Showing 9 changed files with 137 additions and 59 deletions.
4 changes: 3 additions & 1 deletion src/utils/components/Timestamp/utils/datetime.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NO_DATA_DASH } from '@kubevirt-utils/resources/vm/utils/constants';

import {
DAY,
HOUR,
Expand Down Expand Up @@ -113,7 +115,7 @@ export const fromNow = (dateTime: string | Date, now?: Date, options?) => {

export const timestampFor = (mdate: Date, now: Date, omitSuffix: boolean) => {
if (!isValid(mdate)) {
return '-';
return NO_DATA_DASH;
}

const timeDifference = now.getTime() - mdate.getTime();
Expand Down
2 changes: 1 addition & 1 deletion src/utils/resources/vm/hooks/useVMIAndPodsForVM.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const useVMIAndPodsForVM = (
const error = vmiLoadError || podsLoadError;

return {
vmi,
vmi: vmName === vmi?.metadata?.name && vmNamespace === vmi?.metadata?.namespace && vmi,
pods,
loaded,
error,
Expand Down
12 changes: 11 additions & 1 deletion src/utils/resources/vmi/utils/guest-agent.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
import { V1VirtualMachineInstance } from '@kubevirt-ui/kubevirt-api/kubevirt';
import {
V1VirtualMachineInstance,
V1VirtualMachineInstanceGuestAgentInfo,
} from '@kubevirt-ui/kubevirt-api/kubevirt';

export const isGuestAgentConnected = (vmi: V1VirtualMachineInstance): boolean =>
vmi?.status?.conditions?.some(
(condition) => condition?.type === 'AgentConnected' && condition?.status === 'True',
);

export const getOsNameFromGuestAgent = (
guestAgentData: V1VirtualMachineInstanceGuestAgentInfo,
): string =>
guestAgentData?.os?.name?.includes('Windows') && guestAgentData?.os?.version?.includes('Windows')
? guestAgentData?.os?.version
: `${guestAgentData?.os?.name} ${guestAgentData?.os?.version}`;
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ import {
VM_TEMPLATE_ANNOTATION,
} from '@kubevirt-utils/resources/vm';
import { NO_DATA_DASH } from '@kubevirt-utils/resources/vm/utils/constants';
import { useGuestOS } from '@kubevirt-utils/resources/vmi';
import { getOsNameFromGuestAgent, useGuestOS } from '@kubevirt-utils/resources/vmi';
import { isEmpty } from '@kubevirt-utils/utils/utils';
import {
k8sPatch,
k8sUpdate,
Expand All @@ -55,7 +56,7 @@ const VirtualMachineDetailsLeftGrid: React.FC<VirtualMachineDetailsLeftGridProps

const accessReview = asAccessReview(VirtualMachineModel, vm, 'update' as K8sVerb);
const [canUpdateVM] = useAccessReview(accessReview || {});
const [guestAgentData] = useGuestOS(vmi);
const [guestAgentData, loadedGuestAgent] = useGuestOS(vmi);
const firmwareBootloaderTitle = getBootloaderTitleFromVM(vm, t);
const templateName = getLabel(vm, VM_TEMPLATE_ANNOTATION);
const templateNamespace = getLabel(vm, LABEL_USED_TEMPLATE_NAMESPACE);
Expand Down Expand Up @@ -208,8 +209,9 @@ const VirtualMachineDetailsLeftGrid: React.FC<VirtualMachineDetailsLeftGridProps
/>
<VirtualMachineDescriptionItem
descriptionData={
guestAgentData?.os?.prettyName ||
guestAgentData?.os?.name || <GuestAgentIsRequiredText vmi={vmi} />
(loadedGuestAgent &&
!isEmpty(guestAgentData) &&
getOsNameFromGuestAgent(guestAgentData)) || <GuestAgentIsRequiredText vmi={vmi} />
}
isPopover
// body-content text copied from:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as React from 'react';
import React, { FC, useMemo } from 'react';

import { modelToGroupVersionKind, TemplateModel } from '@kubevirt-ui/kubevirt-api/console';
import { V1VirtualMachine } from '@kubevirt-ui/kubevirt-api/kubevirt';
Expand All @@ -9,12 +9,11 @@ import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTransla
import { getLabel } from '@kubevirt-utils/resources/shared';
import { LABEL_USED_TEMPLATE_NAMESPACE } from '@kubevirt-utils/resources/template';
import { useVMIAndPodsForVM, VM_TEMPLATE_ANNOTATION } from '@kubevirt-utils/resources/vm';
import { useGuestOS } from '@kubevirt-utils/resources/vmi';
import { NO_DATA_DASH } from '@kubevirt-utils/resources/vm/utils/constants';
import { getOsNameFromGuestAgent, useGuestOS } from '@kubevirt-utils/resources/vmi';
import { isEmpty } from '@kubevirt-utils/utils/utils';
import { ResourceLink } from '@openshift-console/dynamic-plugin-sdk';
import {
Button,
ButtonVariant,
Card,
CardBody,
DescriptionList,
Expand All @@ -25,15 +24,15 @@ import {
Grid,
GridItem,
pluralize,
Popover,
PopoverPosition,
Skeleton,
} from '@patternfly/react-core';

import { getVMStatusIcon, printableVMStatus } from '../../../../../utils';
import { printableVMStatus } from '../../../../../utils';
import CPUMemory from '../../../details/components/CPUMemory/CPUMemory';

import MigrationProgressPopover from './components/MigrationProgressPopover/MigrationProgressPopover';
import StatusPopoverButton from './components/StatusPopoverButton/StatusPopoverButton';
import VirtualMachineOverviewStatus from './components/VirtualMachineOverviewStatus/VirtualMachineOverviewStatus';
import VirtualMachinesOverviewTabDetailsConsole from './components/VirtualMachinesOverviewTabDetailsConsole';
import VirtualMachinesOverviewTabDetailsTitle from './components/VirtualMachinesOverviewTabDetailsTitle';

Expand All @@ -43,13 +42,10 @@ type VirtualMachinesOverviewTabDetailsProps = {
vm: V1VirtualMachine;
};

const VirtualMachinesOverviewTabDetails: React.FC<VirtualMachinesOverviewTabDetailsProps> = ({
vm,
}) => {
const VirtualMachinesOverviewTabDetails: FC<VirtualMachinesOverviewTabDetailsProps> = ({ vm }) => {
const { t } = useKubevirtTranslation();
const { vmi } = useVMIAndPodsForVM(vm?.metadata?.name, vm?.metadata?.namespace);
const [guestAgentData, loaded] = useGuestOS(vmi);
const Icon = getVMStatusIcon(vm?.status?.printableStatus);
const { vmi, loaded } = useVMIAndPodsForVM(vm?.metadata?.name, vm?.metadata?.namespace);
const [guestAgentData, loadedGuestAgent] = useGuestOS(vmi);
const templateName = getLabel(vm, VM_TEMPLATE_ANNOTATION);
const templateNamespace = getLabel(vm, LABEL_USED_TEMPLATE_NAMESPACE);
const None = <MutedTextSpan text={t('None')} />;
Expand All @@ -59,26 +55,25 @@ const VirtualMachinesOverviewTabDetails: React.FC<VirtualMachinesOverviewTabDeta
new Date(Date.now()),
true,
);
const timestampPluralized = pluralize(timestamp['value'], timestamp['time']);

const guestAgentIsRequired = <GuestAgentIsRequiredText vmi={vmi} />;

const osName =
loaded && !isEmpty(guestAgentData)
? `${guestAgentData?.os?.name} ${guestAgentData?.os?.version}`
: guestAgentIsRequired;
const timestampPluralized = pluralize(timestamp['value'], timestamp['time']);

const hostname = guestAgentData?.hostname ?? guestAgentIsRequired;
const { osName, hostname, fallback } = useMemo(() => {
if (!loadedGuestAgent || !loaded)
return {
fallback: <Skeleton />,
};
if (!isEmpty(guestAgentData))
return {
osName: getOsNameFromGuestAgent(guestAgentData),
hostname: guestAgentData?.hostname,
};
return {
fallback: <GuestAgentIsRequiredText vmi={vmi} />,
};
}, [guestAgentData, loadedGuestAgent, vmi, loaded]);

const vmPrintableStatus = vm?.status?.printableStatus;
const popoverButton = (
<span>
<Icon />{' '}
<Button variant={ButtonVariant.link} isInline>
{vmPrintableStatus}
</Button>
</span>
);

return (
<div className="VirtualMachinesOverviewTabDetails--details">
Expand All @@ -93,37 +88,33 @@ const VirtualMachinesOverviewTabDetails: React.FC<VirtualMachinesOverviewTabDeta
<DescriptionListTerm>{t('Name')}</DescriptionListTerm>
<DescriptionListDescription data-test-id="virtual-machine-overview-details-name">
{' '}
{vm?.metadata?.name}
{vm?.metadata?.name || NO_DATA_DASH}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{t('Status')}</DescriptionListTerm>
<DescriptionListDescription data-test-id="virtual-machine-overview-details-status">
{vmPrintableStatus !== printableVMStatus.Migrating ? (
<Popover
headerContent={vmPrintableStatus}
bodyContent={t('VirtualMachine is currently {{status}}', {
status: vmPrintableStatus,
})}
position={PopoverPosition.right}
>
{popoverButton}
</Popover>
<VirtualMachineOverviewStatus vmPrintableStatus={vmPrintableStatus} />
) : (
<MigrationProgressPopover vmi={vmi}>{popoverButton}</MigrationProgressPopover>
<MigrationProgressPopover vmi={vmi}>
<StatusPopoverButton vmPrintableStatus={vmPrintableStatus} />
</MigrationProgressPopover>
)}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{t('Created')}</DescriptionListTerm>
<DescriptionListDescription data-test-id="virtual-machine-overview-details-created">
{t('{{timestampPluralized}} ago', { timestampPluralized })}
{timestamp !== NO_DATA_DASH
? t('{{timestampPluralized}} ago', { timestampPluralized })
: NO_DATA_DASH}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{t('Operating system')}</DescriptionListTerm>
<DescriptionListDescription data-test-id="virtual-machine-overview-details-os">
{loaded ? osName : <Skeleton />}
{osName ?? fallback}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
Expand All @@ -135,7 +126,7 @@ const VirtualMachinesOverviewTabDetails: React.FC<VirtualMachinesOverviewTabDeta
<DescriptionListGroup>
<DescriptionListTerm>{t('Hostname')}</DescriptionListTerm>
<DescriptionListDescription data-test-id="virtual-machine-overview-details-host">
{loaded ? hostname : <Skeleton />}
{hostname ?? fallback}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import React, { FC } from 'react';

import { Button, ButtonVariant } from '@patternfly/react-core';
import { getVMStatusIcon } from '@virtualmachines/utils';

type StatusPopoverButtonProps = {
vmPrintableStatus: string;
};

const StatusPopoverButton: FC<StatusPopoverButtonProps> = ({ vmPrintableStatus }) => {
if (!vmPrintableStatus) return null;

const Icon = getVMStatusIcon(vmPrintableStatus);

return (
<span>
<Icon />{' '}
<Button variant={ButtonVariant.link} isInline>
{vmPrintableStatus}
</Button>
</span>
);
};

export default StatusPopoverButton;
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import React, { FC } from 'react';

import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
import { NO_DATA_DASH } from '@kubevirt-utils/resources/vm/utils/constants';
import { Popover, PopoverPosition } from '@patternfly/react-core';

import StatusPopoverButton from '../StatusPopoverButton/StatusPopoverButton';

type VirtualMachineOverviewStatusProps = {
vmPrintableStatus: string;
};

const VirtualMachineOverviewStatus: FC<VirtualMachineOverviewStatusProps> = ({
vmPrintableStatus,
}) => {
const { t } = useKubevirtTranslation();
if (!vmPrintableStatus) return <>{NO_DATA_DASH}</>;

return (
<>
<Popover
headerContent={vmPrintableStatus}
bodyContent={t('VirtualMachine is currently {{status}}', {
status: vmPrintableStatus,
})}
position={PopoverPosition.right}
>
<StatusPopoverButton vmPrintableStatus={vmPrintableStatus} />
</Popover>
</>
);
};

export default VirtualMachineOverviewStatus;
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ type DetailsProps = {

const Details: React.FC<DetailsProps> = ({ vmi, pathname }) => {
const { t } = useKubevirtTranslation();
const [guestAgentData] = useGuestOS(vmi);
const [guestAgentData, loadedGuestAgent] = useGuestOS(vmi);
const [vm] = useK8sWatchResource<V1VirtualMachine>({
groupVersionKind: VirtualMachineModelGroupVersionKind,
name: vmi?.metadata?.name,
Expand Down Expand Up @@ -82,7 +82,11 @@ const Details: React.FC<DetailsProps> = ({ vmi, pathname }) => {
<Description vmi={vmi} />
</DescriptionListGroup>
<DescriptionListGroup>
<OperatingSystem vmi={vmi} />
<OperatingSystem
vmi={vmi}
guestAgentData={guestAgentData}
loadedGuestAgent={loadedGuestAgent}
/>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{t('CPU | Memory')}</DescriptionListTerm>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,34 @@
import * as React from 'react';

import { V1VirtualMachineInstance } from '@kubevirt-ui/kubevirt-api/kubevirt';
import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
import {
getOperatingSystem,
getOperatingSystemName,
} from '@kubevirt-utils/resources/vm/utils/operation-system/operationSystem';
V1VirtualMachineInstance,
V1VirtualMachineInstanceGuestAgentInfo,
} from '@kubevirt-ui/kubevirt-api/kubevirt';
import GuestAgentIsRequiredText from '@kubevirt-utils/components/GuestAgentIsRequiredText/GuestAgentIsRequiredText';
import { useKubevirtTranslation } from '@kubevirt-utils/hooks/useKubevirtTranslation';
import { getOsNameFromGuestAgent } from '@kubevirt-utils/resources/vmi';
import { isEmpty } from '@kubevirt-utils/utils/utils';
import { DescriptionListDescription, DescriptionListTerm } from '@patternfly/react-core';

type OperatingSystemProps = {
vmi: V1VirtualMachineInstance;
guestAgentData: V1VirtualMachineInstanceGuestAgentInfo;
loadedGuestAgent: boolean;
};

const OperatingSystem: React.FC<OperatingSystemProps> = ({ vmi }) => {
const OperatingSystem: React.FC<OperatingSystemProps> = ({
vmi,
guestAgentData,
loadedGuestAgent,
}) => {
const { t } = useKubevirtTranslation();
return (
<>
<DescriptionListTerm>{t('Operating system')}</DescriptionListTerm>
<DescriptionListDescription>
{getOperatingSystemName(vmi) || getOperatingSystem(vmi)}
{(loadedGuestAgent &&
!isEmpty(guestAgentData) &&
getOsNameFromGuestAgent(guestAgentData)) || <GuestAgentIsRequiredText vmi={vmi} />}
</DescriptionListDescription>
</>
);
Expand Down

0 comments on commit 3f7f88d

Please sign in to comment.