Skip to content

Commit

Permalink
API for feature toggles
Browse files Browse the repository at this point in the history
  • Loading branch information
alexeykazakov committed Jun 18, 2024
1 parent 92c6051 commit 7572d46
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 1 deletion.
38 changes: 38 additions & 0 deletions api/v1alpha1/toolchainconfig_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,14 @@ type TiersConfig struct {
// +optional
DefaultSpaceTier *string `json:"defaultSpaceTier,omitempty"`

// FeatureToggles specifies the list of feature toggles/flags
// +optional
// +patchMergeKey=name
// +patchStrategy=merge
// +listType=map
// +listMapKey=name
FeatureToggles []FeatureToggle `json:"featureToggles,omitempty" patchStrategy:"merge" patchMergeKey:"name"`

// DurationBeforeChangeTierRequestDeletion specifies the duration before a ChangeTierRequest resource is deleted
// +optional
DurationBeforeChangeTierRequestDeletion *string `json:"durationBeforeChangeTierRequestDeletion,omitempty"`
Expand All @@ -469,6 +477,36 @@ type TiersConfig struct {
TemplateUpdateRequestMaxPoolSize *int `json:"templateUpdateRequestMaxPoolSize,omitempty"`
}

// FeatureToggle defines a feature toggle/flag. Each feature is supposed to have a unique name.
// Features are represented by kube object manifests in space and user templates.
// Such manifests must have an annotation which refers to the corresponding feature name.
// For example a manifest for a RoleBinding object in a space tier template with the following annotation:
// "toolchain.dev.openshift.com/feature: os-lightspeed" would refer to a feature with "os-lightspeed" name.
// When that template is applied for a new space then that RoleBinding object would be applied conditionally,
// according to its weight.
// +k8s:openapi-gen=true
type FeatureToggle struct {
// A unique name of the feature
Name string `json:"name"`
// Rollout weight of the feature. An integer between 0-100.
// Any number lower than 0 will be treated as 0. Any number higher than 100 will be treated as 100.
// If not set then 100 is used by default.
// 0 means the corresponding feature should not be enabled at all, which means
// that corresponding template objects should not be applied at all.
// 100 means the feature should be always enabled (the template is always applied).
// The features are weighted independently of each other.
// For example if there are two features:
// - feature1, weight=5
// - feature2, weight=90
// And tiers (one or many) contain the following object manifests:
// - RoleBinding with "toolchain.dev.openshift.com/feature: feature1" annotation
// - ConfigMap with "toolchain.dev.openshift.com/feature: feature2" annotation
// Then the RoleBinding will be created for the corresponding tiers with probability of 0.05 (around 5 out of every 100 spaces would have it)
// And the ConfigMap will be created with probability of 0.9 (around 90 out of every 100 spaces would have it)
// +optional
Weight *int `json:"weight,omitempty"`
}

// UsersConfig contains all configuration parameters related to users
// +k8s:openapi-gen=true
type UsersConfig struct {
Expand Down
27 changes: 27 additions & 0 deletions api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

58 changes: 57 additions & 1 deletion api/v1alpha1/zz_generated.openapi.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 7572d46

Please sign in to comment.