Skip to content

Commit

Permalink
Fixes 1876440: Cloud init section of common-templates is ignored
Browse files Browse the repository at this point in the history
  • Loading branch information
glekner committed Sep 14, 2020
1 parent abc92b9 commit ff11bb8
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 3 deletions.
Expand Up @@ -6,7 +6,7 @@ import {
iGetRelevantTemplateSelectors,
iGetVmSettingValue,
} from '../../selectors/immutable/vm-settings';
import { VMSettingsField, VMWizardProps } from '../../types';
import { CloudInitField, VMSettingsField, VMWizardProps, VMWizardStorageType } from '../../types';
import { InternalActionType, UpdateOptions } from '../types';
import { asDisabled, asHidden, asRequired } from '../../utils/utils';
import { vmWizardInternalActions } from '../internal-actions';
Expand All @@ -16,16 +16,28 @@ import {
iGetName,
iGetNamespace,
} from '../../selectors/immutable/selectors';
import { iGetRelevantTemplate } from '../../../../selectors/immutable/template/combined';
import {
iGetCommonTemplateCloudInit,
iGetRelevantTemplate,
} from '../../../../selectors/immutable/template/combined';
import {
CUSTOM_FLAVOR,
TEMPLATE_DATAVOLUME_NAME_PARAMETER,
TEMPLATE_DATAVOLUME_NAMESPACE_PARAMETER,
CLOUDINIT_DISK,
DiskType,
DiskBus,
VolumeType,
} from '../../../../constants/vm';
import { ProvisionSource } from '../../../../constants/vm/provision-source';
import { prefillVmTemplateUpdater } from './prefill-vm-template-state-update';
import { iGetPrameterValue, iGetAnnotation } from '../../../../selectors/immutable/common';
import { CDI_UPLOAD_POD_ANNOTATION, CDI_UPLOAD_RUNNING } from '../../../cdi-upload-provider/consts';
import { CloudInitDataHelper } from '../../../../k8s/wrapper/vm/cloud-init-data-helper';
import { toShallowJS } from '../../../../utils/immutable';
import { DiskWrapper } from '../../../../k8s/wrapper/vm/disk-wrapper';
import { VolumeWrapper } from '../../../../k8s/wrapper/vm/volume-wrapper';
import { getStorages } from '../../selectors/selectors';

const selectUserTemplateOnLoadedUpdater = (options: UpdateOptions) => {
const { id, dispatch, getState } = options;
Expand Down Expand Up @@ -274,6 +286,62 @@ const flavorUpdater = ({ id, prevState, dispatch, getState }: UpdateOptions) =>
);
};

const commonTemplatesUpdater = ({ id, prevState, dispatch, getState }: UpdateOptions) => {
const state = getState();
if (
!hasVMSettingsValueChanged(prevState, state, id, VMSettingsField.OPERATING_SYSTEM) &&
!hasVMSettingsValueChanged(prevState, state, id, VMSettingsField.FLAVOR) &&
!hasVMSettingsValueChanged(prevState, state, id, VMSettingsField.WORKLOAD_PROFILE)
) {
return;
}
const iCloudInitStorage = getStorages(state, id).find((stor) => stor?.volume?.cloudInitNoCloud);

const relevantOptions = iGetRelevantTemplateSelectors(state, id);
const iCommonTemplates = iGetLoadedCommonData(state, id, VMWizardProps.commonTemplates);
const iTemplate = iCommonTemplates && iGetRelevantTemplate(iCommonTemplates, relevantOptions);
const [data, isBase64] = CloudInitDataHelper.getUserData(
toShallowJS(iGetCommonTemplateCloudInit(iTemplate))?.cloudInitNoCloud,
);
const typeData = CloudInitDataHelper.toCloudInitNoCloudSource(data, isBase64);
const hasCloudInitData = !!typeData?.userData;

if (hasCloudInitData) {
dispatch(
vmWizardInternalActions[InternalActionType.SetCloudInitFieldValue](
id,
CloudInitField.IS_FORM,
false,
),
);
dispatch(
vmWizardInternalActions[InternalActionType.UpdateStorage](id, {
id: iCloudInitStorage?.id,
type: iCloudInitStorage?.type || VMWizardStorageType.UI_INPUT,
disk: new DiskWrapper()
.init({
name: iCloudInitStorage?.volume?.name || CLOUDINIT_DISK,
})
.setType(DiskType.DISK, { bus: DiskBus.VIRTIO })
.asResource(),
volume: new VolumeWrapper()
.init({ name: iCloudInitStorage?.volume?.name || CLOUDINIT_DISK })
.setType(VolumeType.CLOUD_INIT_NO_CLOUD, typeData)
.asResource(),
}),
);
} else if (iCloudInitStorage && !hasCloudInitData) {
dispatch(
vmWizardInternalActions[InternalActionType.SetCloudInitFieldValue](
id,
CloudInitField.IS_FORM,
true,
),
);
dispatch(vmWizardInternalActions[InternalActionType.RemoveStorage](id, iCloudInitStorage?.id));
}
};

export const updateVmSettingsState = (options: UpdateOptions) =>
[
selectUserTemplateOnLoadedUpdater,
Expand All @@ -284,6 +352,7 @@ export const updateVmSettingsState = (options: UpdateOptions) =>
provisioningSourceUpdater,
nativeK8sUpdater,
flavorUpdater,
commonTemplatesUpdater,
].forEach((updater) => {
updater && updater(options);
});
Expand Up @@ -287,7 +287,7 @@ const CloudInitTabComponent: React.FC<ResultTabComponentProps> = ({
};

return (
<div className={isForm && 'co-m-pane__body co-m-pane__form kubevirt-create-vm-modal__form'}>
<div className={isForm ? 'co-m-pane__body co-m-pane__form kubevirt-create-vm-modal__form' : ''}>
{!isDisabled && !isEditable && (
<Errors
endMargin
Expand Down
Expand Up @@ -8,6 +8,8 @@ import {
import { ITemplate } from '../../../types/template';
import { iGetCreationTimestamp, iGetLabels } from '../common';
import { compareVersions } from '../../../utils/sort';
import { iGet, iGetIn } from '../../../utils/immutable';
import { VirtualMachineModel } from '../../../models';

type FindTemplateOptions = {
workload?: string;
Expand Down Expand Up @@ -87,3 +89,11 @@ export const iGetRelevantTemplates = (
export const iGetRelevantTemplate = (
...args: Parameters<typeof iGetRelevantTemplates>
): ITemplate => iGetRelevantTemplates(...args).first();

export const iSelectVM = (tmp: ITemplate) =>
iGetIn(tmp, ['objects'])?.find((obj) => iGet(obj, 'kind') === VirtualMachineModel.kind);

export const iGetCommonTemplateCloudInit = (tmp: ITemplate) =>
iGetIn(iSelectVM(tmp), ['spec', 'template', 'spec', 'volumes'])?.find((storage) =>
iGetIn(storage, ['cloudInitNoCloud']),
);

0 comments on commit ff11bb8

Please sign in to comment.