Skip to content

feat: implement Go OpenFeature provider for feature flag evaluation #577

@kevwilliams

Description

@kevwilliams

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestgoPull requests that update go code

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions