Skip to content

Commit 95933f4

Browse files
committed
feat: infer service account groups for tenant tiers dynamically
Service account groups were expected to be defined in the config, making tenant-specific namespace projections less flexible. This change ensures that tier-related service accounts are inferred automatically per tenant, reducing manual config and potential drift. - Removed hardcoded service account group mappings from the dev overlay configmap - Added dynamic projection of service account groups in tier mapper - Extended test coverage to validate group inference for free tier service accounts Signed-off-by: Bartosz Majsak <bartosz.majsak@gmail.com>
1 parent b2f7bb3 commit 95933f4

3 files changed

Lines changed: 19 additions & 5 deletions

File tree

maas-api/deploy/overlays/dev/resources/tier-mapping-configmap.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,14 @@ data:
99
level: 1
1010
groups:
1111
- system:authenticated
12-
- system:serviceaccount:openshift-ai-inference-tier-free
1312
- name: premium
1413
description: Premium tier for paying customers
1514
level: 10
1615
groups:
17-
- system:serviceaccount:openshift-ai-inference-tier-premium
1816
- premium-users
1917
- name: enterprise
2018
description: Enterprise tier for corporate customers
2119
level: 20
2220
groups:
23-
- system:serviceaccount:openshift-ai-inference-tier-enterprise
2421
- enterprise-users
2522
- admin-users

maas-api/internal/tier/mapper.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ func (m *Mapper) Namespaces(ctx context.Context) map[string]string {
5151

5252
namespaces := make(map[string]string, len(tiers))
5353

54-
for _, tier := range tiers {
55-
namespaces[tier.Name] = fmt.Sprintf("%s-tier-%s", m.tenantName, tier.Name)
54+
for i := range tiers {
55+
tier := &tiers[i]
56+
namespaces[tier.Name] = m.projectedNsName(tier)
5657
}
5758

5859
return namespaces
@@ -67,6 +68,7 @@ func (m *Mapper) GetTierForGroups(ctx context.Context, groups ...string) (string
6768
return "", fmt.Errorf("no groups provided")
6869
}
6970

71+
// system:serviceaccount:openshift-ai-inference-tier-enterprise
7072
tiers, err := m.loadTierConfig(ctx)
7173
if err != nil {
7274
if errors.IsNotFound(err) {
@@ -109,5 +111,14 @@ func (m *Mapper) loadTierConfig(ctx context.Context) ([]Tier, error) {
109111
return nil, fmt.Errorf("failed to parse tier configuration: %w", err)
110112
}
111113

114+
for i := range tiers {
115+
tier := &tiers[i]
116+
tier.Groups = append(tier.Groups, fmt.Sprintf("system:serviceaccount:%s", m.projectedNsName(tier)))
117+
}
118+
112119
return tiers, nil
113120
}
121+
122+
func (m *Mapper) projectedNsName(tier *Tier) string {
123+
return fmt.Sprintf("%s-tier-%s", m.tenantName, tier.Name)
124+
}

maas-api/internal/tier/mapper_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ func TestMapper_GetTierForGroups(t *testing.T) {
3838
expectedTier: "free",
3939
description: "User belongs to only free tier group",
4040
},
41+
{
42+
name: "inferred SA group - free tier",
43+
groups: []string{"system:serviceaccount:test-tenant-tier-free"},
44+
expectedTier: "free",
45+
description: "User belongs to only free tier group",
46+
},
4147
{
4248
name: "single group - premium tier",
4349
groups: []string{"premium-users"},

0 commit comments

Comments
 (0)