Skip to content

Commit

Permalink
Revise DataVolumeTemplate API field
Browse files Browse the repository at this point in the history
  • Loading branch information
yaacov committed Dec 20, 2020
1 parent 36558f2 commit dd4f0be
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 96 deletions.
Expand Up @@ -43,12 +43,11 @@ const getDisksDescription = (
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
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, PersistentVolumeClaimKind } 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 @@ -11,6 +11,7 @@ import {
import { getVMLikePatches } from '../vm-template';
import { VMLikeEntityKind } from '../../../types/vmLike';
import { getSimpleName } from '../../../selectors/utils';
import { toDataVolumeTemplateSpec } from '../../../selectors/dv/selectors';
import { DiskWrapper } from '../../wrapper/vm/disk-wrapper';
import { V1Disk } from '../../../types/vm/disk/V1Disk';
import { V1Volume } from '../../../types/vm/disk/V1Volume';
Expand Down Expand Up @@ -99,7 +100,7 @@ export const getUpdateDiskPatches = (
dataVolume &&
new PatchBuilder('/spec/dataVolumeTemplates')
.setListUpdate(
dataVolume,
toDataVolumeTemplateSpec(dataVolume),
dataVolumeTemplates,
(other) => getName(other) === oldDataVolumeName,
)
Expand Down
Expand Up @@ -21,6 +21,7 @@ import { asVMILikeWrapper } from '../utils/convert';
import { V1PersistentVolumeClaim } from '../../../types/vm/disk/V1PersistentVolumeClaim';
import { DataVolumeModel } from '../../../models';
import { compareOwnerReference } from '@console/shared/src/utils/owner-references';
import { V1DataVolumeTemplateSpec } from 'packages/kubevirt-plugin/src/types';

export class CombinedDisk {
private readonly dataVolumesLoading: boolean;
Expand Down Expand Up @@ -245,7 +246,7 @@ export class CombinedDiskFactory {

private readonly volumes: V1Volume[];

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

private readonly dataVolumes: V1alpha1DataVolume[];

Expand Down Expand Up @@ -286,7 +287,7 @@ export class CombinedDiskFactory {
}: {
disks: V1Disk[];
volumes: V1Volume[];
dataVolumeTemplates?: V1alpha1DataVolume[];
dataVolumeTemplates?: V1DataVolumeTemplateSpec[];
dataVolumes?: V1alpha1DataVolume[];
dataVolumesLoading?: boolean;
pvcs?: K8sResourceKind[];
Expand Down Expand Up @@ -323,8 +324,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
19 changes: 14 additions & 5 deletions frontend/packages/kubevirt-plugin/src/k8s/wrapper/vm/vm-wrapper.ts
Expand Up @@ -3,7 +3,13 @@ import * as _ from 'lodash';
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, VMISpec, VMKind } from '../../../types';
import {
CPURaw,
V1DataVolumeTemplateSpec,
V1NetworkInterface,
VMISpec,
VMKind,
} from '../../../types';
import {
getCloudInitVolume,
getDataVolumeTemplates,
Expand Down Expand Up @@ -32,6 +38,7 @@ import { V1alpha1DataVolume } from '../../../types/vm/disk/V1alpha1DataVolume';
import { VirtualMachineImportModel, VirtualMachineModel } from '../../../models';
import { buildOwnerReferenceForModel } from '../../../utils';
import { transformDevices } from '../../../selectors/vm/devices';
import { toDataVolumeTemplateSpec } from '../../../selectors/dv/selectors';

export class VMWrapper extends K8sResourceWrapper<VMKind, VMWrapper> implements VMILikeMethods {
constructor(vm?: VMKind | VMWrapper | any, copy = false) {
Expand Down Expand Up @@ -219,11 +226,12 @@ export class VMWrapper extends K8sResourceWrapper<VMKind, VMWrapper> implements
setWizardStorages = (storages: VMWizardStorage[]) => {
this.ensurePath('spec.template.spec.domain.devices');
this.data.spec.template.spec.domain.devices.disks = _.compact(
storages.map((storage) => storage.disk),
storages.map((storage) => (storage.disk?.name ? storage.disk : null)),
);
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) => toDataVolumeTemplateSpec(storage.dataVolume)),
);
this.ensureStorageConsistency();
return this;
};
Expand All @@ -240,7 +248,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
12 changes: 12 additions & 0 deletions frontend/packages/kubevirt-plugin/src/selectors/dv/selectors.ts
@@ -1,6 +1,8 @@
import * as _ from 'lodash';
import { K8sResourceKind } from '@console/internal/module/k8s';
import { getStorageSize } from '../selectors';
import { V1alpha1DataVolume } from '../../types/vm/disk/V1alpha1DataVolume';
import { V1DataVolumeTemplateSpec } from '../../types';

export const getDataVolumeResources = (dataVolume: K8sResourceKind) =>
_.get(dataVolume, 'spec.pvc.resources');
Expand All @@ -14,3 +16,13 @@ export const getDataVolumeVolumeMode = (dataVolume: K8sResourceKind) =>
_.get(dataVolume, 'spec.pvc.volumeMode');
export const getDataVolumeStorageClassName = (dataVolume: K8sResourceKind): string =>
_.get(dataVolume, 'spec.pvc.storageClassName');

export const toDataVolumeTemplateSpec = (
dataVolume: V1alpha1DataVolume,
): V1DataVolumeTemplateSpec =>
dataVolume
? {
metadata: _.get(dataVolume, 'metadata'),
spec: _.get(dataVolume, 'spec'),
}
: null;
14 changes: 11 additions & 3 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 All @@ -22,7 +28,6 @@ import { V1Volume } from '../../types/vm/disk/V1Volume';
import { VMGenericLikeEntityKind } from '../../types/vmLike';
import { RunStrategy, StateChangeRequest } from '../../constants/vm/vm';
import { VolumeWrapper } from '../../k8s/wrapper/vm/volume-wrapper';
import { V1alpha1DataVolume } from '../../types/vm/disk/V1alpha1DataVolume';

export const getMemory = (vm: VMKind) =>
_.get(vm, 'spec.template.spec.domain.resources.requests.memory');
Expand Down Expand Up @@ -50,7 +55,10 @@ 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 = []): V1alpha1DataVolume[] =>
export const getDataVolumeTemplates = (
vm: VMKind,
defaultValue: V1DataVolumeTemplateSpec[] = [],
): V1DataVolumeTemplateSpec[] =>
_.get(vm, 'spec.dataVolumeTemplates') == null ? defaultValue : vm.spec.dataVolumeTemplates;

export const getBootableDisks = (vm: VMKind, disks?: V1Disk[], volumes?: V1Volume[]): V1Disk[] => {
Expand Down
13 changes: 11 additions & 2 deletions frontend/packages/kubevirt-plugin/src/types/vm/index.ts
Expand Up @@ -3,7 +3,16 @@ import {
K8sResourceKind,
ObjectMetadata,
} from '@console/internal/module/k8s';
import { V1alpha1DataVolume } from './disk/V1alpha1DataVolume';
import { V1alpha1DataVolumeSpec } from './disk/V1alpha1DataVolumeSpec';
import { V1alpha1DataVolumeStatus } from './disk/V1alpha1DataVolumeStatus';
import { V1ObjectMeta } from './disk/V1ObjectMeta';

// https://kubevirt.io/api-reference/master/definitions.html#_v1_datavolumetemplatespec
export interface V1DataVolumeTemplateSpec {
metadata?: V1ObjectMeta;
spec: V1alpha1DataVolumeSpec;
status?: V1alpha1DataVolumeStatus;
}

// https://kubevirt.io/api-reference/master/definitions.html#_v1_virtualmachineinstancespec
export type VMISpec = {
Expand Down Expand Up @@ -48,7 +57,7 @@ export type VMSpec = {
template: VMITemplate;
running?: boolean;
runStrategy?: string;
dataVolumeTemplates?: V1alpha1DataVolume[];
dataVolumeTemplates?: V1DataVolumeTemplateSpec[];
};

export type VMStatus = {
Expand Down

0 comments on commit dd4f0be

Please sign in to comment.