Skip to content
This repository was archived by the owner on Apr 28, 2020. It is now read-only.

Commit c39a32c

Browse files
rawagnermareklibra
authored andcommitted
import-vm-apb template is using datavolumes not pvc (#88)
1 parent 6532265 commit c39a32c

File tree

10 files changed

+112
-132
lines changed

10 files changed

+112
-132
lines changed

src/components/Wizard/CreateVmWizard/CreateVmWizard.js

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
33
import { Wizard } from 'patternfly-react';
4-
import { partition } from 'lodash';
54

65
import BasicSettingsTab from './BasicSettingsTab';
76
import StorageTab from './StorageTab';
@@ -34,20 +33,14 @@ const getBasicSettingsValue = (stepData, key) => settingsValue(stepData[BASIC_SE
3433

3534
const onUserTemplateChangedInStorageTab = ({ templates }, stepData, newUserTemplate) => {
3635
const withoutDiscardedTemplateStorage = stepData.value.filter(storage => !storage.templateStorage);
37-
let newTemplateBootableStorages = [];
38-
let newTemplateStorages = [];
36+
37+
const rows = [...withoutDiscardedTemplateStorage];
3938

4039
if (newUserTemplate) {
41-
[newTemplateStorages, newTemplateBootableStorages] = partition(
42-
getTemplateStorages(templates, newUserTemplate),
43-
storage => storage.templateStorage.disk.bootOrder == null
44-
);
45-
newTemplateBootableStorages.sort((a, b) => a.templateStorage.disk.bootOrder - b.templateStorage.disk.bootOrder);
40+
const templateStorages = getTemplateStorages(templates, newUserTemplate);
41+
rows.push(...templateStorages);
4642
}
4743

48-
// prefer boot order from template
49-
const rows = [...newTemplateBootableStorages, ...withoutDiscardedTemplateStorage, ...newTemplateStorages];
50-
5144
return {
5245
...stepData,
5346
value: rows

src/components/Wizard/CreateVmWizard/StorageTab.js

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import { findIndex } from 'lodash';
44

5-
import { PROVISION_SOURCE_URL, PROVISION_SOURCE_REGISTRY } from '../../../constants';
5+
import { PROVISION_SOURCE_TEMPLATE, PROVISION_SOURCE_PXE } from '../../../constants';
66
import { TableFactory } from '../../Table/TableFactory';
77
import { FormFactory } from '../../Form/FormFactory';
8-
import { getName, getGibStorageSize, getStorageClassName } from '../../../utils/selectors';
8+
import {
9+
getName,
10+
getGibStorageSize,
11+
getPvcStorageClassName,
12+
getDataVolumeStorageClassName,
13+
getPvcResources,
14+
getDataVolumeResources
15+
} from '../../../utils/selectors';
916

1017
import { ACTIONS_TYPE, DELETE_ACTION } from '../../Table/constants';
1118

@@ -63,8 +70,7 @@ const hasError = disk => (disk.errors ? disk.errors.some(error => !!error) : fal
6370

6471
const resolveBootability = (rows, sourceType) => {
6572
if (
66-
sourceType !== PROVISION_SOURCE_REGISTRY &&
67-
sourceType !== PROVISION_SOURCE_URL &&
73+
(sourceType === PROVISION_SOURCE_TEMPLATE || sourceType === PROVISION_SOURCE_PXE) &&
6874
!rows.some(row => row.isBootable && !hasError(row))
6975
) {
7076
const bootableDisks = rows.filter(row => !!row.attachStorage || !!row.templateStorage);
@@ -82,7 +88,7 @@ const resolveBootability = (rows, sourceType) => {
8288
}
8389
if (rows && rows.length > 0 && !rows[0].isBootable) {
8490
// change detected
85-
let isBootable = sourceType !== PROVISION_SOURCE_REGISTRY && sourceType !== PROVISION_SOURCE_URL;
91+
let isBootable = sourceType === PROVISION_SOURCE_TEMPLATE || sourceType === PROVISION_SOURCE_PXE;
8692
return rows.map(row => {
8793
const result = {
8894
...row,
@@ -100,29 +106,29 @@ const resolveBootability = (rows, sourceType) => {
100106

101107
const resolveAttachedStorage = (storage, persistentVolumeClaims, storageClasses, units) => {
102108
const attachStorage = persistentVolumeClaims.find(pvc => getName(pvc) === storage.name) || storage.attachStorage;
103-
const attachStorageClassName = getStorageClassName(attachStorage);
109+
const attachStorageClassName = getPvcStorageClassName(attachStorage);
104110

105111
return {
106112
...storage,
107113
attachStorage,
108114
// just for visualisation
109115
name: getName(attachStorage),
110-
size: getGibStorageSize(units, attachStorage),
116+
size: getGibStorageSize(units, getPvcResources(attachStorage)),
111117
storageClass: getName(storageClasses.find(clazz => getName(clazz) === attachStorageClassName))
112118
};
113119
};
114120

115121
const resolveTemplateStorage = (storage, units) => {
116122
const {
117-
templateStorage: { pvc, disk }
123+
templateStorage: { dataVolume, disk }
118124
} = storage;
119125

120126
return {
121127
...storage,
122128
// just for visualisation
123129
name: disk.name,
124-
size: getGibStorageSize(units, pvc),
125-
storageClass: getStorageClassName(pvc)
130+
size: getGibStorageSize(units, getDataVolumeResources(dataVolume)),
131+
storageClass: getDataVolumeStorageClassName(dataVolume)
126132
};
127133
};
128134

@@ -182,10 +188,7 @@ const validateStorage = (row, persistentVolumeClaims) => {
182188
};
183189

184190
const publishResults = (rows, publish, sourceType) => {
185-
let valid =
186-
sourceType !== PROVISION_SOURCE_REGISTRY && sourceType !== PROVISION_SOURCE_URL
187-
? rows.some(row => row.isBootable)
188-
: true;
191+
let valid = sourceType === PROVISION_SOURCE_TEMPLATE ? rows.some(row => row.isBootable) : true;
189192
const storages = rows.map(({ attachStorage, templateStorage, id, name, size, storageClass, isBootable, errors }) => {
190193
let result;
191194
if (attachStorage) {
@@ -401,7 +404,7 @@ class StorageTab extends React.Component {
401404
type: 'dropdown',
402405
defaultValue: '--- Select Bootable Disk ---',
403406
choices: disks.map(disk => disk.name),
404-
required: true
407+
required: this.props.sourceType === PROVISION_SOURCE_TEMPLATE
405408
}
406409
});
407410

@@ -420,12 +423,15 @@ class StorageTab extends React.Component {
420423
const actionButtons = this.getActionButtons();
421424

422425
let bootableForm;
423-
if (this.props.sourceType !== PROVISION_SOURCE_REGISTRY && this.props.sourceType !== PROVISION_SOURCE_URL) {
426+
if (this.props.sourceType === PROVISION_SOURCE_TEMPLATE || this.props.sourceType === PROVISION_SOURCE_PXE) {
424427
const bootableDisk = this.state.rows.find(row => row.isBootable && !hasError(row));
425428
const values = {
426429
bootableDisk: {
427430
value: bootableDisk ? bootableDisk.name : undefined,
428-
validMsg: this.state.rows.length === 0 ? 'A bootable disk could not be found' : undefined
431+
validMsg:
432+
this.props.sourceType === PROVISION_SOURCE_TEMPLATE && this.state.rows.length === 0
433+
? 'A bootable disk could not be found'
434+
: undefined
429435
}
430436
};
431437

src/components/Wizard/CreateVmWizard/utils.js

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,21 @@
1-
import { getName, getDisks, getVolumes, getPersistentVolumeClaimName } from '../../../utils/selectors';
1+
import { get } from 'lodash';
2+
import { getName, getDisks, getVolumes, getDataVolumes } from '../../../utils/selectors';
23

3-
import { selectPVCs, selectVm } from '../../../k8s/selectors';
4+
import { selectVm } from '../../../k8s/selectors';
45

56
export const getTemplateStorages = (templates, userTemplate) => {
67
const { objects } = templates.find(template => getName(template) === userTemplate);
78
const vm = selectVm(objects);
89

9-
const templateDisks = {};
10-
const templateVolumes = {};
11-
12-
// eslint-disable-next-line no-return-assign
13-
getDisks(vm).forEach(disk => (templateDisks[disk.volumeName] = disk));
14-
15-
// eslint-disable-next-line no-return-assign
16-
getVolumes(vm).forEach(volume => (templateVolumes[getPersistentVolumeClaimName(volume)] = volume));
17-
18-
return selectPVCs(objects).map(pvc => {
19-
const volume = templateVolumes[getName(pvc)];
20-
let disk;
21-
22-
if (volume) {
23-
disk = templateDisks[volume.name];
24-
}
25-
10+
return getDisks(vm).map(disk => {
11+
const volume = getVolumes(vm).find(v => v.name === disk.volumeName);
2612
return {
2713
templateStorage: {
28-
pvc,
2914
disk,
30-
volume
15+
volume,
16+
dataVolume: getDataVolumes(vm).find(
17+
dataVolume => get(dataVolume, 'metadata.name') === get(volume, 'dataVolume.name')
18+
)
3119
}
3220
};
3321
});

src/k8s/mock_user_templates/linux.template.js

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,31 @@ export const linuxUserTemplate = {
2525
name: '${NAME}'
2626
},
2727
spec: {
28+
dataVolumeTemplates: [
29+
{
30+
metadata: {
31+
// eslint-disable-next-line no-template-curly-in-string
32+
name: 'vm-${NAME}-dv-01'
33+
},
34+
spec: {
35+
pvc: {
36+
storageClassName: 'storagename',
37+
accessModes: ['ReadWriteOnce'],
38+
resources: {
39+
requests: {
40+
storage: '10Gi'
41+
}
42+
}
43+
},
44+
source: {
45+
pvc: {
46+
namespace: 'somenmspc',
47+
name: 'somenm'
48+
}
49+
}
50+
}
51+
}
52+
],
2853
running: false,
2954
template: {
3055
spec: {
@@ -57,34 +82,15 @@ export const linuxUserTemplate = {
5782
volumes: [
5883
{
5984
name: 'volume-1',
60-
persistentVolumeClaim: {
85+
dataVolume: {
6186
// eslint-disable-next-line no-template-curly-in-string
62-
claimName: 'vm-${NAME}-disk-01'
87+
name: 'vm-${NAME}-dv-01'
6388
}
6489
}
6590
]
6691
}
6792
}
6893
}
69-
},
70-
{
71-
apiVersion: 'v1',
72-
kind: 'PersistentVolumeClaim',
73-
metadata: {
74-
// eslint-disable-next-line no-template-curly-in-string
75-
name: 'vm-${NAME}-disk-01',
76-
annotations: {
77-
'k8s.io/CloneRequest': 'namespace/pvcname'
78-
}
79-
},
80-
spec: {
81-
accessModes: ['ReadWriteOnce'],
82-
resources: {
83-
requests: {
84-
storage: '2Gi'
85-
}
86-
}
87-
}
8894
}
8995
],
9096
parameters: [

src/k8s/mock_user_templates/windows.template.js

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,30 @@ export const windowsUserTemplate = {
2525
name: '${NAME}'
2626
},
2727
spec: {
28+
dataVolumeTemplates: [
29+
{
30+
metadata: {
31+
// eslint-disable-next-line no-template-curly-in-string
32+
name: 'vm-${NAME}-dv-01'
33+
},
34+
spec: {
35+
pvc: {
36+
accessModes: ['ReadWriteOnce'],
37+
resources: {
38+
requests: {
39+
storage: '10Gi'
40+
}
41+
}
42+
},
43+
source: {
44+
pvc: {
45+
namespace: 'somenmspc',
46+
name: 'somenm'
47+
}
48+
}
49+
}
50+
}
51+
],
2852
running: false,
2953
template: {
3054
spec: {
@@ -83,34 +107,15 @@ export const windowsUserTemplate = {
83107
volumes: [
84108
{
85109
name: 'volume-1',
86-
persistentVolumeClaim: {
110+
dataVolume: {
87111
// eslint-disable-next-line no-template-curly-in-string
88-
claimName: 'vm-${NAME}-disk-01'
112+
name: 'vm-${NAME}-dv-01'
89113
}
90114
}
91115
]
92116
}
93117
}
94118
}
95-
},
96-
{
97-
apiVersion: 'v1',
98-
kind: 'PersistentVolumeClaim',
99-
metadata: {
100-
// eslint-disable-next-line no-template-curly-in-string
101-
name: 'vm-${NAME}-disk-01',
102-
annotations: {
103-
'k8s.io/CloneRequest': 'namespace/pvc'
104-
}
105-
},
106-
spec: {
107-
accessModes: ['ReadWriteOnce'],
108-
resources: {
109-
requests: {
110-
storage: '2Gi'
111-
}
112-
}
113-
}
114119
}
115120
],
116121
parameters: [

src/k8s/request.js

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,14 @@ import {
4242
OPERATING_SYSTEM_KEY,
4343
WORKLOAD_PROFILE_KEY
4444
} from '../components/Wizard/CreateVmWizard/constants';
45-
import { VirtualMachineModel, ProcessedTemplatesModel, PersistentVolumeClaimModel } from '../models';
45+
import { VirtualMachineModel, ProcessedTemplatesModel } from '../models';
4646
import { getTemplatesWithLabels, getTemplate } from '../utils/templates';
4747
import {
4848
getOsLabel,
4949
getWorkloadLabel,
5050
getFlavorLabel,
5151
getTemplateAnnotations,
5252
settingsValue,
53-
selectPVCs,
54-
selectAllExceptPVCs,
5553
selectVm
5654
} from './selectors';
5755

@@ -65,13 +63,6 @@ export const createVM = (k8sCreate, templates, basicSettings, { networks }, stor
6563
const vm = selectVm(objects);
6664
addMetadata(vm, template, getSetting);
6765
modifyVmObject(vm, template, getSetting, networks, additionalStorage);
68-
69-
if (getSetting(IMAGE_SOURCE_TYPE_KEY) === PROVISION_SOURCE_TEMPLATE) {
70-
selectPVCs(objects).forEach(pvc => {
71-
pvc.metadata.namespace = getSetting(NAMESPACE_KEY);
72-
k8sCreate(PersistentVolumeClaimModel, pvc);
73-
});
74-
}
7566
return k8sCreate(VirtualMachineModel, vm);
7667
});
7768
};
@@ -88,16 +79,15 @@ const resolveTemplate = (templates, basicSettings, getSetting, storage) => {
8879
const vm = selectVm(chosenTemplate.objects);
8980
// clear
9081
removeDisksAndVolumes(vm);
91-
const newObjects = selectAllExceptPVCs(chosenTemplate.objects);
9282

9383
// add the ones selected by the user again
94-
storage.filter(disk => disk.templateStorage).forEach(({ templateStorage: { pvc, disk, volume }, isBootable }) => {
95-
newObjects.push(pvc);
96-
addVolume(vm, volume);
97-
addBootableDisk(vm, disk, isBootable, getSetting);
98-
});
99-
100-
chosenTemplate.objects = newObjects;
84+
storage
85+
.filter(disk => disk.templateStorage)
86+
.forEach(({ templateStorage: { dataVolume, disk, volume }, isBootable }) => {
87+
addDataVolumeTemplate(vm, dataVolume);
88+
addVolume(vm, volume);
89+
addBootableDisk(vm, disk, isBootable, getSetting);
90+
});
10191
} else {
10292
const baseTemplates = getTemplatesWithLabels(getTemplate(templates, TEMPLATE_TYPE_BASE), [
10393
getOsLabel(basicSettings),
@@ -561,4 +551,5 @@ const addAnnotation = (vm, key, value) => {
561551
const removeDisksAndVolumes = vm => {
562552
delete vm.spec.template.spec.domain.devices.disks;
563553
delete vm.spec.template.spec.volumes;
554+
delete vm.spec.dataVolumeTemplates;
564555
};

0 commit comments

Comments
 (0)