diff --git a/playbooks/devstack/network/run-e2etests.yaml b/playbooks/devstack/network/run-e2etests.yaml index 236b6d5b..7e740fea 100644 --- a/playbooks/devstack/network/run-e2etests.yaml +++ b/playbooks/devstack/network/run-e2etests.yaml @@ -17,6 +17,7 @@ sed -i "s/- neutron::qos/# - neutron::qos/" $config_file sed -i "s/- neutron::vpn/# - neutron::vpn/" $config_file sed -i "s/- neutron::port-forwarding/# - neutron::port-forwarding/" $config_file + sed -i "s/- neutron::firewall/# - neutron::firewall/" $config_file sed -i "s/- octavia/# - octavia/" $config_file # TODO sed -i "s#- pages/network/floatingip.spec.js#\#- pages/network/floatingip.spec.js#" $config_file diff --git a/test/e2e/config/config-network.yaml b/test/e2e/config/config-network.yaml index b6aa63cb..145e345c 100644 --- a/test/e2e/config/config-network.yaml +++ b/test/e2e/config/config-network.yaml @@ -15,6 +15,7 @@ env: - neutron::qos - neutron::vpn - neutron::port-forwarding + - neutron::firewall - octavia testFiles: # network @@ -26,4 +27,7 @@ testFiles: - pages/network/security-group.spec.js - pages/network/vpn.spec.js - pages/network/lb.spec.js + - pages/network/firewall.spec.js + - pages/network/firewall-policy.spec.js + - pages/network/firewall-rule.spec.js # - pages/network/topology.spec.js diff --git a/test/e2e/integration/pages/network/firewall-policy.spec.js b/test/e2e/integration/pages/network/firewall-policy.spec.js new file mode 100644 index 00000000..7024a4bb --- /dev/null +++ b/test/e2e/integration/pages/network/firewall-policy.spec.js @@ -0,0 +1,94 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { onlyOn } from '@cypress/skip-test'; +import { firewallListUrl } from '../../../support/constants'; + +const fwaasEnabled = (Cypress.env('extensions') || []).includes( + 'neutron::firewall' +); + +onlyOn(!fwaasEnabled, () => { + describe('Skip The Network Firewall Policy Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(fwaasEnabled, () => { + describe('The Firewall Policy Page', () => { + const listUrl = firewallListUrl; + const uuid = Cypress._.random(0, 1e6); + const name = `e2e-firewall-policy-${uuid}`; + const newname = `${name}-1`; + const ruleName = `e2e-rule-for-fw-policy-${uuid}`; + + beforeEach(() => { + cy.login(listUrl).wait(5000).clickTab('Firewall Policies', 'policies'); + }); + + it('successfully prepair resource', () => { + cy.createFirewallRule({ name: ruleName }); + }); + + it('successfully create', () => { + cy.clickHeaderActionButton(0) + .formInput('name', name) + .formText('description', name) + .clickModalActionSubmitButton(); + }); + + it('successfully detail', () => { + cy.tableSearchText(name).goToDetail().checkDetailName(name); + cy.goBackToList(listUrl); + }); + + it('successfully insert rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Insert Rule') + .formTableSelectBySearch('rule', ruleName) + .clickModalActionSubmitButton(); + }); + + it('successfully remove rule', () => { + cy.tableSearchText(name) + .clickActionInMore('Remove Rule') + .formTableSelectBySearch('rule', ruleName) + .clickModalActionSubmitButton(); + }); + + it('successfully edit', () => { + cy.tableSearchText(name) + .clickFirstActionButton() + .wait(5000) + .formInput('name', newname) + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully delete', () => { + cy.tableSearchText(newname).clickConfirmActionInMore('Delete'); + }); + + it('successfully disable delete', () => { + cy.tableSearchText('default ingress') + .selectFirst() + .clickHeaderActionButtonByTitle('Delete') + .checkDisableAction(); + }); + + it('successfully delete related resources', () => { + cy.deleteAll('firewall', ruleName, 'Firewall Rules'); + }); + }); +}); diff --git a/test/e2e/integration/pages/network/firewall-rule.spec.js b/test/e2e/integration/pages/network/firewall-rule.spec.js new file mode 100644 index 00000000..82ca0e07 --- /dev/null +++ b/test/e2e/integration/pages/network/firewall-rule.spec.js @@ -0,0 +1,64 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { onlyOn } from '@cypress/skip-test'; +import { firewallListUrl } from '../../../support/constants'; + +const fwaasEnabled = (Cypress.env('extensions') || []).includes( + 'neutron::firewall' +); + +onlyOn(!fwaasEnabled, () => { + describe('Skip The Network Firewall Rule Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(fwaasEnabled, () => { + describe('The Firewall Rule Page', () => { + const listUrl = firewallListUrl; + const name = `e2e-firewall-rule-${Cypress._.random(0, 1e6)}`; + const newname = `${name}-1`; + + beforeEach(() => { + cy.login(listUrl).wait(5000).clickTab('Firewall Rules', 'rules'); + }); + + it('successfully create', () => { + cy.clickHeaderActionButton(0) + .wait(2000) + .formInput('name', name) + .formText('description', name) + .clickFormActionSubmitButton(); + }); + + it('successfully detail', () => { + cy.tableSearchText(name).goToDetail().checkDetailName(name); + cy.goBackToList(listUrl); + }); + + it('successfully edit', () => { + cy.tableSearchText(name) + .clickFirstActionButton() + .wait(5000) + .formInput('name', newname) + .formText('description', 'description') + .clickFormActionSubmitButton(); + }); + + it('successfully delete', () => { + cy.tableSearchText(newname).clickConfirmActionButton('Delete'); + }); + }); +}); diff --git a/test/e2e/integration/pages/network/firewall.spec.js b/test/e2e/integration/pages/network/firewall.spec.js new file mode 100644 index 00000000..18a95a50 --- /dev/null +++ b/test/e2e/integration/pages/network/firewall.spec.js @@ -0,0 +1,106 @@ +// Copyright 2021 99cloud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { onlyOn } from '@cypress/skip-test'; +import { firewallListUrl } from '../../../support/constants'; + +const fwaasEnabled = (Cypress.env('extensions') || []).includes( + 'neutron::firewall' +); + +onlyOn(!fwaasEnabled, () => { + describe('Skip The Network Firewall Page', () => { + it('successfully skip', () => {}); + }); +}); + +onlyOn(fwaasEnabled, () => { + describe('The Firewall Page', () => { + const listUrl = firewallListUrl; + const uuid = Cypress._.random(0, 1e6); + const name = `e2e-firewall-${uuid}`; + const newname = `${name}-1`; + const inPolicyName = `e2e-ingress-policy-for-firewall-${uuid}`; + const ePolicyName = `e2e-egress-policy-for-firewall-${uuid}`; + const networkName = `e2e-network-for-firewall-${uuid}`; + const routerName = `e2e-network-for-firewall-${uuid}`; + + beforeEach(() => { + cy.login(listUrl); + }); + + it('successfully prepair resource', () => { + cy.createFirewallPolicy({ name: inPolicyName }); + cy.createFirewallPolicy({ name: ePolicyName }); + cy.createNetwork({ name: networkName }); + cy.createRouter({ name: routerName, network: networkName }); + }); + + it('successfully create', () => { + cy.clickHeaderActionButton(0) + .wait(5000) + .formInput('name', name) + .formTableSelectBySearch('ingressPolicy', inPolicyName) + .formTableSelectBySearch('egressPolicy', ePolicyName) + .formTabClick('ports', 1) + .wait(2000) + .formTableSelectBySearch('ports', networkName) + .formText('description', name) + .clickFormActionSubmitButton(); + }); + + it('successfully detail', () => { + cy.tableSearchText(name).goToDetail().clickDetailTab('Ports', 'ports'); + cy.goBackToList(listUrl); + }); + + it('successfully disable delete', () => { + cy.tableSearchText(name) + .selectAll() + .clickHeaderActionButtonByTitle('Delete') + .checkDisableAction(); + }); + + it('successfully manage port', () => { + cy.tableSearchText(name) + .clickActionButtonByTitle('Manage Ports') + .formTabClick('ports', 1) + .wait(2000) + .formTableClearSelect('ports') + .clickModalActionSubmitButton(); + }); + + it('successfully edit', () => { + cy.tableSearchText(name) + .clickFirstActionButton() + .wait(5000) + .formInput('name', newname) + .formTableClearSelect('ingressPolicy') + .formTableClearSelect('egressPolicy') + .formText('description', 'description') + .clickModalActionSubmitButton(); + }); + + it('successfully delete', () => { + cy.tableSearchText(newname).clickConfirmActionInMore('Delete'); + }); + + it('successfully delete related resources', () => { + cy.deleteAll('firewall', inPolicyName, 'Firewall Policies'); + cy.deleteAll('firewall', ePolicyName, 'Firewall Policies'); + cy.deleteRouter(routerName, networkName); + cy.deleteAll('network', networkName); + }); + }); +}); diff --git a/test/e2e/support/constants.js b/test/e2e/support/constants.js index 75062912..b42de226 100644 --- a/test/e2e/support/constants.js +++ b/test/e2e/support/constants.js @@ -41,6 +41,7 @@ export const vpnListUrl = '/network/vpn'; export const lbListUrl = '/network/load-balancers'; export const topologyUrl = '/network/topo'; export const securityGroupListUrl = '/network/security-group'; +export const firewallListUrl = '/network/firewall'; // management export const recycleBinListUrl = '/management/recycle-bin'; @@ -86,9 +87,8 @@ export default { networkQosPolicy: policyListUrl, fip: fipListUrl, port: portListUrl, - - // security securityGroup: securityGroupListUrl, + firewall: firewallListUrl, // identity project: projectListUrl, diff --git a/test/e2e/support/resource-commands.js b/test/e2e/support/resource-commands.js index 42f4b303..09b96edc 100644 --- a/test/e2e/support/resource-commands.js +++ b/test/e2e/support/resource-commands.js @@ -27,6 +27,7 @@ import urlMap, { projectListUrl, settingUrl, flavorListUrl, + firewallListUrl, } from './constants'; Cypress.Commands.add('createInstance', ({ name, networkName }) => { @@ -295,3 +296,41 @@ Cypress.Commands.add('deleteAll', (resourceName, name, tab) => { cy.clickHeaderConfirmButtonByTitle('Delete'); } }); + +Cypress.Commands.add( + 'createFirewallRule', + ({ + name, + protocol = 'TCP', // TCP UDP ICMP ANY + ruleAction = 'ALLOW', // ALLOW DENY REJECT + ipVersion = 'IPv4', // IPv4 IPv6 + enabled = true, + }) => { + cy.visit(firewallListUrl) + .wait(5000) + .clickTab('Firewall Rules') + .clickHeaderActionButton(0) + .wait(2000) + .formInput('name', name) + .formRadioChooseByLabel('protocol', protocol) + .formSelect('action', ruleAction) + .formRadioChooseByLabel('ip_version', ipVersion); + if (!enabled) cy.formCheckboxClick('options', 0); // Enabled: default is checked + cy.clickFormActionSubmitButton(); + } +); + +Cypress.Commands.add( + 'createFirewallPolicy', + ({ name, enableShared = false, enableAudited = false }) => { + cy.visit(firewallListUrl) + .wait(5000) + .clickTab('Firewall Policies') + .clickHeaderActionButton(0) + .wait(2000) + .formInput('name', name); + if (enableShared) cy.formCheckboxClick('options', 0); // Shared + if (enableAudited) cy.formCheckboxClick('options', 1); // Audited + cy.clickModalActionSubmitButton(); + } +);