Skip to content

Commit

Permalink
Bug 1911408: Add autoClone cli tests and new flow of VM creation
Browse files Browse the repository at this point in the history
Adjust the wizard process to support new vm creation flow.
Also added test about uploading image from cli for auto clone.
  • Loading branch information
gouyang committed Dec 29, 2020
1 parent 3fc584b commit 085670c
Show file tree
Hide file tree
Showing 16 changed files with 203 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,43 @@ import { execSync } from 'child_process';
import { testName } from '@console/internal-integration-tests/protractor.conf';
import { browser, ExpectedConditions as until } from 'protractor';
import {
click,
removeLeakedResources,
withResource,
withResources,
} from '@console/shared/src/test-utils/utils';
import { errorMessage } from '@console/internal-integration-tests/views/crud.view';
import { errorMessage, isLoaded } from '@console/internal-integration-tests/views/crud.view';
import { warnMessage } from '../views/pvc.view';
import { bootSource, vmtLinkByName } from '../views/template.view';
import {
CLONE_VM_TIMEOUT_SECS,
CDI_UPLOAD_TIMEOUT_SECS,
PAGE_LOAD_TIMEOUT_SECS,
VM_BOOTUP_TIMEOUT_SECS,
STORAGE_CLASS,
CIRROS_IMAGE,
FEDORA_IMAGE,
RHEL7_IMAGE,
WIN10_IMAGE,
} from './utils/constants/common';
import { VM_STATUS } from './utils/constants/vm';
import {
GOLDEN_OS_IMAGES_NS,
CIRROS_PVC,
LOCAL_CIRROS_IMAGE,
FEDORA_PVC,
RHEL7_PVC,
WIN10_PVC,
} from './utils/constants/pvc';
import { VM_STATUS } from './utils/constants/vm';
import { TemplateByName } from './utils/constants/wizard';
import { PVCData } from './types/pvc';
import { UploadForm } from './models/pvcUploadForm';
import { PVC } from './models/pvc';
import { VMBuilder } from './models/vmBuilder';
import { getBasicVMBuilder } from './mocks/vmBuilderPresets';
import { VMTemplateBuilder } from './models/vmtemplateBuilder';
import { getBasicVMBuilder, getBasicVMTBuilder } from './mocks/vmBuilderPresets';
import { flavorConfigs } from './mocks/mocks';
import { uploadOSImage } from './utils/utils';

function imagePull(src, dest) {
if (src === CIRROS_IMAGE) {
Expand Down Expand Up @@ -67,7 +74,7 @@ describe('KubeVirt Auto Clone', () => {
removeLeakedResources(leakedResources);
});

describe('KubeVirt CDI Upload', () => {
xdescribe('KubeVirt CDI Upload', () => {
const uploadForm = new UploadForm();

it(
Expand Down Expand Up @@ -125,7 +132,7 @@ describe('KubeVirt Auto Clone', () => {
});
});

describe('KubeVirt GOLDEN OS Creation', () => {
xdescribe('KubeVirt GOLDEN OS Creation', () => {
const fedoraPVC = new PVC(FEDORA_PVC);
const win10PVC = new PVC(WIN10_PVC);

Expand Down Expand Up @@ -221,4 +228,59 @@ describe('KubeVirt Auto Clone', () => {
VM_BOOTUP_TIMEOUT_SECS + CLONE_VM_TIMEOUT_SECS,
);
});

describe('Auto-clone from cli', () => {
const vmTemplate = new VMTemplateBuilder(getBasicVMTBuilder())
.setName(TemplateByName.RHEL8)
.build();

beforeAll(async () => {
uploadOSImage('rhel8', GOLDEN_OS_IMAGES_NS, cirrosPVC.image, 'ReadWriteMany', true);
});

afterAll(async () => {
execSync(`kubectl delete dv rhel8 --ignore-not-found -n ${GOLDEN_OS_IMAGES_NS}`);
});

it(
'ID(CNV-5044) Verify boot source available for the template RHEL8',
async () => {
await vmTemplate.navigateToListView();
await click(vmtLinkByName(vmTemplate.name));
await isLoaded();
await browser.wait(until.presenceOf(bootSource), PAGE_LOAD_TIMEOUT_SECS);
await browser.wait(until.textToBePresentInElement(bootSource, 'Available'));
},
PAGE_LOAD_TIMEOUT_SECS,
);

it(
'ID(CNV-5597) Create RHEL8 VM from golden os template upload via CLI',
async () => {
const rhel8 = new VMBuilder(getBasicVMBuilder())
.setSelectTemplateName(TemplateByName.RHEL8)
.setStartOnCreation(true)
.build();

await withResource(leakedResources, rhel8.asResource(), async () => {
await rhel8.create();
await rhel8.navigateToDetail();
});
},
VM_BOOTUP_TIMEOUT_SECS + CLONE_VM_TIMEOUT_SECS,
);

it(
'ID(CNV-5598) Delete RHEL8 DV from CLI',
async () => {
execSync(`kubectl delete dv rhel8 -n ${GOLDEN_OS_IMAGES_NS}`);

await vmTemplate.navigateToListView();
await click(vmtLinkByName(vmTemplate.name));
await isLoaded();
await browser.wait(until.stalenessOf(bootSource), PAGE_LOAD_TIMEOUT_SECS);
},
PAGE_LOAD_TIMEOUT_SECS,
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
resolveStorageDataAttribute,
deepFreeze,
} from '../utils/utils';
import { Flavor, TemplateByName } from '../utils/constants/wizard';
import { Flavor } from '../utils/constants/wizard';
import {
NIC_MODEL,
NIC_TYPE,
Expand Down Expand Up @@ -480,7 +480,3 @@ export const v2vUIDeployment = {
},
};
deepFreeze(v2vUIDeployment);

export const basicCommonTemplate = {
name: TemplateByName.RHEL7,
};
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { deepFreeze } from '../utils/utils';
import { VMBuilder } from '../models/vmBuilder';
import * as Combinatorics from 'js-combinatorics';
import { Flavor, Workload, OperatingSystem } from '../utils/constants/wizard';
import { Flavor, Workload, OperatingSystem, TemplateByName } from '../utils/constants/wizard';
import { VMBuilderDataGenerationConfig, VMBuilderData } from '../types/vm';
import { testName } from '@console/internal-integration-tests/protractor.conf';
import {
Expand All @@ -10,7 +10,6 @@ import {
containerRootDisk,
flavorConfigs,
getDiskToCloneFrom,
basicCommonTemplate,
} from './mocks';
import { VirtualMachine } from '../models/virtualMachine';
import { VMTemplateBuilder } from '../models/vmtemplateBuilder';
Expand Down Expand Up @@ -92,7 +91,7 @@ export const getBasicVMBuilder = () =>
new VMBuilder()
.setNamespace(testName)
.setDescription('Default vm description')
.setCommonTemplate(basicCommonTemplate)
.setSelectTemplateName(TemplateByName.RHEL7)
.setFlavor(flavorConfigs.Tiny)
.setOS(OperatingSystem.RHEL7)
.setWorkload(Workload.DESKTOP)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { cloneDeepWithEnum } from '@console/shared/src/constants/object-enum';
import { OperatingSystem, Workload, OSIDLookup } from '../utils/constants/wizard';
import { FlavorConfig, Disk, Network, CloudInitConfig } from '../types/types';
import { BaseVMBuilderData, CommonTemplate } from '../types/vm';
import { BaseVMBuilderData } from '../types/vm';
import { K8sKind } from '@console/internal/module/k8s';
import { getRandStr } from '../utils/utils';
import { ProvisionSource } from '../utils/constants/enums/provisionSource';
Expand Down Expand Up @@ -61,8 +61,8 @@ export abstract class BaseVMBuilder<T extends BaseVMBuilderData> {
return this;
}

public setCommonTemplate(commonTemplate: CommonTemplate) {
this.data.commonTemplate = commonTemplate;
public setTemplateNamespace(namespace: string) {
this.data.templateNamespace = namespace;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@
import { browser, ExpectedConditions as until } from 'protractor';
import { cloneDeepWithEnum } from '@console/shared/src/constants/object-enum';
import { click, waitForStringNotInElement } from '@console/shared/src/test-utils/utils';
import { isLoaded } from '@console/internal-integration-tests/views/crud.view';
import { detailViewAction, listViewAction } from '@console/shared/src/test-utils/actions.view';
import { modalOverlay } from '@console/kubevirt-plugin/integration-tests/views/uiResource.view';
import { VirtualMachineModel } from '@console/kubevirt-plugin/src/models';
import * as vmView from '../../views/virtualMachine.view';
import { vmtLinkByName } from '../../views/template.view';
import { resourceHorizontalTab } from '../../views/uiResource.view';
import { saveButton } from '../../views/kubevirtUIResource.view';
import {
PAGE_LOAD_TIMEOUT_SECS,
UNEXPECTED_ACTION_ERROR,
Expand All @@ -14,8 +18,8 @@ import {
} from '../utils/constants/common';
import { BaseVirtualMachine } from './baseVirtualMachine';
import { AddDialog } from '../dialogs/schedulingDialog';
import { saveButton } from '../../views/kubevirtUIResource.view';
import { VMBuilderData } from '../types/vm';
import { VirtualMachineTemplateModel } from '../types/types';
import { VM_ACTION, TAB, VM_STATUS } from '../utils/constants/vm';

import { MatchLabels } from 'public/module/k8s';
Expand Down Expand Up @@ -154,13 +158,24 @@ export class VirtualMachine extends BaseVirtualMachine {
return new VirtualMachine(builderData);
}

async getVmtResourceName(vmtName: string): Promise<string> {
await this.navigateToListView();
await click(resourceHorizontalTab(VirtualMachineTemplateModel));
await click(vmtLinkByName(vmtName));
await isLoaded();
return this.getResourceTitle();
}

async create() {
const wizard = new Wizard();
const { template } = this.getData();
const { template, templateNamespace } = this.getData();

await this.navigateToListView();

if (template) {
await wizard.openVMFromTemplateWizard(template, this.namespace);
const templateSourceName = await this.getVmtResourceName(template);
await this.navigateToListView();
await wizard.openVMFromTemplateWizard(templateSourceName, templateNamespace);
} else {
await wizard.openWizard(VirtualMachineModel);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
/* eslint-disable no-await-in-loop */
import { click } from '@console/shared/src/test-utils/utils';
import { cloneDeepWithEnum } from '@console/shared/src/constants/object-enum';
import { isLoaded } from '@console/internal-integration-tests/views/crud.view';
import { detailViewAction, listViewAction } from '@console/shared/src/test-utils/actions.view';
import { VirtualMachineTemplateModel } from '../types/types';
import { getResourceUID } from '../utils/utils';
import { KubevirtUIResource } from './kubevirtUIResource';
import { VMT_ACTION } from '../utils/constants/vm';
import { templateCreateVMLink } from '../../views/template.view';
import { templateCreateVMLink, vmtLinkByName } from '../../views/template.view';
import { VMTemplateBuilderData } from '../types/vm';
import { Wizard } from './wizard';

Expand All @@ -31,9 +32,17 @@ export class VirtualMachineTemplate extends KubevirtUIResource<VMTemplateBuilder
await listViewAction(this.name)(action, confirmedActions.includes(action));
}

async getResourceName(): Promise<string> {
await this.navigateToListView();
await click(vmtLinkByName(this.name));
await isLoaded();
return this.getResourceTitle();
}

async createVMFromRowLink() {
await this.navigateToListView();
const uid = getResourceUID(this.model.kind, this.name, this.namespace);
const templateName = await this.getResourceName();
const uid = getResourceUID(this.model.kind, templateName, this.namespace);
await click(templateCreateVMLink(uid));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { BaseVMBuilder } from './baseVMBuilder';
import { VMBuilderData } from '../types/vm';
import { DiskAdvance } from '../types/types';
import { VirtualMachineModel } from '../../../src/models/index';
import { VirtualMachine } from './virtualMachine';

Expand All @@ -23,6 +24,26 @@ export class VMBuilder extends BaseVMBuilder<VMBuilderData> {
return this;
}

public setMountAsCDROM(mountAsCDROM: boolean) {
this.data.mountAsCDROM = mountAsCDROM;
return this;
}

public setPVCSize(pvcSize: string) {
this.data.pvcSize = pvcSize;
return this;
}

public setDiskAdvance(diskAdvance: DiskAdvance) {
this.data.diskAdvance = diskAdvance;
return this;
}

public setSelectTemplateName(selectTemplateName: string) {
this.data.selectTemplateName = selectTemplateName;
return this;
}

build() {
if (!this.getData().name) {
super.generateName();
Expand Down

0 comments on commit 085670c

Please sign in to comment.