@@ -739,6 +739,8 @@ func (api *API) updateEntitlements(ctx context.Context) error {
739
739
return codersdk.Entitlements {}, err
740
740
}
741
741
742
+ api .HasLicense = reloadedEntitlements .HasLicense
743
+
742
744
if reloadedEntitlements .RequireTelemetry && ! api .DeploymentValues .Telemetry .Enable .Value () {
743
745
api .Logger .Error (ctx , "license requires telemetry enabled" )
744
746
return codersdk.Entitlements {}, entitlements .ErrLicenseRequiresTelemetry
@@ -929,17 +931,9 @@ func (api *API) updateEntitlements(ctx context.Context) error {
929
931
}
930
932
reloadedEntitlements .Features [codersdk .FeatureExternalTokenEncryption ] = featureExternalTokenEncryption
931
933
932
- // If there's a license installed, we will use the enterprise build
933
- // limit checker.
934
- // This checker currently only enforces the managed agent limit.
935
- if reloadedEntitlements .HasLicense {
936
- var checker wsbuilder.UsageChecker = api
937
- api .AGPL .BuildUsageChecker .Store (& checker )
938
- } else {
939
- // Don't check any usage, just like AGPL.
940
- var checker wsbuilder.UsageChecker = wsbuilder.NoopUsageChecker {}
941
- api .AGPL .BuildUsageChecker .Store (& checker )
942
- }
934
+ // Always use the enterprise usage checker
935
+ var checker wsbuilder.UsageChecker = api
936
+ api .AGPL .BuildUsageChecker .Store (& checker )
943
937
944
938
return reloadedEntitlements , nil
945
939
})
@@ -948,10 +942,6 @@ func (api *API) updateEntitlements(ctx context.Context) error {
948
942
var _ wsbuilder.UsageChecker = & API {}
949
943
950
944
func (api * API ) CheckBuildUsage (ctx context.Context , store database.Store , templateVersion * database.TemplateVersion ) (wsbuilder.UsageCheckResponse , error ) {
951
- // We assume that if this function is called, a valid license is installed.
952
- // When there are no licenses installed, a noop usage checker is used
953
- // instead.
954
-
955
945
// If the template version has an external agent, we need to check that the
956
946
// license is entitled to this feature.
957
947
if templateVersion .HasExternalAgent .Valid && templateVersion .HasExternalAgent .Bool {
@@ -972,32 +962,35 @@ func (api *API) CheckBuildUsage(ctx context.Context, store database.Store, templ
972
962
}, nil
973
963
}
974
964
975
- // Otherwise , we need to check that we haven't breached the managed agent
965
+ // When unlicensed , we need to check that we haven't breached the managed agent
976
966
// limit.
977
- managedAgentLimit , ok := api .Entitlements .Feature (codersdk .FeatureManagedAgentLimit )
978
- if ! ok || ! managedAgentLimit .Enabled || managedAgentLimit .Limit == nil || managedAgentLimit .UsagePeriod == nil {
979
- return wsbuilder.UsageCheckResponse {
980
- Permitted : false ,
981
- Message : "Your license is not entitled to managed agents. Please contact sales to continue using managed agents." ,
982
- }, nil
983
- }
967
+ // Unlicensed deployments are allowed to use unlimited managed agents.
968
+ if api .HasLicense {
969
+ managedAgentLimit , ok := api .Entitlements .Feature (codersdk .FeatureManagedAgentLimit )
970
+ if ! ok || ! managedAgentLimit .Enabled || managedAgentLimit .Limit == nil || managedAgentLimit .UsagePeriod == nil {
971
+ return wsbuilder.UsageCheckResponse {
972
+ Permitted : false ,
973
+ Message : "Your license is not entitled to managed agents. Please contact sales to continue using managed agents." ,
974
+ }, nil
975
+ }
984
976
985
- // This check is intentionally not committed to the database. It's fine if
986
- // it's not 100% accurate or allows for minor breaches due to build races.
987
- // nolint:gocritic // Requires permission to read all workspaces to read managed agent count.
988
- managedAgentCount , err := store .GetManagedAgentCount (agpldbauthz .AsSystemRestricted (ctx ), database.GetManagedAgentCountParams {
989
- StartTime : managedAgentLimit .UsagePeriod .Start ,
990
- EndTime : managedAgentLimit .UsagePeriod .End ,
991
- })
992
- if err != nil {
993
- return wsbuilder.UsageCheckResponse {}, xerrors .Errorf ("get managed agent count: %w" , err )
994
- }
977
+ // This check is intentionally not committed to the database. It's fine if
978
+ // it's not 100% accurate or allows for minor breaches due to build races.
979
+ // nolint:gocritic // Requires permission to read all workspaces to read managed agent count.
980
+ managedAgentCount , err := store .GetManagedAgentCount (agpldbauthz .AsSystemRestricted (ctx ), database.GetManagedAgentCountParams {
981
+ StartTime : managedAgentLimit .UsagePeriod .Start ,
982
+ EndTime : managedAgentLimit .UsagePeriod .End ,
983
+ })
984
+ if err != nil {
985
+ return wsbuilder.UsageCheckResponse {}, xerrors .Errorf ("get managed agent count: %w" , err )
986
+ }
995
987
996
- if managedAgentCount >= * managedAgentLimit .Limit {
997
- return wsbuilder.UsageCheckResponse {
998
- Permitted : false ,
999
- Message : "You have breached the managed agent limit in your license. Please contact sales to continue using managed agents." ,
1000
- }, nil
988
+ if managedAgentCount >= * managedAgentLimit .Limit {
989
+ return wsbuilder.UsageCheckResponse {
990
+ Permitted : false ,
991
+ Message : "You have breached the managed agent limit in your license. Please contact sales to continue using managed agents." ,
992
+ }, nil
993
+ }
1001
994
}
1002
995
1003
996
return wsbuilder.UsageCheckResponse {
0 commit comments