Skip to content

Commit 3049a56

Browse files
authored
fix: Use the maximum number of users for a license warning (coder#4410)
This was causing a banner on dev.coder.com. But now we have a test!
1 parent 915bb41 commit 3049a56

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

cli/cliui/table.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ func DisplayTable(out any, sort string, filterColumns []string) (string, error)
158158
if val != nil {
159159
v = val.Format(time.RFC3339)
160160
}
161+
case *int64:
162+
if val != nil {
163+
v = *val
164+
}
161165
case fmt.Stringer:
162166
if val != nil {
163167
v = val.String()

enterprise/coderd/license/license.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,17 @@ func Entitlements(ctx context.Context, db database.Store, logger slog.Logger, ke
6060
entitlement = codersdk.EntitlementGracePeriod
6161
}
6262
if claims.Features.UserLimit > 0 {
63+
limit := claims.Features.UserLimit
64+
priorLimit := entitlements.Features[codersdk.FeatureUserLimit]
65+
if priorLimit.Limit != nil && *priorLimit.Limit > limit {
66+
limit = *priorLimit.Limit
67+
}
6368
entitlements.Features[codersdk.FeatureUserLimit] = codersdk.Feature{
6469
Enabled: true,
6570
Entitlement: entitlement,
66-
Limit: &claims.Features.UserLimit,
71+
Limit: &limit,
6772
Actual: &activeUserCount,
6873
}
69-
if activeUserCount > claims.Features.UserLimit {
70-
entitlements.Warnings = append(entitlements.Warnings, fmt.Sprintf(
71-
"Your deployment has %d active users but is only licensed for %d.",
72-
activeUserCount, claims.Features.UserLimit))
73-
}
7474
}
7575
if claims.Features.AuditLog > 0 {
7676
entitlements.Features[codersdk.FeatureAuditLog] = codersdk.Feature{
@@ -114,6 +114,13 @@ func Entitlements(ctx context.Context, db database.Store, logger slog.Logger, ke
114114
}
115115

116116
if entitlements.HasLicense {
117+
userLimit := entitlements.Features[codersdk.FeatureUserLimit].Limit
118+
if userLimit != nil && activeUserCount > *userLimit {
119+
entitlements.Warnings = append(entitlements.Warnings, fmt.Sprintf(
120+
"Your deployment has %d active users but is only licensed for %d.",
121+
activeUserCount, *userLimit))
122+
}
123+
117124
for _, featureName := range codersdk.FeatureNames {
118125
// The user limit has it's own warnings!
119126
if featureName == codersdk.FeatureUserLimit {

enterprise/coderd/license/license_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,28 @@ func TestEntitlements(t *testing.T) {
141141
require.True(t, entitlements.HasLicense)
142142
require.Contains(t, entitlements.Warnings, "Your deployment has 2 active users but is only licensed for 1.")
143143
})
144+
t.Run("MaximizeUserLimit", func(t *testing.T) {
145+
t.Parallel()
146+
db := databasefake.New()
147+
db.InsertUser(context.Background(), database.InsertUserParams{})
148+
db.InsertUser(context.Background(), database.InsertUserParams{})
149+
db.InsertLicense(context.Background(), database.InsertLicenseParams{
150+
JWT: coderdenttest.GenerateLicense(t, coderdenttest.LicenseOptions{
151+
UserLimit: 10,
152+
}),
153+
Exp: time.Now().Add(time.Hour),
154+
})
155+
db.InsertLicense(context.Background(), database.InsertLicenseParams{
156+
JWT: coderdenttest.GenerateLicense(t, coderdenttest.LicenseOptions{
157+
UserLimit: 1,
158+
}),
159+
Exp: time.Now().Add(time.Hour),
160+
})
161+
entitlements, err := license.Entitlements(context.Background(), db, slog.Logger{}, coderdenttest.Keys, map[string]bool{})
162+
require.NoError(t, err)
163+
require.True(t, entitlements.HasLicense)
164+
require.Empty(t, entitlements.Warnings)
165+
})
144166
t.Run("MultipleLicenseEnabled", func(t *testing.T) {
145167
t.Parallel()
146168
db := databasefake.New()

0 commit comments

Comments
 (0)