Skip to content

Commit 2bd84bb

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 2bd84bb

3 files changed

Lines changed: 17 additions & 4 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: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,16 @@ func (m *Mapper) Namespaces(ctx context.Context) map[string]string {
5252
namespaces := make(map[string]string, len(tiers))
5353

5454
for _, tier := range tiers {
55-
namespaces[tier.Name] = fmt.Sprintf("%s-tier-%s", m.tenantName, tier.Name)
55+
namespaces[tier.Name] = m.projectedNsName(tier)
5656
}
5757

5858
return namespaces
5959
}
6060

61+
func (m *Mapper) projectedNsName(tier Tier) string {
62+
return fmt.Sprintf("%s-tier-%s", m.tenantName, tier.Name)
63+
}
64+
6165
// GetTierForGroups returns the highest level tier for a user with multiple group memberships.
6266
//
6367
// Returns error if no groups provided or no groups found in any tier.
@@ -67,6 +71,7 @@ func (m *Mapper) GetTierForGroups(ctx context.Context, groups ...string) (string
6771
return "", fmt.Errorf("no groups provided")
6872
}
6973

74+
// system:serviceaccount:openshift-ai-inference-tier-enterprise
7075
tiers, err := m.loadTierConfig(ctx)
7176
if err != nil {
7277
if errors.IsNotFound(err) {
@@ -109,5 +114,10 @@ func (m *Mapper) loadTierConfig(ctx context.Context) ([]Tier, error) {
109114
return nil, fmt.Errorf("failed to parse tier configuration: %w", err)
110115
}
111116

117+
for i := range tiers {
118+
tier := &tiers[i]
119+
tier.Groups = append(tier.Groups, fmt.Sprintf("system:serviceaccount:%s", m.projectedNsName(*tier)))
120+
}
121+
112122
return tiers, nil
113123
}

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)