Skip to content

Commit

Permalink
Removes unusable fields from vm DataVolumeTemplates
Browse files Browse the repository at this point in the history
Signed-off-by: yaacov <kobi.zamir@gmail.com>
  • Loading branch information
yaacov committed Oct 7, 2020
1 parent d9e4d60 commit 8178aa3
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 106 deletions.
Expand Up @@ -23,10 +23,11 @@ import {
ModalComponentProps,
} from '@console/internal/components/factory';
import { ModalFooter } from '../modal/modal-footer';
import { K8sResourceKind } from '@console/internal/module/k8s';
import { K8sResourceKind, PersistentVolumeClaimKind } from '@console/internal/module/k8s';
import { NamespaceModel, PersistentVolumeClaimModel, ProjectModel } from '@console/internal/models';
import { getName, getNamespace, ValidationErrorType } from '@console/shared';
import { VMKind } from '../../../types';
import { V1alpha1DataVolume } from '../../../types/vm/disk/V1alpha1DataVolume';
import { getDescription } from '../../../selectors/selectors';
import { getLoadedData, getLoadError, prefixedID } from '../../../utils';
import { DataVolumeModel, VirtualMachineModel } from '../../../models';
Expand Down Expand Up @@ -229,8 +230,8 @@ export type CloneVMModalProps = CloneVMModalFirehoseProps &
onNamespaceChanged: (namespace: string) => void;
namespaces?: FirehoseResult<K8sResourceKind[]>;
virtualMachines?: FirehoseResult<VMKind[]>;
dataVolumes?: FirehoseResult<K8sResourceKind[]>;
persistentVolumeClaims?: FirehoseResult<K8sResourceKind[]>;
dataVolumes?: FirehoseResult<V1alpha1DataVolume[]>;
persistentVolumeClaims?: FirehoseResult<PersistentVolumeClaimKind[]>;
requestsDataVolumes: boolean;
requestsPVCs: boolean;
};
Expand Down
@@ -1,7 +1,8 @@
import * as React from 'react';
import { DASH, getName, getNamespace } from '@console/shared';
import { K8sResourceKind } from '@console/internal/module/k8s';
import { VMKind } from '../../../types/vm';
import { K8sResourceKind, PersistentVolumeClaimKind } from '@console/internal/module/k8s';
import { VMKind } from '../../../types';
import { V1alpha1DataVolume } from '../../../types/vm/disk/V1alpha1DataVolume';
import {
getCPU,
getDataVolumeTemplates,
Expand Down Expand Up @@ -31,23 +32,24 @@ const getNicsDescription = (vm: VMKind) =>
const getDisksDescription = (
vm: VMKind,
pvcs: K8sResourceKind[],
dataVolumes: K8sResourceKind[],
dataVolumes: V1alpha1DataVolume[],
) => {
const disks = getDisks(vm);
const volumes = getVolumes(vm);
const dataVolumeTemplates = getDataVolumeTemplates(vm);

return disks.map((disk) => {
const description = [disk.name];

const volume = volumes.find((v) => v.name === disk.name);
if (volume) {
if (volume.dataVolume) {
let dataVolume = dataVolumeTemplates.find((dv) => getName(dv) === volume.dataVolume.name);
if (!dataVolume) {
dataVolume = dataVolumes.find(
const dataVolume =
dataVolumeTemplates.find((dv) => getName(dv) === volume.dataVolume.name) ||
dataVolumes.find(
(dv) => getName(dv) === volume.dataVolume.name && getNamespace(dv) === getNamespace(vm),
);
}

description.push(
getStorageSize(getDataVolumeResources(dataVolume)),
getDataVolumeStorageClassName(dataVolume),
Expand Down Expand Up @@ -98,6 +100,6 @@ export const ConfigurationSummary: React.FC<ConfigurationSummaryProps> = ({
type ConfigurationSummaryProps = {
id: string;
vm: VMKind;
persistentVolumeClaims: K8sResourceKind[];
dataVolumes: K8sResourceKind[];
persistentVolumeClaims: PersistentVolumeClaimKind[];
dataVolumes: V1alpha1DataVolume[];
};
68 changes: 48 additions & 20 deletions frontend/packages/kubevirt-plugin/src/k8s/helpers/vm-clone.ts
@@ -1,14 +1,14 @@
import * as _ from 'lodash';
import { K8sResourceKind } from '@console/internal/module/k8s';
import { createBasicLookup, getName, getNamespace } from '@console/shared';
import { VMKind } from '../../types/vm';
import { V1DataVolumeTemplateSpec, VMKind } from '../../types/vm';
import { generateDataVolumeName, getBasicID } from '../../utils';
import {
getPvcAccessModes,
getPvcStorageClassName,
getPvcStorageSize,
getPvcVolumeMode,
} from '../../selectors/pvc/selectors';
import { DataVolumeTemplate } from '../objects/vm/datavolume-template';
import {
getOperatingSystem,
getOperatingSystemName,
Expand Down Expand Up @@ -102,15 +102,29 @@ export class VMClone {
const pvc = pvcLookup[`${this.oldVMNamespace}-${pvcName}`];

if (pvc) {
const clonedDVTemplate = new DataVolumeTemplate({
name: generateDataVolumeName(name, volume.name),
pvcSourceName: pvcName,
pvcSourceNamespace: this.oldVMNamespace,
accessModes: getPvcAccessModes(pvc),
volumeMode: getPvcVolumeMode(pvc),
size: getPvcStorageSize(pvc),
storageClassName: getPvcStorageClassName(pvc),
}).build();
const clonedDVTemplate: V1DataVolumeTemplateSpec = {
metadata: {
name: generateDataVolumeName(name, volume.name),
},
spec: {
pvc: {
accessModes: _.cloneDeep(getPvcAccessModes(pvc)),
volumeMode: getPvcVolumeMode(pvc),
resources: {
requests: {
storage: getPvcStorageSize(pvc),
},
},
storageClassName: getPvcStorageClassName(pvc),
},
source: {
pvc: {
name: pvcName,
namespace: this.oldVMNamespace,
},
},
},
};

this.vm.ensureDataVolumeTemplates().push(clonedDVTemplate);

Expand All @@ -134,15 +148,29 @@ export class VMClone {
const dataVolume = dvLookup[`${this.oldVMNamespace}-${dvName}`];

if (dataVolume) {
const clonedDVTemplate = new DataVolumeTemplate({
name: generateDataVolumeName(name, volume.name),
pvcSourceName: dvName,
pvcSourceNamespace: this.oldVMNamespace,
accessModes: getDataVolumeAccessModes(dataVolume),
volumeMode: getDataVolumeVolumeMode(dataVolume),
size: getDataVolumeStorageSize(dataVolume),
storageClassName: getDataVolumeStorageClassName(dataVolume),
}).build();
const clonedDVTemplate: V1DataVolumeTemplateSpec = {
metadata: {
name: generateDataVolumeName(name, volume.name),
},
spec: {
pvc: {
accessModes: _.cloneDeep(getDataVolumeAccessModes(dataVolume)),
volumeMode: getDataVolumeVolumeMode(dataVolume),
resources: {
requests: {
storage: getDataVolumeStorageSize(dataVolume),
},
},
storageClassName: getDataVolumeStorageClassName(dataVolume),
},
source: {
pvc: {
name: dvName,
namespace: this.oldVMNamespace,
},
},
},
};

this.vm.ensureDataVolumeTemplates().push(clonedDVTemplate);

Expand Down

This file was deleted.

Expand Up @@ -16,6 +16,7 @@ import { V1Disk } from '../../../types/vm/disk/V1Disk';
import { V1Volume } from '../../../types/vm/disk/V1Volume';
import { V1alpha1DataVolume } from '../../../types/vm/disk/V1alpha1DataVolume';
import { getShiftBootOrderPatches } from './utils';
import { getDataVolumeTemplateSpec } from '../../wrapper/vm/vm-wrapper';

export const getRemoveDiskPatches = (vmLikeEntity: VMLikeEntityKind, disk: V1Disk): Patch[] => {
return getVMLikePatches(vmLikeEntity, (vm) => {
Expand Down Expand Up @@ -99,7 +100,7 @@ export const getUpdateDiskPatches = (
dataVolume &&
new PatchBuilder('/spec/dataVolumeTemplates')
.setListUpdate(
dataVolume,
getDataVolumeTemplateSpec(dataVolume),
dataVolumeTemplates,
(other) => getName(other) === oldDataVolumeName,
)
Expand Down
Expand Up @@ -8,6 +8,7 @@ import { V1Volume } from '../../../types/vm/disk/V1Volume';
import { V1alpha1DataVolume } from '../../../types/vm/disk/V1alpha1DataVolume';
import { getSimpleName } from '../../../selectors/utils';
import { VolumeType, DiskType, AccessMode, VolumeMode } from '../../../constants/vm/storage';
import { V1DataVolumeTemplateSpec } from '../../../types';
import { VMGenericLikeEntityKind } from '../../../types/vmLike';
import { asVM, getDataVolumeTemplates, isWinToolsImage } from '../../../selectors/vm';
import { getLoadedData, isLoaded } from '../../../utils';
Expand Down Expand Up @@ -242,7 +243,7 @@ export class CombinedDiskFactory {

private readonly volumes: V1Volume[];

private readonly dataVolumeTemplates: V1alpha1DataVolume[];
private readonly dataVolumeTemplates: V1DataVolumeTemplateSpec[];

private readonly dataVolumes: V1alpha1DataVolume[];

Expand Down Expand Up @@ -283,7 +284,7 @@ export class CombinedDiskFactory {
}: {
disks: V1Disk[];
volumes: V1Volume[];
dataVolumeTemplates?: V1alpha1DataVolume[];
dataVolumeTemplates?: V1DataVolumeTemplateSpec[];
dataVolumes?: V1alpha1DataVolume[];
dataVolumesLoading?: boolean;
pvcs?: K8sResourceKind[];
Expand Down Expand Up @@ -320,8 +321,8 @@ export class CombinedDiskFactory {
const volume = volumeLookup[diskWrapper.getName()];
const volumeWrapper = new VolumeWrapper(volume);
let dataVolumeName: string;
let dataVolume;
let dataVolumeTemplate;
let dataVolume: V1alpha1DataVolume | V1DataVolumeTemplateSpec;
let dataVolumeTemplate: V1DataVolumeTemplateSpec;
let pvc;

switch (volumeWrapper.getType()) {
Expand Down
28 changes: 20 additions & 8 deletions frontend/packages/kubevirt-plugin/src/k8s/wrapper/vm/vm-wrapper.ts
@@ -1,9 +1,10 @@
/* eslint-disable lines-between-class-members */
import * as _ from 'lodash';
import { getName } from '@console/shared';
import { getLabels } from '@console/shared/src/selectors/common';
import { compareOwnerReference } from '@console/shared/src/utils/owner-references';
import { K8sResourceWrapper } from '../common/k8s-resource-wrapper';
import { CPURaw, V1NetworkInterface, VMKind } from '../../../types/vm';
import { CPURaw, V1DataVolumeTemplateSpec, V1NetworkInterface, VMKind } from '../../../types/vm';
import {
getCloudInitVolume,
getDataVolumeTemplates,
Expand Down Expand Up @@ -33,6 +34,14 @@ import { VirtualMachineImportModel, VirtualMachineModel } from '../../../models'
import { buildOwnerReferenceForModel } from '../../../utils';
import { transformDevices } from '../../../selectors/vm/devices';

export const getDataVolumeTemplateSpec = (dv: V1alpha1DataVolume): V1DataVolumeTemplateSpec =>
dv
? {
metadata: dv?.metadata,
spec: dv.spec,
}
: null;

export class VMWrapper extends K8sResourceWrapper<VMKind, VMWrapper> implements VMILikeMethods {
constructor(vm?: VMKind | VMWrapper | any, copy = false) {
super(VirtualMachineModel, vm, copy);
Expand Down Expand Up @@ -167,17 +176,17 @@ export class VMWrapper extends K8sResourceWrapper<VMKind, VMWrapper> implements
prependStorage = ({
disk,
volume,
dataVolume,
dataVolumeTemplate,
}: {
disk: V1Disk;
volume: V1Volume;
dataVolume?: V1alpha1DataVolume;
dataVolumeTemplate?: V1DataVolumeTemplateSpec;
}) => {
this.ensureStorages();
this.getDisks().unshift(disk);
this.getVolumes().unshift(volume);
if (dataVolume) {
this.getDataVolumeTemplates().unshift(dataVolume);
if (dataVolumeTemplate) {
this.getDataVolumeTemplates().unshift(dataVolumeTemplate);
}
this.ensureStorageConsistency();
return this;
Expand All @@ -197,7 +206,7 @@ export class VMWrapper extends K8sResourceWrapper<VMKind, VMWrapper> implements

if (volumeWrapper.getType() === VolumeType.DATA_VOLUME) {
this.data.spec.dataVolumeTemplates = this.getDataVolumeTemplates().filter(
(dataVolume) => dataVolume.name !== volumeWrapper.getDataVolumeName(),
(dataVolumeTemplate) => getName(dataVolumeTemplate) !== volumeWrapper.getDataVolumeName(),
);
}

Expand All @@ -221,7 +230,9 @@ export class VMWrapper extends K8sResourceWrapper<VMKind, VMWrapper> implements
storages.map((storage) => storage.disk),
);
this.data.spec.template.spec.volumes = _.compact(storages.map((storage) => storage.volume));
this.data.spec.dataVolumeTemplates = _.compact(storages.map((storage) => storage.dataVolume));
this.data.spec.dataVolumeTemplates = _.compact(
storages.map((storage) => getDataVolumeTemplateSpec(storage.dataVolume)),
);

this.ensureStorageConsistency();
return this;
Expand All @@ -239,7 +250,8 @@ export class VMWrapper extends K8sResourceWrapper<VMKind, VMWrapper> implements
return this;
};

ensureDataVolumeTemplates = () => this.ensurePath('spec.dataVolumeTemplates', []);
ensureDataVolumeTemplates = (): V1DataVolumeTemplateSpec[] =>
this.ensurePath('spec.dataVolumeTemplates', []);

private ensureStorages = () => {
this.ensurePath('spec.template.spec.domain.devices.disks', []);
Expand Down
10 changes: 8 additions & 2 deletions frontend/packages/kubevirt-plugin/src/selectors/vm/selectors.ts
Expand Up @@ -7,7 +7,13 @@ import {
TEMPLATE_OS_NAME_ANNOTATION,
TEMPLATE_WORKLOAD_LABEL,
} from '../../constants/vm';
import { CPURaw, V1Network, V1NetworkInterface, VMKind } from '../../types';
import {
CPURaw,
V1DataVolumeTemplateSpec,
V1Network,
V1NetworkInterface,
VMKind,
} from '../../types';
import { findKeySuffixValue, getSimpleName, getValueByPrefix } from '../utils';
import { getAnnotations, getLabels } from '../selectors';
import { NetworkWrapper } from '../../k8s/wrapper/vm/network-wrapper';
Expand Down Expand Up @@ -49,7 +55,7 @@ export const getNetworks = (vm: VMKind, defaultValue: V1Network[] = []): V1Netwo
_.get(vm, 'spec.template.spec.networks') == null ? defaultValue : vm.spec.template.spec.networks;
export const getVolumes = (vm: VMKind, defaultValue: V1Volume[] = []): V1Volume[] =>
_.get(vm, 'spec.template.spec.volumes') == null ? defaultValue : vm.spec.template.spec.volumes;
export const getDataVolumeTemplates = (vm: VMKind, defaultValue = []) =>
export const getDataVolumeTemplates = (vm: VMKind, defaultValue = []): V1DataVolumeTemplateSpec[] =>
_.get(vm, 'spec.dataVolumeTemplates') == null ? defaultValue : vm.spec.dataVolumeTemplates;

export const getBootableDisks = (vm: VMKind, disks?: V1Disk[], volumes?: V1Volume[]): V1Disk[] => {
Expand Down

0 comments on commit 8178aa3

Please sign in to comment.