Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
15 changes: 15 additions & 0 deletions cypress/e2e/po/lists/hosted-providers-list.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import BaseResourceList from '@/cypress/e2e/po/lists/base-resource-list.po';

export default class KontainerDriversListPo extends BaseResourceList {
details(name: string, index: number) {
return this.resourceTable().sortableTable().rowWithName(name).column(index);
}

activate() {
return cy.getId('sortable-table-activate');
}

deactivate() {
return cy.getId('sortable-table-deactivate');
}
}
36 changes: 36 additions & 0 deletions cypress/e2e/po/pages/cluster-manager/hosted-providers.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';
import HostedProvidersListPo from '@/cypress/e2e/po/lists/hosted-providers-list.po';
import BurgerMenuPo from '@/cypress/e2e/po/side-bars/burger-side-menu.po';
import ProductNavPo from '@/cypress/e2e/po/side-bars/product-side-nav.po';
/**
* List page for hostedprovider resources
*/
export default class HostedProvidersPagePo extends PagePo {
private static createPath(clusterId: string) {
return `/c/${ clusterId }/manager/hostedprovider`;
}

static goTo(clusterId: string): Cypress.Chainable<Cypress.AUTWindow> {
return super.goTo(HostedProvidersPagePo.createPath(clusterId));
}

constructor(clusterId = '_') {
super(HostedProvidersPagePo.createPath(clusterId));
}

static navTo() {
const sideNav = new ProductNavPo();

BurgerMenuPo.burgerMenuNavToMenubyLabel('Cluster Management');
sideNav.navToSideMenuGroupByLabel('Providers');
sideNav.navToSideMenuEntryByLabel('Hosted Providers');
}

title() {
return cy.contains('.title > h1', 'Hosted Providers');
}

list(): HostedProvidersListPo {
return new HostedProvidersListPo('[data-testid="hosted-provider-list"]');
}
}
136 changes: 48 additions & 88 deletions cypress/e2e/tests/pages/manager/cluster-manager.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ import { nodeDriveResponse } from '@/cypress/e2e/tests/pages/manager/mock-respon
import TabbedPo from '@/cypress/e2e/po/components/tabbed.po';
import LoadingPo from '@/cypress/e2e/po/components/loading.po';
import { EXTRA_LONG_TIMEOUT_OPT, MEDIUM_TIMEOUT_OPT } from '@/cypress/support/utils/timeouts';
// import KontainerDriversPagePo from '@/cypress/e2e/po/pages/cluster-manager/kontainer-drivers.po';
// import DeactivateDriverDialogPo from '@/cypress/e2e/po/prompts/deactivateDriverDialog.po';
import HostedProvidersPagePo from '@/cypress/e2e/po/pages/cluster-manager/hosted-providers.po';
import { USERS_BASE_URL } from '@/cypress/support/utils/api-endpoints';

// At some point these will come from somewhere central, then we can make tools to remove resources from this or all runs
Expand All @@ -36,7 +35,8 @@ const importType = 'cluster';
const clusterNamePartial = `${ runPrefix }-create`;
const rke2CustomName = `${ clusterNamePartial }-rke2-custom`;
const importGenericName = `${ clusterNamePartial }-import-generic`;
const reenableAKS = false;
let reenableAKS = false;
let originalSettings = '[{"name":"aks","active":true},{"name":"alibaba","active":true},{"name":"eks","active":true},{"name":"gke","active":true}]';

const downloadsFolder = Cypress.config('downloadsFolder');

Expand All @@ -46,92 +46,52 @@ describe('Cluster Manager', { testIsolation: 'off', tags: ['@manager', '@adminUs

before(() => {
cy.login();
cy.getRancherResource('v1', 'management.cattle.io.settings', 'kev2-operators', null).then((resp: Cypress.Response<any>) => {
const response = resp.body;

// update original data before sending request
originalSettings = response.value;
});
});

// Revert commented out tests as part of https://github.com/rancher/dashboard/issues/15391

// it('deactivating a kontainer driver should hide its card from the cluster creation page', () => {
// cy.intercept('GET', '/v3/kontainerdrivers').as('getKontainerDrivers');
// cy.intercept('POST', 'v3/kontainerDrivers/azurekubernetesservice?action=deactivate').as('deactivateDriver');
// cy.intercept('POST', 'v3/kontainerDrivers/azurekubernetesservice?action=activate').as('activateDriver');

// const driversPage = new KontainerDriversPagePo();
// const clusterCreatePage = new ClusterManagerCreatePagePo();

// KontainerDriversPagePo.navTo();
// driversPage.waitForPage();

// // assert AKS kontainer driver is in Active state
// cy.wait('@getKontainerDrivers').then(({ response }) => {
// response.body.data.forEach((item: any) => {
// if (item.id === 'azurekubernetesservice') {
// const state = item['active'];

// expect(state).to.eq(true);
// }
// });
// });

// // deactivate the AKS driver
// driversPage.list().actionMenu('Azure AKS').getMenuItem('Deactivate').click();
// const deactivateDialog = new DeactivateDriverDialogPo();

// deactivateDialog.deactivate();
// cy.wait('@deactivateDriver').its('response.statusCode').should('eq', 200).then(() => {
// reenableAKS = true;
// });

// // verify that the AKS card is not shown
// clusterList.goTo();
// clusterList.checkIsCurrentPage();
// clusterList.createCluster();
// clusterCreatePage.gridElementExistanceByName('Azure AKS', 'not.exist');

// // re-enable the AKS kontainer driver
// KontainerDriversPagePo.navTo();
// driversPage.waitForPage();
// driversPage.list().actionMenu('Azure AKS').getMenuItem('Activate').click();
// cy.wait('@activateDriver').its('response.statusCode').should('eq', 200).then(() => {
// reenableAKS = false;
// });

// // verify that the AKS card is back
// clusterList.goTo();
// clusterList.checkIsCurrentPage();
// clusterList.createCluster();
// clusterCreatePage.gridElementExistanceByName('Azure AKS', 'exist');
// });

// it('deleting a kontainer driver should hide its card from the cluster creation page', () => {
// // intercept get request for kontainer drivers
// cy.intercept('GET', '/v1/management.cattle.io.kontainerdriver*', (req) => {
// req.reply( {
// type: 'collection',
// resourceType: 'management.cattle.io.kontainerdriver',
// count: 0,
// data: []
// });
// } ).as('kontainerDrivers');

// const clusterCreatePage = new ClusterManagerCreatePagePo();

// // verify that the AKS card is not shown
// clusterList.goTo();
// clusterList.checkIsCurrentPage();
// clusterList.createCluster();

// clusterCreatePage.waitForPage();
// cy.wait('@kontainerDrivers');

// clusterCreatePage.gridElementExistanceByName('Azure AKS', 'not.exist');

// clusterCreatePage.gridElementGroupTitles().should('have.length', 2);

// clusterCreatePage.gridElementGroupTitles().eq(0).should('not.contain.text', 'Create a cluster');

// clusterCreatePage.gridElementGroupTitles().eq(0).should('contain.text', 'Provision new nodes');
// clusterCreatePage.gridElementGroupTitles().eq(1).should('contain.text', 'Use existing nodes');
// });
it('deactivating a hosted provider should hide its card from the cluster creation page', () => {
cy.intercept('PUT', `v1/management.cattle.io.settings/kev2-operators`).as('updateProviders');

const providersPage = new HostedProvidersPagePo();
const clusterCreatePage = new ClusterManagerCreatePagePo();

HostedProvidersPagePo.navTo();
providersPage.waitForPage();

// assert AKS kontainer driver is in Active state
providersPage.list().details('Azure AKS', 1).should('contain', 'Active');

// deactivate the AKS driver
providersPage.list().actionMenu('Azure AKS').getMenuItem('Deactivate').click();
cy.wait('@updateProviders').its('response.statusCode').should('eq', 200).then(() => {
reenableAKS = true;
});

// verify that the AKS card is not shown
clusterList.goTo();
clusterList.checkIsCurrentPage();
clusterList.createCluster();
clusterCreatePage.gridElementExistanceByName('Azure AKS', 'not.exist');

// re-enable the AKS kontainer driver
HostedProvidersPagePo.navTo();
providersPage.waitForPage();
providersPage.list().actionMenu('Azure AKS').getMenuItem('Activate').click();
cy.wait('@updateProviders').its('response.statusCode').should('eq', 200).then(() => {
reenableAKS = false;
});

// verify that the AKS card is back
clusterList.goTo();
clusterList.checkIsCurrentPage();
clusterList.createCluster();
clusterCreatePage.gridElementExistanceByName('Azure AKS', 'exist');
});

describe('RKE2 providers', () => {
providersList.forEach((prov) => {
Expand Down Expand Up @@ -797,7 +757,7 @@ describe('Cluster Manager', { testIsolation: 'off', tags: ['@manager', '@adminUs

after(() => {
if (reenableAKS) {
cy.createRancherResource('v3', 'kontainerDrivers/azurekubernetesservice?action=activate', {});
cy.setRancherResource('v1', 'management.cattle.io.settings', 'kev2-operators', { value: originalSettings });
}
});
});
Expand Down
173 changes: 173 additions & 0 deletions cypress/e2e/tests/pages/manager/hosted-providers.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
import HostedProvidersPagePo from '@/cypress/e2e/po/pages/cluster-manager/hosted-providers.po';
import ClusterManagerListPagePo from '@/cypress/e2e/po/pages/cluster-manager/cluster-manager-list.po';
import ClusterManagerCreatePagePo from '@/cypress/e2e/po/edit/provisioning.cattle.io.cluster/create/cluster-create.po';

describe('Hosted Providers', { testIsolation: 'off', tags: ['@manager', '@adminUser'] }, () => {
const providersPage = new HostedProvidersPagePo();
const clusterList = new ClusterManagerListPagePo();
const createCluster = new ClusterManagerCreatePagePo();

const AKS = 'Azure AKS';
const EKS = 'Amazon EKS';
const GKE = 'Google GKE';

before(() => {
cy.login();
});

it('should show the hosted providers list page', () => {
HostedProvidersPagePo.navTo();
providersPage.waitForPage();
providersPage.title().should('be.visible');
providersPage.list().resourceTable().sortableTable().checkVisible();
providersPage.list().resourceTable().sortableTable().checkLoadingIndicatorNotVisible();
});

it('can deactivate provider', () => {
const expected = {
aks: false, eks: true, gke: true
};

HostedProvidersPagePo.navTo();
providersPage.waitForPage();

cy.intercept('PUT', `v1/management.cattle.io.settings/kev2-operators`).as('updateProviders');

providersPage.list().actionMenu(AKS).getMenuItem('Deactivate').click();

cy.wait('@updateProviders').then(({ request, response }) => {
expect(response?.statusCode).to.eq(200);
const resValue = JSON.parse(request.body.value);

resValue.forEach((item: any) => {
if (item.name in expected) {
const state = item['active'];

expect(state).to.eq(expected[item.name]);
}
});
});

// check options on cluster create page
ClusterManagerListPagePo.navTo();
clusterList.waitForPage();
clusterList.createCluster();
createCluster.waitForPage();
createCluster.gridElementExistanceByName(AKS, 'not.exist');
});

it('can activate provider', () => {
const expected = {
aks: true, eks: true, gke: true
};

HostedProvidersPagePo.navTo();
providersPage.waitForPage();

cy.intercept('PUT', `v1/management.cattle.io.settings/kev2-operators`).as('updateProviders');

providersPage.list().actionMenu(AKS).getMenuItem('Activate').click();

cy.wait('@updateProviders').then(({ request, response }) => {
expect(response?.statusCode).to.eq(200);
const resValue = JSON.parse(request.body.value);

resValue.forEach((item: any) => {
if (item.name in expected) {
const state = item['active'];

expect(state).to.eq(expected[item.name]);
}
});
});

// check options on cluster create page
ClusterManagerListPagePo.navTo();
clusterList.waitForPage();
clusterList.createCluster();
createCluster.waitForPage();
createCluster.gridElementExistanceByName(AKS, 'exist');
});

it('can deactivate drivers in bulk', () => {
const expected = {
aks: true, eks: false, gke: false
};

HostedProvidersPagePo.navTo();
providersPage.waitForPage();
providersPage.list().details(EKS, 1).should('contain', 'Active');
providersPage.list().details(GKE, 1).should('contain', 'Active');
providersPage.list().resourceTable().sortableTable().rowSelectCtlWithName(EKS)
.set();
providersPage.list().resourceTable().sortableTable().rowSelectCtlWithName(GKE)
.set();

cy.intercept('PUT', `v1/management.cattle.io.settings/kev2-operators`).as('updateProviders');

providersPage.list().deactivate().click();
cy.wait('@updateProviders').then(({ request, response }) => {
expect(response?.statusCode).to.eq(200);
const resValue = JSON.parse(request.body.value);

resValue.forEach((item: any) => {
if (item.name in expected) {
const state = item['active'];

expect(state).to.eq(expected[item.name]);
}
});
});
providersPage.list().details(EKS, 1).should('contain', 'Inactive');
providersPage.list().details(GKE, 1).should('contain', 'Inactive');

// check options on cluster create page
ClusterManagerListPagePo.navTo();
clusterList.waitForPage();
clusterList.createCluster();
createCluster.waitForPage();
createCluster.gridElementExistanceByName(EKS, 'not.exist');
createCluster.gridElementExistanceByName(GKE, 'not.exist');
});

it('can activate drivers in bulk', () => {
const expected = {
aks: true, eks: true, gke: true
};

HostedProvidersPagePo.navTo();
providersPage.waitForPage();
providersPage.list().details(EKS, 1).should('contain', 'Inactive');
providersPage.list().details(GKE, 1).should('contain', 'Inactive');
providersPage.list().resourceTable().sortableTable().rowSelectCtlWithName(EKS)
.set();
providersPage.list().resourceTable().sortableTable().rowSelectCtlWithName(GKE)
.set();

cy.intercept('PUT', `v1/management.cattle.io.settings/kev2-operators`).as('updateProviders');

providersPage.list().activate().click();
cy.wait('@updateProviders').then(({ request, response }) => {
expect(response?.statusCode).to.eq(200);
const resValue = JSON.parse(request.body.value);

resValue.forEach((item: any) => {
if (item.name in expected) {
const state = item['active'];

expect(state).to.eq(expected[item.name]);
}
});
});
providersPage.list().details(EKS, 1).should('contain', 'Active');
providersPage.list().details(GKE, 1).should('contain', 'Active');

// check options on cluster create page
ClusterManagerListPagePo.navTo();
clusterList.waitForPage();
clusterList.createCluster();
createCluster.waitForPage();
createCluster.gridElementExistanceByName(EKS, 'exist');
createCluster.gridElementExistanceByName(GKE, 'exist');
});
});
Loading