From b0fda6ffae8ae98af7086f9c4eb7ab5c2d5ad888 Mon Sep 17 00:00:00 2001 From: yaacov Date: Wed, 24 Jul 2019 13:41:43 +0300 Subject: [PATCH] Add vm template wizard tests --- frontend/integration-tests/protractor.conf.ts | 1 + .../tests/models/virtualMachine.ts | 7 +- .../tests/models/virtualMachineTemplate.ts | 92 ++++++++++++++ .../integration-tests/tests/models/wizard.ts | 5 +- .../integration-tests/tests/utils/types.ts | 13 ++ .../tests/vm.template.wizard.scenario.ts | 112 ++++++++++++++++++ 6 files changed, 222 insertions(+), 8 deletions(-) create mode 100644 frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachineTemplate.ts create mode 100644 frontend/packages/kubevirt-plugin/integration-tests/tests/vm.template.wizard.scenario.ts diff --git a/frontend/integration-tests/protractor.conf.ts b/frontend/integration-tests/protractor.conf.ts index 4abfcc34c85..a1f4f8a7ec3 100644 --- a/frontend/integration-tests/protractor.conf.ts +++ b/frontend/integration-tests/protractor.conf.ts @@ -174,6 +174,7 @@ export const config: Config = { '../packages/kubevirt-plugin/integration-tests/tests/vm.resources.scenario.ts', '../packages/kubevirt-plugin/integration-tests/tests/vm.clone.scenario.ts', '../packages/kubevirt-plugin/integration-tests/tests/vm.detail.flavor.ts', + '../packages/kubevirt-plugin/integration-tests/tests/vm.template.wizard.scenario.ts', ]), all: suite([ 'tests/crud.scenario.ts', diff --git a/frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachine.ts b/frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachine.ts index 155fa27617d..598d7f1699d 100644 --- a/frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachine.ts +++ b/frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachine.ts @@ -138,12 +138,7 @@ export class VirtualMachine extends KubevirtDetailView { // Networking for (const resource of networkResources) { - await wizard.addNIC( - resource.name, - resource.mac, - resource.networkDefinition, - resource.binding, - ); + await wizard.addNIC(resource); } await wizard.next(); diff --git a/frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachineTemplate.ts b/frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachineTemplate.ts new file mode 100644 index 00000000000..2251a2a9a56 --- /dev/null +++ b/frontend/packages/kubevirt-plugin/integration-tests/tests/models/virtualMachineTemplate.ts @@ -0,0 +1,92 @@ +/* eslint-disable no-unused-vars, no-undef, no-await-in-loop, no-console */ +import { browser } from 'protractor'; +import { testName } from '../../../../../integration-tests/protractor.conf'; +import { + errorMessage, + filterForName, + resourceRowsPresent, +} from '../../../../../integration-tests/views/crud.view'; +import { VMTemplateConfig } from '../utils/types'; +import { WIZARD_CREATE_TEMPLATE_ERROR, WIZARD_TABLE_FIRST_ROW } from '../utils/consts'; +import { Wizard } from './wizard'; +import { KubevirtDetailView } from './kubevirtDetailView'; + +export class VirtualMachineTemplate extends KubevirtDetailView { + constructor(templateConfig) { + super({ ...templateConfig, kind: 'vmtemplates' }); + } + + async create({ + name, + namespace, + description, + provisionSource, + operatingSystem, + flavor, + workloadProfile, + cloudInit, + storageResources, + networkResources, + }: VMTemplateConfig) { + await this.navigateToListView(); + + // Basic Settings for VM template + const wizard = new Wizard(); + await wizard.openWizard(); + await wizard.fillName(name); + await wizard.fillDescription(description); + if (!(await browser.getCurrentUrl()).includes(`${testName}/${this.kind}`)) { + await wizard.selectNamespace(namespace); + } + await wizard.selectProvisionSource(provisionSource); + await wizard.selectOperatingSystem(operatingSystem); + await wizard.selectFlavor(flavor); + await wizard.selectWorkloadProfile(workloadProfile); + if (cloudInit.useCloudInit) { + await wizard.useCloudInit(cloudInit); + } + await wizard.next(); + + // Networking + for (const resource of networkResources) { + await wizard.addNIC(resource); + } + await wizard.next(); + + // Storage + for (const resource of storageResources) { + if (resource.name === 'rootdisk' && provisionSource.method === 'URL') { + // Rootdisk is present by default, only edit specific properties + await wizard.editDiskAttribute(WIZARD_TABLE_FIRST_ROW, 'size', resource.size); + await wizard.editDiskAttribute(WIZARD_TABLE_FIRST_ROW, 'storage', resource.storageClass); + } else { + await wizard.addDisk(resource); + } + } + + // Create VM template + await wizard.next(); + await wizard.waitForCreation(); + + // Check for errors and close wizard + if (await errorMessage.isPresent()) { + console.error(await errorMessage.getText()); + throw new Error(WIZARD_CREATE_TEMPLATE_ERROR); + } + await wizard.next(); + + // Verify VM template is created + await filterForName(name); + await resourceRowsPresent(); + } + + asResource() { + return { + kind: 'template', + metadata: { + namespace: this.namespace, + name: this.name, + }, + }; + } +} diff --git a/frontend/packages/kubevirt-plugin/integration-tests/tests/models/wizard.ts b/frontend/packages/kubevirt-plugin/integration-tests/tests/models/wizard.ts index 80ef8dc74aa..ff552017e27 100644 --- a/frontend/packages/kubevirt-plugin/integration-tests/tests/models/wizard.ts +++ b/frontend/packages/kubevirt-plugin/integration-tests/tests/models/wizard.ts @@ -2,7 +2,7 @@ import { $, browser, ExpectedConditions as until } from 'protractor'; import { createItemButton, isLoaded } from '../../../../../integration-tests/views/crud.view'; import { selectDropdownOption, click } from '../../../../console-shared/src/test-utils/utils'; import { fillInput } from '../utils/utils'; -import { CloudInitConfig, StorageResource } from '../utils/types'; +import { CloudInitConfig, StorageResource, NetworkResource } from '../utils/types'; import { PAGE_LOAD_TIMEOUT_SECS } from '../utils/consts'; import * as wizardView from '../../views/wizard.view'; @@ -80,8 +80,9 @@ export class Wizard { await isLoaded(); } - async addNIC(name: string, mac: string, networkDefinition: string, binding: string) { + async addNIC(NICConfig: NetworkResource) { await click(wizardView.createNIC); + const { name, mac, networkDefinition, binding } = NICConfig; const rowsCount = await this.getTableRowsCount(); // Dropdown selection needs to be first due to https://github.com/kubevirt/web-ui-components/issues/9 await wizardView.selectTableDropdownAttribute(rowsCount, 'network', networkDefinition); diff --git a/frontend/packages/kubevirt-plugin/integration-tests/tests/utils/types.ts b/frontend/packages/kubevirt-plugin/integration-tests/tests/utils/types.ts index c384efe7a19..e4403e1d6d2 100644 --- a/frontend/packages/kubevirt-plugin/integration-tests/tests/utils/types.ts +++ b/frontend/packages/kubevirt-plugin/integration-tests/tests/utils/types.ts @@ -55,3 +55,16 @@ export type ProvisionConfig = { networkResources: NetworkResource[]; storageResources: StorageResource[]; }; + +export type VMTemplateConfig = { + name: string; + namespace: string; + description: string; + provisionSource?: ProvisionOption; + operatingSystem?: string; + flavor?: string; + workloadProfile?: string; + cloudInit?: CloudInitConfig; + storageResources?: StorageResource[]; + networkResources?: NetworkResource[]; +}; diff --git a/frontend/packages/kubevirt-plugin/integration-tests/tests/vm.template.wizard.scenario.ts b/frontend/packages/kubevirt-plugin/integration-tests/tests/vm.template.wizard.scenario.ts new file mode 100644 index 00000000000..535857de014 --- /dev/null +++ b/frontend/packages/kubevirt-plugin/integration-tests/tests/vm.template.wizard.scenario.ts @@ -0,0 +1,112 @@ +/* eslint-disable no-undef, max-nested-callbacks */ +import { OrderedMap } from 'immutable'; +import { testName } from '../../../../integration-tests/protractor.conf'; +import { + removeLeakedResources, + createResources, + deleteResources, + addLeakableResource, +} from '../../../console-shared/src/test-utils/utils'; +import { NetworkResource, StorageResource, ProvisionOption } from './utils/types'; +import { VM_BOOTUP_TIMEOUT_SECS } from './utils/consts'; +import { basicVMConfig, rootDisk, networkInterface, multusNAD, hddDisk } from './utils/mocks'; +import { getTestDataVolume } from './vm.wizard.configs'; +import { VirtualMachine } from './models/virtualMachine'; +import { VirtualMachineTemplate } from './models/virtualMachineTemplate'; + +describe('Kubevirt create VM Template using wizard', () => { + const leakedResources = new Set(); + const testDataVolume = getTestDataVolume(testName); + const commonSettings = { + cloudInit: { + useCloudInit: false, + }, + namespace: testName, + description: `Default description ${testName}`, + flavor: basicVMConfig.flavor, + operatingSystem: basicVMConfig.operatingSystem, + workloadProfile: basicVMConfig.workloadProfile, + }; + const vmTemplateConfig = (name, provisionConfig) => { + return { + ...commonSettings, + name: `${name}-${testName}`, + provisionSource: provisionConfig.provision, + storageResources: provisionConfig.storageResources, + networkResources: provisionConfig.networkResources, + }; + }; + const vmConfig = (name, templateConfig) => { + return { + ...commonSettings, + startOnCreation: true, + name: `${name}-${testName}`, + template: templateConfig.name, + storageResources: [], + networkResources: [], + }; + }; + + const provisionConfigs = OrderedMap< + string, + { + provision: ProvisionOption; + networkResources: NetworkResource[]; + storageResources: StorageResource[]; + } + >() + .set('URL', { + provision: { + method: 'URL', + source: basicVMConfig.sourceURL, + }, + networkResources: [networkInterface], + storageResources: [rootDisk], + }) + .set('Container', { + provision: { + method: 'Container', + source: basicVMConfig.sourceContainer, + }, + networkResources: [networkInterface], + storageResources: [hddDisk], + }) + .set('PXE', { + provision: { + method: 'PXE', + }, + networkResources: [networkInterface], + storageResources: [rootDisk], + }); + + beforeAll(async () => { + createResources([multusNAD, testDataVolume]); + }); + + afterAll(async () => { + deleteResources([multusNAD, testDataVolume]); + }); + + afterEach(() => { + removeLeakedResources(leakedResources); + }); + + provisionConfigs.forEach((provisionConfig, configName) => { + it( + `Create VM Template using ${configName}.`, + async () => { + const vmTemplate = new VirtualMachineTemplate( + vmTemplateConfig(configName.toLowerCase(), provisionConfig), + ); + const vm = new VirtualMachine(vmConfig(configName.toLowerCase(), vmTemplate)); + + addLeakableResource(leakedResources, vmTemplate.asResource()); + addLeakableResource(leakedResources, vm.asResource()); + + await vmTemplate.create(vmTemplateConfig(configName.toLowerCase(), provisionConfig)); + await vm.create(vmConfig(configName.toLowerCase(), vmTemplate)); + }, + VM_BOOTUP_TIMEOUT_SECS * 2, + ); + }); +});