Skip to content

feat(rbac): WorkloadGroup 소유자 기반 update/delete 권한 (AIP-3518) - #128

Merged
taehyeong10 merged 1 commit into
developfrom
feat/AIP-3518
Oct 15, 2026
Merged

taehyeong10 merged 1 commit into
developfrom
feat/AIP-3518

Conversation

@taehyeong10

@taehyeong10 taehyeong10 commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • WorkloadGroup(aipub.ten1010.io/v1alpha1, namespaced) 을 FileServer 와 같은 소유권/RBAC 경로에 추가
  • 프로젝트 developer 는 create/get/watch/list, manager 는 *, 수정/삭제는 생성자 본인의 AipubUser Role 에 resourceName 단위로만 부여
  • 소유자 라벨 변경(transfer) 시 구·신 소유자 Role 이 즉시 재조정되도록 watch 연결
  • 관련 티켓: AIP-3518

Changes

  • 도메인 상수/DTO: ProjectApiConstants 에 workloadgroups kind/plural 추가, V1alpha1WorkloadGroup(+List) 신규 (metadata 만 담아 CRD 스키마 비의존)
  • API/인포머: K8sApiProvider 에 GenericKubernetesApi, SharedInformerFactoryProvider 에 namespace 인덱서 인포머 등록
  • RBAC: ReconciliationService.reconcileProjectRoleRules 에 manager * / developer BASIC_VERBS 규칙 추가, WorkloadResourceResolver 에 kind 매핑 + instanceof 폴백
  • 리컨실러: AipubUserRoleReconciler per-user 워크로드 목록에 workloadgroups 포함, AipubUserRoleControllerFactory readyFunc/watch 연결, OnUpdateFilterFactory/RequestBuilderFactory 필터·요청 빌더 추가
  • 테스트: ReconciliationServiceWorkloadGroupRulesTest 6건, WorkloadGroupOwnerTransferWatchTest 5건

웹훅 rule·컨트롤러 ClusterRole 은 변경 없음 — namespaced CR 은 기존 aipub.ten1010.io * rule 이 커버하고, 컨트롤러 ClusterRole 은 와일드카드

🔍 여기만은 꼭 봐주세요

  • ReconciliationService developer 분기의 workloadgroups 규칙이 BASIC_VERBS 인지 — 여기에 update/delete 가 들어가면 같은 프로젝트의 다른 멤버가 남의 WorkloadGroup 을 지울 수 있다
  • WorkloadResourceResolver 의 instanceof V1alpha1WorkloadGroup 폴백 — 인포머 list 단계에서 kind 가 비어 오는 경우 per-user Role 규칙이 누락되지 않게 하는 장치

Test plan

  • ./gradlew compileJava compileTestJava test
  • kubectl get role -n <proj> -o yaml | grep -A3 workloadgroups 로 developer 는 create/get/watch/list, manager 는 * 확인
  • developer 계정으로 WorkloadGroup 생성 후 kubectl auth can-i delete workloadgroups/<name> -n <proj> --as=oidc:<user> 가 본인은 yes, 다른 developer 는 no
  • aipub.ten1010.io/username 라벨을 다른 사용자로 바꾼 뒤 구 소유자의 delete 가 즉시 no 로 바뀌는지 확인

🚀 Release Version

v5.2.0

같은 namespace 의 WorkloadGroup(aipub.ten1010.io/v1alpha1, namespaced)에 대해
모든 프로젝트 멤버가 create/get/watch/list 가능하도록 project Role 규칙을 추가하고,
수정/삭제(update/patch/delete)는 생성자 본인(AipubUser per-user Role, resourceName
단위) 또는 project manager(*)에게만 부여한다. FileServer(#110)와 동일한 계약이다.

- ProjectApiConstants: workloadgroups kind/plural 상수 추가
- V1alpha1WorkloadGroup(+List) DTO, K8sApiProvider/informer 등록
- reconcileProjectRoleRules: MANAGER `*` / DEVELOPER BASIC_VERBS 규칙 추가
- AipubUserRoleReconciler: per-user 소유 워크로드 목록에 workloadgroups 포함
- WorkloadResourceResolver: WorkloadGroup → workloadgroups 매핑 + instanceof 폴백
- WorkloadGroup watch wiring (OnUpdateFilter/RequestBuilder/ControllerFactory)
- 단위 테스트 11건 추가 (Role 규칙 6건, 소유자 이전 watch 5건)

소유자 라벨은 user-v2 mutating webhook 이 namespaced CREATE 에 주입하므로 웹훅
rule 변경은 없다. 컨트롤러 ClusterRole 은 와일드카드라 인포머 권한도 그대로다.
DTO 는 metadata 만 담아 CRD 스키마에 의존하지 않는다.

검증: ./gradlew build — 전체 56 스위트 통과

Refs: AIP-3518
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@taehyeong10
taehyeong10 merged commit 772c9a6 into develop Oct 15, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant