Skip to content

Commit

Permalink
Add disk validation to virtual hardware
Browse files Browse the repository at this point in the history
Signed-off-by: Ido Rosenzwig <irosenzw@redhat.com>
  • Loading branch information
irosenzw committed Feb 9, 2020
1 parent d1b93e4 commit 7b00a8d
Show file tree
Hide file tree
Showing 13 changed files with 109 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,14 @@ import {
} from './validations/vm-settings-tab-validation';
import { setNetworksTabValidity, validateNetworks } from './validations/networks-tab-validation';
import { setStoragesTabValidity, validateStorages } from './validations/storage-tab-validation';
import { setVirtualHardwareTabValidity } from './validations/virtual-hardware-tab-validation';

const UPDATE_TABS = [VMWizardTab.VM_SETTINGS, VMWizardTab.NETWORKING, VMWizardTab.STORAGE];
const UPDATE_TABS = [
VMWizardTab.VM_SETTINGS,
VMWizardTab.NETWORKING,
VMWizardTab.STORAGE,
VMWizardTab.ADVANCED_VIRTUAL_HARDWARE,
];

const updaterResolver = {
[VMWizardTab.VM_SETTINGS]: updateVmSettingsState,
Expand All @@ -27,6 +33,7 @@ const isTabValidResolver = {
[VMWizardTab.VM_SETTINGS]: setVmSettingsTabValidity,
[VMWizardTab.NETWORKING]: setNetworksTabValidity,
[VMWizardTab.STORAGE]: setStoragesTabValidity,
[VMWizardTab.ADVANCED_VIRTUAL_HARDWARE]: setVirtualHardwareTabValidity,
};

export const updateAndValidateState = (options: UpdateOptions) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ export const validateStorages = (options: UpdateOptions) => {
export const setStoragesTabValidity = (options: UpdateOptions) => {
const { id, dispatch, getState } = options;
const state = getState();
const iStorages = iGetStorages(state, id);

const iStorages = iGetStorages(state, id).filter((iStorage) =>
iGetIn(iStorage, ['disk', 'disk']),
);
let error = null;

let hasAllRequiredFilled = iStorages.every((iStorage) =>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { VMWizardTab } from '../../types';
import { InternalActionType, UpdateOptions } from '../types';
import { vmWizardInternalActions } from '../internal-actions';
import { iGetIn } from '../../../../utils/immutable';
import { checkTabValidityChanged } from '../../selectors/immutable/selectors';
import { iGetStorages } from '../../selectors/immutable/storage';

export const setVirtualHardwareTabValidity = (options: UpdateOptions) => {
const { id, dispatch, getState } = options;
const state = getState();

const iStorages = iGetStorages(state, id).filter((iStorage) =>
iGetIn(iStorage, ['disk', 'cdrom']),
);

const hasAllRequiredFilled = iStorages.every((iStorage) =>
iGetIn(iStorage, ['validation', 'hasAllRequiredFilled']),
);

let isValid = hasAllRequiredFilled;

if (isValid) {
isValid = iStorages.every((iStorage) => iGetIn(iStorage, ['validation', 'isValid']));
}

if (
checkTabValidityChanged(
state,
id,
VMWizardTab.ADVANCED_VIRTUAL_HARDWARE,
isValid,
hasAllRequiredFilled,
null,
)
) {
dispatch(
vmWizardInternalActions[InternalActionType.SetTabValidity](
id,
VMWizardTab.ADVANCED_VIRTUAL_HARDWARE,
isValid,
hasAllRequiredFilled,
null,
),
);
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import { VMSettingsField, VMWizardProps } from '../types';
import { iGetLoadedCommonData } from './immutable/selectors';
import { iGetVmSettingAttribute, iGetVmSettingValue } from './immutable/vm-settings';

const { warn } = console;

const getValidationsFromTemplates = (templates): TemplateValidations[] =>
templates.map(
(relevantTemplate) => new TemplateValidations(iGetTemplateValidations(relevantTemplate)),
Expand Down Expand Up @@ -54,7 +52,8 @@ export const getTemplateValidation = (state, id: string): TemplateValidations =>
const templateValidations = getTemplateValidations(state, id);
if (templateValidations && templateValidations.length > 0) {
templateValidations.length > 1 &&
warn('WARNING: getTemplateValidation: multiple template validations detected!');
// eslint-disable-next-line no-console
console.warn('WARNING: getTemplateValidation: multiple template validations detected!');
return templateValidations[0];
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ const menuActionEdit = (
): KebabOption => {
return {
label: 'Edit',
isDisabled: [
VMWizardStorageType.WINDOWS_GUEST_TOOLS,
VMWizardStorageType.WINDOWS_GUEST_TOOLS_TEMPLATE,
].includes(storageWithWrappers.type),
callback: () =>
withProgress(
vmWizardStorageModalEnhanced({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import { DiskWrapper } from '../../../../k8s/wrapper/vm/disk-wrapper';
import { VHW_TYPES } from './types';
import { VmWizardVirtualHardwareRow } from './vm-wizard-virtualhardware-row';
import './virtual-hardware-tab.scss';
import { getTemplateValidation } from '../../selectors/template';
import { TemplateValidations } from 'packages/kubevirt-plugin/src/utils/validations/template/template-validations';

const getVirtualStoragesData = (
storages: VMWizardStorageWithWrappers[],
Expand Down Expand Up @@ -65,6 +67,7 @@ const getVirtualStoragesData = (
wizardStorageData,
source: combinedDisk.getCDROMSourceValue(),
content: combinedDisk.getContent(),
diskInterface: combinedDisk.getDiskInterface(),
storageClass: combinedDisk.getStorageClassName(),
};
});
Expand All @@ -76,6 +79,7 @@ const VirtualHardwareTabFirehose: React.FC<VirtualHardwareTabFirehoseProps> = ({
setTabLocked,
removeStorage,
storages,
templateValidations,
persistentVolumeClaims,
}) => {
const virtualStorages = getVirtualStoragesData(storages, persistentVolumeClaims);
Expand All @@ -86,7 +90,7 @@ const VirtualHardwareTabFirehose: React.FC<VirtualHardwareTabFirehoseProps> = ({
const diskWrapper = DiskWrapper.initializeFromSimpleData({
name: availableCDName,
type: DiskType.CDROM,
bus: DiskBus.VIRTIO,
bus: templateValidations.getAValidBus(DiskBus.VIRTIO),
});

const addButton = (
Expand Down Expand Up @@ -157,6 +161,7 @@ type VirtualHardwareTabFirehoseProps = {
isBootDiskRequired: boolean;
wizardReduxID: string;
storages: VMWizardStorageWithWrappers[];
templateValidations: TemplateValidations;
removeStorage: (id: string) => void;
setTabLocked: (isLocked: boolean) => void;
persistentVolumeClaims: FirehoseResult<K8sResourceKind[]>;
Expand Down Expand Up @@ -190,6 +195,7 @@ const stateToProps = (state, { wizardReduxID }) => {
namespace: iGetCommonData(state, wizardReduxID, VMWizardProps.activeNamespace),
isLocked: isStepLocked(stepData, VMWizardTab.ADVANCED_VIRTUAL_HARDWARE),
storages: getStoragesWithWrappers(state, wizardReduxID),
templateValidations: getTemplateValidation(state, wizardReduxID),
};
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export const VmWizardVirtualHardwareRow: React.FC<VmWizardVirtualHardwareRowProp
validation={{
content: validations.content || validations.url || validations.container || validations.pvc,
size: validations.size,
diskInterface: validations.diskInterface,
}}
columnClasses={columnClasses}
index={index}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ export const DiskModal = withHandlePromise((props: DiskModalProps) => {
container: containerValidation,
pvc: pvcValidation,
diskInterface: busValidation,
cdromInterface: cdromDiskValidation,
url: urlValidation,
},
isValid,
Expand Down Expand Up @@ -386,7 +387,9 @@ export const DiskModal = withHandlePromise((props: DiskModalProps) => {
title="Interface"
fieldId={asId('interface')}
isRequired
validation={busValidation}
validation={
resultDisk.getType() === DiskType.DISK ? busValidation : cdromDiskValidation
}
>
<FormSelect
onChange={React.useCallback((diskBus) => setBus(DiskBus.fromString(diskBus)), [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export type VMCDSimpleRowProps = {
};

export const CDSimpleRow: React.FC<VMCDSimpleRowProps> = ({
data: { source, content, storageClass },
data: { source, content, diskInterface, storageClass },
validation = {},
columnClasses,
actionsComponent,
Expand All @@ -25,6 +25,7 @@ export const CDSimpleRow: React.FC<VMCDSimpleRowProps> = ({
const dimensify = dimensifyRow(columnClasses);

const isStorageClassLoading = storageClass === undefined;

return (
<TableRow id={content} index={index} trKey={content} style={style}>
<TableData className={dimensify()}>
Expand All @@ -33,6 +34,9 @@ export const CDSimpleRow: React.FC<VMCDSimpleRowProps> = ({
<TableData className={dimensify()}>
<ValidationCell validation={validation.source}>{source}</ValidationCell>
</TableData>
<TableData className={dimensify()}>
<ValidationCell validation={validation.diskInterface}>{diskInterface}</ValidationCell>
</TableData>
<TableData className={dimensify()}>
{isStorageClassLoading && <LoadingInline />}
{!isStorageClassLoading && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ export const diskTableColumnClasses = [
];

export const cdTableColumnClasses = [
classNames('col-lg-4'),
classNames('col-lg-4'),
classNames('col-lg-4'),
classNames('col-lg-3'),
classNames('col-lg-3'),
classNames('col-lg-3'),
classNames('col-lg-3'),
Kebab.columnClass,
];
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ export const VMCDsTable: React.FC<VMCDsTableProps> = ({
sortField: 'source',
transforms: [sortable],
},
{
title: 'Interface',
sortField: 'diskInterface',
transforms: [sortable],
},
{
title: 'Storage Class',
sortField: 'storageClass',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,27 @@ export class TemplateValidations {
});
};

// Return a valid bus, return the defaultBus if it's valid.
getAValidBus = (defaultBus?: DiskBus): DiskBus => {
const allowedBuses = this.getAllowedBuses();
if (defaultBus && allowedBuses.has(defaultBus)) {
return defaultBus;
}
if (allowedBuses.size >= 1) {
return this.getDefaultBus();
}
return null;
};

getDefaultBus = (): DiskBus => {
const allowedBuses = this.getAllowedBuses();
if (allowedBuses.size === 0) {
return null;
}

return [...allowedBuses][0];
};

private validateMemoryByType = (
value: number,
type: ValidationErrorType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export const validateDisk = (
);

const tValidations = templateValidations || new TemplateValidations();
const diskType = disk.getType();

if (source) {
if (source.requiresVolume()) {
Expand Down Expand Up @@ -138,8 +139,7 @@ export const validateDisk = (
validations.pvc = validatePVCName(pvcName, usedPVCNames);
}

// TODO: implement CDROM disk bus validation
if (disk.getType() === DiskType.DISK) {
if (diskType === DiskType.DISK || diskType === DiskType.CDROM) {
addRequired(disk.getDiskBus());
validations.diskInterface = tValidations.validateBus(disk.getDiskBus()).asValidationObject();
}
Expand Down

0 comments on commit 7b00a8d

Please sign in to comment.