Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug 1834671: Acknowledge strategies when computing if VM is running #5619

Merged
merged 1 commit into from
May 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {
import { ByteDataTypes } from '@console/shared/src/graph-helper/data-utils';
import { VMDashboardContext } from '../../vms/vm-dashboard-context';
import { findVMIPod } from '../../../selectors/pod/selectors';
import { isVMRunningWithVMI } from '../../../selectors/vm';
import { isVMCreated } from '../../../selectors/vm';
import { getUtilizationQueries, getMultilineUtilizationQueries, VMQueries } from './queries';
import { getPrometheusQueryEndTimestamp } from '@console/internal/components/graphs/helpers';

Expand Down Expand Up @@ -52,7 +52,7 @@ export const VMUtilizationCard: React.FC = () => {
const vmName = getName(vmiLike);
const namespace = getNamespace(vmiLike);
const launcherPodName = getName(findVMIPod(vmi, pods));
const vmIsRunning = isVMRunningWithVMI({ vm, vmi });
const vmiIsRunning = isVMCreated(vm) && !!vmi;

const queries = React.useMemo(
() =>
Expand Down Expand Up @@ -93,7 +93,7 @@ export const VMUtilizationCard: React.FC = () => {
adjustDuration={adjustDuration}
setTimestamps={setTimestamps}
namespace={namespace}
isDisabled={!vmIsRunning}
isDisabled={!vmiIsRunning}
/>
<PrometheusUtilizationItem
title="Memory"
Expand All @@ -103,7 +103,7 @@ export const VMUtilizationCard: React.FC = () => {
duration={duration}
namespace={namespace}
adjustDuration={adjustDuration}
isDisabled={!vmIsRunning}
isDisabled={!vmiIsRunning}
/>
<PrometheusUtilizationItem
title="Filesystem"
Expand All @@ -113,7 +113,7 @@ export const VMUtilizationCard: React.FC = () => {
duration={duration}
namespace={namespace}
adjustDuration={adjustDuration}
isDisabled={!vmIsRunning}
isDisabled={!vmiIsRunning}
/>
<PrometheusMultilineUtilizationItem
title="Network Transfer"
Expand All @@ -123,7 +123,7 @@ export const VMUtilizationCard: React.FC = () => {
duration={duration}
namespace={namespace}
adjustDuration={adjustDuration}
isDisabled={!vmIsRunning}
isDisabled={!vmiIsRunning}
/>
</UtilizationBody>
</DashboardCard>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
getPVCSourceByDisk,
getStorageSizeByDisk,
getStorageClassNameByDisk,
isVMRunning,
isVMRunningOrExpectedRunning,
} from '../../../selectors/vm/selectors';
import { isValidationError, validateURL } from '../../../utils/validations/common';
import { VMLikeEntityKind } from '../../../types/vmLike';
Expand Down Expand Up @@ -179,7 +179,7 @@ export const CDRomModal = withHandlePromise((props: CDRomModalProps) => {
<div className="modal-content">
<ModalTitle>Edit CD-ROMs</ModalTitle>
<ModalBody>
{showRestartAlert && isVMRunning(vm) && (
{showRestartAlert && isVMRunningOrExpectedRunning(vm) && (
<Alert
variant="info"
isInline
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {
getVolumeDataVolumeName,
getVolumePersistentVolumeClaimName,
getVolumes,
isVMRunning,
isVMExpectedRunning,
} from '../../../selectors/vm';
import { VIRTUAL_MACHINE_EXISTS } from '../../../utils/validations/strings';
import { Errors } from '../../errors/errors';
Expand Down Expand Up @@ -108,7 +108,7 @@ export const CloneVMModal = withHandlePromise((props: CloneVMModalProps) => {
};

const vmRunningWarning =
isVMRunning(vm) &&
isVMExpectedRunning(vm) &&
`The VM ${getName(vm)} is still running. It will be powered off while cloning.`;

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { DASH, dimensifyRow, getDeletetionTimestamp } from '@console/shared';
import { TemplateModel } from '@console/internal/models';
import { deleteDiskModal } from '../modals/delete-disk-modal/delete-disk-modal';
import { VMLikeEntityKind } from '../../types/vmLike';
import { asVM, isVMRunning } from '../../selectors/vm';
import { asVM, isVMRunningOrExpectedRunning } from '../../selectors/vm';
import { isVM, isVMI } from '../../selectors/check-type';
import { VirtualMachineModel } from '../../models';
import { ValidationCell } from '../table/validation-cell';
Expand Down Expand Up @@ -78,7 +78,7 @@ const getActions = (
opts: VMStorageRowActionOpts,
) => {
const actions = [];
if (isVMI(vmLikeEntity) || isVMRunning(asVM(vmLikeEntity))) {
if (isVMI(vmLikeEntity) || isVMRunningOrExpectedRunning(asVM(vmLikeEntity))) {
return actions;
}

Expand Down Expand Up @@ -181,7 +181,7 @@ export const DiskRow: RowFunction<StorageBundle, VMStorageRowCustomData> = ({
isDisabled ||
isVMI(vmLikeEntity) ||
!!getDeletetionTimestamp(vmLikeEntity) ||
isVMRunning(asVM(vmLikeEntity))
isVMRunningOrExpectedRunning(asVM(vmLikeEntity))
}
id={`kebab-for-${disk.getName()}`}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
getTemplateValidationsFromTemplate,
} from '../../selectors/vm-template/selectors';
import { diskSourceFilter } from './table-filters';
import { asVM, isVMRunningOrExpectedRunning } from '../../selectors/vm';

const getStoragesData = ({
vmLikeEntity,
Expand Down Expand Up @@ -162,7 +163,7 @@ export const VMDisks: React.FC<VMDisksProps> = ({ vmLikeEntity, vmTemplate }) =>
createButtonText={ADD_DISK}
canCreate={!isVMI(vmLikeEntity)}
createProps={{
isDisabled: isLocked,
isDisabled: isLocked || isVMRunningOrExpectedRunning(asVM(vmLikeEntity)),
onClick: createFn,
id: 'add-disk',
}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { TemplateModel } from '@console/internal/models';
import { DASH, dimensifyRow, getDeletetionTimestamp } from '@console/shared';
import { deleteNICModal } from '../modals/delete-nic-modal/delete-nic-modal';
import { VirtualMachineModel } from '../../models';
import { asVM, isVMRunning } from '../../selectors/vm';
import { asVM, isVMRunningOrExpectedRunning } from '../../selectors/vm';
import { isVM, isVMI } from '../../selectors/check-type';
import { VMLikeEntityKind } from '../../types/vmLike';
import { nicModalEnhanced } from '../modals/nic-modal/nic-modal-enhanced';
Expand Down Expand Up @@ -58,7 +58,7 @@ const menuActionDelete = (
});

const getActions = (nic, network, vmLikeEntity: VMLikeEntityKind, opts: VMNicRowActionOpts) => {
if (isVMI(vmLikeEntity) || isVMRunning(asVM(vmLikeEntity))) {
if (isVMI(vmLikeEntity) || isVMRunningOrExpectedRunning(asVM(vmLikeEntity))) {
return [];
}
const actions = [menuActionEdit, menuActionDelete];
Expand Down Expand Up @@ -126,7 +126,7 @@ export const NicRow: RowFunction<NetworkBundle, VMNicRowCustomData> = ({
isDisabled ||
isVMI(vmLikeEntity) ||
!!getDeletetionTimestamp(vmLikeEntity) ||
isVMRunning(asVM(vmLikeEntity))
isVMRunningOrExpectedRunning(asVM(vmLikeEntity))
}
id={`kebab-for-${name}`}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { NetworkBundle } from './types';
import { nicTableColumnClasses } from './utils';
import { asVMILikeWrapper } from '../../k8s/wrapper/utils/convert';
import { ADD_NETWORK_INTERFACE } from '../../utils/strings';
import { asVM, isVMRunningOrExpectedRunning } from '../../selectors/vm';

const getNicsData = (vmLikeEntity: VMGenericLikeEntityKind): NetworkBundle[] => {
const vmiLikeWrapper = asVMILikeWrapper(vmLikeEntity);
Expand Down Expand Up @@ -126,7 +127,7 @@ export const VMNics: React.FC<VMLikeEntityTabProps> = ({ obj: vmLikeEntity }) =>
}).result,
)
}
isDisabled={isLocked}
isDisabled={isLocked || isVMRunningOrExpectedRunning(asVM(vmLikeEntity))}
>
{ADD_NETWORK_INTERFACE}
</Button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ import { getName, getNamespace } from '@console/shared';
import { confirmModal, deleteModal } from '@console/internal/components/modals';
import { ModifyApplication } from '@console/dev-console/src/actions/modify-application';
import { VMIKind, VMKind } from '../../types/vm';
import { isVMRunning, isVMRunningWithVMI } from '../../selectors/vm';
import {
isVMCreated,
isVMExpectedRunning,
isVMRunningOrExpectedRunning,
} from '../../selectors/vm/selectors';
import { getMigrationVMIName } from '../../selectors/vmi-migration';
import { VirtualMachineInstanceMigrationModel } from '../../models';
import { restartVM, startVM, stopVM, VMActionType } from '../../k8s/requests/vm';
Expand Down Expand Up @@ -44,7 +48,7 @@ export const menuActionStart = (
hidden:
vmStatusBundle?.status?.isImporting() ||
vmStatusBundle?.status?.isMigrating() ||
isVMRunning(vm),
isVMRunningOrExpectedRunning(vm),
label: title,
callback: () => startVM(vm),
accessReview: asAccessReview(kindObj, vm, 'patch'),
Expand All @@ -54,7 +58,7 @@ export const menuActionStart = (
const menuActionStop = (kindObj: K8sKind, vm: VMKind): KebabOption => {
const title = 'Stop Virtual Machine';
return {
hidden: !isVMRunning(vm),
hidden: !isVMExpectedRunning(vm),
label: title,
callback: () =>
confirmModal({
Expand All @@ -70,14 +74,15 @@ const menuActionStop = (kindObj: K8sKind, vm: VMKind): KebabOption => {
const menuActionRestart = (
kindObj: K8sKind,
vm: VMKind,
{ vmStatusBundle, vmi }: ActionArgs,
{ vmStatusBundle }: ActionArgs,
): KebabOption => {
const title = 'Restart Virtual Machine';
return {
hidden:
vmStatusBundle?.status?.isImporting() ||
vmStatusBundle?.status?.isMigrating() ||
!isVMRunningWithVMI({ vm, vmi }),
!isVMExpectedRunning(vm) ||
!isVMCreated(vm),
label: title,
callback: () =>
confirmModal({
Expand Down Expand Up @@ -115,7 +120,8 @@ const menuActionMigrate = (
hidden:
vmStatusBundle?.status?.isImporting() ||
vmStatusBundle?.status?.isMigrating() ||
!isVMRunningWithVMI({ vm, vmi }),
!isVMExpectedRunning(vm) ||
!isVMCreated(vm),
label: title,
callback: () =>
confirmModal({
Expand Down Expand Up @@ -180,7 +186,7 @@ const menuActionCdEdit = (
hidden:
vmStatusBundle?.status?.isImporting() ||
vmStatusBundle?.status?.isMigrating() ||
isVMRunning(vm),
isVMRunningOrExpectedRunning(vm),
label: 'Edit CD-ROMs',
callback: () => VMCDRomModal({ vmLikeEntity: vm, modalClassName: 'modal-lg' }),
accessReview: asAccessReview(kindObj, vm, 'patch'),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { AccessConsoles, VncConsole } from '@patternfly/react-console';
import { AccessConsoles, VncConsole } from '@patternfly/react-console/dist/js';
import { Firehose, FirehoseResult, LoadingInline } from '@console/internal/components/utils';
import { getNamespace } from '@console/shared';
import { PodKind } from '@console/internal/module/k8s';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export const VMEnvironmentFooter: React.FC<VMEnvironmentFooterProps> = ({
errorMsg,
isSuccess,
isSaveBtnDisabled,
isReloadBtnDisabled,
}) => {
return (
<footer className="co-m-btn-bar">
Expand All @@ -17,7 +18,7 @@ export const VMEnvironmentFooter: React.FC<VMEnvironmentFooterProps> = ({
<Button isDisabled={isSaveBtnDisabled} type="submit" variant="primary" onClick={save}>
Save
</Button>
<Button isDisabled={false} type="button" variant="secondary" onClick={reload}>
<Button isDisabled={isReloadBtnDisabled} type="button" variant="secondary" onClick={reload}>
Reload
</Button>
</ActionGroup>
Expand All @@ -31,4 +32,5 @@ type VMEnvironmentFooterProps = {
errorMsg: string;
isSuccess: boolean;
isSaveBtnDisabled: boolean;
isReloadBtnDisabled: boolean;
};
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import {
withHandlePromise,
} from '@console/internal/components/utils';
import { VMTabProps } from '../types';
import { getVMLikeModel } from '../../../selectors/vm';
import { getVMLikeModel, isVMRunningOrExpectedRunning } from '../../../selectors/vm';
import { isVM } from '../../../selectors/check-type';
import * as _ from 'lodash';
import {
Expand Down Expand Up @@ -146,6 +146,7 @@ const VMEnvironment = withHandlePromise<VMEnvironmentProps>(
const serviceAccounts = serviceAccountsResource?.data;
const template = templateResource?.data;
const vmWrapper = new VMWrapper(vm);
const isVMRunning = isVMRunningOrExpectedRunning(vm);

const [errMsg, setErrMsg] = React.useState(errorMessage);
const [isSuccess, setIsSuccess] = React.useState(false);
Expand Down Expand Up @@ -397,6 +398,7 @@ const VMEnvironment = withHandlePromise<VMEnvironmentProps>(
: toListObj(serviceAccountList, []);

const addButtonDisabled =
isVMRunning ||
envDisks.length >= configMaps?.length + secrets?.length + serviceAccounts?.length;

return (
Expand All @@ -413,7 +415,7 @@ const VMEnvironment = withHandlePromise<VMEnvironmentProps>(
nameValueId={0}
nameValuePairs={envDisks}
updateParentData={updateEnvDisks}
readOnly={false}
readOnly={isVMRunning}
configMaps={availableConfigMaps}
secrets={availableSecrets}
serviceAccounts={availableServiceAccounts}
Expand All @@ -429,7 +431,8 @@ const VMEnvironment = withHandlePromise<VMEnvironmentProps>(
reload={onReload}
errorMsg={errMsg}
isSuccess={isSuccess}
isSaveBtnDisabled={isSaveBtnDisabled()}
isSaveBtnDisabled={isVMRunning || isSaveBtnDisabled()}
isReloadBtnDisabled={isVMRunning}
/>
</div>
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ import { EditButton } from '../edit-button';
import { VMStatus } from '../vm-status/vm-status';
import { DiskSummary } from '../vm-disks/disk-summary';
import { BootOrderSummary } from '../boot-order';
import { getOperatingSystemName, getOperatingSystem } from '../../selectors/vm';
import {
getOperatingSystemName,
getOperatingSystem,
isVMRunningOrExpectedRunning,
} from '../../selectors/vm';
import { getVmiIpAddresses } from '../../selectors/vmi/ip-address';
import { findVMIPod } from '../../selectors/pod/selectors';
import { isVMIPaused, getVMINodeName } from '../../selectors/vmi';
Expand Down Expand Up @@ -122,7 +126,11 @@ export const VMDetailsList: React.FC<VMResourceListProps> = ({
const vmiLike = isVM ? vm : vmi;
const vmiLikeWrapper = asVMILikeWrapper(vmiLike);

const canEdit = vmiLike && canUpdateVM && kindObj !== VirtualMachineInstanceModel;
const canEdit =
vmiLike &&
canUpdateVM &&
kindObj !== VirtualMachineInstanceModel &&
!isVMRunningOrExpectedRunning(vm);

const [isStatusModalOpen, setStatusModalOpen] = React.useState<boolean>(false);

Expand Down Expand Up @@ -219,7 +227,11 @@ export const VMSchedulingList: React.FC<VMSchedulingListProps> = ({
const isVM = kindObj === VirtualMachineModel;
const vmiLike = isVM ? vm : vmi;
const vmiLikeWrapper = asVMILikeWrapper(vmiLike);
const canEdit = vmiLike && canUpdateVM && kindObj !== VirtualMachineInstanceModel;
const canEdit =
vmiLike &&
canUpdateVM &&
kindObj !== VirtualMachineInstanceModel &&
!isVMRunningOrExpectedRunning(vm);

const id = getBasicID(vmiLike);
const flavorText = getFlavorText({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export const VIRT_LAUNCHER_POD_PREFIX = 'virt-launcher-';
export const BUS_VIRTIO = 'virtio';
export const READABLE_VIRTIO = 'VirtIO';
export const ANNOTATION_FIRST_BOOT = 'kubevirt.ui/firstBoot';
export const ANNOTATION_DESCRIPTION = 'description';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export class VMStatus extends StatusEnum<VMStatusSimpleLabel | StatusSimpleLabel
isInProgress: true,
});
static readonly VM_ERROR = new VMStatus('VMStatus_VM_ERROR', 'VM error', { isError: true });
static readonly VMI_ERROR = new VMStatus('VMStatus_VMI_ERROR', 'VMI error', { isError: true });
static readonly POD_ERROR = new VMStatus('VMStatus_POD_ERROR', 'Pod error', { isError: true });
static readonly CDI_IMPORT_ERROR = new VMStatus('VMStatus_CDI_IMPORT_ERROR', 'Import error', {
isError: true,
Expand Down
11 changes: 11 additions & 0 deletions frontend/packages/kubevirt-plugin/src/constants/vm/vm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export enum RunStrategy {
Always = 'Always',
RerunOnFailure = 'RerunOnFailure',
Halted = 'Halted',
Manual = 'Manual',
}

export enum StateChangeRequest {
Start = 'Start',
Stop = 'Stop',
}