Skip to content

Commit 0cb19ce

Browse files
Delivery rules correction for proper rollout key (#351)
* Fix delivery rules to use experiment as key instead of experiments_map, which was invalid. * Use featureId for building variables map * Update sdkKey and environmentKey to default to blank string
1 parent 637129a commit 0cb19ce

File tree

2 files changed

+357
-29
lines changed

2 files changed

+357
-29
lines changed

Diff for: optimizely/optimizely_config.py

+27-21
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def __init__(self, revision, experiments_map, features_map, datafile=None,
2525
self.experiments_map = experiments_map
2626
self.features_map = features_map
2727
self._datafile = datafile
28-
self.sdk_key = sdk_key
29-
self.environment_key = environment_key
28+
self.sdk_key = sdk_key or ''
29+
self.environment_key = environment_key or ''
3030
self.attributes = attributes or []
3131
self.events = events or []
3232
self.audiences = audiences or []
@@ -125,11 +125,9 @@ def __init__(self, project_config):
125125
Merging typed_audiences with audiences from project_config.
126126
The typed_audiences has higher precedence.
127127
'''
128-
129-
typed_audiences = project_config.typed_audiences[:]
130128
optly_typed_audiences = []
131129
id_lookup_dict = {}
132-
for typed_audience in typed_audiences:
130+
for typed_audience in project_config.typed_audiences:
133131
optly_audience = OptimizelyAudience(
134132
typed_audience.get('id'),
135133
typed_audience.get('name'),
@@ -269,6 +267,8 @@ def _create_lookup_maps(self):
269267
self.exp_id_to_feature_map = {}
270268
self.feature_key_variable_key_to_variable_map = {}
271269
self.feature_key_variable_id_to_variable_map = {}
270+
self.feature_id_variable_id_to_feature_variables_map = {}
271+
self.feature_id_variable_key_to_feature_variables_map = {}
272272

273273
for feature in self.feature_flags:
274274
for experiment_id in feature['experimentIds']:
@@ -283,10 +283,12 @@ def _create_lookup_maps(self):
283283
variables_key_map[variable['key']] = opt_variable
284284
variables_id_map[variable['id']] = opt_variable
285285

286+
self.feature_id_variable_id_to_feature_variables_map[feature['id']] = variables_id_map
287+
self.feature_id_variable_key_to_feature_variables_map[feature['id']] = variables_key_map
286288
self.feature_key_variable_key_to_variable_map[feature['key']] = variables_key_map
287289
self.feature_key_variable_id_to_variable_map[feature['key']] = variables_id_map
288290

289-
def _get_variables_map(self, experiment, variation):
291+
def _get_variables_map(self, experiment, variation, feature_id=None):
290292
""" Gets variables map for given experiment and variation.
291293
292294
Args:
@@ -296,23 +298,27 @@ def _get_variables_map(self, experiment, variation):
296298
Returns:
297299
dict - Map of variable key to OptimizelyVariable for the given variation.
298300
"""
301+
variables_map = {}
302+
299303
feature_flag = self.exp_id_to_feature_map.get(experiment['id'], None)
300-
if feature_flag is None:
304+
if feature_flag is None and feature_id is None:
301305
return {}
302306

303307
# set default variables for each variation
304-
variables_map = {}
305-
variables_map = copy.deepcopy(self.feature_key_variable_key_to_variable_map[feature_flag['key']])
308+
if feature_id:
309+
variables_map = copy.deepcopy(self.feature_id_variable_key_to_feature_variables_map[feature_id])
310+
else:
311+
variables_map = copy.deepcopy(self.feature_key_variable_key_to_variable_map[feature_flag['key']])
306312

307-
# set variation specific variable value if any
308-
if variation.get('featureEnabled'):
309-
for variable in variation.get('variables', []):
310-
feature_variable = self.feature_key_variable_id_to_variable_map[feature_flag['key']][variable['id']]
311-
variables_map[feature_variable.key].value = variable['value']
313+
# set variation specific variable value if any
314+
if variation.get('featureEnabled'):
315+
for variable in variation.get('variables', []):
316+
feature_variable = self.feature_key_variable_id_to_variable_map[feature_flag['key']][variable['id']]
317+
variables_map[feature_variable.key].value = variable['value']
312318

313319
return variables_map
314320

315-
def _get_variations_map(self, experiment):
321+
def _get_variations_map(self, experiment, feature_id=None):
316322
""" Gets variation map for the given experiment.
317323
318324
Args:
@@ -324,7 +330,7 @@ def _get_variations_map(self, experiment):
324330
variations_map = {}
325331

326332
for variation in experiment.get('variations', []):
327-
variables_map = self._get_variables_map(experiment, variation)
333+
variables_map = self._get_variables_map(experiment, variation, feature_id)
328334
feature_enabled = variation.get('featureEnabled', None)
329335

330336
optly_variation = OptimizelyVariation(
@@ -394,7 +400,7 @@ def _get_features_map(self, experiments_id_map):
394400

395401
for feature in self.feature_flags:
396402

397-
delivery_rules = self._get_delivery_rules(self.rollouts, feature.get('rolloutId'))
403+
delivery_rules = self._get_delivery_rules(self.rollouts, feature.get('rolloutId'), feature['id'])
398404
experiment_rules = []
399405

400406
exp_map = {}
@@ -415,7 +421,7 @@ def _get_features_map(self, experiments_id_map):
415421

416422
return features_map
417423

418-
def _get_delivery_rules(self, rollouts, rollout_id):
424+
def _get_delivery_rules(self, rollouts, rollout_id, feature_id):
419425
""" Gets an array of rollouts for the project config
420426
421427
returns:
@@ -435,12 +441,12 @@ def _get_delivery_rules(self, rollouts, rollout_id):
435441
for optly_audience in self.audiences:
436442
audiences_map[optly_audience.id] = optly_audience.name
437443

438-
# Get the experiments_map for that rollout
439-
experiments = rollout.get('experiments_map')
444+
# Get the experiments for that rollout
445+
experiments = rollout.get('experiments')
440446
if experiments:
441447
for experiment in experiments:
442448
optly_exp = OptimizelyExperiment(
443-
experiment['id'], experiment['key'], self._get_variations_map(experiment)
449+
experiment['id'], experiment['key'], self._get_variations_map(experiment, feature_id)
444450
)
445451
audiences = self.replace_ids_with_names(experiment.get('audienceConditions', []), audiences_map)
446452
optly_exp.audiences = audiences

0 commit comments

Comments
 (0)