From 69bae6f1668e8e955f5522f02d8ca27182a8c353 Mon Sep 17 00:00:00 2001 From: "Jingwei.Zhang" Date: Thu, 30 Sep 2021 12:34:48 +0800 Subject: [PATCH] test: Update e2e test according to service enabled 1. Add extenstions in config.yaml to support skip e2e case when service is disabled 2. Support compute, storage, network, other(identity, heat, configuration) config files to runthe corresponding cases Change-Id: I310f4481d083319221045708cf5b311d51802b8c --- package.json | 1 + test/e2e/config/config-compute.yaml | 27 ++ test/e2e/config/config-network.yaml | 30 ++ test/e2e/config/config-other.yaml | 31 ++ test/e2e/config/config-storage.yaml | 24 + test/e2e/config/config.yaml | 15 +- .../pages/compute/baremetal.spec.js | 377 +++++++-------- .../integration/pages/compute/ironic.spec.js | 353 +++++++------- .../pages/configuration/system.spec.js | 9 +- test/e2e/integration/pages/heat/stack.spec.js | 217 ++++----- .../pages/network/floatingip.spec.js | 41 +- test/e2e/integration/pages/network/lb.spec.js | 435 +++++++++--------- .../pages/network/qos-policy.spec.js | 213 +++++---- .../pages/network/virtual-adapter.spec.js | 34 +- .../e2e/integration/pages/network/vpn.spec.js | 351 +++++++------- .../integration/pages/storage/backup.spec.js | 179 +++---- .../integration/pages/storage/volume.spec.js | 43 +- yarn.lock | 5 + 18 files changed, 1323 insertions(+), 1062 deletions(-) create mode 100644 test/e2e/config/config-compute.yaml create mode 100644 test/e2e/config/config-network.yaml create mode 100644 test/e2e/config/config-other.yaml create mode 100644 test/e2e/config/config-storage.yaml diff --git a/package.json b/package.json index 36b38247..6179365e 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "@babel/preset-env": "^7.14.2", "@babel/preset-react": "^7.13.13", "@cypress/code-coverage": "^3.9.5", + "@cypress/skip-test": "^2.6.1", "autoprefixer": "^9.3.1", "babel-eslint": "^9.0.0", "babel-jest": "^26.6.3", diff --git a/test/e2e/config/config-compute.yaml b/test/e2e/config/config-compute.yaml new file mode 100644 index 00000000..7d10c27a --- /dev/null +++ b/test/e2e/config/config-compute.yaml @@ -0,0 +1,27 @@ +# For the use case configuration under the compute menu +covarage: true +baseUrl: http://localhost:8081 +env: + switchToAdminProject: false + username: e2e + password: passW0rdY_ + usernameAdmin: e2e-admin + passwordAdmin: passW0rdY_ + userIsRegisted: true + imageName: cirros-0.5.2-x86_64-disk + imageType: Others + imageDownloadUrl: http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img + imageCanChangePassword: false + extensions: + - ironic +testFiles: + # compute + - pages/compute/image.spec.js + - pages/compute/flavor.spec.js + - pages/compute/server-group.spec.js + - pages/compute/keypair.spec.js + - pages/compute/instance.spec.js + - pages/compute/ironic.spec.js + - pages/compute/aggregate.spec.js + - pages/compute/hypervisor.spec.js + - pages/compute/baremetal.spec.js diff --git a/test/e2e/config/config-network.yaml b/test/e2e/config/config-network.yaml new file mode 100644 index 00000000..5dc4b889 --- /dev/null +++ b/test/e2e/config/config-network.yaml @@ -0,0 +1,30 @@ +# For the use case configuration under the network menu +covarage: true +baseUrl: http://localhost:8081 +env: + switchToAdminProject: false + username: e2e + password: passW0rdY_ + usernameAdmin: e2e-admin + passwordAdmin: passW0rdY_ + userIsRegisted: true + imageName: cirros-0.5.2-x86_64-disk + imageType: Others + imageDownloadUrl: http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img + imageCanChangePassword: false + extensions: + - neutron::qos + - neutron::vpn + - neutron::port-forwarding + - octavia +testFiles: + # network + - pages/network/router.spec.js + - pages/network/network.spec.js + - pages/network/virtual-adapter.spec.js + - pages/network/qos-policy.spec.js + - pages/network/floatingip.spec.js + - pages/network/security-group.spec.js + - pages/network/vpn.spec.js + - pages/network/lb.spec.js + - pages/network/topology.spec.js diff --git a/test/e2e/config/config-other.yaml b/test/e2e/config/config-other.yaml new file mode 100644 index 00000000..2d0c528a --- /dev/null +++ b/test/e2e/config/config-other.yaml @@ -0,0 +1,31 @@ +# For the use case configuration under the identity, configuration, heat menu +covarage: true +baseUrl: http://localhost:8081 +env: + switchToAdminProject: false + username: e2e + password: passW0rdY_ + usernameAdmin: e2e-admin + passwordAdmin: passW0rdY_ + userIsRegisted: true + imageName: cirros-0.5.2-x86_64-disk + imageType: Others + imageDownloadUrl: http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img + imageCanChangePassword: false + extensions: + - heat +testFiles: + - pages/login.spec.js + - pages/error.spec.js + # identity + - pages/identity/role.spec.js + - pages/identity/domain.spec.js + - pages/identity/user.spec.js + - pages/identity/project.spec.js + - pages/identity/user-group.spec.js + # configuration + - pages/configuration/metadata.spec.js + - pages/configuration/system.spec.js + - pages/configuration/setting.spec.js + # heat + - pages/heat/stack.spec.js diff --git a/test/e2e/config/config-storage.yaml b/test/e2e/config/config-storage.yaml new file mode 100644 index 00000000..c4361d2f --- /dev/null +++ b/test/e2e/config/config-storage.yaml @@ -0,0 +1,24 @@ +# For the use case configuration under the storage menu +covarage: true +baseUrl: http://localhost:8081 +env: + switchToAdminProject: false + username: e2e + password: passW0rdY_ + usernameAdmin: e2e-admin + passwordAdmin: passW0rdY_ + userIsRegisted: true + imageName: cirros-0.5.2-x86_64-disk + imageType: Others + imageDownloadUrl: http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img + imageCanChangePassword: false + extensions: + - cinder::buckup +testFiles: + # storage + - pages/storage/qos.spec.js + - pages/storage/volume-type.spec.js + - pages/storage/volume.spec.js + - pages/storage/backup.spec.js + - pages/storage/snapshot.spec.js + - pages/storage/storage.spec.js diff --git a/test/e2e/config/config.yaml b/test/e2e/config/config.yaml index b66303d3..2dff397f 100644 --- a/test/e2e/config/config.yaml +++ b/test/e2e/config/config.yaml @@ -11,20 +11,31 @@ env: imageType: Others imageDownloadUrl: http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img imageCanChangePassword: false + extensions: + - cinder::buckup + - neutron::qos + - neutron::vpn + - neutron::port-forwarding + - octavia + - heat + - ironic testFiles: - pages/login.spec.js - pages/error.spec.js + # identity - pages/identity/role.spec.js - pages/identity/domain.spec.js - pages/identity/user.spec.js - pages/identity/project.spec.js - pages/identity/user-group.spec.js + # storage - pages/storage/qos.spec.js - pages/storage/volume-type.spec.js - pages/storage/volume.spec.js - pages/storage/backup.spec.js - pages/storage/snapshot.spec.js - pages/storage/storage.spec.js + # network - pages/network/router.spec.js - pages/network/network.spec.js - pages/network/virtual-adapter.spec.js @@ -34,6 +45,7 @@ testFiles: - pages/network/vpn.spec.js - pages/network/lb.spec.js - pages/network/topology.spec.js + # compute - pages/compute/image.spec.js - pages/compute/flavor.spec.js - pages/compute/server-group.spec.js @@ -44,8 +56,9 @@ testFiles: - pages/compute/hypervisor.spec.js - pages/compute/baremetal.spec.js # - pages/management/recycle-bin.spec.js + # configuration - pages/configuration/metadata.spec.js - pages/configuration/system.spec.js - pages/configuration/setting.spec.js + # heat - pages/heat/stack.spec.js - diff --git a/test/e2e/integration/pages/compute/baremetal.spec.js b/test/e2e/integration/pages/compute/baremetal.spec.js index 3583a614..fa324ce0 100644 --- a/test/e2e/integration/pages/compute/baremetal.spec.js +++ b/test/e2e/integration/pages/compute/baremetal.spec.js @@ -12,189 +12,204 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { bareMetalListUrl } from '../../../support/constants'; -describe('The Bare Metal Page', () => { - const listUrl = bareMetalListUrl; - const uuid = Cypress._.random(0, 1e6); - const name = `e2e-node-${uuid}`; - const ip = `10.10.${Cypress._.random(50, 100)}.${Cypress._.random(5, 250)}`; - const newname = `${name}-1`; - const username = 'admin'; - const password = 'passW0rd_1'; - const nodeName = 'node-0'; - const portGroupName = `e2e-node-port-group-${uuid}`; - const macPort = `AD:78:BE:AF:${Cypress._.random(10, 99)}:${Cypress._.random( - 10, - 99 - )}`; - const macPortGroup = `B1:F1:2D:A8:${Cypress._.random( - 10, - 99 - )}:${Cypress._.random(10, 99)}`; - const macPort2 = `AD:78:BE:AF:${Cypress._.random(10, 99)}:${Cypress._.random( - 10, - 99 - )}`; - const macPortGroup2 = `B1:F1:2D:A8:${Cypress._.random( - 10, - 99 - )}:${Cypress._.random(10, 99)}`; +const ironicServiceEnabled = (Cypress.env('extensions') || []).includes( + 'ironic' +); - beforeEach(() => { - cy.loginAdmin(listUrl); - }); - - it('successfully create', () => { - cy.clickHeaderButton(1) - .wait(2000) - .formInput('name', name) - .formSelect('driver') - .clickStepActionNextButton() - .wait(2000) - .formSelect('driver_info_deploy_kernel') - .formSelect('driver_info_deploy_ramdisk') - .formInput('driver_info_ipmi_address', ip) - .formInput('driver_info_ipmi_username', username) - .formInput('driver_info_ipmi_password', password) - .clickStepActionNextButton() - .wait(2000) - .clickStepActionNextButton() - .waitFormLoading() - .url() - .should('include', listUrl) - .closeNotice(); - }); - - it('successfully detail', () => { - cy.tableSimpleSearchText(nodeName) - .checkTableFirstRow(nodeName) - .goToDetail(); - cy.checkDetailName(nodeName); - cy.clickDetailTab('Ports', 'ports').clickDetailTab( - 'Port Groups', - 'portGroups' - ); - cy.goBackToList(listUrl); - }); - - it('successfully power on', () => { - cy.tableSimpleSearchText('power off') - .wait(2000) - .clickConfirmActionInMore('Power On') - .wait(10000) - .waitStatusActiveByRefresh(); - }); - - it('successfully power off', () => { - cy.tableSimpleSearchText('power on') - .wait(2000) - .clickConfirmActionInMore('Power Off') - .wait(10000); - }); - - it('successfully auto inspect', () => { - cy.tableSimpleSearchText(nodeName).clickConfirmActionInMore('Auto Inspect'); - }); - - it('successfully enter maintenace mode', () => { - cy.tableSimpleSearchText(nodeName) - .clickActionInMore('Enter Maintenance Mode') - .formText('reason', 'Enter Maintenance Mode') - .clickModalActionSubmitButton() - .wait(10000); - }); - - it('successfully leave maintenace mode', () => { - cy.tableSimpleSearchText(nodeName).clickConfirmActionInMore( - 'Leave Maintenance Mode' - ); - }); - - it('successfully set boot device', () => { - cy.tableSimpleSearchText(nodeName) - .clickActionInMore('Set Boot Device') - .wait(5000) - .formSelect('boot_device', 'pxe') - .clickModalActionSubmitButton(); - }); - - it('successfully create port group', () => { - cy.tableSimpleSearchText(name) - .clickActionInMore('Create Port Group') - .formInput('name', portGroupName) - .formInput('address', macPortGroup) - .clickModalActionSubmitButton() - .wait(60000); - }); - - it('successfully create port', () => { - cy.tableSimpleSearchText(name) - .clickActionInMore('Create Port') - .wait(5000) - .formInput('address', macPort) - .clickModalActionSubmitButton() - .wait(60000); - }); - - it('successfully edit port', () => { - cy.tableSimpleSearchText(name) - .goToDetail() - .clickDetailTab('Ports') - .clickFirstActionButton() - .formInput('address', macPort2) - .clickModalActionSubmitButton() - .wait(60000); - }); - - it('successfully delete port', () => { - cy.tableSimpleSearchText(name) - .goToDetail() - .clickDetailTab('Ports') - .clickConfirmActionButton('Delete') - .wait(60000); - }); - - it('successfully edit port group', () => { - cy.tableSimpleSearchText(name) - .goToDetail() - .clickDetailTab('Port Groups') - .clickFirstActionButton() - .formInput('address', macPortGroup2) - .clickModalActionSubmitButton() - .wait(60000); - }); - - it('successfully delete port group', () => { - cy.tableSimpleSearchText(name) - .goToDetail() - .clickDetailTab('Port Groups') - .clickConfirmActionButton('Delete') - .wait(60000); - }); - - it('successfully edit', () => { - cy.tableSimpleSearchText(name) - .clickActionInMore('Edit') - .wait(2000) - .formInput('name', newname) - .clickStepActionNextButton() - .wait(2000) - .clickStepActionNextButton() - .wait(2000) - .clickStepActionNextButton() - .waitFormLoading() - .wait(60000); - }); - - it('successfully delete', () => { - cy.tableSimpleSearchText(newname).clickConfirmActionInMore('Delete'); - }); - - it('successfully manage state', () => { - cy.tableSimpleSearchText(nodeName) - .clickFirstActionButton() - .formSelect('target') - .clickModalActionSubmitButton(); +onlyOn(!ironicServiceEnabled, () => { + describe('Skip The Bare Metal Page', () => { + it('successfully skip', () => {}); + }); +}); + +describe('The Bare Metal Page', () => { + onlyOn(ironicServiceEnabled, () => { + const listUrl = bareMetalListUrl; + const uuid = Cypress._.random(0, 1e6); + const name = `e2e-node-${uuid}`; + const ip = `10.10.${Cypress._.random(50, 100)}.${Cypress._.random(5, 250)}`; + const newname = `${name}-1`; + const username = 'admin'; + const password = 'passW0rd_1'; + const nodeName = 'node-0'; + const portGroupName = `e2e-node-port-group-${uuid}`; + const macPort = `AD:78:BE:AF:${Cypress._.random(10, 99)}:${Cypress._.random( + 10, + 99 + )}`; + const macPortGroup = `B1:F1:2D:A8:${Cypress._.random( + 10, + 99 + )}:${Cypress._.random(10, 99)}`; + const macPort2 = `AD:78:BE:AF:${Cypress._.random( + 10, + 99 + )}:${Cypress._.random(10, 99)}`; + const macPortGroup2 = `B1:F1:2D:A8:${Cypress._.random( + 10, + 99 + )}:${Cypress._.random(10, 99)}`; + + beforeEach(() => { + cy.loginAdmin(listUrl); + }); + + it('successfully create', () => { + cy.clickHeaderButton(1) + .wait(2000) + .formInput('name', name) + .formSelect('driver') + .clickStepActionNextButton() + .wait(2000) + .formSelect('driver_info_deploy_kernel') + .formSelect('driver_info_deploy_ramdisk') + .formInput('driver_info_ipmi_address', ip) + .formInput('driver_info_ipmi_username', username) + .formInput('driver_info_ipmi_password', password) + .clickStepActionNextButton() + .wait(2000) + .clickStepActionNextButton() + .waitFormLoading() + .url() + .should('include', listUrl) + .closeNotice(); + }); + + it('successfully detail', () => { + cy.tableSimpleSearchText(nodeName) + .checkTableFirstRow(nodeName) + .goToDetail(); + cy.checkDetailName(nodeName); + cy.clickDetailTab('Ports', 'ports').clickDetailTab( + 'Port Groups', + 'portGroups' + ); + cy.goBackToList(listUrl); + }); + + it('successfully power on', () => { + cy.tableSimpleSearchText('power off') + .wait(2000) + .clickConfirmActionInMore('Power On') + .wait(10000) + .waitStatusActiveByRefresh(); + }); + + it('successfully power off', () => { + cy.tableSimpleSearchText('power on') + .wait(2000) + .clickConfirmActionInMore('Power Off') + .wait(10000); + }); + + it('successfully auto inspect', () => { + cy.tableSimpleSearchText(nodeName).clickConfirmActionInMore( + 'Auto Inspect' + ); + }); + + it('successfully enter maintenace mode', () => { + cy.tableSimpleSearchText(nodeName) + .clickActionInMore('Enter Maintenance Mode') + .formText('reason', 'Enter Maintenance Mode') + .clickModalActionSubmitButton() + .wait(10000); + }); + + it('successfully leave maintenace mode', () => { + cy.tableSimpleSearchText(nodeName).clickConfirmActionInMore( + 'Leave Maintenance Mode' + ); + }); + + it('successfully set boot device', () => { + cy.tableSimpleSearchText(nodeName) + .clickActionInMore('Set Boot Device') + .wait(5000) + .formSelect('boot_device', 'pxe') + .clickModalActionSubmitButton(); + }); + + it('successfully create port group', () => { + cy.tableSimpleSearchText(name) + .clickActionInMore('Create Port Group') + .formInput('name', portGroupName) + .formInput('address', macPortGroup) + .clickModalActionSubmitButton() + .wait(60000); + }); + + it('successfully create port', () => { + cy.tableSimpleSearchText(name) + .clickActionInMore('Create Port') + .wait(5000) + .formInput('address', macPort) + .clickModalActionSubmitButton() + .wait(60000); + }); + + it('successfully edit port', () => { + cy.tableSimpleSearchText(name) + .goToDetail() + .clickDetailTab('Ports') + .clickFirstActionButton() + .formInput('address', macPort2) + .clickModalActionSubmitButton() + .wait(60000); + }); + + it('successfully delete port', () => { + cy.tableSimpleSearchText(name) + .goToDetail() + .clickDetailTab('Ports') + .clickConfirmActionButton('Delete') + .wait(60000); + }); + + it('successfully edit port group', () => { + cy.tableSimpleSearchText(name) + .goToDetail() + .clickDetailTab('Port Groups') + .clickFirstActionButton() + .formInput('address', macPortGroup2) + .clickModalActionSubmitButton() + .wait(60000); + }); + + it('successfully delete port group', () => { + cy.tableSimpleSearchText(name) + .goToDetail() + .clickDetailTab('Port Groups') + .clickConfirmActionButton('Delete') + .wait(60000); + }); + + it('successfully edit', () => { + cy.tableSimpleSearchText(name) + .clickActionInMore('Edit') + .wait(2000) + .formInput('name', newname) + .clickStepActionNextButton() + .wait(2000) + .clickStepActionNextButton() + .wait(2000) + .clickStepActionNextButton() + .waitFormLoading() + .wait(60000); + }); + + it('successfully delete', () => { + cy.tableSimpleSearchText(newname).clickConfirmActionInMore('Delete'); + }); + + it('successfully manage state', () => { + cy.tableSimpleSearchText(nodeName) + .clickFirstActionButton() + .formSelect('target') + .clickModalActionSubmitButton(); + }); }); }); diff --git a/test/e2e/integration/pages/compute/ironic.spec.js b/test/e2e/integration/pages/compute/ironic.spec.js index 6c1a23aa..624107d4 100644 --- a/test/e2e/integration/pages/compute/ironic.spec.js +++ b/test/e2e/integration/pages/compute/ironic.spec.js @@ -12,178 +12,191 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { instanceListUrl } from '../../../support/constants'; -describe('The Ironic Page', () => { - const listUrl = instanceListUrl; - const uuid = Cypress._.random(0, 1e6); - const name = `e2e-ironic-${uuid}`; - const newname = `${name}-1`; - const password = 'passW0rd_1'; - const flavorName = `e2e-flavor-for-ironic-${uuid}`; - const networkName = `e2e-network-for-ironic-${uuid}`; - const routerName = `e2e-router-for-ironic-${uuid}`; - const imageName = Cypress.env('imageName'); - const imageType = Cypress.env('imageType'); +const ironicServiceEnabled = (Cypress.env('extensions') || []).includes( + 'ironic' +); - beforeEach(() => { - cy.login(listUrl); - }); - - it('successfully prepair resource by admin', () => { - cy.loginAdmin().createIronicFlavor(flavorName); - }); - - it('successfully prepair resource', () => { - cy.createNetwork({ name: networkName }); - cy.createRouter({ name: routerName, network: networkName }); - cy.createFip(); - }); - - it('successfully create', () => { - cy.clickHeaderButton(2) - .wait(5000) - .formTableSelect('flavor') - .formRadioChooseByLabel('image', imageType) - .formTableSelectBySearch('image', imageName) - .clickStepActionNextButton() - .wait(5000) - .formTableSelectBySearch('networkSelect', networkName) - .formTableSelectBySearch('securityGroup', 'default') - .wait(2000) - .clickStepActionNextButton() - .formInput('name', name) - .formRadioChoose('loginType', 1) - .formInput('password', password) - .formInput('confirmPassword', password) - .wait(2000) - .clickStepActionNextButton() - .wait(2000) - .clickStepActionNextButton() - .waitFormLoading() - .url() - .should('include', listUrl) - .closeNotice() - .waitStatusActiveByRefresh(); - }); - - it('successfully detail', () => { - cy.tableSearchText(name).checkTableFirstRow(name).goToDetail(); - cy.checkDetailName(name); - cy.clickDetailTab('Interface', 'interface') - .clickDetailTab('Floating IPs', 'floatingIps') - .clickDetailTab('Security Group', 'securityGroup'); - cy.goBackToList(listUrl); - }); - - it('successfully lock', () => { - cy.tableSearchText(name) - .clickConfirmActionInMoreSub('Lock', 'Instance Status') - .wait(10000); - }); - - it('successfully unlock', () => { - cy.tableSearchText(name) - .clickConfirmActionInMoreSub('Unlock', 'Instance Status') - .wait(10000); - }); - - it('successfully stop', () => { - cy.tableSearchText(name) - .clickConfirmActionInMoreSub('Stop', 'Instance Status') - .wait(10000) - .tableSearchText(name) - .checkColumnValue(6, 'Shutoff') - .selectFirst() - .clickHeaderButtonByTitle('Stop') - .checkDisableAction(2000); - }); - - it('successfully start', () => { - cy.tableSearchText(name) - .clickConfirmActionInMoreSub('Start', 'Instance Status') - .waitStatusActive() - .checkColumnValue(6, 'Active') - .selectFirst() - .clickHeaderButtonByTitle('Start') - .checkDisableAction(2000); - }); - - it('successfully reboot', () => { - cy.tableSearchText(name) - .clickConfirmActionInMoreSub('Reboot', 'Instance Status') - .tableSearchText(name) - .waitStatusActiveByRefresh(); - }); - - it('successfully attach interface', () => { - cy.tableSearchText(name) - .clickActionInMoreSub('Attach Interface', 'Related Resources') - .wait(5000) - .formTableSelect('network') - .clickModalActionSubmitButton(); - }); - - it('successfully detach interface', () => { - cy.tableSearchText(name) - .clickActionInMoreSub('Detach Interface', 'Related Resources') - .wait(5000) - .formTableSelect('interfaces') - .clickModalActionSubmitButton(); - }); - - it('successfully associate floating IP', () => { - cy.tableSearchText(name) - .clickActionInMoreSub('Associate Floating IP', 'Related Resources') - .wait(5000) - .formTableSelect('fixed_ip') - .wait(5000) - .formTableSelect('fip') - .clickModalActionCancelButton(); - }); - - it('successfully disassociate floating ip', () => { - cy.tableSearchText(name) - .clickActionInMoreSub('Disassociate Floating Ip', 'Related Resources') - .wait(5000) - .formSelect('address') - .clickModalActionCancelButton(); - }); - - it('successfully manage security group with cancel', () => { - cy.tableSearchText(name) - .clickActionInMoreSub('Manage Security Group', 'Related Resources') - .wait(5000) - .formTableSelect('port') - .wait(5000) - .clickModalActionCancelButton(); - }); - - it('successfully rebuild ironic', () => { - cy.tableSearchText(name) - .clickActionInMoreSub('Rebuild Instance', 'Configuration Update') - .wait(5000) - .formTableSelect('image') - .clickModalActionSubmitButton() - .waitStatusActiveByRefresh(); - }); - - it('successfully edit', () => { - cy.tableSearchText(name) - .clickActionInMore('Edit') - .formInput('name', newname) - .clickModalActionSubmitButton() - .wait(2000); - }); - - it('successfully delete', () => { - cy.tableSearchText(name).clickConfirmActionInMore('Delete'); - }); - - it('successfully delete related resources', () => { - cy.deleteAll('fip'); - cy.deleteRouter(routerName, networkName); - cy.deleteAll('network', networkName); - cy.loginAdmin().deleteAll('flavor', flavorName, 'Bare Metal'); +onlyOn(!ironicServiceEnabled, () => { + describe('Skip The Ironic Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(ironicServiceEnabled, () => { + describe('The Ironic Page', () => { + const listUrl = instanceListUrl; + const uuid = Cypress._.random(0, 1e6); + const name = `e2e-ironic-${uuid}`; + const newname = `${name}-1`; + const password = 'passW0rd_1'; + const flavorName = `e2e-flavor-for-ironic-${uuid}`; + const networkName = `e2e-network-for-ironic-${uuid}`; + const routerName = `e2e-router-for-ironic-${uuid}`; + const imageName = Cypress.env('imageName'); + const imageType = Cypress.env('imageType'); + + beforeEach(() => { + cy.login(listUrl); + }); + + it('successfully prepair resource by admin', () => { + cy.loginAdmin().createIronicFlavor(flavorName); + }); + + it('successfully prepair resource', () => { + cy.createNetwork({ name: networkName }); + cy.createRouter({ name: routerName, network: networkName }); + cy.createFip(); + }); + + it('successfully create', () => { + cy.clickHeaderButton(2) + .wait(5000) + .formTableSelect('flavor') + .formRadioChooseByLabel('image', imageType) + .formTableSelectBySearch('image', imageName) + .clickStepActionNextButton() + .wait(5000) + .formTableSelectBySearch('networkSelect', networkName) + .formTableSelectBySearch('securityGroup', 'default') + .wait(2000) + .clickStepActionNextButton() + .formInput('name', name) + .formRadioChoose('loginType', 1) + .formInput('password', password) + .formInput('confirmPassword', password) + .wait(2000) + .clickStepActionNextButton() + .wait(2000) + .clickStepActionNextButton() + .waitFormLoading() + .url() + .should('include', listUrl) + .closeNotice() + .waitStatusActiveByRefresh(); + }); + + it('successfully detail', () => { + cy.tableSearchText(name).checkTableFirstRow(name).goToDetail(); + cy.checkDetailName(name); + cy.clickDetailTab('Interface', 'interface') + .clickDetailTab('Floating IPs', 'floatingIps') + .clickDetailTab('Security Group', 'securityGroup'); + cy.goBackToList(listUrl); + }); + + it('successfully lock', () => { + cy.tableSearchText(name) + .clickConfirmActionInMoreSub('Lock', 'Instance Status') + .wait(10000); + }); + + it('successfully unlock', () => { + cy.tableSearchText(name) + .clickConfirmActionInMoreSub('Unlock', 'Instance Status') + .wait(10000); + }); + + it('successfully stop', () => { + cy.tableSearchText(name) + .clickConfirmActionInMoreSub('Stop', 'Instance Status') + .wait(10000) + .tableSearchText(name) + .checkColumnValue(6, 'Shutoff') + .selectFirst() + .clickHeaderButtonByTitle('Stop') + .checkDisableAction(2000); + }); + + it('successfully start', () => { + cy.tableSearchText(name) + .clickConfirmActionInMoreSub('Start', 'Instance Status') + .waitStatusActive() + .checkColumnValue(6, 'Active') + .selectFirst() + .clickHeaderButtonByTitle('Start') + .checkDisableAction(2000); + }); + + it('successfully reboot', () => { + cy.tableSearchText(name) + .clickConfirmActionInMoreSub('Reboot', 'Instance Status') + .tableSearchText(name) + .waitStatusActiveByRefresh(); + }); + + it('successfully attach interface', () => { + cy.tableSearchText(name) + .clickActionInMoreSub('Attach Interface', 'Related Resources') + .wait(5000) + .formTableSelect('network') + .clickModalActionSubmitButton(); + }); + + it('successfully detach interface', () => { + cy.tableSearchText(name) + .clickActionInMoreSub('Detach Interface', 'Related Resources') + .wait(5000) + .formTableSelect('interfaces') + .clickModalActionSubmitButton(); + }); + + it('successfully associate floating IP', () => { + cy.tableSearchText(name) + .clickActionInMoreSub('Associate Floating IP', 'Related Resources') + .wait(5000) + .formTableSelect('fixed_ip') + .wait(5000) + .formTableSelect('fip') + .clickModalActionCancelButton(); + }); + + it('successfully disassociate floating ip', () => { + cy.tableSearchText(name) + .clickActionInMoreSub('Disassociate Floating Ip', 'Related Resources') + .wait(5000) + .formSelect('address') + .clickModalActionCancelButton(); + }); + + it('successfully manage security group with cancel', () => { + cy.tableSearchText(name) + .clickActionInMoreSub('Manage Security Group', 'Related Resources') + .wait(5000) + .formTableSelect('port') + .wait(5000) + .clickModalActionCancelButton(); + }); + + it('successfully rebuild ironic', () => { + cy.tableSearchText(name) + .clickActionInMoreSub('Rebuild Instance', 'Configuration Update') + .wait(5000) + .formTableSelect('image') + .clickModalActionSubmitButton() + .waitStatusActiveByRefresh(); + }); + + it('successfully edit', () => { + cy.tableSearchText(name) + .clickActionInMore('Edit') + .formInput('name', newname) + .clickModalActionSubmitButton() + .wait(2000); + }); + + it('successfully delete', () => { + cy.tableSearchText(name).clickConfirmActionInMore('Delete'); + }); + + it('successfully delete related resources', () => { + cy.deleteAll('fip'); + cy.deleteRouter(routerName, networkName); + cy.deleteAll('network', networkName); + cy.loginAdmin().deleteAll('flavor', flavorName, 'Bare Metal'); + }); }); }); diff --git a/test/e2e/integration/pages/configuration/system.spec.js b/test/e2e/integration/pages/configuration/system.spec.js index e1b1ed9d..2c795a96 100644 --- a/test/e2e/integration/pages/configuration/system.spec.js +++ b/test/e2e/integration/pages/configuration/system.spec.js @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { infoListUrl } from '../../../support/constants'; describe('The System Info Page', () => { @@ -26,6 +27,8 @@ describe('The System Info Page', () => { const routerName = `e2e-router-for-neutronAgent-${uuid}`; const networkName = `e2e-network-for-neutronAgent-${uuid}`; + const heatServiceEnabled = (Cypress.env('extensions') || []).includes('heat'); + beforeEach(() => { cy.loginAdmin(listUrl); }); @@ -150,8 +153,10 @@ describe('The System Info Page', () => { .clickModalActionSubmitButton(); }); - it('successfully orchestration services', () => { - cy.clickTab(orchestrationServicesTab, 'heatService'); + onlyOn(heatServiceEnabled, () => { + it('successfully orchestration services', () => { + cy.clickTab(orchestrationServicesTab, 'heatService'); + }); }); it('successfully delete related resources', () => { diff --git a/test/e2e/integration/pages/heat/stack.spec.js b/test/e2e/integration/pages/heat/stack.spec.js index ae2f13af..0194eb4f 100644 --- a/test/e2e/integration/pages/heat/stack.spec.js +++ b/test/e2e/integration/pages/heat/stack.spec.js @@ -12,111 +12,122 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { stackListUrl } from '../../../support/constants'; -describe('The Stack Page', () => { - const listUrl = stackListUrl; - const uuid = Cypress._.random(0, 1e6); - const name = `e2e-stack-${uuid}`; - const nameAbandon = `e2e-stack-abandon-${uuid}`; - const contentFile = 'stack-content.yaml'; - const paramFile = 'stack-params.yaml'; - const volumeName = `e2e-volume-for-stack-${uuid}`; - const volumeNameUpdate = `e2e-volume-for-stack-update-${uuid}`; - const volumeNameAbandon = `e2e-volume-for-stack-abandon-${uuid}`; +const heatServiceEnabled = (Cypress.env('extensions') || []).includes('heat'); - beforeEach(() => { - cy.login(listUrl); - }); - - it('successfully create', () => { - const volumeJson = { - name: volumeName, - }; - cy.clickHeaderButton(1, 2000) - .formAttachFile('content', contentFile) - .formAttachFile('params', paramFile) - .clickStepActionNextButton() - .wait(2000) - .formInput('name', name) - .formJsonInput('volume_name_spec', volumeJson) - .clickStepActionNextButton() - .waitFormLoading() - .wait(5000) - .tableSearchSelectText('Name', name) - .waitStatusActiveByRefresh(); - }); - - it('successfully detail', () => { - cy.tableSearchSelectText('Name', name) - .checkTableFirstRow(name) - .goToDetail() - .checkDetailName(name); - cy.clickDetailTab('Stack Resources', 'resource') - .clickDetailTab('Stack Events', 'event') - .clickDetailTab('YAML File', 'template'); - cy.goBackToList(listUrl); - }); - - it('successfully link resource', () => { - cy.tableSearchSelectText('Name', name) - .checkTableFirstRow(name) - .goToDetail() - .checkDetailName(name); - cy.clickDetailTab('Stack Resources').goToDetail(); - }); - - it('successfully update template', () => { - const volumeJson = { - name: volumeNameUpdate, - }; - cy.tableSearchSelectText('Name', name) - .clickActionInMore('Update Template') - .wait(2000) - .formAttachFile('content', contentFile) - .formAttachFile('params', paramFile) - .clickStepActionNextButton() - .wait(2000) - .formJsonInput('volume_name_spec', volumeJson) - .clickStepActionNextButton() - .waitFormLoading() - .wait(5000) - .tableSearchSelectText('Name', name) - .waitStatusActiveByRefresh(); - }); - - it('successfully delete', () => { - cy.tableSearchSelectText('Name', name) - .clickConfirmActionInFirst() - .wait(10000); - }); - - it('successfully create for abandon', () => { - const volumeJson = { - name: volumeNameAbandon, - }; - cy.clickHeaderButton(1, 2000) - .formAttachFile('content', contentFile) - .formAttachFile('params', paramFile) - .clickStepActionNextButton() - .wait(2000) - .formInput('name', nameAbandon) - .wait(2000) - .formJsonInput('volume_name_spec', volumeJson) - .clickStepActionNextButton() - .waitFormLoading() - .wait(5000) - .tableSearchSelectText('Name', nameAbandon) - .waitStatusActiveByRefresh(); - }); - - it('successfully abandon stack', () => { - cy.tableSearchSelectText('Name', nameAbandon).clickConfirmActionInMore( - 'Abandon Stack' - ); - }); - - it('successfully delete resource', () => { - cy.deleteAll('volume', volumeNameAbandon); +onlyOn(!heatServiceEnabled, () => { + describe('Skip The Stack Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(heatServiceEnabled, () => { + describe('The Stack Page', () => { + const listUrl = stackListUrl; + const uuid = Cypress._.random(0, 1e6); + const name = `e2e-stack-${uuid}`; + const nameAbandon = `e2e-stack-abandon-${uuid}`; + const contentFile = 'stack-content.yaml'; + const paramFile = 'stack-params.yaml'; + const volumeName = `e2e-volume-for-stack-${uuid}`; + const volumeNameUpdate = `e2e-volume-for-stack-update-${uuid}`; + const volumeNameAbandon = `e2e-volume-for-stack-abandon-${uuid}`; + + beforeEach(() => { + cy.login(listUrl); + }); + + it('successfully create', () => { + const volumeJson = { + name: volumeName, + }; + cy.clickHeaderButton(1, 2000) + .formAttachFile('content', contentFile) + .formAttachFile('params', paramFile) + .clickStepActionNextButton() + .wait(2000) + .formInput('name', name) + .formJsonInput('volume_name_spec', volumeJson) + .clickStepActionNextButton() + .waitFormLoading() + .wait(5000) + .tableSearchSelectText('Name', name) + .waitStatusActiveByRefresh(); + }); + + it('successfully detail', () => { + cy.tableSearchSelectText('Name', name) + .checkTableFirstRow(name) + .goToDetail() + .checkDetailName(name); + cy.clickDetailTab('Stack Resources', 'resource') + .clickDetailTab('Stack Events', 'event') + .clickDetailTab('YAML File', 'template'); + cy.goBackToList(listUrl); + }); + + it('successfully link resource', () => { + cy.tableSearchSelectText('Name', name) + .checkTableFirstRow(name) + .goToDetail() + .checkDetailName(name); + cy.clickDetailTab('Stack Resources').goToDetail(); + }); + + it('successfully update template', () => { + const volumeJson = { + name: volumeNameUpdate, + }; + cy.tableSearchSelectText('Name', name) + .clickActionInMore('Update Template') + .wait(2000) + .formAttachFile('content', contentFile) + .formAttachFile('params', paramFile) + .clickStepActionNextButton() + .wait(2000) + .formJsonInput('volume_name_spec', volumeJson) + .clickStepActionNextButton() + .waitFormLoading() + .wait(5000) + .tableSearchSelectText('Name', name) + .waitStatusActiveByRefresh(); + }); + + it('successfully delete', () => { + cy.tableSearchSelectText('Name', name) + .clickConfirmActionInFirst() + .wait(10000); + }); + + it('successfully create for abandon', () => { + const volumeJson = { + name: volumeNameAbandon, + }; + cy.clickHeaderButton(1, 2000) + .formAttachFile('content', contentFile) + .formAttachFile('params', paramFile) + .clickStepActionNextButton() + .wait(2000) + .formInput('name', nameAbandon) + .wait(2000) + .formJsonInput('volume_name_spec', volumeJson) + .clickStepActionNextButton() + .waitFormLoading() + .wait(5000) + .tableSearchSelectText('Name', nameAbandon) + .waitStatusActiveByRefresh(); + }); + + it('successfully abandon stack', () => { + cy.tableSearchSelectText('Name', nameAbandon).clickConfirmActionInMore( + 'Abandon Stack' + ); + }); + + it('successfully delete resource', () => { + cy.deleteAll('volume', volumeNameAbandon); + }); }); }); diff --git a/test/e2e/integration/pages/network/floatingip.spec.js b/test/e2e/integration/pages/network/floatingip.spec.js index a54296a2..d7f17f72 100644 --- a/test/e2e/integration/pages/network/floatingip.spec.js +++ b/test/e2e/integration/pages/network/floatingip.spec.js @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { fipListUrl, instanceListUrl } from '../../../support/constants'; describe('The Floating IP Page', () => { @@ -21,13 +22,18 @@ describe('The Floating IP Page', () => { const networkName = `e2e-network-for-fip-${uuid}`; const instanceName = `e2e-instance-for-fip-${uuid}`; const routerName = `e2e-router-for-fip-${uuid}`; + const qosServiceEnabled = (Cypress.env('extensions') || []).includes( + 'neutron::qos' + ); beforeEach(() => { cy.login(listUrl); }); - it('successfully prepair resource by admin', () => { - cy.loginAdmin().wait(5000).createNetworkPolicy({ name: policyName }); + onlyOn(qosServiceEnabled, () => { + it('successfully prepair resource by admin', () => { + cy.loginAdmin().wait(5000).createNetworkPolicy({ name: policyName }); + }); }); it('successfully prepair resource', () => { @@ -84,14 +90,25 @@ describe('The Floating IP Page', () => { .clickConfirmActionInMore('Disassociate'); }); - it('successfully edit', () => { - cy.clickFirstActionButton() - .formText('description', 'description') - .formTabClick('qos_policy_id', 1) - .wait(5000) - .formTableSelectBySearch('qos_policy_id', policyName) - .clickModalActionSubmitButton() - .wait(2000); + onlyOn(!qosServiceEnabled, () => { + it('successfully edit with qos', () => { + cy.clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton() + .wait(2000); + }); + }); + + onlyOn(qosServiceEnabled, () => { + it('successfully edit with qos', () => { + cy.clickFirstActionButton() + .formText('description', 'description') + .formTabClick('qos_policy_id', 1) + .wait(5000) + .formTableSelectBySearch('qos_policy_id', policyName) + .clickModalActionSubmitButton() + .wait(2000); + }); }); it('successfully delete', () => { @@ -105,6 +122,8 @@ describe('The Floating IP Page', () => { cy.deleteRouter(routerName, networkName); cy.deleteAll('network', networkName); cy.loginAdmin().wait(5000); - cy.deleteAll('networkQosPolicy', policyName); + onlyOn(qosServiceEnabled, () => { + cy.deleteAll('networkQosPolicy', policyName); + }); }); }); diff --git a/test/e2e/integration/pages/network/lb.spec.js b/test/e2e/integration/pages/network/lb.spec.js index e8e28ac4..6d07e048 100644 --- a/test/e2e/integration/pages/network/lb.spec.js +++ b/test/e2e/integration/pages/network/lb.spec.js @@ -12,220 +12,231 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { lbListUrl } from '../../../support/constants'; -describe('The LB Page', () => { - const listUrl = lbListUrl; - const uuid = Cypress._.random(0, 1e6); - const name = `e2e-lb-${uuid}`; - const listener = `e2e-listener-${uuid}`; - const pool = `e2e-pool-${uuid}`; - const health = `e2e-health-${uuid}`; +const lbServiceEnabled = (Cypress.env('extensions') || []).includes('octavia'); - const listener2 = `e2e-listener2-${uuid}`; - const pool2 = `e2e-pool2-${uuid}`; - - const port = 55; - const port2 = 56; - const networkName = `e2e-network-for-lb-${uuid}`; - const routerName = `e2e-router-for-lb-${uuid}`; - - beforeEach(() => { - cy.login(listUrl); - }); - - it('successfully prepair resource', () => { - cy.createNetwork({ name: networkName }); - cy.createRouter({ name: routerName, network: networkName }); - cy.createFip(); - }); - - it('successfully create lb', () => { - cy.clickHeaderButton(1) - .wait(5000) - .formInput('name', name) - .formText('description', name) - .formTableSelectBySearch('vip_network_id', networkName) - .wait(5000) - .formButtonClick('vip_address') - .formSelect('vip_address') - .clickStepActionNextButton(); - - cy.formInput('listener_name', listener) - .formText('listener_description', listener) - .formSelect('listener_protocol') - .formInput('listener_protocol_port', port) - .clickStepActionNextButton(); - - cy.formInput('pool_name', pool) - .formText('pool_description', pool) - .formSelect('pool_lb_algorithm') - .formSelect('pool_protocol') - .clickStepActionNextButton(); - - cy.wait(5000).clickStepActionNextButton(); - - cy.formInput('health_name', health) - .formSelect('health_type') - .clickStepActionNextButton() - .waitFormLoading() - .url() - .should('include', listUrl) - .closeNotice() - .wait(5000) - .tableSearchText(name) - .waitStatusActiveByRefresh(); - }); - - it('successfully detail', () => { - cy.tableSearchText(name).goToDetail(1, 2000).goBackToList(listUrl); - }); - - it('successfully edit', () => { - cy.tableSearchText(name) - .clickFirstActionButton() - .formText('description', 'description') - .clickModalActionSubmitButton() - .waitStatusActiveByRefresh(); - }); - - it('successfully associate fip', () => { - cy.tableSearchText(name) - .clickActionInMore('Associate Floating IP') - .formTableSelect('fixed_ip') - .formTableSelect('fip') - .clickModalActionSubmitButton() - .waitStatusActiveByRefresh(); - }); - - it('successfully disassociate fip', () => { - cy.tableSearchText(name) - .clickConfirmActionInMore('Disassociate Floating IP') - .waitStatusActiveByRefresh(); - }); - - it('successfully create listener', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .clickHeaderButton(1) - .formInput('name', listener2) - .formText('description', listener2) - .formSelect('protocol') - .formInput('protocol_port', port2) - .clickModalActionSubmitButton(); - }); - - it('successfully edit listener', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .clickFirstActionButton() - .formText('description', 'description') - .clickModalActionSubmitButton(); - }); - - it('successfully edit listener health monitor', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .clickActionInMore('Edit Health Monitor') - .formRadioChoose('admin_state_up', 1) - .clickModalActionSubmitButton() - .tableSearchText(listener) - .waitStatusActiveByRefresh(); - }); - - it('successfully edit listener default pool', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .clickActionInMore('Edit Default Pool') - .formText('description', 'description') - .clickModalActionSubmitButton() - .tableSearchText(listener) - .waitStatusActiveByRefresh(); - }); - - it('successfully delete listener default pool', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .clickConfirmActionInMore('Delete Default Pool') - .tableSearchText(listener) - .waitStatusActiveByRefresh(); - }); - - it('successfully create listener default pool', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .clickActionInMore('Create Default Pool') - .formInput('name', pool2) - .formText('description', pool2) - .formSelect('lb_algorithm') - .formSelect('protocol') - .clickModalActionSubmitButton() - .tableSearchText(listener) - .waitStatusActiveByRefresh(); - }); - - it('successfully listener detail', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .goToDetail(0, 2000) - .clickDetailTab('Member', 'members'); - }); - - it('successfully create listener member', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .goToDetail(0, 2000) - .clickDetailTab('Member') - .clickHeaderButton(1) - .formButtonClick('extMembers') - .get('.ant-form-item') - .eq(1) - .find('.ant-input-number-input') - .first() - .type(port2) - .clickModalActionSubmitButton() - .waitStatusActiveByRefresh(); - }); - - it('successfully edit listener member', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .goToDetail(0, 2000) - .clickDetailTab('Member') - .clickFirstActionButton() - .wait(2000) - .formInput('weight', 2) - .clickModalActionSubmitButton() - .waitStatusActiveByRefresh(); - }); - - it('successfully delete listener member', () => { - cy.tableSearchText(name) - .goToDetail(1, 2000) - .tableSearchText(listener) - .goToDetail(0, 2000) - .clickDetailTab('Member') - .clickConfirmActionButton('Delete') - .goBackToList() - .tableSearchText(listener) - .waitStatusActiveByRefresh(); - }); - - it('successfully delete', () => { - cy.tableSearchText(name).clickConfirmActionInMore('Delete'); - }); - - it('successfully delete related resources', () => { - cy.deleteRouter(routerName, networkName); - cy.deleteAll('network', networkName); - cy.deleteAll('fip'); +onlyOn(!lbServiceEnabled, () => { + describe('Skip The LB Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(lbServiceEnabled, () => { + describe('The LB Page', () => { + const listUrl = lbListUrl; + const uuid = Cypress._.random(0, 1e6); + const name = `e2e-lb-${uuid}`; + const listener = `e2e-listener-${uuid}`; + const pool = `e2e-pool-${uuid}`; + const health = `e2e-health-${uuid}`; + + const listener2 = `e2e-listener2-${uuid}`; + const pool2 = `e2e-pool2-${uuid}`; + + const port = 55; + const port2 = 56; + const networkName = `e2e-network-for-lb-${uuid}`; + const routerName = `e2e-router-for-lb-${uuid}`; + + beforeEach(() => { + cy.login(listUrl); + }); + + it('successfully prepair resource', () => { + cy.createNetwork({ name: networkName }); + cy.createRouter({ name: routerName, network: networkName }); + cy.createFip(); + }); + + it('successfully create lb', () => { + cy.clickHeaderButton(1) + .wait(5000) + .formInput('name', name) + .formText('description', name) + .formTableSelectBySearch('vip_network_id', networkName) + .wait(5000) + .formButtonClick('vip_address') + .formSelect('vip_address') + .clickStepActionNextButton(); + + cy.formInput('listener_name', listener) + .formText('listener_description', listener) + .formSelect('listener_protocol') + .formInput('listener_protocol_port', port) + .clickStepActionNextButton(); + + cy.formInput('pool_name', pool) + .formText('pool_description', pool) + .formSelect('pool_lb_algorithm') + .formSelect('pool_protocol') + .clickStepActionNextButton(); + + cy.wait(5000).clickStepActionNextButton(); + + cy.formInput('health_name', health) + .formSelect('health_type') + .clickStepActionNextButton() + .waitFormLoading() + .url() + .should('include', listUrl) + .closeNotice() + .wait(5000) + .tableSearchText(name) + .waitStatusActiveByRefresh(); + }); + + it('successfully detail', () => { + cy.tableSearchText(name).goToDetail(1, 2000).goBackToList(listUrl); + }); + + it('successfully edit', () => { + cy.tableSearchText(name) + .clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton() + .waitStatusActiveByRefresh(); + }); + + it('successfully associate fip', () => { + cy.tableSearchText(name) + .clickActionInMore('Associate Floating IP') + .formTableSelect('fixed_ip') + .formTableSelect('fip') + .clickModalActionSubmitButton() + .waitStatusActiveByRefresh(); + }); + + it('successfully disassociate fip', () => { + cy.tableSearchText(name) + .clickConfirmActionInMore('Disassociate Floating IP') + .waitStatusActiveByRefresh(); + }); + + it('successfully create listener', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .clickHeaderButton(1) + .formInput('name', listener2) + .formText('description', listener2) + .formSelect('protocol') + .formInput('protocol_port', port2) + .clickModalActionSubmitButton(); + }); + + it('successfully edit listener', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully edit listener health monitor', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .clickActionInMore('Edit Health Monitor') + .formRadioChoose('admin_state_up', 1) + .clickModalActionSubmitButton() + .tableSearchText(listener) + .waitStatusActiveByRefresh(); + }); + + it('successfully edit listener default pool', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .clickActionInMore('Edit Default Pool') + .formText('description', 'description') + .clickModalActionSubmitButton() + .tableSearchText(listener) + .waitStatusActiveByRefresh(); + }); + + it('successfully delete listener default pool', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .clickConfirmActionInMore('Delete Default Pool') + .tableSearchText(listener) + .waitStatusActiveByRefresh(); + }); + + it('successfully create listener default pool', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .clickActionInMore('Create Default Pool') + .formInput('name', pool2) + .formText('description', pool2) + .formSelect('lb_algorithm') + .formSelect('protocol') + .clickModalActionSubmitButton() + .tableSearchText(listener) + .waitStatusActiveByRefresh(); + }); + + it('successfully listener detail', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .goToDetail(0, 2000) + .clickDetailTab('Member', 'members'); + }); + + it('successfully create listener member', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .goToDetail(0, 2000) + .clickDetailTab('Member') + .clickHeaderButton(1) + .formButtonClick('extMembers') + .get('.ant-form-item') + .eq(1) + .find('.ant-input-number-input') + .first() + .type(port2) + .clickModalActionSubmitButton() + .waitStatusActiveByRefresh(); + }); + + it('successfully edit listener member', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .goToDetail(0, 2000) + .clickDetailTab('Member') + .clickFirstActionButton() + .wait(2000) + .formInput('weight', 2) + .clickModalActionSubmitButton() + .waitStatusActiveByRefresh(); + }); + + it('successfully delete listener member', () => { + cy.tableSearchText(name) + .goToDetail(1, 2000) + .tableSearchText(listener) + .goToDetail(0, 2000) + .clickDetailTab('Member') + .clickConfirmActionButton('Delete') + .goBackToList() + .tableSearchText(listener) + .waitStatusActiveByRefresh(); + }); + + it('successfully delete', () => { + cy.tableSearchText(name).clickConfirmActionInMore('Delete'); + }); + + it('successfully delete related resources', () => { + cy.deleteRouter(routerName, networkName); + cy.deleteAll('network', networkName); + cy.deleteAll('fip'); + }); }); }); diff --git a/test/e2e/integration/pages/network/qos-policy.spec.js b/test/e2e/integration/pages/network/qos-policy.spec.js index 22960a6b..bfca76d6 100644 --- a/test/e2e/integration/pages/network/qos-policy.spec.js +++ b/test/e2e/integration/pages/network/qos-policy.spec.js @@ -12,108 +12,121 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { policyListUrl } from '../../../support/constants'; -describe('The Network Qos Policy Page', () => { - const listUrl = policyListUrl; - const name = `e2e-policy-${Cypress._.random(0, 1e6)}`; - const newname = `${name}-1`; +const qosServiceEnabled = (Cypress.env('extensions') || []).includes( + 'neutron::qos' +); - beforeEach(() => { - cy.loginAdmin(listUrl); - }); - - it('successfully create', () => { - cy.clickHeaderButton(1) - .wait(2000) - .formInput('name', name) - .formText('description', name) - // .formSelect('project_id', 'admin') - .formSwitch('shared') - .clickModalActionSubmitButton(); - }); - - it('successfully detail', () => { - cy.tableSearchText(name) - .checkTableFirstRow(name) - .goToDetail() - .checkDetailName(name); - cy.goBackToList(listUrl); - }); - - // egress - it('successfully create egress bandwidth limit rule', () => { - cy.tableSearchText(name) - .clickActionInMore('Create Bandwidth Limit Rule') - .formSelect('direction', 'egress') - .clickModalActionSubmitButton(); - }); - - it('successfully edit bandwidth egress limit rule', () => { - cy.tableSearchText(name) - .clickActionInMore('Edit Bandwidth Egress Limit Rule') - .formInput('max_kbps', 2) - .clickModalActionSubmitButton(); - }); - - it('successfully delete bandwidth egress limit rule', () => { - cy.tableSearchText(name).clickConfirmActionInMore( - 'Delete Bandwidth Egress Rules' - ); - }); - - it('successfully create bandwidth ingress limit rule', () => { - cy.tableSearchText(name) - .clickActionInMore('Create Bandwidth Limit Rule') - .formSelect('direction', 'ingress') - .clickModalActionSubmitButton(); - }); - - it('successfully edit bandwidth ingress limit rule', () => { - cy.tableSearchText(name) - .clickActionInMore('Edit Bandwidth Ingress Limit Rule') - .formInput('max_kbps', 2) - .clickModalActionSubmitButton(); - }); - - it('successfully delete bandwidth ingress limit rule', () => { - cy.tableSearchText(name).clickConfirmActionInMore( - 'Delete Bandwidth Ingress Rules' - ); - }); - - it('successfully create DSCP marking rule', () => { - cy.tableSearchText(name) - .clickActionInMore('Create DSCP Marking Rule') - .clickModalActionSubmitButton(); - }); - - it('successfully edit DSCP marking rule', () => { - cy.tableSearchText(name) - .clickActionInMore('Edit DSCP Marking Rule') - .formSelect('dscp_mark', 8) - .clickModalActionSubmitButton(); - }); - - it('successfully delete DSCP marking rule', () => { - cy.tableSearchText(name).clickConfirmActionInMore( - 'Delete DSCP Marking Rules' - ); - }); - - it('successfully edit', () => { - cy.tableSearchText(name) - .clickFirstActionButton() - .formInput('name', newname) - .formText('description', newname) - .clickModalActionSubmitButton() - .wait(2000); - }); - - it('successfully delete', () => { - cy.tableSearchText(newname) - .checkTableFirstRow(newname) - .clickConfirmActionInMore('Delete'); - cy.tableSearchText(newname).checkEmptyTable(); +onlyOn(!qosServiceEnabled, () => { + describe('Skip The Network Qos Policy Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(qosServiceEnabled, () => { + describe('The Network Qos Policy Page', () => { + const listUrl = policyListUrl; + const name = `e2e-policy-${Cypress._.random(0, 1e6)}`; + const newname = `${name}-1`; + + beforeEach(() => { + cy.loginAdmin(listUrl); + }); + + it('successfully create', () => { + cy.clickHeaderButton(1) + .wait(2000) + .formInput('name', name) + .formText('description', name) + // .formSelect('project_id', 'admin') + .formSwitch('shared') + .clickModalActionSubmitButton(); + }); + + it('successfully detail', () => { + cy.tableSearchText(name) + .checkTableFirstRow(name) + .goToDetail() + .checkDetailName(name); + cy.goBackToList(listUrl); + }); + + // egress + it('successfully create egress bandwidth limit rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Create Bandwidth Limit Rule') + .formSelect('direction', 'egress') + .clickModalActionSubmitButton(); + }); + + it('successfully edit bandwidth egress limit rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Edit Bandwidth Egress Limit Rule') + .formInput('max_kbps', 2) + .clickModalActionSubmitButton(); + }); + + it('successfully delete bandwidth egress limit rule', () => { + cy.tableSearchText(name).clickConfirmActionInMore( + 'Delete Bandwidth Egress Rules' + ); + }); + + it('successfully create bandwidth ingress limit rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Create Bandwidth Limit Rule') + .formSelect('direction', 'ingress') + .clickModalActionSubmitButton(); + }); + + it('successfully edit bandwidth ingress limit rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Edit Bandwidth Ingress Limit Rule') + .formInput('max_kbps', 2) + .clickModalActionSubmitButton(); + }); + + it('successfully delete bandwidth ingress limit rule', () => { + cy.tableSearchText(name).clickConfirmActionInMore( + 'Delete Bandwidth Ingress Rules' + ); + }); + + it('successfully create DSCP marking rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Create DSCP Marking Rule') + .clickModalActionSubmitButton(); + }); + + it('successfully edit DSCP marking rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Edit DSCP Marking Rule') + .formSelect('dscp_mark', 8) + .clickModalActionSubmitButton(); + }); + + it('successfully delete DSCP marking rule', () => { + cy.tableSearchText(name).clickConfirmActionInMore( + 'Delete DSCP Marking Rules' + ); + }); + + it('successfully edit', () => { + cy.tableSearchText(name) + .clickFirstActionButton() + .formInput('name', newname) + .formText('description', newname) + .clickModalActionSubmitButton() + .wait(2000); + }); + + it('successfully delete', () => { + cy.tableSearchText(newname) + .checkTableFirstRow(newname) + .clickConfirmActionInMore('Delete'); + cy.tableSearchText(newname).checkEmptyTable(); + }); }); }); diff --git a/test/e2e/integration/pages/network/virtual-adapter.spec.js b/test/e2e/integration/pages/network/virtual-adapter.spec.js index 77b1a990..82545742 100644 --- a/test/e2e/integration/pages/network/virtual-adapter.spec.js +++ b/test/e2e/integration/pages/network/virtual-adapter.spec.js @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { virtualAdapterListUrl } from '../../../support/constants'; describe('The Virtual Adapter Page', () => { @@ -24,13 +25,18 @@ describe('The Virtual Adapter Page', () => { const networkName = `e2e-network-for-virtual-adapter-${uuid}`; const instanceName = `e2e-instance-for-virtual-adapter-${uuid}`; const routerName = `e2e-router-for-virtual-adapter-${uuid}`; + const qosServiceEnabled = (Cypress.env('extensions') || []).includes( + 'neutron::qos' + ); beforeEach(() => { cy.login(listUrl); }); - it('successfully prepair resource by admin', () => { - cy.loginAdmin().wait(5000).createNetworkPolicy({ name: policyName }); + onlyOn(qosServiceEnabled, () => { + it('successfully prepair resource by admin', () => { + cy.loginAdmin().wait(5000).createNetworkPolicy({ name: policyName }); + }); }); it('successfully prepair resource', () => { @@ -115,15 +121,17 @@ describe('The Virtual Adapter Page', () => { cy.tableSearchText(name).clickConfirmActionInMore('Detach'); }); - it('successfully modify qos', () => { - cy.tableSearchText(name) - .clickActionInMore('Modify QoS') - .wait(5000) - .formSwitch('enableQosPolicy') - .formTabClick('qos_policy_id', 1) - .wait(2000) - .formTableSelectBySearch('qos_policy_id', policyName) - .clickModalActionSubmitButton(); + onlyOn(qosServiceEnabled, () => { + it('successfully modify qos', () => { + cy.tableSearchText(name) + .clickActionInMore('Modify QoS') + .wait(5000) + .formSwitch('enableQosPolicy') + .formTabClick('qos_policy_id', 1) + .wait(2000) + .formTableSelectBySearch('qos_policy_id', policyName) + .clickModalActionSubmitButton(); + }); }); it('successfully manage security group', () => { @@ -180,6 +188,8 @@ describe('The Virtual Adapter Page', () => { cy.deleteAll('network', networkName); cy.deleteAll('fip'); cy.loginAdmin().wait(5000); - cy.deleteAll('networkQosPolicy', policyName); + onlyOn(qosServiceEnabled, () => { + cy.deleteAll('networkQosPolicy', policyName); + }); }); }); diff --git a/test/e2e/integration/pages/network/vpn.spec.js b/test/e2e/integration/pages/network/vpn.spec.js index b16e34de..63e38efb 100644 --- a/test/e2e/integration/pages/network/vpn.spec.js +++ b/test/e2e/integration/pages/network/vpn.spec.js @@ -12,177 +12,190 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { vpnListUrl } from '../../../support/constants'; -describe('The VPN Page', () => { - const listUrl = vpnListUrl; - const uuid = Cypress._.random(0, 1e6); - const gateway = `e2e-gateway-${uuid}`; - const endpointLocal = `e2e-endpoint-local-${uuid}`; - const endpointPeer = `e2e-endpoint-peer-${uuid}`; - const ikePolicy = `e2e-ike-policy-${uuid}`; - const ipsecPolicy = `e2e-ipsec-policy-${uuid}`; - const tunnel = `e2e-tunnel-${uuid}`; +const vpnServiceEnabled = (Cypress.env('extensions') || []).includes( + 'neutron::vpn' +); - const cidr = '192.168.0.0/24'; - - const networkName = `e2e-network-for-vpn-${uuid}`; - const routerName = `e2e-router-for-vpn-${uuid}`; - - beforeEach(() => { - cy.login(listUrl); - }); - - it('successfully prepair resource', () => { - cy.createNetwork({ name: networkName }); - cy.createRouter({ name: routerName, network: networkName }); - }); - - it('successfully create gateway', () => { - cy.clickHeaderButton(1) - .formInput('name', gateway) - .formText('description', gateway) - .formTableSelectBySearch('router_id', routerName) - .clickModalActionSubmitButton(); - }); - - it('successfully create local endpoint', () => { - cy.clickTab('VPN EndPoint Group', 'vpn_endpoint_groups') - .clickHeaderButton(1) - .wait(5000) - .formInput('name', endpointLocal) - .formText('description', endpointLocal) - .formSelect('type', 'Local') - .formTableSelectBySearch('router_id', routerName) - .wait(5000) - .formTableSelect('subnet_id') - .clickModalActionSubmitButton(); - }); - - it('successfully create peer endpoint', () => { - cy.clickTab('VPN EndPoint Group', 'vpn_endpoint_groups') - .clickHeaderButton(1) - .formInput('name', endpointPeer) - .formText('description', endpointPeer) - .formSelect('type', 'Peer') - .wait(2000) - .formText('endpoints', cidr) - .clickModalActionSubmitButton(); - }); - - it('successfully create ike policy', () => { - cy.clickTab('IKE Policy', 'ike_policy') - .clickHeaderButton(1) - .formInput('name', ikePolicy) - .formText('description', ikePolicy) - .clickModalActionSubmitButton(); - }); - - it('successfully create ipsec policy', () => { - cy.clickTab('IPsec Policy', 'ipsec_policy') - .clickHeaderButton(1) - .formInput('name', ipsecPolicy) - .formText('description', ipsecPolicy) - .clickModalActionSubmitButton(); - }); - - it('successfully create vpn tunnel', () => { - cy.clickTab('VPN Tunnel', 'ipsec_connections') - .clickHeaderButton(1) - .wait(5000) - .formInput('name', tunnel) - .formText('description', tunnel) - .formSelect('vpnservice_id', gateway) - .formSelect('ikepolicy_id', ikePolicy) - .formSelect('ipsecpolicy_id', ipsecPolicy) - .formSelect('local_ep_group_id', endpointLocal) - .wait(2000) - .formInput('peer_address', '192.168.1.1') - .formSelect('peer_ep_group_id', endpointPeer) - .formInput('password', 'passW0rd') - .formInput('confirmPassword', 'passW0rd') - .formButtonClick('more') - .clickModalActionSubmitButton(); - }); - - it('successfully detail vpn tunnel', () => { - cy.clickTab('VPN Tunnel', 'ipsec_connections').tableSearchText(tunnel); - cy.goToDetail().wait(30000); - cy.goBackToList(listUrl); - }); - - it('successfully edit tunnel', () => { - cy.clickTab('VPN Tunnel') - .tableSearchText(tunnel) - .clickFirstActionButton() - .formText('description', 'description') - .clickModalActionSubmitButton(); - }); - - it('successfully delete tunnel', () => { - cy.clickTab('VPN Tunnel') - .tableSearchText(tunnel) - .clickConfirmActionButton('Delete'); - }); - - it('successfully edit ipsec policy', () => { - cy.clickTab('IPsec Policy') - .tableSearchText(ipsecPolicy) - .clickFirstActionButton() - .formText('description', 'description') - .clickModalActionSubmitButton(); - }); - - it('successfully delete ipsec policy', () => { - cy.clickTab('IPsec Policy') - .tableSearchText(ipsecPolicy) - .clickConfirmActionButton('Delete'); - }); - - it('successfully edit ike policy', () => { - cy.clickTab('IKE Policy') - .tableSearchText(ikePolicy) - .clickFirstActionButton() - .formText('description', 'description') - .clickModalActionSubmitButton(); - }); - - it('successfully delete ike policy', () => { - cy.clickTab('IKE Policy') - .tableSearchText(ikePolicy) - .clickConfirmActionButton('Delete'); - }); - - it('successfully edit endpoint', () => { - cy.clickTab('VPN EndPoint Group') - .tableSearchText(endpointLocal) - .clickFirstActionButton() - .formText('description', 'description') - .clickModalActionSubmitButton(); - }); - - it('successfully delete endpoint', () => { - cy.clickTab('VPN EndPoint Group') - .tableSearchText(endpointLocal) - .clickConfirmActionButton('Delete') - .wait(5000) - .tableSearchText(endpointPeer) - .clickConfirmActionButton('Delete'); - }); - - it('successfully edit gateway', () => { - cy.tableSearchText(gateway) - .clickFirstActionButton() - .formText('description', 'description') - .clickModalActionSubmitButton(); - }); - - it('successfully delete gateway', () => { - cy.tableSearchText(gateway).clickConfirmActionButton('Delete'); - }); - - it('successfully delete related resources', () => { - cy.deleteRouter(routerName, networkName); - cy.deleteAll('network', networkName); +onlyOn(!vpnServiceEnabled, () => { + describe('The VPN Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(vpnServiceEnabled, () => { + describe('The VPN Page', () => { + const listUrl = vpnListUrl; + const uuid = Cypress._.random(0, 1e6); + const gateway = `e2e-gateway-${uuid}`; + const endpointLocal = `e2e-endpoint-local-${uuid}`; + const endpointPeer = `e2e-endpoint-peer-${uuid}`; + const ikePolicy = `e2e-ike-policy-${uuid}`; + const ipsecPolicy = `e2e-ipsec-policy-${uuid}`; + const tunnel = `e2e-tunnel-${uuid}`; + + const cidr = '192.168.0.0/24'; + + const networkName = `e2e-network-for-vpn-${uuid}`; + const routerName = `e2e-router-for-vpn-${uuid}`; + + beforeEach(() => { + cy.login(listUrl); + }); + + it('successfully prepair resource', () => { + cy.createNetwork({ name: networkName }); + cy.createRouter({ name: routerName, network: networkName }); + }); + + it('successfully create gateway', () => { + cy.clickHeaderButton(1) + .formInput('name', gateway) + .formText('description', gateway) + .formTableSelectBySearch('router_id', routerName) + .clickModalActionSubmitButton(); + }); + + it('successfully create local endpoint', () => { + cy.clickTab('VPN EndPoint Group', 'vpn_endpoint_groups') + .clickHeaderButton(1) + .wait(5000) + .formInput('name', endpointLocal) + .formText('description', endpointLocal) + .formSelect('type', 'Local') + .formTableSelectBySearch('router_id', routerName) + .wait(5000) + .formTableSelect('subnet_id') + .clickModalActionSubmitButton(); + }); + + it('successfully create peer endpoint', () => { + cy.clickTab('VPN EndPoint Group', 'vpn_endpoint_groups') + .clickHeaderButton(1) + .formInput('name', endpointPeer) + .formText('description', endpointPeer) + .formSelect('type', 'Peer') + .wait(2000) + .formText('endpoints', cidr) + .clickModalActionSubmitButton(); + }); + + it('successfully create ike policy', () => { + cy.clickTab('IKE Policy', 'ike_policy') + .clickHeaderButton(1) + .formInput('name', ikePolicy) + .formText('description', ikePolicy) + .clickModalActionSubmitButton(); + }); + + it('successfully create ipsec policy', () => { + cy.clickTab('IPsec Policy', 'ipsec_policy') + .clickHeaderButton(1) + .formInput('name', ipsecPolicy) + .formText('description', ipsecPolicy) + .clickModalActionSubmitButton(); + }); + + it('successfully create vpn tunnel', () => { + cy.clickTab('VPN Tunnel', 'ipsec_connections') + .clickHeaderButton(1) + .wait(5000) + .formInput('name', tunnel) + .formText('description', tunnel) + .formSelect('vpnservice_id', gateway) + .formSelect('ikepolicy_id', ikePolicy) + .formSelect('ipsecpolicy_id', ipsecPolicy) + .formSelect('local_ep_group_id', endpointLocal) + .wait(2000) + .formInput('peer_address', '192.168.1.1') + .formSelect('peer_ep_group_id', endpointPeer) + .formInput('password', 'passW0rd') + .formInput('confirmPassword', 'passW0rd') + .formButtonClick('more') + .clickModalActionSubmitButton(); + }); + + it('successfully detail vpn tunnel', () => { + cy.clickTab('VPN Tunnel', 'ipsec_connections').tableSearchText(tunnel); + cy.goToDetail().wait(30000); + cy.goBackToList(listUrl); + }); + + it('successfully edit tunnel', () => { + cy.clickTab('VPN Tunnel') + .tableSearchText(tunnel) + .clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully delete tunnel', () => { + cy.clickTab('VPN Tunnel') + .tableSearchText(tunnel) + .clickConfirmActionButton('Delete'); + }); + + it('successfully edit ipsec policy', () => { + cy.clickTab('IPsec Policy') + .tableSearchText(ipsecPolicy) + .clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully delete ipsec policy', () => { + cy.clickTab('IPsec Policy') + .tableSearchText(ipsecPolicy) + .clickConfirmActionButton('Delete'); + }); + + it('successfully edit ike policy', () => { + cy.clickTab('IKE Policy') + .tableSearchText(ikePolicy) + .clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully delete ike policy', () => { + cy.clickTab('IKE Policy') + .tableSearchText(ikePolicy) + .clickConfirmActionButton('Delete'); + }); + + it('successfully edit endpoint', () => { + cy.clickTab('VPN EndPoint Group') + .tableSearchText(endpointLocal) + .clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully delete endpoint', () => { + cy.clickTab('VPN EndPoint Group') + .tableSearchText(endpointLocal) + .clickConfirmActionButton('Delete') + .wait(5000) + .tableSearchText(endpointPeer) + .clickConfirmActionButton('Delete'); + }); + + it('successfully edit gateway', () => { + cy.tableSearchText(gateway) + .clickFirstActionButton() + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully delete gateway', () => { + cy.tableSearchText(gateway).clickConfirmActionButton('Delete'); + }); + + it('successfully delete related resources', () => { + cy.deleteRouter(routerName, networkName); + cy.deleteAll('network', networkName); + }); }); }); diff --git a/test/e2e/integration/pages/storage/backup.spec.js b/test/e2e/integration/pages/storage/backup.spec.js index 86135f92..f357f861 100644 --- a/test/e2e/integration/pages/storage/backup.spec.js +++ b/test/e2e/integration/pages/storage/backup.spec.js @@ -12,91 +12,104 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { backupListUrl, volumeListUrl } from '../../../support/constants'; -describe('The Volume Backup Page', () => { - const listUrl = backupListUrl; - const uuid = Cypress._.random(0, 1e6); - const name = `e2e-backup-${uuid}`; - const nameInc = `${name}-inc`; - const volumeName = `e2e-volume-for-backup-${uuid}`; - const volumeNameByBackup = `e2e-volume-by-backup-${uuid}`; - const newname = `${name}-1`; +const backupServiceEnabled = (Cypress.env('extensions') || []).includes( + 'cinder::buckup' +); - beforeEach(() => { - cy.login(listUrl); - }); - - it('successfully prepair resource', () => { - cy.createVolume(volumeName); - }); - - it('successfully create full bakcup', () => { - cy.clickHeaderButton(1, 5000) - .formInput('name', name) - .formTableSelectBySearch('volume', volumeName) - .clickModalActionSubmitButton() - .wait(5000) - .waitTableLoading(); - - cy.wait(30000); - }); - - it('successfully create increment bakcup', () => { - cy.clickHeaderButton(1, 5000) - .formInput('name', nameInc) - .formRadioChoose('incremental', 1) - .formTableSelectBySearch('volume', volumeName) - .clickModalActionSubmitButton() - .wait(5000) - .waitTableLoading(); - }); - - it('successfully detail', () => { - cy.tableSearchText(name).goToDetail().checkDetailName(name); - cy.goBackToList(listUrl); - - cy.visitPage(volumeListUrl) - .tableSearchText(volumeName) - .goToDetail() - .clickDetailTab('Backup', 'backup'); - }); - - it('successfully restore by backup', () => { - cy.tableSearchText(name) - .clickActionInMore('Restore Backup') - .wait(5000) - .formTableSelect('backup') - .clickModalActionSubmitButton() - .wait(30000); - }); - - it('successfully create volume by backup', () => { - cy.tableSearchText(name) - .clickActionInMore('Create Volume') - .wait(5000) - .formInput('name', volumeNameByBackup) - .formSelect('volume_type') - .formSelect('availability_zone') - .clickModalActionSubmitButton(); - }); - - it('successfully edit', () => { - cy.tableSearchText(name) - .clickFirstActionButton() - .formInput('name', newname) - .clickModalActionSubmitButton() - .wait(2000); - }); - - it('successfully delete', () => { - cy.tableSearchText(newname) - .clickConfirmActionInMore('Delete') - .tableSearchText(newname); - }); - - it('successfully delete related resources', () => { - cy.deleteAll('volume', volumeName); - cy.deleteAll('volume', volumeNameByBackup); +onlyOn(!backupServiceEnabled, () => { + describe('Skip The Volume Backup Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(backupServiceEnabled, () => { + describe('The Volume Backup Page', () => { + const listUrl = backupListUrl; + const uuid = Cypress._.random(0, 1e6); + const name = `e2e-backup-${uuid}`; + const nameInc = `${name}-inc`; + const volumeName = `e2e-volume-for-backup-${uuid}`; + const volumeNameByBackup = `e2e-volume-by-backup-${uuid}`; + const newname = `${name}-1`; + + beforeEach(() => { + cy.login(listUrl); + }); + + it('successfully prepair resource', () => { + cy.createVolume(volumeName); + }); + + it('successfully create full bakcup', () => { + cy.clickHeaderButton(1, 5000) + .formInput('name', name) + .formTableSelectBySearch('volume', volumeName) + .clickModalActionSubmitButton() + .wait(5000) + .waitTableLoading(); + cy.tableSearchText(name).waitStatusTextByFresh('Available'); + }); + + it('successfully create increment bakcup', () => { + cy.clickHeaderButton(1, 5000) + .formInput('name', nameInc) + .formRadioChoose('incremental', 1) + .formTableSelectBySearch('volume', volumeName) + .clickModalActionSubmitButton() + .wait(5000) + .waitTableLoading(); + cy.tableSearchText(nameInc).waitStatusTextByFresh('Available'); + }); + + it('successfully detail', () => { + cy.tableSearchText(name).goToDetail().checkDetailName(name); + cy.goBackToList(listUrl); + + cy.visitPage(volumeListUrl) + .tableSearchText(volumeName) + .goToDetail() + .clickDetailTab('Backup', 'backup'); + }); + + it('successfully restore by backup', () => { + cy.tableSearchText(name) + .clickActionInMore('Restore Backup') + .wait(5000) + .formTableSelect('backup') + .clickModalActionSubmitButton() + .wait(30000); + }); + + it('successfully create volume by backup', () => { + cy.tableSearchText(name) + .clickActionInMore('Create Volume') + .wait(5000) + .formInput('name', volumeNameByBackup) + .formSelect('volume_type') + .formSelect('availability_zone') + .clickModalActionSubmitButton(); + }); + + it('successfully edit', () => { + cy.tableSearchText(name) + .clickFirstActionButton() + .formInput('name', newname) + .clickModalActionSubmitButton() + .wait(2000); + }); + + it('successfully delete', () => { + cy.tableSearchText(newname) + .clickConfirmActionInMore('Delete') + .tableSearchText(newname); + }); + + it('successfully delete related resources', () => { + cy.deleteAll('volume', volumeName); + cy.deleteAll('volume', volumeNameByBackup); + }); }); }); diff --git a/test/e2e/integration/pages/storage/volume.spec.js b/test/e2e/integration/pages/storage/volume.spec.js index 76fdb86e..2349d174 100644 --- a/test/e2e/integration/pages/storage/volume.spec.js +++ b/test/e2e/integration/pages/storage/volume.spec.js @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { onlyOn } from '@cypress/skip-test'; import { volumeListUrl, volumeTypeListUrl } from '../../../support/constants'; describe('The Volume Page', () => { @@ -32,6 +33,10 @@ describe('The Volume Page', () => { const networkName = `e2e-network-for-volume-${uuid}`; const instanceName = `e2e-instance-for-volume-${uuid}`; + const backupServiceEnabled = (Cypress.env('extensions') || []).includes( + 'cinder::buckup' + ); + beforeEach(() => { cy.login(listUrl); }); @@ -96,25 +101,27 @@ describe('The Volume Page', () => { cy.deleteAll('volumeSnapshot', snapshotName); }); - it('successfully create backup', () => { - cy.tableSearchText(name) - .clickActionInMore('Create Backup') - .formInput('name', backupName) - .clickModalActionSubmitButton() - .tableSearchText(name) - .waitStatusActiveByRefresh(); - }); + onlyOn(backupServiceEnabled, () => { + it('successfully create backup', () => { + cy.tableSearchText(name) + .clickActionInMore('Create Backup') + .formInput('name', backupName) + .clickModalActionSubmitButton() + .tableSearchText(name) + .waitStatusActiveByRefresh(); + }); - it('successfully create backup inc', () => { - cy.tableSearchText(name) - .clickActionInMore('Create Backup') - .formInput('name', backupIncName) - .formRadioChoose('incremental', 1) - .clickModalActionSubmitButton() - .tableSearchText(name) - .waitStatusActive(); - cy.deleteAll('backup', backupIncName); - cy.wait(5000).deleteAll('backup', backupName); + it('successfully create backup inc', () => { + cy.tableSearchText(name) + .clickActionInMore('Create Backup') + .formInput('name', backupIncName) + .formRadioChoose('incremental', 1) + .clickModalActionSubmitButton() + .tableSearchText(name) + .waitStatusActive(); + cy.deleteAll('backup', backupIncName); + cy.wait(5000).deleteAll('backup', backupName); + }); }); it('successfully clone volume', () => { diff --git a/yarn.lock b/yarn.lock index 634f124b..4dc4b654 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1550,6 +1550,11 @@ tunnel-agent "^0.6.0" uuid "^3.3.2" +"@cypress/skip-test@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@cypress/skip-test/-/skip-test-2.6.1.tgz#44a4bc4c2b2e369a7661177c9b38e50d417a36ea" + integrity sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA== + "@cypress/xvfb@^1.2.4": version "1.2.4" resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a"