diff --git a/frontend/src/__tests__/cypress/cypress/tests/mocked/modelRegistrySettings/modelRegistryPermissions.cy.ts b/frontend/src/__tests__/cypress/cypress/tests/mocked/modelRegistrySettings/modelRegistryPermissions.cy.ts index 95f9a1ee0c..885f41d2a9 100644 --- a/frontend/src/__tests__/cypress/cypress/tests/mocked/modelRegistrySettings/modelRegistryPermissions.cy.ts +++ b/frontend/src/__tests__/cypress/cypress/tests/mocked/modelRegistrySettings/modelRegistryPermissions.cy.ts @@ -101,7 +101,7 @@ describe('MR Permissions', () => { cy.findByTestId('not-found-page').should('exist'); }); - it('Redirect if no rolebindings (if valid MR, there will at least be a default)', () => { + it('redirect if no modelregistry', () => { initIntercepts({ isEmpty: true }); usersTab.visit('example-mr'); cy.url().should('eq', `${Cypress.config().baseUrl}/modelRegistrySettings`); diff --git a/frontend/src/api/k8s/roleBindings.ts b/frontend/src/api/k8s/roleBindings.ts index defc960686..7805523b5b 100644 --- a/frontend/src/api/k8s/roleBindings.ts +++ b/frontend/src/api/k8s/roleBindings.ts @@ -6,6 +6,7 @@ import { k8sListResource, k8sPatchResource, K8sStatus, + K8sResourceCommon, } from '@openshift/dynamic-plugin-sdk-utils'; import { K8sAPIOptions, @@ -18,7 +19,7 @@ import { RoleBindingModel } from '~/api/models'; import { genRandomChars } from '~/utilities/string'; import { applyK8sAPIOptions } from '~/api/apiMergeUtils'; import { RoleBindingPermissionsRoleType } from '~/concepts/roleBinding/types'; -import { addOwnerReference } from '../k8sUtils'; +import { addOwnerReference } from '~/api/k8sUtils'; export const generateRoleBindingServingRuntime = ( name: string, @@ -60,13 +61,8 @@ export const generateRoleBindingPermissions = ( [KnownLabels.DASHBOARD_RESOURCE]: 'true', [KnownLabels.PROJECT_SHARING]: 'true', }, + ownerReference?: K8sResourceCommon, ): RoleBindingKind => { - const roleRef = { - apiGroup: 'rbac.authorization.k8s.io', - apiVersion: 'rbac.authorization.k8s.io/v1', - kind: rbRoleRefKind, - name: rbRoleRefName, - }; const roleBindingObject: RoleBindingKind = { apiVersion: 'rbac.authorization.k8s.io/v1', kind: 'RoleBinding', @@ -75,7 +71,11 @@ export const generateRoleBindingPermissions = ( namespace, labels: rbLabels, }, - roleRef: roleRef, + roleRef: { + apiGroup: 'rbac.authorization.k8s.io', + kind: rbRoleRefKind, + name: rbRoleRefName, + }, subjects: [ { apiGroup: 'rbac.authorization.k8s.io', @@ -84,7 +84,7 @@ export const generateRoleBindingPermissions = ( }, ], }; - return addOwnerReference(roleBindingObject, roleRef); + return addOwnerReference(roleBindingObject, ownerReference); }; export const listRoleBindings = ( diff --git a/frontend/src/concepts/roleBinding/RoleBindingPermissions.tsx b/frontend/src/concepts/roleBinding/RoleBindingPermissions.tsx index aa8e31a4b1..105f7d98d1 100644 --- a/frontend/src/concepts/roleBinding/RoleBindingPermissions.tsx +++ b/frontend/src/concepts/roleBinding/RoleBindingPermissions.tsx @@ -11,6 +11,7 @@ import { EmptyStateHeader, } from '@patternfly/react-core'; import { ExclamationCircleIcon } from '@patternfly/react-icons'; +import { K8sResourceCommon } from '@openshift/dynamic-plugin-sdk-utils'; import { GroupKind, RoleBindingKind, RoleBindingRoleRef } from '~/k8sTypes'; import { ProjectSectionID } from '~/pages/projects/screens/detail/types'; import { ContextResourceData } from '~/types'; @@ -19,6 +20,7 @@ import { RoleBindingPermissionsRBType, RoleBindingPermissionsRoleType } from './ import { filterRoleBindingSubjects } from './utils'; type RoleBindingPermissionsProps = { + ownerReference?: K8sResourceCommon; roleBindingPermissionsRB: ContextResourceData; defaultRoleBindingName?: string; permissionOptions: { @@ -35,6 +37,7 @@ type RoleBindingPermissionsProps = { }; const RoleBindingPermissions: React.FC = ({ + ownerReference, roleBindingPermissionsRB, defaultRoleBindingName, permissionOptions, @@ -84,6 +87,7 @@ const RoleBindingPermissions: React.FC = ({ const userTable = ( = ({ const groupTable = ( = ({ + ownerReference, subjectKind, namespace, roleRefKind, @@ -65,6 +68,7 @@ const RoleBindingPermissionsTable: React.FC = roleRefName || rbRoleRefName, roleRefKind, labels, + ownerReference, ); createRoleBinding(newRBObject) .then(() => { @@ -96,6 +100,7 @@ const RoleBindingPermissionsTable: React.FC = roleRefName || rbRoleRefName, roleRefKind, labels, + ownerReference, ); createRoleBinding(newRBObject) .then(() => diff --git a/frontend/src/concepts/roleBinding/RoleBindingPermissionsTableSection.tsx b/frontend/src/concepts/roleBinding/RoleBindingPermissionsTableSection.tsx index 46e823e663..a79143ba52 100644 --- a/frontend/src/concepts/roleBinding/RoleBindingPermissionsTableSection.tsx +++ b/frontend/src/concepts/roleBinding/RoleBindingPermissionsTableSection.tsx @@ -10,6 +10,7 @@ import { StackItem, Title, } from '@patternfly/react-core'; +import { K8sResourceCommon } from '@openshift/dynamic-plugin-sdk-utils'; import { RoleBindingKind, RoleBindingRoleRef, RoleBindingSubject } from '~/k8sTypes'; import HeaderIcon from '~/concepts/design/HeaderIcon'; import { ProjectObjectType } from '~/concepts/design/utils'; @@ -17,6 +18,7 @@ import RoleBindingPermissionsTable from './RoleBindingPermissionsTable'; import { RoleBindingPermissionsRBType, RoleBindingPermissionsRoleType } from './types'; export type RoleBindingPermissionsTableSectionAltProps = { + ownerReference?: K8sResourceCommon; roleBindings: RoleBindingKind[]; projectName: string; roleRefKind: RoleBindingRoleRef['kind']; @@ -34,6 +36,7 @@ export type RoleBindingPermissionsTableSectionAltProps = { }; const RoleBindingPermissionsTableSection: React.FC = ({ + ownerReference, roleBindings, projectName, roleRefKind, @@ -74,6 +77,7 @@ const RoleBindingPermissionsTableSection: React.FC { const [activeTabKey, setActiveTabKey] = React.useState('users'); + const [ownerReference, setOwnerReference] = React.useState(); const [groups] = useGroups(); const roleBindings = useContextResourceData(useModelRegistryRoleBindings()); const { mrName } = useParams(); + const state = useModelRegistryNamespaceCR(MODEL_REGISTRY_DEFAULT_NAMESPACE, mrName || ''); + const [modelRegistryCR, crLoaded] = state; const filteredRoleBindings = roleBindings.data.filter( (rb) => rb.metadata.labels?.['app.kubernetes.io/name'] === mrName, ); - if (roleBindings.loaded && filteredRoleBindings.length === 0) { + + React.useEffect(() => { + if (modelRegistryCR) { + setOwnerReference(modelRegistryCR); + } else { + setOwnerReference(undefined); + } + }, [modelRegistryCR]); + + if ( + (roleBindings.loaded && filteredRoleBindings.length === 0) || + (crLoaded && !modelRegistryCR) + ) { return ; } @@ -67,6 +83,7 @@ const ModelRegistriesManagePermissions: React.FC = () => {