Skip to content

Commit

Permalink
Support built-in plugin operator with feature flag (rancher#11036)
Browse files Browse the repository at this point in the history
* Support built-in plugin operator with feature flag

Update unit tests to account for feature flag

* remove waitForPage from addExtensionsRepository

* adjust before and beforeEach hooks in kubewarden spec

* adjust beforeEach hook on KW spec so that it matches what is on the extension spec, which is working as expected

* Add catchTargetPageException

---------

Co-authored-by: Alexandre Alves <[email protected]>
  • Loading branch information
jordojordo and aalves08 authored May 30, 2024
1 parent 542ebd4 commit 6e939ba
Show file tree
Hide file tree
Showing 10 changed files with 181 additions and 827 deletions.
83 changes: 1 addition & 82 deletions cypress/e2e/po/pages/extensions.po.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';
import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po';
import LabeledSelectPo from '@/cypress/e2e/po/components/labeled-select.po';
import TabbedPo from '@/cypress/e2e/po/components/tabbed.po';
import ActionMenuPo from '@/cypress/e2e/po/components/action-menu.po';
Expand Down Expand Up @@ -37,43 +36,6 @@ export default class ExtensionsPagePo extends PagePo {
return this.self().get('.data-loading');
}

/**
* install extensions operator
*/
installExtensionsOperatorIfNeeded(attempt = 0): Cypress.Chainable | null {
// this will make sure we wait for the page to render first content
// so that the attempts aren't on a blank page
// this.title();

this.waitForPage();
this.title();

if (attempt > 30) {
return null;
}

const enableButton = this.installOperatorBtn();

if (!enableButton.isVisible) {
throw new Error('PO changed');
}

return enableButton.isVisible().then((visible) => {
if (visible) {
return enableButton.click().then(() => {
// don't install the parners repo yet, as it's needed for the add repositories test
this.enableExtensionModalParnersRepoClick();

return this.enableExtensionModalEnableClick();
});
} else {
return cy.wait(250).then(() => { // eslint-disable-line cypress/no-unnecessary-waiting
return this.installExtensionsOperatorIfNeeded(++attempt); // next attempt
});
}
});
}

/**
* Adds a cluster repo for extensions
* @param repo - The repository url (e.g. https://github.com/rancher/ui-plugin-examples)
Expand All @@ -92,7 +54,7 @@ export default class ExtensionsPagePo extends PagePo {
// create a new clusterrepo
const appRepoList = new RepositoriesPagePo('local', 'apps');

appRepoList.waitForPage();
// appRepoList.waitForPage();
appRepoList.waitForGoTo('/v1/catalog.cattle.io.clusterrepos?exclude=metadata.managedFields');
appRepoList.create();

Expand Down Expand Up @@ -236,10 +198,6 @@ export default class ExtensionsPagePo extends PagePo {
return new ActionMenuPo(this.self()).getMenuItem('Add Rancher Repositories').click();
}

disableExtensionsClick(): Cypress.Chainable {
return new ActionMenuPo(this.self()).getMenuItem('Disable Extension Support').click();
}

// ------------------ ADD RANCHER REPOSITORIES modal ------------------
addReposModal() {
return this.self().getId('add-extensions-repos-modal');
Expand All @@ -249,45 +207,6 @@ export default class ExtensionsPagePo extends PagePo {
return this.addReposModal().get('.dialog-buttons button:last-child').click();
}

// ------------------ DISABLE EXTENSIONS modal ------------------
disableExtensionModal() {
return this.self().getId('disable-ext-modal');
}

removeRancherExtRepoCheckboxClick(): Cypress.Chainable {
return this.self().getId('disable-ext-modal-remove-official-repo').click();
}

disableExtensionModalCancelClick(): Cypress.Chainable {
return this.disableExtensionModal().get('.dialog-buttons button:first-child').click();
}

disableExtensionModalDisableClick(): Cypress.Chainable {
return this.disableExtensionModal().get('.dialog-buttons button:last-child').click();
}

// ------------------ ENABLE EXTENSIONS modal ------------------
enableExtensionModal() {
return this.self().get('[data-modal="confirm-uiplugins-setup"]');
}

enableExtensionModalParnersRepoClick(): Cypress.Chainable {
return this.enableExtensionModal().getId('extension-enable-operator-partners-repo').click();
}

enableExtensionModalCancelClick(): Cypress.Chainable {
return this.enableExtensionModal().get('.dialog-buttons button:first-child').click();
}

enableExtensionModalEnableClick(): Cypress.Chainable {
return this.enableExtensionModal().get('.dialog-buttons button:last-child').click();
}

// ------------------ install operator ------------------
installOperatorBtn(): AsyncButtonPo {
return new AsyncButtonPo('[data-testid="extension-enable-operator"]');
}

// ------------------ add a new repo (Extension Examples) ------------------
enterClusterRepoName(name: string) {
return new NameNsDescriptionPo(this.self()).name().set(name);
Expand Down
20 changes: 10 additions & 10 deletions cypress/e2e/po/pages/extensions/kubewarden.po.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';
import ExtensionsPagePo from '@/cypress/e2e/po/pages/extensions.po';
// import ExtensionsPagePo from '@/cypress/e2e/po/pages/extensions.po';

export default class KubewardenExtensionPo extends PagePo {
private static createPath(clusterId: string) {
Expand All @@ -15,15 +15,15 @@ export default class KubewardenExtensionPo extends PagePo {
}

/** add ui-plugin-charts repository */
addChartsRepoIfNeeded(): void {
const extensionsPo: ExtensionsPagePo = new ExtensionsPagePo();
// addChartsRepoIfNeeded(): void {
// const extensionsPo: ExtensionsPagePo = new ExtensionsPagePo();

extensionsPo.waitForPage();
// extensionsPo.waitForPage();

cy.get('body').then(($body: any) => {
if ( $body.find('[data-testid="extension-card-kubewarden"]').length === 0 ) {
extensionsPo.addExtensionsRepository('https://github.com/rancher/ui-plugin-charts', 'main', 'rancher-extensions');
}
});
}
// cy.get('body').then(($body: any) => {
// if ( $body.find('[data-testid="extension-card-kubewarden"]').length === 0 ) {
// extensionsPo.addExtensionsRepository('https://github.com/rancher/ui-plugin-charts', 'main', 'rancher-extensions');
// }
// });
// }
}
63 changes: 32 additions & 31 deletions cypress/e2e/tests/pages/extensions/extensions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ describe('Extensions page', { tags: ['@extensions', '@adminUser'] }, () => {
extensionsPo.goTo();
extensionsPo.waitForPage();

// install extensions operator if it's not installed
extensionsPo.installExtensionsOperatorIfNeeded();

// install the rancher plugin examples
extensionsPo.addExtensionsRepository('https://github.com/rancher/ui-plugin-examples', 'main', 'rancher-plugin-examples');
});
Expand All @@ -37,6 +34,38 @@ describe('Extensions page', { tags: ['@extensions', '@adminUser'] }, () => {
cy.title().should('eq', 'Rancher - Extensions');
});

it('Should check the feature flag', () => {
const extensionsPo = new ExtensionsPagePo();

extensionsPo.goTo();

cy.intercept('GET', '/v1/management.cattle.io.features?*', {
type: 'collection',
resourceType: 'management.cattle.io.feature',
data: [
{
id: 'uiextension',
type: 'management.cattle.io.feature',
kind: 'Feature',
spec: { value: true },
status: {
default: true,
description: 'Enable UI Extensions when starting Rancher',
dynamic: false,
lockedValue: null
}
}
]
}).as('getFeatureFlag');

extensionsPo.waitForPage();
extensionsPo.waitForTitle();

cy.wait('@getFeatureFlag').then(() => {
extensionsPo.extensionTabs.checkVisible();
});
});

it('using "Add Rancher Repositories" should add a new repository (Partners repo)', () => {
const extensionsPo = new ExtensionsPagePo();

Expand Down Expand Up @@ -65,34 +94,6 @@ describe('Extensions page', { tags: ['@extensions', '@adminUser'] }, () => {
appRepoList.sortableTable().rowElementWithName(UI_PLUGINS_PARTNERS_REPO_URL).should('exist');
});

it('Should disable and enable extension support', () => {
const extensionsPo = new ExtensionsPagePo();

extensionsPo.goTo();

// open menu and click on disable extension support
extensionsPo.extensionMenuToggle();
extensionsPo.disableExtensionsClick();

// on the modal, keep the extensions repo and click disable
extensionsPo.disableExtensionModalDisableClick();

// let's wait for the install button to become visible and re-install
// the extensions operator
extensionsPo.installOperatorBtn().checkVisible();
extensionsPo.installOperatorBtn().click();
extensionsPo.enableExtensionModalEnableClick();

// wait for operation to finish and refresh...
extensionsPo.extensionTabs.checkVisible();
extensionsPo.goTo();
extensionsPo.waitForPage();

// let's make sure all went good
extensionsPo.extensionTabAvailableClick();
extensionsPo.extensionCard(EXTENSION_NAME).should('be.visible');
});

it('New repos banner should only appear once (after dismiss should NOT appear again)', () => {
cy.getRancherResource('v3', 'setting', 'display-add-extension-repos-banner', null).then((resp: Cypress.Response<any>) => {
const notFound = resp.status === 404;
Expand Down
21 changes: 15 additions & 6 deletions cypress/e2e/tests/pages/extensions/kubewarden.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,34 @@ import { ChartsPage } from '@/cypress/e2e/po/pages/explorer/charts/charts.po';
import RepositoriesPagePo from '@/cypress/e2e/po/pages/chart-repositories.po';
import ProductNavPo from '@/cypress/e2e/po/side-bars/product-side-nav.po';
import KubewardenExtensionPo from '@/cypress/e2e/po/pages/extensions/kubewarden.po';
import { catchTargetPageException } from '@/cypress/support/utils/exception-utils';

const extensionName = 'kubewarden';

describe('Kubewarden Extension', { tags: ['@extensions', '@adminUser'] }, () => {
before(() => {
catchTargetPageException('Navigation cancelled');
cy.login();

ExtensionsPagePo.goTo();
const extensionsPo = new ExtensionsPagePo();
const kubewardenPo = new KubewardenExtensionPo();

// install extensions operator if it's not installed
extensionsPo.installExtensionsOperatorIfNeeded();
kubewardenPo.addChartsRepoIfNeeded();
extensionsPo.goTo();
extensionsPo.waitForPage();

// install the ui-plugin-charts repo
extensionsPo.addExtensionsRepository('https://github.com/rancher/ui-plugin-charts', 'main', 'rancher-extensions');
});

beforeEach(() => {
cy.login();
ExtensionsPagePo.goTo();
});

it('Should install Kubewarden extension', () => {
const extensionsPo = new ExtensionsPagePo();

extensionsPo.goTo();
extensionsPo.waitForPage();

extensionsPo.extensionTabAvailableClick();

// click on install button on card
Expand Down Expand Up @@ -66,6 +70,7 @@ describe('Kubewarden Extension', { tags: ['@extensions', '@adminUser'] }, () =>
const productMenu = new ProductNavPo();

kubewardenPo.goTo();
kubewardenPo.waitForPage();

const kubewardenNavItem = productMenu.groups().contains('Kubewarden');

Expand All @@ -77,6 +82,7 @@ describe('Kubewarden Extension', { tags: ['@extensions', '@adminUser'] }, () =>
const kubewardenPo = new KubewardenExtensionPo();

kubewardenPo.goTo();
kubewardenPo.waitForPage();

cy.get('h1').contains('Kubewarden').should('exist');
cy.get('button').contains('Install Kubewarden').should('exist');
Expand All @@ -85,6 +91,9 @@ describe('Kubewarden Extension', { tags: ['@extensions', '@adminUser'] }, () =>
it('Should uninstall Kubewarden', () => {
const extensionsPo = new ExtensionsPagePo();

extensionsPo.goTo();
extensionsPo.waitForPage();

extensionsPo.extensionTabInstalledClick();

// click on uninstall button on card
Expand Down
6 changes: 3 additions & 3 deletions shell/assets/translations/en-us.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4328,17 +4328,17 @@ plugins:
title: Extension support is not enabled
prompt:
cant: Automatic installation is not available - required Helm Charts could not be found
can: You need to install the Extension Operator
can: 'You need to enable the <code>{ff}</code> Feature Flag in Global Settings. Once enabled, Rancher will require a restart.'
official: The Official Rancher Extensions Repository provides extensions published by Rancher
partners: The Partners Extensions Repository provides extensions published by Rancher Partners
community: The Community Extensions Repository provides extensions published by Rancher Community
install:
title: Enable Extension Support?
prompt: This will install the Helm charts needed to enable Extension support
prompt: This will lead you to the page where you can enable the Feature Flag needed to enable Extension support.
featuresButton: Go to Feature Flags
airgap: Air-gapped installations should NOT enable this feature
addRancherRepo: Add Official Rancher Extensions Repository
addPartnersRancherRepo: Add Partners Extensions Repository
addCommunityRancherRepo: Add Community Extensions Repository
remove:
label: Disable Extension Support
title: Disable Extension Support?
Expand Down
Loading

0 comments on commit 6e939ba

Please sign in to comment.