Skip to content

Conversation

@Leo6Leo
Copy link
Contributor

@Leo6Leo Leo6Leo commented Oct 15, 2025

Description

As a cluster administrator want to impersonate a user with multiple group memberships simultaneously, so that I can accurately reproduce their effective permissions and troubleshoot RBAC issues.

Leo6Leo added 10 commits October 6, 2025 14:44
…tion

Support multiple Impersonate-Group subprotocols on WebSocket connections.
Maintains backward compatibility for single-group impersonation.
…nation

Handle X-Console-Impersonate-Groups header by splitting comma-separated
groups into multiple Impersonate-Group headers for Kubernetes API.
Update GraphQL context to support array-valued headers for multi-group
impersonation. Change headers type from map[string]string to map[string]interface{}
to support both single string values and []string arrays.
Update fetch utilities to handle multi-group impersonation:
- Support array-valued Impersonate-Group headers
- Convert array to X-Console-Impersonate-Groups for fetch() API compatibility
- Add UserWithGroups kind support in header generation
…ation

Add multi-group support to Redux actions:
- Update startImpersonate to accept groups parameter
- Encode multiple groups as WebSocket subprotocols in UserWithGroups mode
- Pass groups to beginImpersonate action
- Expose store and UIActions for testing (temporary)
Add modal component for multi-group user impersonation:
- TypeScript React component with group selection
- Multi-select group input with search/filter
- Chip display for selected groups
- Form validation for username
- Internationalization support
Integrate multi-group impersonation into the UI:
- Update impersonation banner to display multiple groups
- Add modal trigger in masthead toolbar
- Update user component to show impersonated user
- Add feature flag checks in app component
- Add masthead menu items for start/stop impersonation
- Add enabled parameter to usePackageManifestCheck hook
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Oct 15, 2025
@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Oct 15, 2025

@Leo6Leo: This pull request references CONSOLE-4734 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

Details

In response to this:

Description

As a cluster administrator want to impersonate a user with multiple group memberships simultaneously, so that I can accurately reproduce their effective permissions and troubleshoot RBAC issues.

The feature flag bridge/impersonate-enabled in localStorage will keep the feature hidden/display from users until all frontend and backend components are complete and merged.

The flag is disabled by default.

// Enable the feature
localStorage.setItem('bridge/impersonate-enabled', 'true'); location.reload();
// Disable the feature
localStorage.setItem('bridge/impersonate-enabled', 'false'); location.reload();

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci bot requested review from jhadvig and sg00dwin October 15, 2025 19:12
@openshift-ci openshift-ci bot added component/backend Related to backend component/core Related to console core functionality labels Oct 15, 2025
window.store = store;
}

// Temporary: Expose store for testing multi-group impersonation
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This need to get removed whenever the PR is ready to get merged.

@openshift-ci openshift-ci bot added component/sdk Related to console-plugin-sdk component/shared Related to console-shared kind/i18n Indicates issue or PR relates to internationalization or has content that needs to be translated labels Oct 15, 2025
@Leo6Leo
Copy link
Contributor Author

Leo6Leo commented Oct 22, 2025

/cc @logonoff

@openshift-ci openshift-ci bot requested a review from logonoff October 22, 2025 16:30
Copy link
Member

@logonoff logonoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

first pass

@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 22, 2025
@openshift-merge-robot openshift-merge-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 23, 2025
…y logonoff

Co-authored-by: logonoff <git@logonoff.co>
@Leo6Leo Leo6Leo force-pushed the leo/CONSOLE-4782-all-changes-combined branch from b35925e to b97bafd Compare November 25, 2025 02:37
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (6)
frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts (3)

40-63: Cleanup logic may fail silently if dropdown doesn't open.

The after() cleanup has nested .then() callbacks that could silently skip cleanup if the dropdown toggle click doesn't open the menu in time. Consider adding explicit waits or using .should() assertions to ensure the dropdown is open before checking for the stop button.

   after(() => {
     // Cleanup: stop any active impersonation using dropdown (more reliable)
     cy.get('body').then(($body) => {
       // Only clean up if there's an impersonation banner (not other cluster banners)
       if ($body.find('.pf-v6-c-banner:contains("You are impersonating")').length > 0) {
         // Check if dropdown toggle exists and is visible
-        cy.get('[data-test="user-dropdown-toggle"]').then(($toggle) => {
-          if ($toggle.length > 0 && $toggle.is(':visible')) {
-            cy.wrap($toggle).click();
-
-            // Wait for dropdown to open and stop button to appear
-            cy.get('body').then(($body2) => {
-              if ($body2.find('[data-test="stop-impersonate"]').length > 0) {
-                cy.byTestID('stop-impersonate').click();
-
-                // Wait for impersonation banner to disappear
-                cy.contains('You are impersonating', { timeout: 10000 }).should('not.exist');
-              }
-            });
-          }
-        });
+        cy.byTestID('user-dropdown-toggle').should('be.visible').click();
+        cy.byTestID('stop-impersonate').should('be.visible').click();
+        cy.contains('You are impersonating', { timeout: 10000 }).should('not.exist');
       }
     });
   });

104-136: Test relies on state from previous test, reducing isolation.

Line 106 explicitly states this test depends on state from the previous test ("Impersonation should be active from previous test"). This creates test coupling and can cause cascading failures. If the previous test fails or is skipped, this test will also fail for the wrong reason.

Consider making this test self-contained by starting impersonation at the beginning:

   it('SMOKE: Banner persists across page navigation', () => {
     guidedTour.close();
-    // Impersonation should be active from previous test
-    // Check specifically for the impersonation banner, not other banners (e.g., kubeadmin)
-    cy.contains('.pf-v6-c-banner', 'You are impersonating', { timeout: 5000 }).should('be.visible');
-    cy.contains('smoke-test-user').should('be.visible');
+    // Start impersonation for this test
+    cy.byTestID('user-dropdown-toggle').should('be.visible').click();
+    cy.byTestID('impersonate-user').should('be.visible').click();
+    cy.byTestID('username-input').should('be.visible').clear().type('smoke-test-user');
+    cy.byTestID('impersonate-button').should('not.be.disabled').click();
+    cy.wait(1000);
+    cy.contains('You are impersonating', { timeout: 10000 }).should('be.visible');
 
     // Navigate to Workloads > Pods using nav link (preserves Redux state)

178-190: Conditional test logic with .then() may hide failures.

Using cy.get('body').then() to conditionally check for groups creates a code path where the test passes even if no groups are available. While the log message notes this is acceptable for smoke tests, this pattern makes it harder to detect regressions where groups should be available but aren't.

Consider splitting into two tests: one that explicitly skips when groups unavailable, and another (like line 209) that uses mocked data to guarantee group availability.

frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts (3)

44-104: Resource creation commands don't verify success before proceeding.

The cy.exec() calls for creating namespaces, groups, and rolebindings use failOnNonZeroExit: false but don't verify the resources were actually created before proceeding. If any creation fails (e.g., due to quota or permissions), subsequent tests will fail with confusing errors.

Consider adding verification after resource creation:

     cy.exec(`oc create namespace ${testNamespaceA} --dry-run=client -o yaml | oc apply -f -`, {
       failOnNonZeroExit: false,
+    }).then((result) => {
+      if (result.code !== 0) {
+        cy.log(`⚠️ Namespace A creation may have failed: ${result.stderr}`);
+      }
     });

Or add a verification step after all creations:

// Verify all resources exist before running tests
cy.exec(`oc get namespace ${testNamespaceA} ${testNamespaceB} ${testNamespaceC}`);
cy.exec(`oc get group ${testGroupA} ${testGroupB} ${testGroupC}`);

182-183: Hard-coded 10 second wait may be insufficient or excessive.

The 10-second wait for pods to be created is a fixed delay that may be too short in slow environments or unnecessarily long in fast ones. This contributes to test flakiness and slow execution.

Consider polling for pod readiness instead:

-    // Wait for pods to be created and potentially start
-    cy.wait(10000);
+    // Wait for pods to be created (poll with timeout)
+    cy.exec(`oc wait --for=condition=Ready pod/test-pod-a -n ${testNamespaceA} --timeout=60s || oc get pod test-pod-a -n ${testNamespaceA}`, {
+      failOnNonZeroExit: false,
+      timeout: 70000,
+    });

334-355: Conditional assertion doesn't fail on unexpected access.

Lines 334-341 log a warning if namespace B is unexpectedly visible but don't fail the test. The actual access verification happens via cy.exec() on lines 347-352, which is good, but the UI check should either be removed or made to fail if unexpected access is detected.

       // Namespace B should NOT be visible in the dropdown (no permissions)
       cy.get('body').then(($body) => {
         if ($body.text().includes(testNamespaceB)) {
           // If somehow visible, it's an error - user shouldn't see namespaces they don't have access to
-          cy.log('⚠️ WARNING: User can see namespace B when they should not have access');
+          throw new Error(`Security issue: User can see namespace ${testNamespaceB} when they should not have access`);
         } else {
           cy.log('✅ Correctly not showing namespace B (no permissions)');
         }
       });
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 4f1b842 and b97bafd.

📒 Files selected for processing (2)
  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts (1 hunks)
  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts
  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts
🧬 Code graph analysis (1)
frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts (1)
frontend/packages/integration-tests-cypress/support/index.ts (1)
  • checkErrors (84-90)
🔇 Additional comments (4)
frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts (1)

1-485: Comprehensive smoke test suite covering critical paths.

The smoke tests provide good coverage of the impersonation feature's critical paths: modal interactions, user impersonation, group selection, banner persistence, and cleanup. The mocked data tests (lines 209-328) ensure deterministic UI validation. The documentation blocks clearly communicate test scope and expectations.

frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts (3)

250-273: Helper functions improve readability and reduce duplication.

The startImpersonation and stopImpersonation helper functions (lines 250-281) effectively encapsulate the repeated UI interactions for impersonation flows. This is good practice for test maintainability.


544-567: API verification with multiple groups provides strong RBAC validation.

The test on lines 544-567 effectively validates combined group permissions by testing API access to all three namespaces with the correct --as-group flags. This provides reliable verification that the multi-group impersonation is working at the API level, not just in the UI.


1-750: Well-structured E2E test suite with comprehensive RBAC coverage.

The test suite provides thorough coverage of the multi-group impersonation feature:

  • Real resource creation/cleanup for authentic RBAC testing
  • Single and multi-group permission verification
  • Edge cases (special characters, empty groups)
  • Both UI and API-level validation

The test organization into logical describe blocks (Single Group, Multi-Group, Search/Filter, Edge Cases) improves maintainability and makes test failures easier to diagnose.

Comment on lines 127 to 133
// Navigate to Build > Builds
cy.clickNavLink(['Builds', 'BuildConfigs']);
cy.wait(1500);

// Verify banner still persists on Nodes page
cy.contains('.pf-v6-c-banner', 'You are impersonating').should('be.visible');
cy.contains('smoke-test-user').should('be.visible');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Comment says "Nodes page" but code navigates to "BuildConfigs".

The comment on line 131 says "Verify banner still persists on Nodes page" but the navigation on line 128 goes to ['Builds', 'BuildConfigs']. This misleading comment could confuse future maintainers.

     // Navigate to Build > Builds
     cy.clickNavLink(['Builds', 'BuildConfigs']);
     cy.wait(1500);
 
-    // Verify banner still persists on Nodes page
+    // Verify banner still persists on BuildConfigs page
     cy.contains('.pf-v6-c-banner', 'You are impersonating').should('be.visible');
🤖 Prompt for AI Agents
In
frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts
around lines 127 to 133, the inline comment says "Nodes page" but the test
navigates to ['Builds', 'BuildConfigs']; update the comment to accurately
describe the destination (e.g., "Verify banner still persists on BuildConfigs
page") or, if the intent was to check the Nodes page, change the navigation call
to the correct nav path (e.g., ['Infrastructure', 'Nodes']) so the comment and
navigation match.

Comment on lines 413 to 414
// Verify tooltip shows both groups
cy.get('[role="tooltip"]', { timeout: 5000 })
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Comment says "Navigate to Compute > Nodes" but navigates to "Builds > BuildConfigs".

Same issue as in the smoke test file - the comment doesn't match the actual navigation.

-    // Navigate to Compute > Nodes
+    // Navigate to Builds > BuildConfigs
     cy.clickNavLink(['Builds', 'BuildConfigs']);

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts
around lines 413-414, the inline comment says "Navigate to Compute > Nodes" but
the test actually navigates to "Builds > BuildConfigs"; update the comment to
accurately reflect the navigation (e.g., "Navigate to Builds > BuildConfigs") or
if the test should go to Compute > Nodes, change the navigation code/selectors
to perform that navigation instead—make the comment and the navigation
consistent.

…mpersonation button is clicked: since after staritng the impersonation, the modal might show up and blocking the test
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts (1)

405-427: Reduce coupling to PF CSS classes / literal copy and avoid fixed cy.wait where possible

Across this file (e.g., here and in the group‑chip checks), the tests rely on:

  • PatternFly CSS classes like .pf-v6-c-banner, .pf-v6-c-label, .pf-v6-c-menu__list(-item).
  • Literal UI text like 'You are impersonating', 'with groups:', and 'No results found'.
  • Fixed cy.wait(...) calls after interactions.

This works but is brittle: PF upgrades or minor copy/i18n changes will break tests, and hard waits can both slow the suite and still be flaky under load.

When you iterate on this suite, consider:

  • Prefer data-test / data-test-id selectors on key elements (banner, group chips, menus) instead of PF CSS classes and visible strings.
  • Where feasible, replace cy.wait(...) with event‑driven waits (e.g., should('be.visible'), checking for table rows, dropdown menus, or spinner disappearance) so Cypress’ retry logic handles timing.
  • Reserve text assertions for semantics you explicitly want to lock in (e.g., banner presence), and still back them with more stable attributes if available.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between b97bafd and ff89345.

📒 Files selected for processing (2)
  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts (1 hunks)
  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user-smoke.cy.ts
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts
🧬 Code graph analysis (1)
frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts (3)
frontend/packages/integration-tests-cypress/support/index.ts (1)
  • checkErrors (84-90)
frontend/public/components/RBAC/rules.jsx (1)
  • groups (58-58)
frontend/packages/integration-tests-cypress/views/nav.ts (1)
  • nav (6-105)
🔇 Additional comments (1)
frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts (1)

25-199: Comprehensive RBAC coverage and setup/teardown look solid

The end‑to‑end flow (cluster setup via oc, impersonation helpers, and the set of scenarios across single/multi‑group, search, selection, persistence, and edge cases) is well structured and matches the multi‑group impersonation feature’s intent. The global setup/cleanup and checkErrors hook should keep these tests reliable in CI.

Also applies to: 283-749

Comment on lines 333 to 352
// Namespace B should NOT be visible in the dropdown (no permissions)
cy.get('body').then(($body) => {
if ($body.text().includes(testNamespaceB)) {
// If somehow visible, it's an error - user shouldn't see namespaces they don't have access to
cy.log('⚠️ WARNING: User can see namespace B when they should not have access');
} else {
cy.log('✅ Correctly not showing namespace B (no permissions)');
}
});

// Close dropdown
cy.get('body').click(0, 0);

// Verify via API that user has no access to namespace B
cy.exec(`oc get pods -n ${testNamespaceB} --as=${testUser} --as-group=${testGroupA}`, {
failOnNonZeroExit: false,
}).then((result) => {
expect(result.code).to.not.equal(0);
expect(result.stderr).to.include('cannot list resource "pods"');
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Make namespace‑B visibility an assertion, not just a log

In the "should NOT have access to namespace B" test, the UI check only logs a warning when namespace B is visible:

cy.get('body').then(($body) => {
  if ($body.text().includes(testNamespaceB)) {
    // If somehow visible, it's an error - user shouldn't see namespaces they don't have access to
    cy.log('⚠️ WARNING: User can see namespace B when they should not have access');
  } else {
    cy.log('✅ Correctly not showing namespace B (no permissions)');
  }
});

This never fails the test on that condition; only the later oc call can fail it. Given both the test name and comment, this should be an assertion.

You can make the intent enforceable with something like:

-      cy.get('body').then(($body) => {
-        if ($body.text().includes(testNamespaceB)) {
-          // If somehow visible, it's an error - user shouldn't see namespaces they don't have access to
-          cy.log('⚠️ WARNING: User can see namespace B when they should not have access');
-        } else {
-          cy.log('✅ Correctly not showing namespace B (no permissions)');
-        }
-      });
+      cy.get('body').then(($body) => {
+        const bodyText = $body.text();
+        // Namespace B must not be visible in the dropdown
+        expect(bodyText.includes(testNamespaceB)).to.be.false;
+      });

(or equivalently, use cy.contains(testNamespaceB).should('not.exist') scoped to the dropdown container).

🤖 Prompt for AI Agents
frontend/packages/integration-tests-cypress/tests/app/impersonate-user.cy.ts
around lines 333 to 352: the test currently only logs a warning when namespace B
is visible instead of asserting it must not be visible, so replace the
conditional cy.get('body').then(...) logging block with a real Cypress assertion
that namespace B is not present in the dropdown (e.g., scope to the dropdown
element and use a negative assertion like contains(...).should('not.exist') or
should('not.be.visible')), preserving the subsequent click to close the dropdown
and the existing API verification.

@jhadvig
Copy link
Member

jhadvig commented Nov 25, 2025

--- FAIL: TestAsyncCache (4.00s)

/retest backend

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 25, 2025

@jhadvig: The /retest command does not accept any targets.
The following commands are available to trigger required jobs:

/test analyze
/test backend
/test e2e-gcp-console
/test frontend
/test images
/test okd-scos-images

The following commands are available to trigger optional jobs:

/test okd-scos-e2e-aws-ovn

Use /test all to run the following jobs that were automatically triggered:

pull-ci-openshift-console-main-analyze
pull-ci-openshift-console-main-backend
pull-ci-openshift-console-main-e2e-gcp-console
pull-ci-openshift-console-main-frontend
pull-ci-openshift-console-main-images
pull-ci-openshift-console-main-okd-scos-images
Details

In response to this:

--- FAIL: TestAsyncCache (4.00s)

/retest backend

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@jhadvig
Copy link
Member

jhadvig commented Nov 25, 2025

/test backend

@jhadvig
Copy link
Member

jhadvig commented Nov 25, 2025

Per discussion with @Leo6Leo and @yapei the e2e tests will be delivered as a follow up due to the massive flakiness of the Guided Tour step.
/lgtm

@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Nov 25, 2025
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 25, 2025

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jhadvig, jseseCCS, Leo6Leo, logonoff, TheRealJon

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 25, 2025

@Leo6Leo: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/okd-scos-e2e-aws-ovn aedd7c2 link false /test okd-scos-e2e-aws-ovn

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@Leo6Leo
Copy link
Contributor Author

Leo6Leo commented Nov 25, 2025

/retest-required
Another flaky cypress test appearing

@Leo6Leo
Copy link
Contributor Author

Leo6Leo commented Nov 26, 2025

/verified by @yapei
The verified label was removed due to the new commit that removes the flaky cypress tests. Horray all tests passed now.

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Nov 26, 2025
@openshift-ci-robot
Copy link
Contributor

@Leo6Leo: This PR has been marked as verified by @yapei.

Details

In response to this:

/verified by @yapei
The verified label was removed due to the new commit that removes the flaky cypress tests. Horray all tests passed now.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@kevinhatchoua
Copy link

@Leo6Leo Thanks for sharing the demo and highlighting the various scenarios.

  1. I think it makes sense to redirect users to the project list page as this will allow them see what projects the impersonated user/group have access to.

  2. @allison Wolfe’s proposal sounds good to me 😄.

  3. Let's default to the current pattern we use for modals (https://www.patternfly.org/components/modal) The primary action (Impersonate) should have the PF primary button component and Cancel should be link button. There may be different variations of this in the Console, but our latest PF guidelines are as in the link I shared.

Hope this helps. Thank you!

@Leo6Leo
Copy link
Contributor Author

Leo6Leo commented Jan 13, 2026

The follow up PR to fix all the issues mentioned in this PR is opened: #15916

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. component/backend Related to backend component/core Related to console core functionality component/olm Related to OLM component/sdk Related to console-plugin-sdk component/shared Related to console-shared docs-approved Signifies that Docs has signed off on this PR jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. kind/cypress Related to Cypress e2e integration testing kind/i18n Indicates issue or PR relates to internationalization or has content that needs to be translated lgtm Indicates that a PR is ready to be merged. plugin-api-approved Indicates a PR with plugin API changes has been approved by an API reviewer px-approved Signifies that Product Support has signed off on this PR tide/merge-method-squash Denotes a PR that should be squashed by tide when it merges. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants