Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 90 additions & 82 deletions testing/playwright/e2e/downstream/create-provider.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,109 +9,117 @@ if (!existsSync(providersPath)) {
}

import { CreateProviderPage } from '../../page-objects/CreateProviderPage';
import { EndpointType } from '../../types/enums';
import { EndpointType, ProviderType } from '../../types/enums';
import type { ProviderData } from '../../types/test-data';
import { getProviderConfig } from '../../utils/providers';
import { MTV_NAMESPACE } from '../../utils/resource-manager/constants';
import { ResourceManager } from '../../utils/resource-manager/ResourceManager';

const createProviderData = ({
useVddkAioOptimization,
}: {
useVddkAioOptimization: boolean;
}): ProviderData => {
const providerKey = process.env.VSPHERE_PROVIDER ?? 'vsphere-8.0.1';
const VSPHERE_KEY = process.env.VSPHERE_PROVIDER ?? 'vsphere-8.0.1';
const OVA_KEY = process.env.OVA_PROVIDER ?? 'ova';

interface ProviderTestScenario {
scenarioName: string;
providerType: ProviderType;
providerKey: string;
providerDataOverrides?: Partial<ProviderData>;
}

const createProviderData = (
providerType: ProviderType,
providerKey: string,
overrides?: Partial<ProviderData>,
): ProviderData => {
const providerConfig = getProviderConfig(providerKey);
const suffix = useVddkAioOptimization ? 'enabled' : 'disabled';
const uniqueId = crypto.randomUUID().slice(0, 8);

return {
name: `test-vsphere-provider-${suffix}-${crypto.randomUUID().slice(0, 8)}`,
const baseData: ProviderData = {
name: `test-${providerType}-provider-${uniqueId}`,
projectName: MTV_NAMESPACE,
type: providerConfig.type,
endpointType: providerConfig.endpoint_type ?? EndpointType.VCENTER,
hostname: providerConfig.api_url,
username: providerConfig.username,
password: providerConfig.password,
vddkInitImage: providerConfig.vddk_init_image,
useVddkAioOptimization,
};
};

test.describe('Provider Creation Tests', () => {
const resourceManager = new ResourceManager();
if (providerType !== ProviderType.OVA) {
baseData.username = providerConfig.username;
baseData.password = providerConfig.password;
}

test(
'should create a new vsphere provider with VDDK AIO optimization enabled',
{
tag: '@downstream',
},
async ({ page }) => {
const createProvider = new CreateProviderPage(page, resourceManager);
const testProviderData = createProviderData({ useVddkAioOptimization: true });
if (providerType === ProviderType.VSPHERE) {
baseData.endpointType = providerConfig.endpoint_type ?? EndpointType.VCENTER;
baseData.vddkInitImage = providerConfig.vddk_init_image;
}

await createProvider.navigate();
await createProvider.create(testProviderData, true);
return { ...baseData, ...overrides };
};

// Verify the useVddkAioOptimization value is persisted in the provider spec
const providerResource = await resourceManager.fetchProvider(page, testProviderData.name);
expect(providerResource).not.toBeNull();
expect(providerResource?.spec?.settings?.useVddkAioOptimization).toBe('true');
},
);
const providerTestScenarios: ProviderTestScenario[] = [
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

worth extracting to a constant to make this file a bit more clear and to easily expand more scenrios

{
scenarioName: 'vSphere with VDDK AIO optimization enabled',
providerType: ProviderType.VSPHERE,
providerKey: VSPHERE_KEY,
providerDataOverrides: { useVddkAioOptimization: true },
},
{
scenarioName: 'vSphere with VDDK AIO optimization disabled',
providerType: ProviderType.VSPHERE,
providerKey: VSPHERE_KEY,
providerDataOverrides: { useVddkAioOptimization: false },
},
{
scenarioName: 'OVA provider',
providerType: ProviderType.OVA,
providerKey: OVA_KEY,
},
];

test(
'should create a new vsphere provider with VDDK AIO optimization disabled',
{
tag: '@downstream',
},
async ({ page }) => {
const createProvider = new CreateProviderPage(page, resourceManager);
const testProviderData = createProviderData({ useVddkAioOptimization: false });

await createProvider.navigate();
await createProvider.create(testProviderData, true);

// Verify the useVddkAioOptimization value is persisted in the provider spec
const providerResource = await resourceManager.fetchProvider(page, testProviderData.name);
expect(providerResource).not.toBeNull();
// When disabled, the field might be undefined, 'false', or not present
const aioOptimization = providerResource?.spec?.settings?.useVddkAioOptimization;
expect(aioOptimization === undefined || aioOptimization === 'false').toBe(true);
},
);
test.describe('Provider Creation Tests', () => {
const resourceManager = new ResourceManager();

test(
'should create a new OVA provider',
{
tag: '@downstream',
},
async ({ page }) => {
const createProvider = new CreateProviderPage(page, resourceManager);

// Get OVA provider configuration
const ovaProviderKey = process.env.OVA_PROVIDER ?? 'ova';
const ovaProviderConfig = getProviderConfig(ovaProviderKey);

const testProviderData: ProviderData = {
name: `test-ova-provider-${crypto.randomUUID().slice(0, 8)}`,
projectName: MTV_NAMESPACE,
type: ovaProviderConfig.type,
hostname: ovaProviderConfig.api_url,
};

await createProvider.navigate();
await createProvider.create(testProviderData, true);

// Verify the provider resource was created
const providerResource = await resourceManager.fetchProvider(page, testProviderData.name);
expect(providerResource).not.toBeNull();
expect(providerResource?.spec?.type).toBe('ova');
expect(providerResource?.spec?.url).toBe(testProviderData.hostname);
providerTestScenarios.forEach(
({ scenarioName, providerType, providerKey, providerDataOverrides }) => {
test(
`should create a new ${providerType} provider: ${scenarioName}`,
{
tag: '@downstream',
},
async ({ page }) => {
const createProvider = new CreateProviderPage(page, resourceManager);
const testProviderData = createProviderData(
providerType,
providerKey,
providerDataOverrides,
);

await test.step('Navigate to provider creation page', async () => {
await createProvider.navigate();
});

await test.step('Create provider', async () => {
await createProvider.create(testProviderData, true);
});

await test.step('Verify provider resource', async () => {
const providerResource = await resourceManager.fetchProvider(
page,
testProviderData.name,
);
expect(providerResource).not.toBeNull();
expect(providerResource?.spec?.type).toBe(providerType);

if (testProviderData.useVddkAioOptimization === true) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if (testProviderData.useVddkAioOptimization)

expect(providerResource?.spec?.settings?.useVddkAioOptimization).toBe('true');
} else if (testProviderData.useVddkAioOptimization === false) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need else can be if (!testProviderData.useVddkAioOptimization)

const aioValue = providerResource?.spec?.settings?.useVddkAioOptimization;
expect(aioValue === undefined || aioValue === 'false').toBe(true);
}
});
},
);
},
);

test.afterAll(async () => {
// Cleanup: Delete the created provider
await resourceManager.instantCleanup();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ test.describe.serial('Plans - VSphere to Host Happy Path Cold Migration', () =>
sourceProvider: providerName,
virtualMachines: [
{
sourceName: 'mtv-func-rhel9',
targetName: `mtv-func-rhel9-renamed-${Date.now()}`,
sourceName: 'mtv-tests-rhel8',
targetName: `mtv-tests-rhel8-renamed-${Date.now()}`,
folder: 'vm',
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,12 @@ export class StorageMapStep {

for (let i = 0; i < rowCount; i += 1) {
const row = rows.nth(i);
const text = await row.textContent();
const sourceCell = row.locator('td').first();
const text = await sourceCell.textContent();
if (text) {
availableStorages.push(text.trim());
}
if (text?.includes(sourceStorage)) {
if (text?.trim() === sourceStorage) {
targetRow = row;
break;
}
Expand Down
Loading