diff --git a/controller/metaproxy_provision.go b/controller/metaproxy_provision.go index 363ff5285ee2..36decc712dbe 100644 --- a/controller/metaproxy_provision.go +++ b/controller/metaproxy_provision.go @@ -142,7 +142,7 @@ func validateMetaproxyProvisionRequest( return errors.New("channels exceeds the 256-channel limit") } - modelRatios, err := parseRatioMap("ModelRatio", request.Options.ModelRatio, false) + modelRatios, err := parseRatioMap("ModelRatio", request.Options.ModelRatio, true) if err != nil { return err } @@ -219,9 +219,13 @@ func validateMetaproxyProvisionRequest( continue } for _, modelName := range models { - if _, priced := modelRatios[modelName]; !priced { + ratio, priced := modelRatios[modelName] + if !priced { return fmt.Errorf("enabled model %q in an offered group is missing from ModelRatio", modelName) } + if ratio == 0 { + return fmt.Errorf("enabled model %q in an offered group must have a positive ModelRatio", modelName) + } } } return nil diff --git a/controller/metaproxy_provision_test.go b/controller/metaproxy_provision_test.go index 5a1d18719fac..ca4eb47eccab 100644 --- a/controller/metaproxy_provision_test.go +++ b/controller/metaproxy_provision_test.go @@ -85,6 +85,20 @@ func TestValidateMetaproxyProvisionRequestAllowsUnpricedModelInUnpublishedGroup( require.NoError(t, validateMetaproxyProvisionRequest(request, request.Digest, "none")) } +func TestValidateMetaproxyProvisionRequestAllowsLegacyZeroRatioOutsideManagedChannels(t *testing.T) { + request := validMetaproxyProvisionRequest() + request.Options.ModelRatio = `{"model-one":1,"legacy-disabled-model":0}` + require.NoError(t, validateMetaproxyProvisionRequest(request, request.Digest, "none")) +} + +func TestValidateMetaproxyProvisionRequestRejectsZeroRatioForOfferedModel(t *testing.T) { + request := validMetaproxyProvisionRequest() + request.Options.ModelRatio = `{"model-one":0}` + err := validateMetaproxyProvisionRequest(request, request.Digest, "none") + require.ErrorContains(t, err, "model-one") + require.ErrorContains(t, err, "positive ModelRatio") +} + func TestValidateMetaproxyProvisionRequestRejectsMalformedRatioJson(t *testing.T) { request := validMetaproxyProvisionRequest() request.Options.GroupRatio = `{"standard":"free"}`