Skip to content

Commit 2d4212f

Browse files
committed
refactor: fail early when no tier mapping configmap is found
Previously, missing tier mapping configmaps were silently defaulted to `free`, which could mislead users and hide configuration issues. By failing fast, users are immediately informed of the problem and can correct it, avoiding confusion and unintended behavior. The component now explicitly fails when the configmap is missing instead of falling back to the `free` tier. Signed-off-by: Bartosz Majsak <bartosz.majsak@gmail.com>
1 parent e315444 commit 2d4212f

File tree

2 files changed

+23
-26
lines changed

2 files changed

+23
-26
lines changed

maas-api/internal/tier/mapper.go

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,6 @@ import (
1717
"k8s.io/apimachinery/pkg/api/errors"
1818
)
1919

20-
var defaultTier = Tier{
21-
Name: "free",
22-
Level: 0,
23-
Groups: []string{
24-
"system:authenticated",
25-
},
26-
}
27-
2820
// Mapper handles tier-to-group mapping lookups
2921
type Mapper struct {
3022
tenantName string
@@ -38,22 +30,19 @@ func NewMapper(clientset kubernetes.Interface, tenantName, namespace string) *Ma
3830
}
3931
}
4032

41-
func (m *Mapper) Namespaces(ctx context.Context) map[string]string {
33+
func (m *Mapper) Namespace(ctx context.Context, tier string) (string, error) {
4234
tiers, err := m.loadTierConfig(ctx)
4335
if err != nil {
44-
if errors.IsNotFound(err) {
45-
tiers = []Tier{defaultTier}
46-
}
36+
return "", err
4737
}
4838

49-
namespaces := make(map[string]string, len(tiers))
50-
5139
for i := range tiers {
52-
tier := &tiers[i]
53-
namespaces[tier.Name] = m.projectedNsName(tier)
40+
if tiers[i].Name == tier {
41+
return m.ProjectedNsName(&tiers[i]), nil
42+
}
5443
}
5544

56-
return namespaces
45+
return "", fmt.Errorf("tier %s not found", tier)
5746
}
5847

5948
// GetTierForGroups returns the highest level tier for a user with multiple group memberships.
@@ -90,6 +79,15 @@ func (m *Mapper) GetTierForGroups(ctx context.Context, groups ...string) (string
9079
return "", &GroupNotFoundError{Group: fmt.Sprintf("groups [%s]", strings.Join(groups, ", "))}
9180
}
9281

82+
// ProjectedSAGroup returns the projected SA group for a tier.
83+
func (m *Mapper) ProjectedSAGroup(tier *Tier) string {
84+
return fmt.Sprintf("system:serviceaccounts:%s", m.ProjectedNsName(tier))
85+
}
86+
87+
func (m *Mapper) ProjectedNsName(tier *Tier) string {
88+
return fmt.Sprintf("%s-tier-%s", m.tenantName, tier.Name)
89+
}
90+
9391
func (m *Mapper) loadTierConfig(ctx context.Context) ([]Tier, error) {
9492
cm, err := m.configMapClient.Get(ctx, constant.TierMappingConfigMap, metav1.GetOptions{})
9593
if err != nil {
@@ -109,12 +107,8 @@ func (m *Mapper) loadTierConfig(ctx context.Context) ([]Tier, error) {
109107

110108
for i := range tiers {
111109
tier := &tiers[i]
112-
tier.Groups = append(tier.Groups, fmt.Sprintf("system:serviceaccounts:%s", m.projectedNsName(tier)))
110+
tier.Groups = append(tier.Groups, m.ProjectedSAGroup(tier))
113111
}
114112

115113
return tiers, nil
116114
}
117-
118-
func (m *Mapper) projectedNsName(tier *Tier) string {
119-
return fmt.Sprintf("%s-tier-%s", m.tenantName, tier.Name)
120-
}

maas-api/internal/token/manager.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ func (m *Manager) RevokeTokens(ctx context.Context, user *UserContext) error {
8484
return fmt.Errorf("failed to determine user tier for %s: %w", user.Username, err)
8585
}
8686

87-
namespace := m.tierMapper.Namespaces(ctx)[userTier]
87+
namespace, errNS := m.tierMapper.Namespace(ctx, userTier)
88+
if errNS != nil {
89+
return fmt.Errorf("failed to determine namespace for user %s: %w", user.Username, errNS)
90+
}
8891

8992
saName, errName := m.sanitizeServiceAccountName(user.Username)
9093
if errName != nil {
@@ -117,9 +120,9 @@ func (m *Manager) RevokeTokens(ctx context.Context, user *UserContext) error {
117120
// ensureTierNamespace creates a tier-based namespace if it doesn't exist.
118121
// It takes a tier name, formats it as {instance}-tier-{tier}, and returns the namespace name.
119122
func (m *Manager) ensureTierNamespace(ctx context.Context, tier string) (string, error) {
120-
namespace := m.tierMapper.Namespaces(ctx)[tier]
121-
if namespace == "" {
122-
return "", fmt.Errorf("no namespace mapping found for tier %q", tier)
123+
namespace, errNs := m.tierMapper.Namespace(ctx, tier)
124+
if errNs != nil {
125+
return "", fmt.Errorf("failed to determine namespace for tier %q: %w", tier, errNs)
123126
}
124127

125128
_, err := m.namespaceLister.Get(namespace)

0 commit comments

Comments
 (0)