diff --git a/web/cypress/fixtures/gateway-api-template.yaml b/web/cypress/fixtures/gateway-api-template.yaml deleted file mode 100644 index 1d5b5dbfb..000000000 --- a/web/cypress/fixtures/gateway-api-template.yaml +++ /dev/null @@ -1,97 +0,0 @@ -apiVersion: template.openshift.io/v1 -kind: Template -metadata: - name: gateway-api-resources -objects: -- apiVersion: v1 - kind: Namespace - metadata: - name: ${NAMESPACE} - labels: - app: ${NAMESPACE_LABEL} -- apiVersion: gateway.networking.k8s.io/v1 - kind: GatewayClass - metadata: - name: openshift-default - spec: - controllerName: openshift.io/gateway-controller/v1 -- apiVersion: gateway.networking.k8s.io/v1 - kind: Gateway - metadata: - name: ${GATEWAY_NAME} - namespace: ${NAMESPACE} - spec: - gatewayClassName: openshift-default - listeners: - - name: demo - hostname: ${HOSTNAME} - port: 80 - protocol: HTTP - allowedRoutes: - namespaces: - from: Selector - selector: - matchLabels: - app: ${NAMESPACE_LABEL} -- apiVersion: gateway.networking.k8s.io/v1 - kind: HTTPRoute - metadata: - name: ${HTTPROUTE_NAME} - namespace: ${NAMESPACE} - spec: - parentRefs: - - name: ${GATEWAY_NAME} - namespace: ${NAMESPACE} - hostnames: ["${HOSTNAME}"] - rules: - - backendRefs: - - name: service-unsecure - port: 27017 -- apiVersion: apps/v1 - kind: Deployment - metadata: - name: traffic-generator - namespace: ${NAMESPACE} - spec: - replicas: 1 - selector: - matchLabels: - app: traffic-generator - template: - metadata: - labels: - app: traffic-generator - spec: - containers: - - name: traffic-gen - image: registry.access.redhat.com/ubi8/ubi-minimal - command: - - /bin/sh - - -c - - | - while true; do - curl -s http://${GATEWAY_NAME}-openshift-default.${NAMESPACE}.svc.cluster.local:8080 || true - wget -q -O- http://${GATEWAY_NAME}-openshift-default.${NAMESPACE}.svc.cluster.local:8080 || true - sleep 5 - done -parameters: -- name: GATEWAY_NAME - description: Name of the Gateway resource - value: test-gateway-owner - required: true -- name: HTTPROUTE_NAME - description: Name of the HTTPRoute resource - value: test-httproute - required: true -- name: NAMESPACE - description: Namespace for Gateway and HTTPRoute resources - value: netobserv-gateway-test - required: true -- name: HOSTNAME - description: Hostname for the Gateway listener and HTTPRoute - value: gwapi.example.com - required: true -- name: NAMESPACE_LABEL - description: Label value for namespace app label - value: gwapi - required: true diff --git a/web/cypress/fixtures/gateway-api.yaml b/web/cypress/fixtures/gateway-api.yaml new file mode 100644 index 000000000..89248eace --- /dev/null +++ b/web/cypress/fixtures/gateway-api.yaml @@ -0,0 +1,121 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: netobserv-gateway-test + labels: + app: gwapi +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: GatewayClass +metadata: + name: openshift-default +spec: + controllerName: openshift.io/gateway-controller/v1 +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: Gateway +metadata: + name: test-gateway-owner + namespace: netobserv-gateway-test +spec: + gatewayClassName: openshift-default + listeners: + - name: demo + hostname: gwapi.example.com + port: 80 + protocol: HTTP + allowedRoutes: + namespaces: + from: Selector + selector: + matchLabels: + app: gwapi +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: test-httproute + namespace: netobserv-gateway-test + labels: + app: gwapi +spec: + parentRefs: + - name: test-gateway-owner + namespace: netobserv-gateway-test + hostnames: ["gwapi.example.com"] + rules: + - backendRefs: + - name: echo-service + port: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: echo-service + namespace: netobserv-gateway-test + labels: + app: gwapi +spec: + selector: + app: echo-server + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: echo-server + namespace: netobserv-gateway-test + labels: + app: gwapi +spec: + replicas: 1 + selector: + matchLabels: + app: echo-server + template: + metadata: + labels: + app: echo-server + spec: + containers: + - name: echo + image: hashicorp/http-echo:latest + args: + - -text=echo response + - -listen=:8080 + ports: + - containerPort: 8080 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: traffic-generator + namespace: netobserv-gateway-test + labels: + app: gwapi + component: traffic-generator +spec: + replicas: 1 + selector: + matchLabels: + app: traffic-generator + template: + metadata: + labels: + app: traffic-generator + spec: + containers: + - name: traffic-gen + image: curlimages/curl:latest + command: + - /bin/sh + - -c + - | + while true; do + curl -s -H 'Host: gwapi.example.com' http://test-gateway-owner-openshift-default.netobserv-gateway-test.svc.cluster.local:8080 || true + sleep 5 + done diff --git a/web/cypress/fixtures/image-digest-mirror-set.yaml b/web/cypress/fixtures/image-digest-mirror-set.yaml index 3501f52cc..b3ea21e73 100644 --- a/web/cypress/fixtures/image-digest-mirror-set.yaml +++ b/web/cypress/fixtures/image-digest-mirror-set.yaml @@ -30,4 +30,5 @@ spec: source: registry.redhat.io/network-observability/network-observability-operator-bundle - mirrors: - quay.io/redhat-user-workloads/ocp-network-observab-tenant/network-observability-console-plugin-pf4-ystream + - quay.io/redhat-user-workloads/ocp-network-observab-tenant/network-observability-console-plugin-pf4-zstream source: registry.redhat.io/network-observability/network-observability-console-plugin-compat-rhel9 diff --git a/web/cypress/fixtures/test-server-client.yaml b/web/cypress/fixtures/test-server-client.yaml index 040e4e9cb..1c95ae7e6 100644 --- a/web/cypress/fixtures/test-server-client.yaml +++ b/web/cypress/fixtures/test-server-client.yaml @@ -1,19 +1,25 @@ -apiVersion: template.openshift.io/v1 -kind: Template +--- +apiVersion: v1 +kind: Namespace metadata: - name: netobserv-test-client-server -objects: - - kind: Namespace - apiVersion: v1 - metadata: - name: ${SERVER_NS} - labels: - name: ${SERVER_NS} - - apiVersion: apps/v1 - kind: Deployment + name: test-server-56222 + labels: + name: test-server-56222 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx + namespace: test-server-56222 + labels: + app: nginx +spec: + replicas: 1 + selector: + matchLabels: + app: nginx + template: metadata: - name: nginx - namespace: ${SERVER_NS} labels: app: nginx spec: @@ -21,74 +27,61 @@ objects: runAsNonRoot: true seccompProfile: type: RuntimeDefault - replicas: 1 - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: ["ALL"] - privileged: false - image: quay.io/openshifttest/nginx-alpine:1.2.3 - imagePullPolicy: IfNotPresent - ports: - - containerPort: 8080 - - apiVersion: v1 - kind: Service - metadata: - namespace: ${SERVER_NS} - name: nginx-service - spec: - selector: - app: nginx - type: NodePort - ports: - - protocol: TCP - port: 80 - targetPort: 8080 - - kind: Namespace - apiVersion: v1 - metadata: - name: ${CLIENT_NS} - labels: - name: ${CLIENT_NS} - - apiVersion: v1 - kind: Pod - metadata: - creationTimestamp: null - labels: - run: client - name: client - namespace: ${CLIENT_NS} - spec: containers: - - command: - - sh - - -c - - " - \ while : ; do\n - \ curl nginx-service.${SERVER_NS}.svc:80/data/100K 2>&1 > /dev/null ; sleep 5 \n - \ done" - image: quay.io/openshifttest/hello-openshift:1.2.0 + - name: nginx + image: quay.io/openshifttest/nginx-alpine:1.2.3 + imagePullPolicy: IfNotPresent securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] - privileged: false - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - name: client -parameters: - - name: SERVER_NS - value: test-server - - name: CLIENT_NS - value: test-client + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + namespace: test-server-56222 + name: nginx-service +spec: + selector: + app: nginx + type: NodePort + ports: + - protocol: TCP + port: 80 + targetPort: 8080 +--- +apiVersion: v1 +kind: Namespace +metadata: + name: test-client-56222 + labels: + name: test-client-56222 +--- +apiVersion: v1 +kind: Pod +metadata: + labels: + run: client + name: client + namespace: test-client-56222 +spec: + containers: + - name: client + image: quay.io/openshifttest/hello-openshift:1.2.0 + command: + - sh + - -c + - | + while : ; do + curl nginx-service.test-server-56222.svc:80/data/100K 2>&1 > /dev/null + sleep 5 + done + securityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault diff --git a/web/cypress/integration-tests/client_performance.cy.ts b/web/cypress/integration-tests/client_performance.cy.ts index f3124ad28..4154d8183 100644 --- a/web/cypress/integration-tests/client_performance.cy.ts +++ b/web/cypress/integration-tests/client_performance.cy.ts @@ -1,11 +1,7 @@ -import { netflowPage, loadTimes, memoryUsage, overviewSelectors } from "@views/netflow-page" +import { netflowPage, loadTimes, memoryUsage, overviewSelectors, getMemoryUsageMB, topologyPage } from "@views/netflow-page" import { Operator } from "@views/netobserv" -function getTopologyScopeURL(scope: string): string { - return `**/flow/metrics?filters=&limit=50&recordType=flowLog&dedup=true&packetLoss=all&timeRange=300&rateInterval=30s&step=15s&type=bytes&aggregateBy=${scope}` -} - -describe("(OCP-67725, memodi) Network_Observability Client Performances", { browser: 'chrome', tags: ['Performance'] }, function () { +describe("(OCP-67725, memodi) Client Performances", { browser: 'chrome', tags: ['Performance'] }, function () { before("tests", function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) cy.uiLogin(Cypress.env('LOGIN_IDP'), Cypress.env('LOGIN_USERNAME'), Cypress.env('LOGIN_PASSWORD')) @@ -17,27 +13,26 @@ describe("(OCP-67725, memodi) Network_Observability Client Performances", { brow beforeEach("test", function () { cy.clearLocalStorage() - cy.intercept('**/backend/api/flow/metrics*').as('call1') cy.visit('/netflow-traffic') - // wait for all calls to complete - cy.wait('@call1', { timeout: 60000 }) - + // wait for page to be fully loaded + cy.get('#overview-container', { timeout: 60000 }).should('exist') + cy.byTestID('no-results-found').should('not.exist') }) - it("(OCP-67725, memodi, Network_Observability) should measure overview page load times", function () { + it("(OCP-67725, memodi) should measure overview page load times", function () { netflowPage.clearAllFilters() const start = performance.now() - cy.intercept('GET', getTopologyScopeURL("namespace"), { + cy.intercept('GET', topologyPage.getScopeURL("namespace"), { fixture: 'perf/overview_perf_ns.json' }) - cy.intercept('GET', getTopologyScopeURL("app"), { + cy.intercept('GET', topologyPage.getScopeURL("app"), { fixture: 'perf/overview_perf_app.json' }) cy.get('#overview-flex').contains(overviewSelectors.defaultPanels[0]).should('be.visible').then(() => { cy.wrap(performance.now()).then(end => { let pageload = Math.round(end - start) - let curMemoryUsage = Math.round(window.performance.memory.usedJSHeapSize / 1048576) + let curMemoryUsage = getMemoryUsageMB() cy.log(`Overview page load took ${pageload} ms.`) cy.log(`Overview page memory consumption ${curMemoryUsage} MB`) let thresPageload = loadTimes.overview + loadTimes.overview * 0.5 @@ -48,18 +43,18 @@ describe("(OCP-67725, memodi) Network_Observability Client Performances", { brow }) }) - it("(OCP-67725, memodi, Network_Observability) should measure table page load times", function () { - cy.get('#tabs-container li:nth-child(2)').click() + it("(OCP-67725, memodi) should measure table page load times", function () { + cy.get('#tabs-container').contains('Traffic flows').click() netflowPage.clearAllFilters() const start = performance.now() - const url = '**/backend/api/flow/metrics*' + const url = '**/api/flow/metrics*' cy.intercept('GET', url, { fixture: 'perf/netflow_table_perf.json' }) cy.byTestID("table-composable").should('be.visible').then(() => { cy.wrap(performance.now()).then(end => { let pageload = Math.round(end - start) - let curMemoryUsage = Math.round(window.performance.memory.usedJSHeapSize / 1048576) + let curMemoryUsage = getMemoryUsageMB() cy.log(`Table view page load took ${pageload} ms.`) cy.log(`Table view memory consumption ${curMemoryUsage} MB`) let thresPageload = loadTimes.table + loadTimes.table * 0.5 @@ -70,17 +65,17 @@ describe("(OCP-67725, memodi) Network_Observability Client Performances", { brow }) }) - it("(OCP-67725, memodi, Network_Observability) should measure topology page load times", function () { - cy.get('#tabs-container li:nth-child(3)').click() + it("(OCP-67725, memodi) should measure topology page load times", function () { + cy.get('#tabs-container').contains('Topology').click() netflowPage.clearAllFilters() const start = performance.now() - cy.intercept('GET', getTopologyScopeURL("namespace"), { + cy.intercept('GET', topologyPage.getScopeURL("namespace"), { fixture: 'perf/flow_metrics_perf.json' }) cy.get('[data-surface="true"]').should('be.visible').then(() => { cy.wrap(performance.now()).then(end => { let pageload = Math.round(end - start) - let curMemoryUsage = Math.round(window.performance.memory.usedJSHeapSize / 1048576) + let curMemoryUsage = getMemoryUsageMB() cy.log(`Topology view page load took ${pageload} ms.`) cy.log(`Topology view memory consumption ${curMemoryUsage} MB`) let thresPageload = loadTimes.topology + loadTimes.topology * 0.5 @@ -94,7 +89,7 @@ describe("(OCP-67725, memodi) Network_Observability Client Performances", { brow netflowPage.resetClearFilters() }) - after("suite", function () { + after("all tests", function () { cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/dns_dashboards.cy.ts b/web/cypress/integration-tests/dns_dashboards.cy.ts index e9e9cf396..5eb9df2a9 100644 --- a/web/cypress/integration-tests/dns_dashboards.cy.ts +++ b/web/cypress/integration-tests/dns_dashboards.cy.ts @@ -23,7 +23,7 @@ const DNSPanels = [ "dns-error-rate-per-infra-workload-chart" ] -describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-67087) DNSTracking test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -34,9 +34,9 @@ describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network Operator.createFlowcollector("DNSTracking") }) - it("(OCP-67087, aramesha, Network_Observability) Validate DNSLatencies edge label and Query Summary stats", function () { + it("(OCP-67087, aramesha) Validate DNSLatencies edge label and Query Summary stats", function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(3)').click() + cy.get('#tabs-container').contains('Topology').click() cy.get('#drawer').should('not.be.empty') cy.get(filterSelectors.filterInput).type("dns_latency>=0" + '{enter}') @@ -56,7 +56,7 @@ describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network cy.byTestID("scope-dropdown").click().get("#host").click() cy.contains('Display options').should('exist').click() - cy.get('[data-test-id=edge-handler]').should('exist').each((g) => { + cy.byLegacyTestID('edge-handler').should('exist').each((g) => { expect(g.text()).to.match(/\d+\s*ms/); }); @@ -67,7 +67,7 @@ describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network netflowPage.clearAllFilters() }) - it("(OCP-67087, aramesha, Network_Observability) Validate DNSTracking dashboards", function () { + it("(OCP-67087, aramesha) Validate DNSTracking dashboards", function () { // navigate to 'NetObserv / Main' Dashboard page dashboard.visit() dashboard.visitDashboard("netobserv-main") diff --git a/web/cypress/integration-tests/dns_tracking.cy.ts b/web/cypress/integration-tests/dns_tracking.cy.ts index b60e99848..ecaf3dea3 100644 --- a/web/cypress/integration-tests/dns_tracking.cy.ts +++ b/web/cypress/integration-tests/dns_tracking.cy.ts @@ -1,7 +1,7 @@ import { colSelectors, filterSelectors, netflowPage, overviewSelectors, querySumSelectors } from "@views/netflow-page" import { Operator, project } from "@views/netobserv" -describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-67087) DNSTracking test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -16,7 +16,7 @@ describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network netflowPage.visit() }) - it("(OCP-67087, aramesha, Network_Observability) Verify DNSTracking panels and Query Summary", function () { + it("(OCP-67087, aramesha) Verify DNSTracking panels and Query Summary", function () { // verify default DNSTracking panels are visible cy.checkPanel(overviewSelectors.defaultDNSTrackingPanels) cy.checkPanelsNum(6); @@ -48,7 +48,7 @@ describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network }) it("(OCP-67087, aramesha) Validate DNSTracking columns and DNSName", function () { - cy.get('#tabs-container li:nth-child(2)').click() + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') netflowPage.stopAutoRefresh() @@ -91,7 +91,7 @@ describe('(OCP-67087 Network_Observability) DNSTracking test', { tags: ['Network netflowPage.resetClearFilters() }) - after("Delete flowcollector and DNS pods", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/flowRTT.cy.ts b/web/cypress/integration-tests/flowRTT.cy.ts index 66957f172..21ee7b403 100644 --- a/web/cypress/integration-tests/flowRTT.cy.ts +++ b/web/cypress/integration-tests/flowRTT.cy.ts @@ -1,7 +1,7 @@ import { colSelectors, netflowPage, overviewSelectors, querySumSelectors } from "@views/netflow-page" import { Operator } from "@views/netobserv" -describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-68246) FlowRTT test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -16,18 +16,7 @@ describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Obs netflowPage.visit() }) - it("(OCP-68246, aramesha, Network_Observability) Verify flowRTT panels", function () { - // to reduce flakes restore default panels first time it comes to overview page - cy.openPanelsModal(); - cy.get(overviewSelectors.panelsModal).contains('Restore default panels').click(); - cy.get(overviewSelectors.panelsModal).contains('Save').click(); - netflowPage.waitForLokiQuery() - - // verify Query Summary stats for flowRTT - cy.get(querySumSelectors.avgRTT).should('exist').then(avgRTT => { - cy.checkQuerySummary(avgRTT) - }) - + it("(OCP-68246, aramesha) Verify flowRTT panels", function () { // verify default flowRTT panels are visible cy.checkPanel(overviewSelectors.defaultFlowRTTPanels) cy.checkPanelsNum(5); @@ -44,10 +33,23 @@ describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Obs netflowPage.waitForLokiQuery() cy.checkPanel(overviewSelectors.allFlowRTTPanels) + + // restore default panels and verify they are visible + cy.openPanelsModal(); + cy.byTestID(overviewSelectors.resetDefault).click().byTestID(overviewSelectors.save).click() + netflowPage.waitForLokiQuery() + cy.checkPanel(overviewSelectors.defaultFlowRTTPanels) + cy.checkPanelsNum(5); + + // verify Query Summary stats for flowRTT + // Wait for flows to be collected and metrics to be non-zero (retry up to 120s) + cy.get(querySumSelectors.avgRTT, { timeout: 120000 }).should('exist').then(avgRTT => { + cy.checkQuerySummary(avgRTT) + }) }) - it("(OCP-68246, aramesha, Network_Observability) Verify default flowRTT column", function () { - cy.get('#tabs-container li:nth-child(2)').click() + it("(OCP-68246, aramesha) Verify default flowRTT column", function () { + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') netflowPage.stopAutoRefresh() @@ -61,7 +63,7 @@ describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Obs netflowPage.resetClearFilters() }) - after("Delete flowcollector", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/flowRTT_dashboards.cy.ts b/web/cypress/integration-tests/flowRTT_dashboards.cy.ts index dee4b4e7e..7dc7e377b 100644 --- a/web/cypress/integration-tests/flowRTT_dashboards.cy.ts +++ b/web/cypress/integration-tests/flowRTT_dashboards.cy.ts @@ -1,6 +1,6 @@ import { Operator } from "@views/netobserv" import { netflowPage, querySumSelectors, topologySelectors, filterSelectors } from "@views/netflow-page" -import { dashboard, graphSelector } from "@views/dashboards-page" +import { dashboard } from "@views/dashboards-page" const metricType = [ "Bytes", @@ -20,7 +20,7 @@ const flowRTTPanels = [ "top-p99-srtt-per-infra-workload-(ms)-chart" ] -describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-68246) FlowRTT test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -31,9 +31,9 @@ describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Obs Operator.createFlowcollector("FlowRTT") }) - it("(OCP-68246, aramesha, Network_Observability) Validate flowRTT edge labels and Query Summary stats", function () { + it("(OCP-68246, aramesha) Validate flowRTT edge labels and Query Summary stats", function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(3)').click() + cy.get('#tabs-container').contains('Topology').click() cy.get('#drawer').should('not.be.empty') cy.byTestID("show-view-options-button").should('exist').click().then(views => { @@ -55,7 +55,7 @@ describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Obs // filter on TCP protocol cy.get(filterSelectors.filterInput).type("protocol=TCP" + '{enter}').click() - cy.get('[data-test-id=edge-handler]').each((g) => { + cy.byLegacyTestID('edge-handler').each((g) => { expect(g.text()).to.match(/\d+\s*ms/); }); netflowPage.clearAllFilters() @@ -67,17 +67,17 @@ describe('(OCP-68246 Network_Observability) FlowRTT test', { tags: ['Network_Obs netflowPage.resetClearFilters() }) - it("(OCP-68246, aramesha, Network_Observability) Validate flowRTT dashboards", function () { + it("(OCP-68246, aramesha) Validate flowRTT dashboards", function () { // navigate to 'NetObserv / Main' Dashboard page dashboard.visit() dashboard.visitDashboard("netobserv-main") // verify 'TCP latency,p99' panel - cy.get('[data-test="tcp-latency,-p99-chart"]').find(graphSelector.graphBody).should('not.have.class', 'graph-empty-state') + cy.checkDashboards(['tcp-latency,-p99-chart']) cy.checkDashboards(flowRTTPanels) }) - after("Delete flowcollector", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/flow_dashboards_bytes.cy.ts b/web/cypress/integration-tests/flow_dashboards_bytes.cy.ts index 5722b6d9b..7139bd344 100644 --- a/web/cypress/integration-tests/flow_dashboards_bytes.cy.ts +++ b/web/cypress/integration-tests/flow_dashboards_bytes.cy.ts @@ -29,7 +29,7 @@ describe('Network_Observability flow dashboards tests', { tags: ['Network_Observ Operator.createFlowcollector("BytesMetrics") }) - it("(OCP-63790, memodi, Network_Observability), should have flow dashboards for bytes metrics", function () { + it("(OCP-63790, memodi), should have flow dashboards for bytes metrics", function () { // navigate to 'NetObserv / Main' Dashboard page dashboard.visit() dashboard.visitDashboard("netobserv-main") @@ -48,7 +48,7 @@ describe('Network_Observability flow dashboards tests', { tags: ['Network_Observ cy.checkDashboards(trafficRatesPanelsBottom) }) - after("delete flowcollector and NetObs Operator", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/flow_dashboards_packets.cy.ts b/web/cypress/integration-tests/flow_dashboards_packets.cy.ts index 9483672ca..33608bda6 100644 --- a/web/cypress/integration-tests/flow_dashboards_packets.cy.ts +++ b/web/cypress/integration-tests/flow_dashboards_packets.cy.ts @@ -29,7 +29,7 @@ describe('Network_Observability flow dashboards tests', { tags: ['Network_Observ Operator.createFlowcollector("PacketsMetrics") }) - it("(OCP-63790, memodi, Network_Observability), should have flow dashboards for packets metrics", function () { + it("(OCP-63790, memodi), should have flow dashboards for packets metrics", function () { // navigate to 'NetObserv / Main' Dashboard page dashboard.visit() dashboard.visitDashboard("netobserv-main") @@ -48,7 +48,7 @@ describe('Network_Observability flow dashboards tests', { tags: ['Network_Observ cy.checkDashboards(trafficRatesPanelsBottom) }) - after("delete flowcollector and NetObs Operator", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/gateway_topology_logo.cy.ts b/web/cypress/integration-tests/gateway_topology_logo.cy.ts index aa3a28a98..4d08f0bfb 100644 --- a/web/cypress/integration-tests/gateway_topology_logo.cy.ts +++ b/web/cypress/integration-tests/gateway_topology_logo.cy.ts @@ -1,57 +1,74 @@ -import { netflowPage, setupTopologyViewWithNamespaceFilter, topologyPage, topologySelectors } from "@views/netflow-page" +import { netflowPage, topologyPage, topologySelectors } from "@views/netflow-page" import { Operator } from "@views/netobserv" import { verifyResourceSVGLogo } from "@views/netobserv-logo" +import { catalogSources } from "@views/catalog-source" + +const gatewayNS = 'netobserv-gateway-test' +const gatewayName = 'test-gateway-owner' + +describe("(OCP-87215) Gateway API owner metadata", { tags: ['Network_Observability'] }, function () { + let skipTest = false -describe("(OCP-87215, Network_Observability) Verify Gateway API three-level owner metadata UI Test\t", function () { - const gatewayNS = 'netobserv-gateway-test' - const gatewayName = 'test-gateway-owner' before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) cy.uiLogin(Cypress.env('LOGIN_IDP'), Cypress.env('LOGIN_USERNAME'), Cypress.env('LOGIN_PASSWORD')) - Operator.install() - cy.checkStorageClass(this) - Operator.createFlowcollector("FlowRTT") + // Gateway test is only supported from OCP 4.19 onwards + catalogSources.getOCPVersion() + cy.get('@VERSION').then((version) => { + const ocpVersion = parseFloat(String(version)) + if (ocpVersion < 4.19) { + cy.log(`Skipping Gateway test - OCP version ${version} is less than 4.19`) + skipTest = true + this.skip() + } + }).then(() => { + // Only run setup if test is not being skipped + if (!skipTest) { + Operator.install() + cy.checkStorageClass(this) + Operator.createFlowcollector("FlowRTT") + + cy.adminCLI('oc apply -f cypress/fixtures/gateway-api.yaml') + + // Wait for pods to be created + cy.wait(10000) - // Deploy all Gateway API resources from combined template (includes namespace creation and traffic generator) - cy.adminCLI(`oc process -f cypress/fixtures/gateway-api-template.yaml \ - | oc apply -f -`) + // Wait for pods to be ready + cy.adminCLI('oc wait --for=condition=Ready pod -l app=traffic-generator -n netobserv-gateway-test --timeout=120s') + cy.adminCLI('oc wait --for=condition=Ready pod -l app=echo-server -n netobserv-gateway-test --timeout=120s') + } + }) }) beforeEach("navigate to topology view", function () { - setupTopologyViewWithNamespaceFilter(gatewayNS) + topologyPage.setupWithNamespaceFilter(gatewayNS) }) - it("(OCP-87215, kapjain, Network_Observability) should verify Gateway appears as owner-level topology node with logo", function () { - - topologyPage.selectScopeGroup("owner", null) + it("(OCP-87215, kapjain) Gateway owner logo", function () { + topologyPage.selectScopeGroup("owner") topologyPage.isViewRendered() - // Verify topology is rendered - cy.get('[data-surface="true"]').should('exist') - - // Verify nodes exist in the topology - cy.get(topologySelectors.node, { timeout: 60000 }).should('have.length.greaterThan', 0) + cy.get(topologySelectors.node, { timeout: 80000 }).should('have.length.greaterThan', 0) - // Search for Gateway in topology cy.byTestID('search-topology-element-input').should('exist').clear().type(gatewayName) - // Verify Gateway node exists and is visible - cy.get(`g[data-id*="o=Gateway.${gatewayName}"]`, { timeout: 90000 }).should('exist') - - // Validate Gateway SVG icon/logo dynamically - verifyResourceSVGLogo('Gateway', gatewayName, 60000) + verifyResourceSVGLogo('Gateway', gatewayName) }) afterEach("test", function () { netflowPage.clearAllFilters() }) - after("cleanup Gateway resources", function () { - // Delete traffic generator deployment - cy.adminCLI(`oc process -f cypress/fixtures/gateway-api-template.yaml \ - | oc delete -f -`, { failOnNonZeroExit: false }) - // Remove cluster admin role + after("all tests", function () { + if (skipTest) { + cy.log('Skipping cleanup - test was not run') + cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) + return + } + + cy.adminCLI('oc delete -f cypress/fixtures/gateway-api.yaml --ignore-not-found') + Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/health_dashboards.cy.ts b/web/cypress/integration-tests/health_dashboards.cy.ts index d8a304f9d..7b57c9630 100644 --- a/web/cypress/integration-tests/health_dashboards.cy.ts +++ b/web/cypress/integration-tests/health_dashboards.cy.ts @@ -49,7 +49,7 @@ describe('Network_Observability health dashboards tests', { tags: ['Network_Obse Operator.createFlowcollector("BytesMetrics") }) - it('(OCP-61893, memodi, Network_Observability), should have health dashboards', function () { + it('(OCP-61893, memodi), should have health dashboards', function () { // navigate to 'NetObserv / Health' Dashboard page // all health panels are visible with default metrics dashboard.visit() @@ -84,7 +84,7 @@ describe('Network_Observability health dashboards tests', { tags: ['Network_Obse cy.checkDashboards(resourcePanels) }) - after("delete flowcollector and NetObs Operator", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/ingress_dashboard.cy.ts b/web/cypress/integration-tests/ingress_dashboard.cy.ts index ee9549a9d..0e1f3bb16 100644 --- a/web/cypress/integration-tests/ingress_dashboard.cy.ts +++ b/web/cypress/integration-tests/ingress_dashboard.cy.ts @@ -22,26 +22,10 @@ describe('Network_Observability networking dashboards tests', { tags: ['Network_ // navigate to 'Networking / Ingress' Dashboard page dashboard.visit() - cy.visit(`/monitoring/dashboards/grafana-dashboard-ingress-operator`) - - cy.get('[data-test="poll-interval-dropdown"] > .pf-v6-c-menu-toggle').should('exist').then(btn => { - cy.wrap(btn).click().then(drop => { - cy.contains('15 seconds').should('exist').click() - }) - }) - - cy.get('[data-test="time-range-dropdown"]').should('exist').then(btn => { - cy.wrap(btn).click().then(drop => { - cy.contains('Last 5 minutes').should('exist').click() - }) - }) - - cy.wait(1000) - cy.get('#content-scrollable').scrollTo('bottom') - cy.wait(1000) + dashboard.visitDashboard("grafana-dashboard-ingress-operator") }) - it('(OCP-69946, aramesha, Network_Observability), should have ingress operator dashboards', function () { + it('(OCP-69946, aramesha), should have ingress operator dashboards', function () { // verify that 'Current Total Incoming Bandwidth', 'Current Total Outgoing Bandwidth', 'HTTP Error Rate' and 'HTTP Server Average Response Latency' panels exist and are populated cy.checkDashboards(ingressPanels) diff --git a/web/cypress/integration-tests/netflow_cluster_admin_group.cy.ts b/web/cypress/integration-tests/netflow_cluster_admin_group.cy.ts index 483a5491c..a7e714c3b 100644 --- a/web/cypress/integration-tests/netflow_cluster_admin_group.cy.ts +++ b/web/cypress/integration-tests/netflow_cluster_admin_group.cy.ts @@ -1,7 +1,7 @@ import { netflowPage } from "@views/netflow-page" import { Operator } from "@views/netobserv" -describe.skip('(OCP-67617 Network_Observability) User in group with cluster-admin role', { tags: ['Network_Observability'] }, function () { +describe.skip('(OCP-67617) User in group with cluster-admin role', { tags: ['Network_Observability'] }, function () { before('any test', function () { // create new group, add user to that group and give that group cluster-admin role @@ -15,13 +15,13 @@ describe.skip('(OCP-67617 Network_Observability) User in group with cluster-admi Operator.createFlowcollector() }) - it("(OCP-67617, aramesha, Network_Observability) should verify user in group with cluster-admin role is able to access flows", function () { + it("(OCP-67617, aramesha) should verify user in group with cluster-admin role is able to access flows", function () { // validate netflow traffic page netflowPage.visit() cy.checkNetflowTraffic() }) - it("(OCP-67617, aramesha, Network_Observability) should verify user NOT in group with cluster-admin role is NOT able to access flows", function () { + it("(OCP-67617, aramesha) should verify user NOT in group with cluster-admin role is NOT able to access flows", function () { // remove user from cluster-admin group cy.adminCLI(`oc adm policy remove-cluster-role-from-group cluster-admin netobservadmins`) cy.visit('/netflow-traffic') diff --git a/web/cypress/integration-tests/netflow_conversations.cy.ts b/web/cypress/integration-tests/netflow_conversations.cy.ts index d09cd067d..6bf5b421d 100644 --- a/web/cypress/integration-tests/netflow_conversations.cy.ts +++ b/web/cypress/integration-tests/netflow_conversations.cy.ts @@ -1,7 +1,7 @@ import { Operator } from "@views/netobserv" import { netflowPage, colSelectors, querySumSelectors } from "@views/netflow-page" -describe('(OCP-71787 Network_Observability) Conversation tracking test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-71787) Conversation tracking test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -14,18 +14,18 @@ describe('(OCP-71787 Network_Observability) Conversation tracking test', { tags: beforeEach('any conversation tracking test', function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(2)').click() + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') }) - it("(OCP-71787, aramesha, Network_Observability) should validate default conversation tracking columns", function () { + it("(OCP-71787, aramesha) should validate default conversation tracking columns", function () { cy.byTestID('table-composable').should('exist').within(() => { cy.get(colSelectors.recordType).should('exist') cy.get(colSelectors.conversationID).should('exist') }) }) - it("(OCP-71787, aramesha, Network_Observability) should verify Query Summary panel", function () { + it("(OCP-71787, aramesha) should verify Query Summary panel", function () { cy.changeQueryOption('Conversation') // validate Query Summary panel @@ -37,13 +37,8 @@ describe('(OCP-71787 Network_Observability) Conversation tracking test', { tags: }) cy.get(querySumSelectors.flowsCount).should('exist').then(ConversationsCnt => { - let nflows = 0 - if (warningExists) { - nflows = Number(ConversationsCnt.text().split('+ Ended conversations')[0]) - } - else { - nflows = Number(ConversationsCnt.text().split(' ')[0]) - } + // parseFloat handles formats: "123 Ended conversations", "123+ Ended conversations" + const nflows = parseFloat(ConversationsCnt.text()) cy.wait(10) expect(nflows).to.be.gte(0) }) @@ -53,7 +48,7 @@ describe('(OCP-71787 Network_Observability) Conversation tracking test', { tags: netflowPage.resetClearFilters() }) - after("delete flowcollector and NetObs Operator", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/netflow_developer_view.cy.ts b/web/cypress/integration-tests/netflow_developer_view.cy.ts index 3898fe734..dec408ca6 100644 --- a/web/cypress/integration-tests/netflow_developer_view.cy.ts +++ b/web/cypress/integration-tests/netflow_developer_view.cy.ts @@ -24,13 +24,13 @@ describe.skip('NetObserv developer view', { tags: ['Network_Observability'] }, f Operator.createFlowcollector() }) - it("(OCP-75874, aramesha, Network_Observability) should verify developer view - Loki DataSource", function () { + it("(OCP-75874, aramesha) should verify developer view - Loki DataSource", function () { // verify Netflow traffic tab netflowPage.visit() cy.checkNetflowTraffic() }) - it("(OCP-75874, OCP-73876 aramesha, Network_Observability) should verify developer view - Prom DataSource", function () { + it("(OCP-75874, OCP-73876 aramesha) should verify developer view - Prom DataSource", function () { // Deploy flowcollector with Loki disabled Operator.createFlowcollector("LokiDisabled") @@ -40,11 +40,11 @@ describe.skip('NetObserv developer view', { tags: ['Network_Observability'] }, f // Deploy client server manifests logged in as user2 cy.cliLogin(`${user2}`, `${user2Passwd}`) - cy.exec(`oc create -f cypress/fixtures/testuser-server-client.yaml`) + cy.adminCLI(`oc create -f cypress/fixtures/testuser-server-client.yaml`) // Logout from console as user1 and login as user2 cy.uiLogout().then(() => { - cy.visit(Cypress.config('baseUrl')) + cy.visit(Cypress.config('baseUrl') || '/') }) cy.uiLogin(Cypress.env('LOGIN_IDP'), user2, user2Passwd) @@ -57,7 +57,7 @@ describe.skip('NetObserv developer view', { tags: ['Network_Observability'] }, f // Logout from console as user2 and login as user3 cy.uiLogout().then(() => { - cy.visit(Cypress.config('baseUrl')) + cy.visit(Cypress.config('baseUrl') || '/') }) cy.uiLogin(Cypress.env('LOGIN_IDP'), user3, user3Passwd) @@ -69,7 +69,7 @@ describe.skip('NetObserv developer view', { tags: ['Network_Observability'] }, f cy.adminCLI(`oc adm policy remove-cluster-role-from-user netobserv-metrics-reader ${user3}`) }) - after("after all tests are done", function () { + after("all tests", function () { cy.adminCLI(`oc login -u system:admin`) cy.adminCLI(`oc delete flowcollector cluster`) cy.adminCLI(`oc delete project test-server --ignore-not-found`) diff --git a/web/cypress/integration-tests/netflow_export.cy.ts b/web/cypress/integration-tests/netflow_export.cy.ts index 923a8e554..d5d4f0ea3 100644 --- a/web/cypress/integration-tests/netflow_export.cy.ts +++ b/web/cypress/integration-tests/netflow_export.cy.ts @@ -1,7 +1,7 @@ import { Operator, project } from "@views/netobserv" import { netflowPage } from "@views/netflow-page" -describe('(OCP-72610 Network_Observability) Export automation', { tags: ['Network_Observability'] }, function () { +describe('(OCP-72610) Export automation', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -16,7 +16,7 @@ describe('(OCP-72610 Network_Observability) Export automation', { tags: ['Networ netflowPage.visit() }) - it("(OCP-72610, aramesha, Network_Observability) should validate exporting panels", function () { + it("(OCP-72610, aramesha) should validate exporting panels", function () { // Export all overview panels cy.get('li.overviewTabButton').should('exist').click() netflowPage.stopAutoRefresh() @@ -25,38 +25,36 @@ describe('(OCP-72610 Network_Observability) Export automation', { tags: ['Networ cy.readFile('cypress/downloads/overview_page.png') // Export only Top 5 average bytes rates panel - cy.get('#panel-kebab-top_avg_byte_rates-container > .pf-v5-c-menu-toggle').should('exist').click() + cy.get('#panel-kebab-top_avg_byte_rates-container button').should('exist').click() cy.contains("Export panel").should('exist').click() cy.readFile('cypress/downloads/overview_panel_top_avg_byte_rates.png') cy.exec('rm cypress/downloads/overview_page.png') cy.exec('rm cypress/downloads/overview_panel_top_avg_byte_rates.png') }) - it("(OCP-72610, aramesha, Network_Observability) should validate exporting table view", function () { - cy.get('li.tableTabButton').should('exist').click() + it("(OCP-72610, aramesha) should validate exporting table view", function () { + cy.get('#tabs-container').contains('Traffic flows').click() netflowPage.stopAutoRefresh() netflowPage.selectSourceNS(project) cy.byTestID("table-composable").should('exist') cy.showAdvancedOptions(); cy.get('#export-button').should('exist').click() - cy.get('[data-test="export-modal-footer"] > [data-test="export-button"]').should('exist').then((exportbtn) => { - cy.wrap(exportbtn).click() - // wait for download to complete - cy.wait(3000) - // get the CSV file name - cy.exec("ls cypress/downloads").then((response) => { - // rename CSV file to export_table.csv - cy.wrap(response.stdout).should('not.be.empty') - cy.exec(`mv cypress/downloads/${response.stdout} cypress/downloads/export_table.csv`) - cy.readFile('cypress/downloads/export_table.csv') - }) - cy.exec('rm cypress/downloads/export_table.csv') + cy.byTestID('export-modal-header').should('be.visible') + cy.get('[data-test="export-modal-footer"] > [data-test="export-button"]').click() + // Wait for the CSV download to complete and validate exactly one CSV exists + cy.exec("ls cypress/downloads", { timeout: 15000 }).then((response) => { + const files = response.stdout.trim().split('\n').filter(f => f.endsWith('.csv')) + expect(files).to.have.length(1, 'Expected exactly one CSV file in downloads') + const csvFile = files[0] + cy.exec(`mv "cypress/downloads/${csvFile}" "cypress/downloads/export_table.csv"`) + cy.readFile('cypress/downloads/export_table.csv', { timeout: 10000 }) }) + cy.exec('rm cypress/downloads/export_table.csv') netflowPage.clearAllFilters() }) - it("(OCP-72610, aramesha, Network_Observability) should validate exporting topology view", function () { - cy.get('li.topologyTabButton').should('exist').click() + it("(OCP-72610, aramesha) should validate exporting topology view", function () { + cy.get('#tabs-container').contains('Topology').click() netflowPage.selectSourceNS(project) netflowPage.stopAutoRefresh() cy.get('#drawer').should('not.be.empty') diff --git a/web/cypress/integration-tests/netflow_external_subnet.cy.ts b/web/cypress/integration-tests/netflow_external_subnet.cy.ts index 9a18d2bef..df2eb1689 100644 --- a/web/cypress/integration-tests/netflow_external_subnet.cy.ts +++ b/web/cypress/integration-tests/netflow_external_subnet.cy.ts @@ -1,7 +1,7 @@ import { colSelectors, filterSelectors, netflowPage } from "@views/netflow-page" import { Operator } from "@views/netobserv" -describe('(OCP-67615, OCP-72874 Network_Observability) Return external traffic and custom subnet labels test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-67615, OCP-72874) Return external traffic and custom subnet labels test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -15,9 +15,9 @@ describe('(OCP-67615, OCP-72874 Network_Observability) Return external traffic a cy.adminCLI('oc create -f cypress/fixtures/test-pod.yaml') }) - it("(OCP-67615, aramesha, Network_Observability) External traffic and custom subnet label", function () { + it("(OCP-67615, aramesha) External traffic and custom subnet label", function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(2)').click() + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') // enable SrcSubnetLabel and DstSubnetLabel columns diff --git a/web/cypress/integration-tests/netflow_table.cy.ts b/web/cypress/integration-tests/netflow_table.cy.ts index d513b59ee..b5343df78 100644 --- a/web/cypress/integration-tests/netflow_table.cy.ts +++ b/web/cypress/integration-tests/netflow_table.cy.ts @@ -1,7 +1,7 @@ import { colSelectors, filterSelectors, genSelectors, histogramSelectors, netflowPage } from "@views/netflow-page" import { Operator, project } from "@views/netobserv" -describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Netflow Table view tests', { tags: ['Network_Observability'] }, function () { +describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408) Netflow Table view tests', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -14,11 +14,11 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net beforeEach("test", function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(2)').click() + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') }) - it("(OCP-50532, memodi, Network_Observability) should validate netflow table features", { tags: ['@netobserv-critical'] }, function () { + it("(OCP-50532, memodi) should validate netflow table features", { tags: ['@netobserv-critical'] }, function () { cy.byTestID(genSelectors.timeDrop).then(btn => { expect(btn).to.exist cy.wrap(btn).click().then(drop => { @@ -53,7 +53,7 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net cy.byTestID("show-view-options-button").should('exist').click() }) - it("(OCP-50532, memodi, Network_Observability) should validate columns", { tags: ['e2e', 'admin'] }, function () { + it("(OCP-50532, memodi) should validate columns", { tags: ['e2e', 'admin'] }, function () { netflowPage.stopAutoRefresh() cy.openColumnsModal().then(col => { cy.get(colSelectors.columnsModal).should('be.visible') @@ -101,7 +101,7 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net }) }) - it("(OCP-50532, memodi, Network_Observability) should validate filters", { tags: ['@netobserv-critical'] }, function () { + it("(OCP-50532, memodi) should validate filters", { tags: ['@netobserv-critical'] }, function () { netflowPage.stopAutoRefresh() // verify Source namespace filter @@ -124,7 +124,10 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net netflowPage.clearAllFilters() // verify NOT filter - cy.get(filterSelectors.filterDropdown).click().get('.pf-v5-c-panel__main-body').should('be.visible') + // Clear any text in filter input to ensure FilterSearchPanel (not suggestions) is shown + cy.get(filterSelectors.filterInput).clear() + cy.get(filterSelectors.filterDropdown).click() + cy.get('#filter-popper').should('be.visible') cy.get(filterSelectors.sourceRadio).should('exist').click() cy.get(filterSelectors.columnFilter).should('exist').click().get('#namespace').should('exist').click() cy.get(filterSelectors.compareDropdown).should('exist').click().get('#not-equal').should('exist').click() @@ -136,17 +139,17 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net // verify src port filter and port Naming cy.get(filterSelectors.filterInput).type("src_port=3100" + '{enter}') - cy.get('#src_port-0-toggle > span.pf-v5-c-menu-toggle__text').should('contain.text', 'loki') + cy.get('#src_port-0-toggle').should('contain.text', 'loki') // disable filter cy.get('#src_port-0-toggle').click().get('#dropdown-item-disable').click() // sort by port - cy.get('[data-test=th-SrcPort] > .pf-v5-c-table__button').click() + cy.get('[data-test=th-SrcPort] button').click() // Verify SrcPort doesnt not have text loki for all rows cy.get('[data-test-td-column-id=SrcPort]').each((td) => { - cy.get('[data-test-td-column-id=SrcPort] > div > div > p').should('not.contain.text', 'loki (3100)') + cy.wrap(td).should('not.contain.text', 'loki (3100)') }) // enable filter @@ -154,14 +157,14 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net // Verify SrcPort has text loki for all rows cy.get('[data-test-td-column-id=SrcPort]').each((td) => { - cy.get('[data-test-td-column-id=SrcPort] > div > div > p').should('contain.text', 'loki (3100)') + cy.wrap(td).should('contain.text', 'loki (3100)') }) netflowPage.clearAllFilters() cy.get('#filters').should('not.exist') }) - it("(OCP-50531, memodi, Network_Observability) should validate localstorage for plugin", { tags: ['e2e', 'admin'] }, function () { + it("(OCP-50531, memodi) should validate localstorage for plugin", { tags: ['e2e', 'admin'] }, function () { // select compact column size cy.byTestID("show-view-options-button").should('exist').click().then(views => { cy.contains('Display options').should('exist').click() @@ -179,19 +182,19 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net cy.visit('/netflow-traffic') cy.get('#pageHeader').should('exist').then(() => { - const settings = JSON.parse(localStorage.getItem('netobserv-plugin-settings')) + const settings = JSON.parse(localStorage.getItem('netobserv-plugin-settings') as string) expect(settings['netflow-traffic-refresh']).to.be.equal(15000) expect(settings['netflow-traffic-size-size']).to.be.equal('s') expect(settings['netflow-traffic-columns']).to.include('StartTime') }) }) - it("(OCP-59408, memodi, Network_Observability) should verify histogram", function () { + it("(OCP-59408, memodi) should verify histogram", function () { cy.get('#time-range-dropdown-dropdown').should('exist').click().byTestID("5m").should('exist').click() cy.byTestID("show-histogram-button").should('exist').click() cy.get('#popover-netobserv-tour-popover-body').should('exist') // close tour - cy.get("#popover-netobserv-tour-popover-header > h6 > div > div:nth-child(2) > button").should("exist").click() + cy.get(".guided-tour-close-button").should("exist").click() cy.byTestID(genSelectors.refreshDrop).should('be.disabled') // get current refreshed time let lastRefresh = Cypress.$("#lastRefresh").text() diff --git a/web/cypress/integration-tests/netflow_zone_multiCluster.cy.ts b/web/cypress/integration-tests/netflow_zone_multiCluster.cy.ts index c42b876c5..59a1ee6b7 100644 --- a/web/cypress/integration-tests/netflow_zone_multiCluster.cy.ts +++ b/web/cypress/integration-tests/netflow_zone_multiCluster.cy.ts @@ -1,10 +1,6 @@ -import { colSelectors, netflowPage, setupTopologyViewWithNamespaceFilter, topologyPage, topologySelectors } from "@views/netflow-page" +import { colSelectors, netflowPage, topologyPage, topologySelectors } from "@views/netflow-page" import { Operator } from "@views/netobserv" -function getTopologyScopeURL(scope: string): string { - return `**/flow/metrics**aggregateBy=${scope}*` -} - describe('Netflow Zone and multiCluster test', { tags: ['Network_Observability'] }, function () { before('any test', function () { @@ -20,8 +16,8 @@ describe('Netflow Zone and multiCluster test', { tags: ['Network_Observability'] netflowPage.visit() }) - it("(OCP-71525, aramesha, Network_Observability) should validate zone/multiCluster columns", function () { - cy.get('#tabs-container li:nth-child(2)').click() + it("(OCP-71525, aramesha) should validate zone/multiCluster columns", function () { + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') cy.openColumnsModal().then(col => { @@ -45,17 +41,17 @@ describe('Netflow Zone and multiCluster test', { tags: ['Network_Observability'] }) }) - it("(OCP-71524, aramesha, Network_Observability) should verify zone/cluster scope topology", function () { - setupTopologyViewWithNamespaceFilter() + it("(OCP-71524, aramesha) should verify zone/cluster scope topology", function () { + topologyPage.setupWithNamespaceFilter() // Verify Zone scope var scope = "zone" - cy.intercept('GET', getTopologyScopeURL(scope), { + cy.intercept('GET', topologyPage.getScopeURL(scope), { fixture: 'flowmetrics/zone.json' }).as('matchedUrl') - topologyPage.selectScopeGroup(scope, null) + topologyPage.selectScopeGroup(scope) cy.wait('@matchedUrl').then(({ response }) => { - expect(response.statusCode).to.eq(200) + expect(response?.statusCode).to.eq(200) }) topologyPage.isViewRendered() @@ -65,13 +61,13 @@ describe('Netflow Zone and multiCluster test', { tags: ['Network_Observability'] // Verify Cluster scope scope = "cluster" - cy.intercept('GET', getTopologyScopeURL(scope), { + cy.intercept('GET', topologyPage.getScopeURL(scope), { fixture: 'flowmetrics/cluster.json' }).as('matchedUrl') - topologyPage.selectScopeGroup(scope, null) + topologyPage.selectScopeGroup(scope) cy.wait('@matchedUrl').then(({ response }) => { - expect(response.statusCode).to.eq(200) + expect(response?.statusCode).to.eq(200) }) topologyPage.isViewRendered() @@ -84,7 +80,7 @@ describe('Netflow Zone and multiCluster test', { tags: ['Network_Observability'] netflowPage.resetClearFilters() }) - after("delete flowcollector and NetObs Operator", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/netobserv_udn.cy.ts b/web/cypress/integration-tests/netobserv_udn.cy.ts index 3d9cc3ab7..d3ef9012a 100644 --- a/web/cypress/integration-tests/netobserv_udn.cy.ts +++ b/web/cypress/integration-tests/netobserv_udn.cy.ts @@ -1,17 +1,34 @@ -import { colSelectors, filterSelectors, netflowPage, setupTopologyViewWithNamespaceFilter, topologyPage, topologySelectors } from "@views/netflow-page" +import { colSelectors, filterSelectors, netflowPage, topologyPage, topologySelectors } from "@views/netflow-page" import { Operator } from "@views/netobserv" -describe('(OCP-81751 Network_Observability) UDN test', { tags: ['Network_Observability'] }, function () { +import { catalogSources } from "@views/catalog-source" + +describe('(OCP-81751) UDN test', { tags: ['Network_Observability'] }, function () { + let skipTest = false before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) cy.uiLogin(Cypress.env('LOGIN_IDP'), Cypress.env('LOGIN_USERNAME'), Cypress.env('LOGIN_PASSWORD')) - Operator.install() - cy.checkStorageClass(this) - Operator.createFlowcollector("UDNMapping") + // UDN is only supported from OCP 4.18 onwards + catalogSources.getOCPVersion() + cy.get('@VERSION').then((version) => { + const ocpVersion = parseFloat(String(version)) + if (ocpVersion < 4.18) { + cy.log(`Skipping UDN test - OCP version ${version} is less than 4.18`) + skipTest = true + this.skip() + } + }).then(() => { + // Only run setup if test is not being skipped + if (!skipTest) { + Operator.install() + cy.checkStorageClass(this) + Operator.createFlowcollector("UDNMapping") - // deploy UDN and CUDN - cy.adminCLI('oc create -f cypress/fixtures/test-udn.yaml') + // deploy UDN and CUDN + cy.adminCLI('oc apply -f cypress/fixtures/test-udn.yaml') + } + }) }) beforeEach('any UDN test', function () { @@ -19,7 +36,7 @@ describe('(OCP-81751 Network_Observability) UDN test', { tags: ['Network_Observa }) it("(OCP-81751, aramesha) should verify default Network Name columns", function () { - cy.get('#tabs-container li:nth-child(2)').click() + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') netflowPage.stopAutoRefresh() @@ -31,10 +48,10 @@ describe('(OCP-81751 Network_Observability) UDN test', { tags: ['Network_Observa }) it("(OCP-81751, aramesha) should verify network scope", function () { - setupTopologyViewWithNamespaceFilter() + topologyPage.setupWithNamespaceFilter() const scope = 'network' - topologyPage.selectScopeGroup(scope, null) + topologyPage.selectScopeGroup(scope) topologyPage.isViewRendered() // Filter on empty CUDN @@ -56,7 +73,13 @@ describe('(OCP-81751 Network_Observability) UDN test', { tags: ['Network_Observa }) after("all tests", function () { - cy.adminCLI('oc delete -f cypress/fixtures/test-udn.yaml') + if (skipTest) { + cy.log('Skipping cleanup - test was not run') + cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) + return + } + + cy.adminCLI('oc delete -f cypress/fixtures/test-udn.yaml --ignore-not-found') Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/network_health.cy.ts b/web/cypress/integration-tests/network_health.cy.ts index af990448c..cbab9441e 100644 --- a/web/cypress/integration-tests/network_health.cy.ts +++ b/web/cypress/integration-tests/network_health.cy.ts @@ -4,7 +4,7 @@ import { networkHealth, networkHealthSelectors } from "@views/network-health" const alertServerity = ["Info", "Warning", "Critical"] -describe('(OCP-84821 Network_Observability) Network Health test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-84821) Network Health test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -21,10 +21,10 @@ describe('(OCP-84821 Network_Observability) Network Health test', { tags: ['Netw }) - it("(OCP-84821, memodi, Network_Observability) Verify Network Health Alerts", function () { + it("(OCP-84821, memodi) Verify Network Health Alerts", function () { cy.visit('/monitoring/alertrules') - cy.get('#alert-rules-table-scroll').should('exist') - cy.byTestID('console-select-menu-toggle').should('exist') + cy.get('[data-test="loading-indicator"]', { timeout: 30000 }).should('not.exist') + cy.byTestID('name-filter-input').type('DNSNxDomain_PerDst' + '{enter}') const variants = ["Namespace", "Workload"] variants.forEach(variant => { alertServerity.forEach(severity => { @@ -39,48 +39,42 @@ describe('(OCP-84821 Network_Observability) Network Health test', { tags: ['Netw cy.get(networkHealthSelectors.namespace).should('exist') cy.get(networkHealthSelectors.workload).should('exist') - // wait 1min for alert to show up + // wait a min for alert to show up cy.wait(60000) - cy.get(networkHealthSelectors.namespace).should('exist').click().then(() => { - networkHealth.verifyAlert("dns-traffic") - }) + cy.get(networkHealthSelectors.namespace).should('exist').click() + networkHealth.verifyAlert("dns-traffic") networkHealth.navigateToAlertPage("dns-traffic") - // verify Runbooks on the inspect alert page. - cy.get('div .pf-m-link').eq(1).should('have.attr', 'href').and('include', 'https'); }) - it("(OCP-84821, memodi, Network_Observability) Verify RecordingRules", function () { + it("(OCP-84821, memodi) Verify RecordingRules", function () { cy.visit('/network-health') cy.get(networkHealthSelectors.node).should('exist').click() networkHealth.verifyAlert("ip", "recording", "Too many DNS NX_DOMAIN errors") }) - it("(OCP-84821, memodi, Network_Observability) Verify Health Topology Integration", function () { + it("(OCP-84821, memodi) Verify Health Topology Integration", function () { cy.visit('/network-health') cy.get(networkHealthSelectors.namespace).should('exist').click() networkHealth.clickOnAlert("dns-traffic") cy.get(networkHealthSelectors.sidePanel).should('be.visible') - // click the kebab button - cy.get('div.rule-details-row:nth-child(1) button').click().then(() => { - cy.get('button[role="menuitem"]').eq(2).click().then(() => { + cy.get('div.rule-details-row').first().find('button').click().then(() => { + cy.contains('Inspect network traffic').click().then(() => { cy.checkNetflowTraffic() - // select Owner group topologyPage.selectGroupWithSlider("Owner") topologyPage.selectGroupWithSlider("Namespace") - // click on the NS and check Health tab in sidebar. cy.get('g[data-kind="node"] > g').eq(1).parent().should('exist').click() cy.get('#elementPanel').should('be.visible') - cy.get('#drawer-tabs > ul > li:nth-child(3)').should('exist').click() + cy.get('#drawer-tabs').contains('Health').should('exist').click() cy.get('div .rule-details-row').should('exist') }) }) }) - after("any test", function () { + after("all tests", function () { cy.adminCLI('oc delete -f cypress/fixtures/dns_errors.yaml --ignore-not-found') Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) diff --git a/web/cypress/integration-tests/overview_page.cy.ts b/web/cypress/integration-tests/overview_page.cy.ts index 933811db0..08e5530b0 100644 --- a/web/cypress/integration-tests/overview_page.cy.ts +++ b/web/cypress/integration-tests/overview_page.cy.ts @@ -1,7 +1,7 @@ import { genSelectors, netflowPage, overviewSelectors, querySumSelectors } from "@views/netflow-page" import { Operator } from "@views/netobserv" -describe('(OCP-54839 Network_Observability) Netflow Overview page tests', { tags: ['Network_Observability'] }, function () { +describe('(OCP-54839) Netflow Overview page tests', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -21,7 +21,7 @@ describe('(OCP-54839 Network_Observability) Netflow Overview page tests', { tags cy.checkPanelsNum(); }) - it("(OCP-54839, aramesha, Network_Observability) should validate overview page features", { tags: ['@netobserv-critical'] }, function () { + it("(OCP-54839, aramesha) should validate overview page features", { tags: ['@netobserv-critical'] }, function () { cy.byTestID(genSelectors.timeDrop).then(btn => { expect(btn).to.exist cy.wrap(btn).click().then(drop => { @@ -67,7 +67,7 @@ describe('(OCP-54839 Network_Observability) Netflow Overview page tests', { tags }) }) - it("(OCP-54839, aramesha, Network_Observability) should validate query summary panel", function () { + it("(OCP-54839, aramesha) should validate query summary panel", function () { cy.get(querySumSelectors.bytesCount).should('exist').then(bytesCnt => { cy.checkQuerySummary(bytesCnt) }) @@ -83,7 +83,7 @@ describe('(OCP-54839 Network_Observability) Netflow Overview page tests', { tags cy.contains('Sampling').should('exist') }) - it("(OCP-54839, aramesha, Network_Observability) should validate panels", { tags: ['@netobserv-critical'] }, function () { + it("(OCP-54839, aramesha) should validate panels", { tags: ['@netobserv-critical'] }, function () { cy.showAdvancedOptions().then(views => { cy.contains('Display options').should('exist').click() @@ -126,7 +126,7 @@ describe('(OCP-54839 Network_Observability) Netflow Overview page tests', { tags cy.get(overviewSelectors.panelsModal).contains('Save').should('be.disabled'); // select 1 panel and verify its visible on console - cy.get('.pf-v5-c-data-list__check > #top_avg_packet_rates').click(); + cy.get('[data-test="overview-panel-management"]').find('#top_avg_packet_rates').check(); cy.get(overviewSelectors.panelsModal).contains('Save').click(); netflowPage.waitForLokiQuery() cy.checkPanel([overviewSelectors.allPanels[2]]) @@ -145,7 +145,7 @@ describe('(OCP-54839 Network_Observability) Netflow Overview page tests', { tags netflowPage.resetClearFilters() }) - after("after all tests are done", function () { + after("all tests", function () { cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/ovn_dashboard.cy.ts b/web/cypress/integration-tests/ovn_dashboard.cy.ts index 99d6c322c..185440e2f 100644 --- a/web/cypress/integration-tests/ovn_dashboard.cy.ts +++ b/web/cypress/integration-tests/ovn_dashboard.cy.ts @@ -36,7 +36,7 @@ describe('Network_Observability networking dashboards tests', { tags: ['Network_ cy.uiLogin(Cypress.env('LOGIN_IDP'), Cypress.env('LOGIN_USERNAME'), Cypress.env('LOGIN_PASSWORD')) }) - it('(OCP-69944, aramesha, Network_Observability), should have OVN (Linux Subsystem Stats) dashboards', function () { + it('(OCP-69944, aramesha), should have OVN (Linux Subsystem Stats) dashboards', function () { // navigate to 'Networking / Linux Subsystem Stats' Dashboard page dashboard.visit() dashboard.visitDashboard("grafana-dashboard-network-stats") diff --git a/web/cypress/integration-tests/packet_drop.cy.ts b/web/cypress/integration-tests/packet_drop.cy.ts index a0b9275f2..d2d5f562a 100644 --- a/web/cypress/integration-tests/packet_drop.cy.ts +++ b/web/cypress/integration-tests/packet_drop.cy.ts @@ -5,7 +5,7 @@ function getPacketDropURL(drop: string): string { return `**/netflow-traffic**packetLoss=${drop}` } -describe('(OCP-66141 Network_Observability) PacketDrop test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-66141) PacketDrop test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -20,7 +20,7 @@ describe('(OCP-66141 Network_Observability) PacketDrop test', { tags: ['Network_ netflowPage.visit() }) - it("(OCP-66141, aramesha, Network_Observability) Verify packetDrop panels", function () { + it("(OCP-66141, aramesha) Verify packetDrop panels", function () { // verify default PacketDrop panels are visible cy.checkPanel(overviewSelectors.defaultPacketDropPanels) cy.checkPanelsNum(6); @@ -45,8 +45,8 @@ describe('(OCP-66141 Network_Observability) PacketDrop test', { tags: ['Network_ cy.checkPanelsNum(6); }) - it("(OCP-66141, aramesha, Network_Observability) Verify packetDrop Query Options filters", function () { - cy.get('#tabs-container li:nth-child(2)').click() + it("(OCP-66141, aramesha) Verify packetDrop Query Options filters", function () { + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') // toggle between drops filter @@ -73,7 +73,7 @@ describe('(OCP-66141 Network_Observability) PacketDrop test', { tags: ['Network_ netflowPage.resetClearFilters() }) - after("Delete flowcollector", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/packet_drop_dashboards.cy.ts b/web/cypress/integration-tests/packet_drop_dashboards.cy.ts index 8c217d32d..409f91e39 100644 --- a/web/cypress/integration-tests/packet_drop_dashboards.cy.ts +++ b/web/cypress/integration-tests/packet_drop_dashboards.cy.ts @@ -1,6 +1,6 @@ import { Operator } from "@views/netobserv" import { netflowPage, querySumSelectors, topologySelectors } from "@views/netflow-page" -import { dashboard, graphSelector } from "@views/dashboards-page" +import { dashboard } from "@views/dashboards-page" const metricType = [ "Bytes", @@ -18,7 +18,7 @@ const PacketDropPanels = [ "top-drops-per-infra-workload-(pps)-chart", ] -describe('(OCP-66141 Network_Observability) PacketDrop dashboards test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-66141) PacketDrop dashboards test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) cy.uiLogin(Cypress.env('LOGIN_IDP'), Cypress.env('LOGIN_USERNAME'), Cypress.env('LOGIN_PASSWORD')) @@ -28,9 +28,9 @@ describe('(OCP-66141 Network_Observability) PacketDrop dashboards test', { tags: Operator.createFlowcollector("PacketDrop") }) - it("(OCP-66141, aramesha, Network_Observability) Validate PacketDrop edge labels and Query Summary stats", function () { + it("(OCP-66141, aramesha) Validate PacketDrop edge labels and Query Summary stats", function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(3)').click() + cy.get('#tabs-container').contains('Topology').click() cy.get('#drawer').should('not.be.empty') cy.byTestID("show-view-options-button").should('exist').click().then(views => { @@ -79,20 +79,20 @@ describe('(OCP-66141 Network_Observability) PacketDrop dashboards test', { tags: netflowPage.resetClearFilters() }) - it("(OCP-66141, aramesha, Network_Observability) Validate packetDrop dashboards", function () { + it("(OCP-66141, aramesha) Validate packetDrop dashboards", function () { // navigate to 'NetObserv / Main' Dashboard page dashboard.visit() dashboard.visitDashboard("netobserv-main") // verify 'Drops' panel - cy.get('[data-test="drops-chart"]').find(graphSelector.graphBody).should('not.have.class', 'graph-empty-state') + cy.checkDashboards(['drops-chart']) cy.get('#content-scrollable').scrollTo('bottom') cy.checkDashboards(PacketDropPanels) }) - after("Delete flowcollector", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/prom_datasource_only.cy.ts b/web/cypress/integration-tests/prom_datasource_only.cy.ts index 35b6a7619..97247334e 100644 --- a/web/cypress/integration-tests/prom_datasource_only.cy.ts +++ b/web/cypress/integration-tests/prom_datasource_only.cy.ts @@ -1,7 +1,7 @@ import { netflowPage } from "@views/netflow-page" import { Operator } from "@views/netobserv" -describe('(OCP-74049, OCP-73875 Network_Observability) Prometheus datasource only', { tags: ['Network_Observability'] }, function () { +describe('(OCP-74049, OCP-73875) Prometheus datasource only', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -11,7 +11,7 @@ describe('(OCP-74049, OCP-73875 Network_Observability) Prometheus datasource onl Operator.createFlowcollector("LokiDisabled") }) - it('(OCP-74049, aramesha, Network_Observability), Verify Prom dataSource in Administrator view as cluster-admin user', function () { + it('(OCP-74049, aramesha), Verify Prom dataSource in Administrator view as cluster-admin user', function () { netflowPage.visit() cy.checkNetflowTraffic("Disabled") @@ -32,9 +32,8 @@ describe('(OCP-74049, OCP-73875 Network_Observability) Prometheus datasource onl cy.byTestID('resource').should('not.exist') }) }) - after("after all tests are done", function () { - // Delete flowcollector - cy.adminCLI(`oc delete flowcollector cluster`) + after("after all tests", function () { + Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/quickFilters.cy.ts b/web/cypress/integration-tests/quickFilters.cy.ts index b6582070e..520f9c14a 100644 --- a/web/cypress/integration-tests/quickFilters.cy.ts +++ b/web/cypress/integration-tests/quickFilters.cy.ts @@ -17,39 +17,46 @@ var patch = [{ } ] }] -var templateParams = `-p SERVER_NS=${SERVER_NS} CLIENT_NS=${CLIENT_NS}` -var templateProcessCmd = `oc process -f cypress/fixtures/test-server-client.yaml ${templateParams} --kubeconfig ${Cypress.env('KUBECONFIG_PATH')}` -describe('(OCP-56222 Network_Observability) Quick Filters test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-56222) Quick Filters test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) cy.uiLogin(Cypress.env('LOGIN_IDP'), Cypress.env('LOGIN_USERNAME'), Cypress.env('LOGIN_PASSWORD')) - // create test server and client pods - cy.adminCLI(`${templateProcessCmd}| oc apply -f -`) Operator.install() cy.checkStorageClass(this) Operator.createFlowcollector() + + // create test server and client pods + cy.adminCLI('oc apply -f cypress/fixtures/test-server-client.yaml') + + // Wait for pods to be created + cy.wait(10000) + + // Wait for pods to be ready + cy.adminCLI('oc wait --for=condition=Ready pod -l app=nginx -n test-server-56222 --timeout=120s') + cy.adminCLI('oc wait --for=condition=Ready pod -n test-client-56222 client --timeout=120s') }) beforeEach('any netflow table test', function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(2)').click() + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') }) - - it("(OCP-56222, memodi, Network_Observability) should verify quick filters add", function () { + it("(OCP-56222, memodi) should verify quick filters add", function () { const addQuickFilterPatch = JSON.stringify(patch).replace('$op', 'add') cy.adminCLI(`oc patch flowcollector/cluster --type json -p \'${addQuickFilterPatch}\'`) - // wait 10 seconds for plugin pod to get restarted - cy.wait(10000).then(() => { + // Wait for plugin to reload with updated config + cy.contains("Quick filters", { timeout: 15000 }).should('exist').then(() => { cy.reload() }) - cy.contains("Quick filters").should('exist').click() - cy.get('#quick-filters-dropdown').contains("Test NS") - cy.get('#quick-filters-dropdown').find('.pf-v5-c-check__input').should('exist').click() + cy.contains("Quick filters").should('be.visible').click() + cy.get('#quick-filters-dropdown').should('be.visible').within(() => { + cy.contains("Test NS").should('exist') + cy.contains('label', "Test NS").find('input[type="checkbox"]').should('exist').click() + }) // verify source and destination NS are test-server and test-client respectively cy.get('[data-test-td-column-id=SrcK8S_Namespace]').each((td) => { @@ -59,16 +66,18 @@ describe('(OCP-56222 Network_Observability) Quick Filters test', { tags: ['Netwo expect(td).to.contain(CLIENT_NS) }) - cy.get('#quick-filters-dropdown').find('.pf-v5-c-check__input').should('exist').click() + cy.get('#quick-filters-dropdown').should('be.visible').within(() => { + cy.contains('label', "Test NS").find('input[type="checkbox"]').should('exist').click() + }) cy.get('#filters').should('not.exist') }) - it("(OCP-56222, memodi, Network_Observability) should verify quick filters remove", function () { + it("(OCP-56222, memodi) should verify quick filters remove", function () { const addQuickFilterPatch = JSON.stringify(patch).replace('$op', 'remove') cy.adminCLI(`oc patch flowcollector/cluster --type json -p \'${addQuickFilterPatch}\'`) - // wait 10 seconds for plugin pod to get restarted - cy.wait(10000).then(() => { + // Wait for plugin to reload with updated config + cy.contains("Quick filters", { timeout: 15000 }).should('exist').then(() => { cy.reload() }) cy.contains("Quick filters").should('exist').click() @@ -82,7 +91,7 @@ describe('(OCP-56222 Network_Observability) Quick Filters test', { tags: ['Netwo }) after("all tests", function () { - cy.adminCLI(`${templateProcessCmd} | oc delete -f -`) + cy.adminCLI('oc delete -f cypress/fixtures/test-server-client.yaml --ignore-not-found') cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/static_plugin.cy.ts b/web/cypress/integration-tests/static_plugin.cy.ts index dae8f6f16..19c7ea866 100644 --- a/web/cypress/integration-tests/static_plugin.cy.ts +++ b/web/cypress/integration-tests/static_plugin.cy.ts @@ -1,7 +1,7 @@ import { netflowPage, overviewSelectors, pluginSelectors } from "@views/netflow-page" import { Operator } from "@views/netobserv" -describe('(OCP-84156 Network_Observability) StaticPlugin test', { tags: ['Network_Observability'] }, function () { +describe('(OCP-84156) StaticPlugin test', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -12,7 +12,7 @@ describe('(OCP-84156 Network_Observability) StaticPlugin test', { tags: ['Networ Operator.createFlowcollector("StaticPlugin") }) - it("(OCP-84156, aramesha, Network_Observability) Edit flowcollector form view", function () { + it("(OCP-84156, aramesha) Edit flowcollector form view", function () { // Edit flowcollector form view to update sampling to 1 cy.visit('k8s/cluster/flows.netobserv.io~v1beta2~FlowCollector/status') cy.get(pluginSelectors.editFlowcollector).click() @@ -41,7 +41,7 @@ describe('(OCP-84156 Network_Observability) StaticPlugin test', { tags: ['Networ netflowPage.resetClearFilters() }) - after("Delete flowcollector", function () { + after("all tests", function () { Operator.deleteFlowCollector() cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/integration-tests/table_queryopts.cy.ts b/web/cypress/integration-tests/table_queryopts.cy.ts index 33fa2c6d5..32b4cd43f 100644 --- a/web/cypress/integration-tests/table_queryopts.cy.ts +++ b/web/cypress/integration-tests/table_queryopts.cy.ts @@ -5,7 +5,7 @@ function getTableLimitURL(limit: string): string { return `**/netflow-traffic**limit=${limit}` } -describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Netflow Table Query Options', { tags: ['Network_Observability'] }, function () { +describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408) Netflow Table Query Options', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -18,11 +18,11 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net beforeEach('any netflow table test', function () { netflowPage.visit() - cy.get('#tabs-container li:nth-child(2)').click() + cy.get('#tabs-container').contains('Traffic flows').click() cy.byTestID("table-composable").should('exist') }) - it("(OCP-50532, aramesha, Network_Observability) should verify Query Options dropdown", { tags: ['@smoke'] }, function () { + it("(OCP-50532, aramesha) should verify Query Options dropdown", { tags: ['@smoke'] }, function () { // toggle between the page limits cy.changeQueryOption('500') netflowPage.waitForLokiQuery() @@ -43,7 +43,7 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net }).as('matchedUrl') }) - it("(OCP-50532, memodi, Network_Observability) should validate query summary panel", { tags: ['@smoke'] }, function () { + it("(OCP-50532, memodi) should validate query summary panel", { tags: ['@smoke'] }, function () { let warningExists = false cy.get(querySumSelectors.queryStatsPanel).should('exist').then(qrySum => { if (Cypress.$(querySumSelectors.queryStatsPanel + ' svg.query-summary-warning').length > 0) { @@ -52,42 +52,19 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net }) cy.get(querySumSelectors.flowsCount).should('exist').then(flowsCnt => { - let nflows = 0 - if (warningExists) { - nflows = Number(flowsCnt.text().split('+ Flows')[0]) - } - else { - nflows = Number(flowsCnt.text().split(' ')[0]) - } + // parseFloat handles formats: "123 Flows", "123+ Flows", "1.5k Flows", "1.5k+ Flows" + const nflows = parseFloat(flowsCnt.text()) cy.wait(10) expect(nflows).to.be.greaterThan(0) }) cy.get(querySumSelectors.bytesCount).should('exist').then(bytesCnt => { - let nbytes = 0 - if (warningExists) { - nbytes = Number(bytesCnt.text().split('+ ')[0]) - } - else { - nbytes = Number(bytesCnt.text().split(' ')[0]) - } + const nbytes = parseFloat(bytesCnt.text()) expect(nbytes).to.be.greaterThan(0) }) cy.get(querySumSelectors.packetsCount).should('exist').then(pktsCnt => { - let npkts = 0 - if (warningExists) { - let npktsStr = pktsCnt.text().split('+ ')[0] - if (npktsStr.includes('k')) { - npkts = Number(npktsStr.split('k')[0]) - } - else { - npkts = Number(npktsStr) - } - } - else { - npkts = Number(pktsCnt.text().split(' ')[0]) - } + const npkts = parseFloat(pktsCnt.text()) expect(npkts).to.be.greaterThan(0) }) cy.get('#query-summary-toggle').should('exist').click() @@ -105,7 +82,7 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net cy.contains('Date').should('exist') }) - it("(OCP-68125, aramesha, Network_Observability) should verify DSCP column", function () { + it("(OCP-68125, aramesha) should verify DSCP column", function () { netflowPage.stopAutoRefresh() cy.openColumnsModal().then(col => { cy.get(colSelectors.columnsModal).should('be.visible') @@ -120,12 +97,12 @@ describe('(OCP-50532, OCP-50531, OCP-50530, OCP-59408 Network_Observability) Net // filter on DSCP values cy.get(filterSelectors.filterInput).type("dscp=0" + '{enter}').click() - cy.get('#dscp-0-toggle > span.pf-v5-c-menu-toggle__text').should('contain.text', 'Standard') + cy.get('#dscp-0-toggle').should('contain.text', 'Standard') // Verify DSCP value is Standard for all rows cy.get('[data-test-td-column-id=Dscp]').each((td) => { - expect(td).attr("data-test-td-value").to.contain(0) - cy.get('[data-test-td-column-id=Dscp] > div > div').should('contain.text', 'Standard') + cy.wrap(td).should('have.attr', 'data-test-td-value').and('contain', '0') + cy.wrap(td).should('contain.text', 'Standard') }) netflowPage.clearAllFilters() }) diff --git a/web/cypress/integration-tests/topology_edges_labels.cy.ts b/web/cypress/integration-tests/topology_edges_labels.cy.ts index b1c1db9a1..1f3286b3b 100644 --- a/web/cypress/integration-tests/topology_edges_labels.cy.ts +++ b/web/cypress/integration-tests/topology_edges_labels.cy.ts @@ -1,11 +1,7 @@ -import { netflowPage, topologySelectors, topologyPage, setupTopologyViewWithNamespaceFilter } from "@views/netflow-page" +import { netflowPage, topologySelectors, topologyPage } from "@views/netflow-page" import { Operator, project } from "@views/netobserv" -function getTopologyResourceScopeGroupURL(groups: string): string { - return `**/flow/metrics**groups=${groups}*` -} - -describe("(OCP-53591 Network_Observability) Netflow Topology edges,labels, badges features", { tags: ['Network_Observability'] }, function () { +describe("(OCP-53591) Netflow Topology edges,labels, badges features", { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -17,19 +13,19 @@ describe("(OCP-53591 Network_Observability) Netflow Topology edges,labels, badge }) beforeEach("run before each test", function () { - setupTopologyViewWithNamespaceFilter() - - // advance options menu remains visible throughout the test - topologyPage.selectScopeGroup("resource", "owners") - cy.contains('Display options').should('exist').click() + topologyPage.setupWithNamespaceFilter() }) - it("(OCP-53591, memodi, Network_Observability) should verify group owners", function () { - cy.intercept(getTopologyResourceScopeGroupURL('owners'), { fixture: 'flowmetrics/Owners.json' }) - cy.get(topologySelectors.nGroups).its('length').should('be.greaterThan', 30) + it("(OCP-53591, memodi) should verify group owners", function () { + cy.intercept('GET', topologyPage.getResourceScopeGroupURL('owners'), { fixture: 'flowmetrics/Owners.json' }).as('ownersData') + topologyPage.selectScopeGroup("resource", "owners") + cy.wait('@ownersData') + cy.get(topologySelectors.nGroups).its('length').should('be.greaterThan', 4) }) - it("(OCP-53591, memodi, Network_Observability) should verify group expand/collapse", function () { + it("(OCP-53591, memodi) should verify group expand/collapse", function () { + topologyPage.selectScopeGroup("resource", "owners") + cy.contains('Display options').should('exist').click() cy.get(topologySelectors.groupToggle).click() cy.get(topologySelectors.groupLayer + ' > ' + topologySelectors.group).each((node, index) => { cy.wrap(node).should('not.have.descendants', 'g.pf-topology__group') @@ -40,7 +36,9 @@ describe("(OCP-53591 Network_Observability) Netflow Topology edges,labels, badge }) }) - it("(OCP-53591, memodi, Network_Observability) should verify edges display/hidden", function () { + it("(OCP-53591, memodi) should verify edges display/hidden", function () { + topologyPage.selectScopeGroup("resource", "owners") + cy.contains('Display options').should('exist').click() cy.get(topologySelectors.edgeToggle).uncheck() // verify labels are also hidden @@ -55,28 +53,28 @@ describe("(OCP-53591 Network_Observability) Netflow Topology edges,labels, badge }) }) - it("(OCP-53591, memodi, Network_Observability) should verify edges labels can be displayed/hidden", function () { + it("(OCP-53591, memodi) should verify edges labels can be displayed/hidden", function () { netflowPage.selectSourceNS(project) - topologyPage.selectScopeGroup(null, "none") - topologyPage.selectScopeGroup("namespace", null) + topologyPage.selectScopeGroup(undefined, "none") + topologyPage.selectScopeGroup("namespace") cy.get('#reset-view').should('exist').click() - cy.get('[data-test-id="edge-handler"] g.pf-topology__edge__tag').should("exist") + cy.byLegacyTestID('edge-handler').find('g.pf-topology__edge__tag').should("exist") cy.contains('Display options').should('exist').click() cy.get(topologySelectors.labelToggle).uncheck() - cy.get('[data-test-id="edge-handler"] g.pf-topology__edge__tag').should("not.exist") + cy.byLegacyTestID('edge-handler').find('g.pf-topology__edge__tag').should("not.exist") cy.get(topologySelectors.labelToggle).check() - cy.get('[data-test-id="edge-handler"] g.pf-topology__edge__tag').should("exist") + cy.byLegacyTestID('edge-handler').find('g.pf-topology__edge__tag').should("exist") netflowPage.clearAllFilters() }) - it("(OCP-53591, memodi, Network_Observability) should verify badges display/hidden", function () { + it("(OCP-53591, memodi) should verify badges display/hidden", function () { netflowPage.selectSourceNS(project) - topologyPage.selectScopeGroup(null, "none") - topologyPage.selectScopeGroup("namespace", null) + topologyPage.selectScopeGroup(undefined, "none") + topologyPage.selectScopeGroup("namespace") cy.get('#reset-view').should('exist').click() cy.contains('Display options').should('exist').click() @@ -90,12 +88,12 @@ describe("(OCP-53591 Network_Observability) Netflow Topology edges,labels, badge netflowPage.clearAllFilters() }) - afterEach("after each tests", function () { + afterEach("each test", function () { cy.contains('Display options').should('exist').click() netflowPage.resetClearFilters() }) - after("after all tests are done", function () { + after("all tests", function () { cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/topology_groups.cy.ts b/web/cypress/integration-tests/topology_groups.cy.ts index fb513bd1c..5474fca60 100644 --- a/web/cypress/integration-tests/topology_groups.cy.ts +++ b/web/cypress/integration-tests/topology_groups.cy.ts @@ -1,15 +1,7 @@ -import { netflowPage, topologySelectors, topologyPage, setupTopologyViewWithNamespaceFilter } from "@views/netflow-page" +import { netflowPage, topologySelectors, topologyPage } from "@views/netflow-page" import { Operator } from "@views/netobserv" -function getTopologyScopeURL(scope: string): string { - return `**/flow/metrics**aggregateBy=${scope}*` -} - -function getTopologyResourceScopeGroupURL(groups: string): string { - return `**/flow/metrics**groups=${groups}*` -} - -describe("(OCP-53591 Network_Observability) Netflow Topology groups features", { tags: ['Network_Observability'] }, function () { +describe("(OCP-53591) Netflow Topology groups features", { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -21,21 +13,21 @@ describe("(OCP-53591 Network_Observability) Netflow Topology groups features", { }) beforeEach("run before each test", function () { - setupTopologyViewWithNamespaceFilter() + topologyPage.setupWithNamespaceFilter() }) - it("(OCP-53591, memodi, Network_Observability) should verify namespace scope", function () { + it("(OCP-53591, memodi) should verify namespace scope", function () { const scope = "namespace" - cy.intercept('GET', getTopologyScopeURL(scope), { + cy.intercept('GET', topologyPage.getScopeURL(scope), { fixture: 'flowmetrics/namespace.json' }).as('matchedUrl') // selecting something different first // to re-trigger API request on namespace selection - topologyPage.selectScopeGroup("owner", null) - topologyPage.selectScopeGroup(scope, null) + topologyPage.selectScopeGroup("owner") + topologyPage.selectScopeGroup(scope) cy.wait('@matchedUrl').then(({ response }) => { - expect(response.statusCode).to.eq(200) + expect(response?.statusCode).to.eq(200) }) topologyPage.isViewRendered() // verify number of edges and nodes. @@ -43,23 +35,23 @@ describe("(OCP-53591 Network_Observability) Netflow Topology groups features", { cy.get('#drawer ' + topologySelectors.node).should('have.length', 5) }) - it("(OCP-53591, memodi, Network_Observability) should verify owner scope", function () { + it("(OCP-53591, memodi) should verify owner scope", function () { const scope = "owner" - cy.intercept('GET', getTopologyScopeURL(scope), { + cy.intercept('GET', topologyPage.getScopeURL(scope), { fixture: 'flowmetrics/owner.json' }).as('matchedUrl') // using slider let lastRefresh = Cypress.$("#lastRefresh").text() cy.log(`last refresh is ${lastRefresh}`) - cy.get('.pf-v5-c-progress-stepper').get('#scope-step-2 > div:nth-child(2) > button').click().then(slider => { + cy.get('#scope-step-2 button').click().then(slider => { netflowPage.waitForLokiQuery() cy.wait(3000) cy.get('#lastRefresh').invoke('text').should('not.eq', lastRefresh) }) cy.wait('@matchedUrl').then(({ response }) => { - expect(response.statusCode).to.eq(200) + expect(response?.statusCode).to.eq(200) }) topologyPage.isViewRendered() // verify number of edges and nodes. @@ -69,10 +61,10 @@ describe("(OCP-53591 Network_Observability) Netflow Topology groups features", { it("(OCP-53591, memodi) should verify resource scope", function () { const scope = 'resource' - cy.intercept('GET', getTopologyScopeURL(scope), { fixture: 'flowmetrics/resource.json' }).as('matchedUrl') - topologyPage.selectScopeGroup(scope, null) + cy.intercept('GET', topologyPage.getScopeURL(scope), { fixture: 'flowmetrics/resource.json' }).as('matchedUrl') + topologyPage.selectScopeGroup(scope) cy.wait('@matchedUrl').then(({ response }) => { - expect(response.statusCode).to.eq(200) + expect(response?.statusCode).to.eq(200) }) topologyPage.isViewRendered() // verify number of edges and nodes. @@ -80,9 +72,9 @@ describe("(OCP-53591 Network_Observability) Netflow Topology groups features", { cy.get('#drawer ' + topologySelectors.node).should('have.length', 28) }) - it("(OCP-53591, memodi, Network_Observability) should verify group Nodes", function () { + it("(OCP-53591, memodi) should verify group Nodes", function () { const groups = 'hosts' - cy.intercept('GET', getTopologyResourceScopeGroupURL(groups), { + cy.intercept('GET', topologyPage.getResourceScopeGroupURL(groups), { fixture: 'flowmetrics/hosts.json' }) topologyPage.selectScopeGroup("resource", groups) @@ -91,28 +83,28 @@ describe("(OCP-53591 Network_Observability) Netflow Topology groups features", { cy.get(topologySelectors.nGroups).should('have.length', 6) }) - it("(OCP-53591, memodi, Network_Observability) should verify group Nodes+NS", function () { - cy.intercept('GET', getTopologyResourceScopeGroupURL('hosts%2Bnamespaces'), { fixture: 'flowmetrics/hostsNS.json' }) + it("(OCP-53591, memodi) should verify group Nodes+NS", function () { + cy.intercept('GET', topologyPage.getResourceScopeGroupURL('hosts%2Bnamespaces'), { fixture: 'flowmetrics/hostsNS.json' }) topologyPage.selectScopeGroup("resource", "hosts+namespaces") topologyPage.isViewRendered() cy.get(topologySelectors.nGroups).should('have.length', 10) }) - it("(OCP-53591, memodi, Network_Observability) should verify group Nodes+Owners", function () { - cy.intercept('GET', getTopologyResourceScopeGroupURL('hosts%2Bowners'), { fixture: 'flowmetrics/hostsOwners.json' }) + it("(OCP-53591, memodi) should verify group Nodes+Owners", function () { + cy.intercept('GET', topologyPage.getResourceScopeGroupURL('hosts%2Bowners'), { fixture: 'flowmetrics/hostsOwners.json' }) topologyPage.selectScopeGroup("resource", "hosts+owners") // verify number of groups cy.get(topologySelectors.nGroups).should('have.length', 11) }) - it("(OCP-53591, memodi, Network_Observability) should verify group NS", function () { - cy.intercept('GET', getTopologyResourceScopeGroupURL('namespaces'), { fixture: 'flowmetrics/NS.json' }) + it("(OCP-53591, memodi) should verify group NS", function () { + cy.intercept('GET', topologyPage.getResourceScopeGroupURL('namespaces'), { fixture: 'flowmetrics/NS.json' }) topologyPage.selectScopeGroup("resource", "namespaces") cy.get(topologySelectors.nGroups).should('have.length', 4) }) - it("(OCP-53591, memodi, Network_Observability) should verify group NS+Owners", function () { - cy.intercept('GET', getTopologyResourceScopeGroupURL('namespaces%2Bowners'), { fixture: 'flowmetrics/NSOwners.json' }) + it("(OCP-53591, memodi) should verify group NS+Owners", function () { + cy.intercept('GET', topologyPage.getResourceScopeGroupURL('namespaces%2Bowners'), { fixture: 'flowmetrics/NSOwners.json' }) topologyPage.selectScopeGroup("resource", "namespaces+owners") cy.get(topologySelectors.nGroups).should('have.length', 9) }) @@ -121,7 +113,7 @@ describe("(OCP-53591 Network_Observability) Netflow Topology groups features", { netflowPage.resetClearFilters() }) - after("after all tests are done", function () { + after("after all tests", function () { cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/topology_view.cy.ts b/web/cypress/integration-tests/topology_view.cy.ts index 3eb9cf5cf..c3f94c59b 100644 --- a/web/cypress/integration-tests/topology_view.cy.ts +++ b/web/cypress/integration-tests/topology_view.cy.ts @@ -1,4 +1,4 @@ -import { genSelectors, netflowPage, topologySelectors, setupTopologyViewWithNamespaceFilter } from "@views/netflow-page" +import { genSelectors, netflowPage, topologyPage, topologySelectors } from "@views/netflow-page" import { Operator } from "@views/netobserv" const metricFunction = [ @@ -13,7 +13,7 @@ const metricType = [ "Packets" ] -describe("(OCP-53591 Network_Observability) Netflow Topology view features", { tags: ['Network_Observability'] }, function () { +describe("(OCP-53591) Netflow Topology view features", { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) cy.uiLogin(Cypress.env('LOGIN_IDP'), Cypress.env('LOGIN_USERNAME'), Cypress.env('LOGIN_PASSWORD')) @@ -24,10 +24,10 @@ describe("(OCP-53591 Network_Observability) Netflow Topology view features", { t }) beforeEach("run before each test", function () { - setupTopologyViewWithNamespaceFilter() + topologyPage.setupWithNamespaceFilter() }) - it("(OCP-53591, memodi, Network_Observability) should verify topology page features", { tags: ['@netobserv-critical'] }, function () { + it("(OCP-53591, memodi) should verify topology page features", { tags: ['@netobserv-critical'] }, function () { cy.byTestID('search-topology-element-input').should('exist') cy.contains('Display options').should('exist').click() @@ -49,7 +49,7 @@ describe("(OCP-53591 Network_Observability) Netflow Topology view features", { t cy.get('#query-summary').should('exist') }) - it("(OCP-53591, memodi, Network_Observability) should verify local storage", function () { + it("(OCP-53591, memodi) should verify local storage", function () { // modify some options cy.contains('Display options').should('exist').click() cy.byTestID('truncate-dropdown').click().byTestID("25").click() @@ -62,7 +62,9 @@ describe("(OCP-53591 Network_Observability) Netflow Topology view features", { t cy.get('#drawer').should('exist') cy.get('#pageHeader').should('exist').then(() => { - const settings = JSON.parse(localStorage.getItem('netobserv-plugin-settings')) + const rawSettings = localStorage.getItem('netobserv-plugin-settings') + expect(rawSettings, 'netobserv-plugin-settings should exist').to.not.be.null + const settings = JSON.parse(rawSettings as string) const topologySettings = settings['netflow-traffic-topology-options'] expect(settings['netflow-traffic-view-id']).to.be.equal('topology') @@ -78,22 +80,22 @@ describe("(OCP-53591 Network_Observability) Netflow Topology view features", { t }) }) - it("(OCP-53591, memodi, Network_Observability) should verify side panel", function () { + it("(OCP-53591, memodi) should verify side panel", function () { cy.get('g[data-kind="node"] > g').eq(1).parent().should('exist').click() cy.get('#elementPanel').should('be.visible') // details tab - cy.get('#drawer-tabs > ul > li:nth-child(1)').should('exist') + cy.get('#drawer-tabs').contains('Details').should('exist') // metrics tab - cy.get('#drawer-tabs > ul > li:nth-child(2)').should('exist').click() - cy.get('div.pf-v5-c-chart').should('exist') + cy.get('#drawer-tabs').contains('Metrics').should('exist').click() + cy.get('.element-metrics-container svg').should('exist') }) afterEach("test", function () { netflowPage.resetClearFilters() }) - after("after all tests are done", function () { + after("all tests", function () { cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) }) diff --git a/web/cypress/integration-tests/workloads.cy.ts b/web/cypress/integration-tests/workloads.cy.ts index ee0a2adbc..6bc814d92 100644 --- a/web/cypress/integration-tests/workloads.cy.ts +++ b/web/cypress/integration-tests/workloads.cy.ts @@ -6,7 +6,7 @@ const pagesToVisit = ["/k8s/ns/netobserv/core~v1~Pod", "/k8s/ns/netobserv/apps~v1~ReplicaSet", ] -describe('(OCP-70972 Network_Observability) Netflow traffic pages on workloads', { tags: ['Network_Observability'] }, function () { +describe('(OCP-70972) Netflow traffic pages on workloads', { tags: ['Network_Observability'] }, function () { before('any test', function () { cy.adminCLI(`oc adm policy add-cluster-role-to-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) @@ -17,13 +17,13 @@ describe('(OCP-70972 Network_Observability) Netflow traffic pages on workloads', Operator.createFlowcollector() }) - it('(OCP-70972, memodi, Network_Observability), netflow traffic pages should appear on workloads', { tags: ["@smoke"] }, function () { + it('(OCP-70972, memodi), netflow traffic pages should appear on workloads', { tags: ["@smoke"] }, function () { pagesToVisit.forEach((page) => { cy.clearLocalStorage() cy.visitNetflowTrafficTab(page) }) }) - after("after all tests are done", function () { + after("all tests", function () { cy.adminCLI(`oc adm policy remove-cluster-role-from-user cluster-admin ${Cypress.env('LOGIN_USERNAME')}`) }) diff --git a/web/cypress/support/commands.ts b/web/cypress/support/commands.ts index d5d9cb7ea..aa5f0baa8 100644 --- a/web/cypress/support/commands.ts +++ b/web/cypress/support/commands.ts @@ -6,6 +6,14 @@ import './console-utilities'; import './selectors'; /// + +/** + * Escapes a string for safe use in shell commands + * Wraps the value in single quotes and escapes any single quotes within + */ +function escapeShellArg(arg: string): string { + return `'${arg.replace(/'/g, "'\\''")}'`; +} // *********************************************** // This example commands.ts shows you how to // create various custom commands and overwrite @@ -329,6 +337,28 @@ Cypress.Commands.add('uiLogout', () => { }) }); +Cypress.Commands.add("cliLogin", (username?: string, password?: string) => { + const kubeconfig = Cypress.env('KUBECONFIG_PATH'); + const loginUsername = username || Cypress.env('LOGIN_USERNAME'); + const loginPassword = password || Cypress.env('LOGIN_PASSWORD'); + + if (!kubeconfig || !loginUsername || !loginPassword) { + throw new Error('cliLogin requires KUBECONFIG_PATH, LOGIN_USERNAME, and LOGIN_PASSWORD'); + } + + cy.exec(`oc whoami --show-server=true --kubeconfig ${escapeShellArg(kubeconfig)}`, { log: false }) + .then(result => { + const hostapi = result.stdout.trim(); + cy.log(`Server: ${hostapi}`); + return cy.exec( + `oc login -u ${escapeShellArg(loginUsername)} -p ${escapeShellArg(loginPassword)} ${escapeShellArg(hostapi)} --insecure-skip-tls-verify=true --kubeconfig ${escapeShellArg(kubeconfig)}`, + { failOnNonZeroExit: true, log: false } + ); + }) + .its('code') + .should('eq', 0); +}); + Cypress.Commands.add('retryTask', (command, expectedOutput, options?) => { const { retries, interval } = options || DEFAULT_RETRY_OPTIONS; const retryTaskFn = (currentRetries) => { @@ -381,6 +411,7 @@ declare global { adminCLI(command: string, options?: Partial): Chainable uiLogin(provider: string, username: string, password: string): Chainable uiLogout(): Chainable + cliLogin(username?: string, password?: string): Chainable switchPerspective(perspective: string): Chainable checkCommandResult(command: string, expectedoutput: string, options?: { retries?: number; interval?: number }): Chainable retryTask(condition: string, expectedoutput: string, options?: { retries?: number; interval?: number }): Chainable diff --git a/web/cypress/views/catalogs.ts b/web/cypress/views/catalogs.ts deleted file mode 100644 index 7b74579fd..000000000 --- a/web/cypress/views/catalogs.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const catalog = { - extensionCatalogLoaded: () => { - cy.get('[data-test-group-name="source"]',{timeout: 60000}).should('exist'); - cy.get('a[class*="catalog-tile"]',{timeout: 60000}).should('exist'); - }, - filterBySource: (source_name) => { - cy.get(`input[title="${source_name}"]`).check(); - } -} \ No newline at end of file diff --git a/web/cypress/views/dashboards-page.ts b/web/cypress/views/dashboards-page.ts index 707eab865..c6b6bc3a3 100644 --- a/web/cypress/views/dashboards-page.ts +++ b/web/cypress/views/dashboards-page.ts @@ -6,25 +6,28 @@ export const dashboard = { visitDashboard: (dashboardName: string) => { cy.visit(`/monitoring/dashboards/${dashboardName}`) - // Revert once https://issues.redhat.com/browse/OCPBUGS-57307 is fixed - // cy.get('#refresh-interval-dropdown-dropdown').should('exist').then(btn => { - // cy.wrap(btn).click().then(drop => { - // cy.contains('15 seconds').should('exist').click() - // }) - // }) - cy.get('label[for="refresh-interval-dropdown"]').parent().parent().parent().within(() => { - cy.get('button').click() + // Handle different DOM structures between PF5 (OCP 4.18) and PF6 (OCP 4.19+) + // PF5: label and button are in the same parent div + // PF6: label is in one div, button is in the first sibling div + cy.contains('label', 'Refresh interval').parent().then($parent => { + if (Cypress.$($parent).find('button').length > 0) { + // PF5: button is in the same parent + cy.wrap($parent).within(() => cy.get('button').click()) + } else { + // PF6: button is in the first sibling + cy.wrap($parent).siblings().first().find('button').click() + } }) cy.contains('15 seconds').should('exist').click() - // Revert once https://issues.redhat.com/browse/OCPBUGS-57307 is fixed - // cy.get('#monitoring-time-range-dropdown-dropdown').should('exist').then(btn => { - // cy.wrap(btn).click().then(drop => { - // cy.contains('Last 5 minutes').should('exist').click() - // }) - // }) - cy.get('label[for="monitoring-time-range-dropdown"]').parent().parent().parent().within(() => { - cy.get('button').click() + cy.contains('label', 'Time range').parent().then($parent => { + if (Cypress.$($parent).find('button').length > 0) { + // PF5: button is in the same parent + cy.wrap($parent).within(() => cy.get('button').click()) + } else { + // PF6: button is in the first sibling + cy.wrap($parent).siblings().first().find('button').click() + } }) cy.contains('Last 5 minutes').should('exist').click() @@ -36,24 +39,19 @@ export const dashboard = { } export namespace dashboardSelectors { - export const flowStatsToggle = '[data-test-id=panel-flowlogs-pipeline-statistics] > div > div > div > button' - export const ebpfStatsToggle = '[data-test-id=panel-e-bpf-agent-statistics]> div > div > div > button' - export const operatorStatsToggle = '[data-test-id=panel-operator-statistics] > div > div > div > button' - export const resourceStatsToggle = '[data-test-id=panel-resource-usage] > div > div > div > button' - export const top10PerRouteToggle = '[data-test-id=panel-top-10-per-route] > div > div > div > button' - export const top10PerNamespaceToggle = '[data-test-id=panel-top-10-per-namespace] > div > div > div > button' - export const top10PerShardToggle = '[data-test-id=panel-top-10-per-shard] > div > div > div > button' + export const flowStatsToggle = '[data-test-id=panel-flowlogs-pipeline-statistics] button:first' + export const ebpfStatsToggle = '[data-test-id=panel-e-bpf-agent-statistics] button:first' + export const operatorStatsToggle = '[data-test-id=panel-operator-statistics] button:first' + export const resourceStatsToggle = '[data-test-id=panel-resource-usage] button:first' + export const top10PerRouteToggle = '[data-test-id=panel-top-10-per-route] button:first' + export const top10PerNamespaceToggle = '[data-test-id=panel-top-10-per-namespace] button:first' + export const top10PerShardToggle = '[data-test-id=panel-top-10-per-shard] button:first' } export const graphSelector = { - graphBody: '.pf-v6-c-card__body > div > div' + graphBody: '[role="region"]' } -export const appsInfra = [ - "applications-chart", - "infrastructure-chart" -] - Cypress.Commands.add('checkDashboards', (names) => { for (let i = 0; i < names.length; i++) { // Wait for panel to exist @@ -68,7 +66,7 @@ Cypress.Commands.add('checkDashboards', (names) => { // Check that graph body doesn't have empty state - use a custom retry mechanism cy.byTestID(names[i], { timeout: 120000 }).first().within(() => { cy.get(graphSelector.graphBody, { timeout: 120000 }).should($body => { - const hasEmptyState = $body.hasClass('pf-v6-c-empty-state') + const hasEmptyState = $body.find('[data-test="empty-state"]').length > 0 if (hasEmptyState) { // Force a retry by throwing an error throw new Error('Dashboard panel still showing empty state, retrying...') diff --git a/web/cypress/views/list-page.ts b/web/cypress/views/list-page.ts index ccab2b8f4..820a25f41 100644 --- a/web/cypress/views/list-page.ts +++ b/web/cypress/views/list-page.ts @@ -1,164 +1,13 @@ -import * as yamlEditor from '@views/yaml-editor'; - export const listPage = { - titleShouldHaveText: (title: string) => - cy.get('[data-test="page-heading"] h1').contains(title).should('exist'), - clickCreateYAMLdropdownButton: () => { - cy.byTestID('item-create') - .click() - .get('body') - .then(($body) => { - if ($body.find(`[data-test-dropdown-menu="yaml"]`).length) { - cy.get(`[data-test-dropdown-menu="yaml"]`).click(); - } - }); - }, - isCreateButtonVisible: () => { - cy.byTestID('item-create').should('be.visible'); - }, - clickCreateYAMLbutton: () => { - cy.byTestID('item-create').click({ force: true }); - }, - createNamespacedResourceWithDefaultYAML: (resourceType: string, testName: string) => { - cy.visit(`/k8s/ns/${testName}/${resourceType}`); - listPage.clickCreateYAMLbutton(); - cy.byTestID('resource-sidebar').should('exist'); - yamlEditor.isLoaded(); - yamlEditor.clickSaveCreateButton(); - }, - filter: { - byName: (name: string) => { - cy.byTestID('name-filter-input').clear().type(name); - }, - clickSearchByDropdown: () => { - cy.byTestID('filter-toolbar').within(() => { - cy.byTestID('console-select-menu-toggle').click(); - }); - }, - clickFilterDropdown: () => { - cy.byLegacyTestID('filter-dropdown-toggle').within(() => { - cy.get('button').click(); - }); - }, - by: (rowFilter: string) => { - cy.byTestID('filter-toolbar').within(() => { - cy.byLegacyTestID('filter-dropdown-toggle') - .find('button') - .as('filterDropdownToggleButton') - .click(); - }); - /* PF Filter dropdown menu items are: -
  • -