Summary
Implement a Go OpenFeature-compatible provider backed by the Milo `AllowanceBucket` API. Services import this package to evaluate feature flags without hand-rolling quota API queries.
Depends on
Package location
`pkg/featureflags/` (shared, importable by portal, API server, and other Go services)
Implementation
Implement the `openfeature-go` `FeatureProvider` interface:
```go
type AllowanceBucketProvider struct {
client quotav1alpha1client.QuotaV1alpha1Interface
}
func (p *AllowanceBucketProvider) ResolveBooleanValue(
ctx context.Context,
flag openfeature.FlagEvaluationDetails,
evalCtx openfeature.FlattenedContext,
) openfeature.BoolResolutionDetail {
// flagKey → features.miloapis.com/
// evalCtx["targetingKey"] → org name
// query AllowanceBuckets by field selector
// return true/TARGETING_MATCH if status.available > 0
// return false/DEFAULT on miss or any error
}
```
Metadata, string/number/object resolution stubs (return `openfeature.NotImplemented`).
Tests
Table-driven unit tests with a fake `AllowanceBucket` lister:
- Flag enabled (`status.available=1`) → returns `true`
- Flag not granted (no bucket) → returns `false`, reason `DEFAULT`
- API error → returns default value, reason `DEFAULT`, no panic
- Wrong org → returns `false`
Usage
```go
openfeature.SetProvider(featureflags.NewProvider(quotaClient))
client := openfeature.NewClient("my-service")
enabled, _ := client.BooleanValue(ctx, "private-beta-gpu-inference", false,
openfeature.NewEvaluationContext("acme-corp", nil))
```
Context
Enhancement: datum-cloud/enhancements#695
Summary
Implement a Go OpenFeature-compatible provider backed by the Milo `AllowanceBucket` API. Services import this package to evaluate feature flags without hand-rolling quota API queries.
Depends on
Package location
`pkg/featureflags/` (shared, importable by portal, API server, and other Go services)
Implementation
Implement the `openfeature-go` `FeatureProvider` interface:
```go
type AllowanceBucketProvider struct {
client quotav1alpha1client.QuotaV1alpha1Interface
}
func (p *AllowanceBucketProvider) ResolveBooleanValue(
ctx context.Context,
flag openfeature.FlagEvaluationDetails,
evalCtx openfeature.FlattenedContext,
) openfeature.BoolResolutionDetail {
// flagKey → features.miloapis.com/
// evalCtx["targetingKey"] → org name
// query AllowanceBuckets by field selector
// return true/TARGETING_MATCH if status.available > 0
// return false/DEFAULT on miss or any error
}
```
Metadata, string/number/object resolution stubs (return `openfeature.NotImplemented`).
Tests
Table-driven unit tests with a fake `AllowanceBucket` lister:
Usage
```go
openfeature.SetProvider(featureflags.NewProvider(quotaClient))
client := openfeature.NewClient("my-service")
enabled, _ := client.BooleanValue(ctx, "private-beta-gpu-inference", false,
openfeature.NewEvaluationContext("acme-corp", nil))
```
Context
Enhancement: datum-cloud/enhancements#695