Skip to content

Commit 0cff19a

Browse files
committed
Add holdouts to OptimizelyConfig
This change exposes holdouts in the OptimizelyConfig API, allowing clients to retrieve holdout information via the config endpoint. Changes: - Added OptimizelyHoldout type with id, key, audiences, and variationsMap - Added Holdouts field to OptimizelyConfig struct - Added GetHoldoutList() method to ProjectConfig interface - Implemented getHoldouts() helper to convert holdout entities to OptimizelyHoldouts - Populated holdouts in NewOptimizelyConfig constructor This enables Agent and other clients to expose holdout configuration through their /config endpoints.
1 parent ce6e57b commit 0cff19a

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

pkg/config/datafileprojectconfig/config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,11 @@ func (c DatafileProjectConfig) GetHoldoutsForFlag(featureKey string) []entities.
292292
return []entities.Holdout{}
293293
}
294294

295+
// GetHoldoutList returns all holdouts in the project
296+
func (c DatafileProjectConfig) GetHoldoutList() []entities.Holdout {
297+
return c.holdouts
298+
}
299+
295300
// NewDatafileProjectConfig initializes a new datafile from a json byte array using the default JSON datafile parser
296301
func NewDatafileProjectConfig(jsonDatafile []byte, logger logging.OptimizelyLogProducer) (*DatafileProjectConfig, error) {
297302
datafile, err := Parse(jsonDatafile)

pkg/config/interface.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type ProjectConfig interface {
5757
GetFlagVariationsMap() map[string][]entities.Variation
5858
GetRegion() string
5959
GetHoldoutsForFlag(featureKey string) []entities.Holdout
60+
GetHoldoutList() []entities.Holdout
6061
}
6162

6263
// ProjectConfigManager maintains an instance of the ProjectConfig

pkg/config/optimizely_config.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type OptimizelyConfig struct {
4242
Attributes []OptimizelyAttribute `json:"attributes"`
4343
Audiences []OptimizelyAudience `json:"audiences"`
4444
Events []OptimizelyEvent `json:"events"`
45+
Holdouts []OptimizelyHoldout `json:"holdouts"`
4546
datafile string
4647
}
4748

@@ -78,6 +79,14 @@ type OptimizelyEvent struct {
7879
ExperimentIds []string `json:"experimentIds"`
7980
}
8081

82+
// OptimizelyHoldout has holdout info
83+
type OptimizelyHoldout struct {
84+
ID string `json:"id"`
85+
Key string `json:"key"`
86+
Audiences string `json:"audiences"`
87+
VariationsMap map[string]OptimizelyVariation `json:"variationsMap"`
88+
}
89+
8190
// OptimizelyFeature has feature info
8291
type OptimizelyFeature struct {
8392
ID string `json:"id"`
@@ -365,6 +374,35 @@ func getFeaturesMap(audiencesByID map[string]entities.Audience, mappedExperiment
365374
return featuresMap
366375
}
367376

377+
func getHoldoutAudiences(holdout entities.Holdout, audiencesByID map[string]entities.Audience) string {
378+
return getSerializedAudiences(holdout.AudienceConditions, audiencesByID)
379+
}
380+
381+
func getHoldouts(audiencesByID map[string]entities.Audience, holdouts []entities.Holdout) []OptimizelyHoldout {
382+
optimizelyHoldouts := []OptimizelyHoldout{}
383+
384+
for _, holdout := range holdouts {
385+
// Create variations map for this holdout
386+
variationsMap := map[string]OptimizelyVariation{}
387+
for _, variation := range holdout.Variations {
388+
variationsMap[variation.Key] = OptimizelyVariation{
389+
ID: variation.ID,
390+
Key: variation.Key,
391+
FeatureEnabled: variation.FeatureEnabled,
392+
VariablesMap: map[string]OptimizelyVariable{}, // Holdouts don't have feature variables
393+
}
394+
}
395+
396+
optimizelyHoldouts = append(optimizelyHoldouts, OptimizelyHoldout{
397+
ID: holdout.ID,
398+
Key: holdout.Key,
399+
Audiences: getHoldoutAudiences(holdout, audiencesByID),
400+
VariationsMap: variationsMap,
401+
})
402+
}
403+
return optimizelyHoldouts
404+
}
405+
368406
// NewOptimizelyConfig constructs OptimizelyConfig object
369407
func NewOptimizelyConfig(projConfig ProjectConfig) *OptimizelyConfig {
370408

@@ -405,6 +443,8 @@ func NewOptimizelyConfig(projConfig ProjectConfig) *OptimizelyConfig {
405443
variableByIDMap := getVariableByIDMap(featuresList)
406444
optimizelyConfig.FeaturesMap = getFeaturesMap(projConfig.GetAudienceMap(), mappedExperiments, featuresList, rolloutIDMap, variableByIDMap)
407445

446+
optimizelyConfig.Holdouts = getHoldouts(projConfig.GetAudienceMap(), projConfig.GetHoldoutList())
447+
408448
optimizelyConfig.datafile = projConfig.GetDatafile()
409449

410450
return optimizelyConfig

0 commit comments

Comments
 (0)