Skip to content

Commit a6528b6

Browse files
authored
Merge pull request #325 from splitio/refactor-om-and-st
updated operationMode and storageType params values
2 parents 3c41da0 + a0bff04 commit a6528b6

File tree

9 files changed

+55
-67
lines changed

9 files changed

+55
-67
lines changed

splitio/client/config.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
DEFAULT_CONFIG = {
13-
'operationMode': 'in-memory',
13+
'operationMode': 'standalone',
1414
'connectionTimeout': 1500,
1515
'streamingEnabled': True,
1616
'featuresRefreshRate': 30,
@@ -64,34 +64,35 @@
6464

6565
def _parse_operation_mode(apikey, config):
6666
"""
67-
Process incoming config to determine operation mode.
67+
Process incoming config to determine operation mode and storage type
6868
6969
:param config: user supplied config
7070
:type config: dict
7171
72-
:returns: operation mode
73-
:rtype: str
72+
:returns: operation mode and storage type
73+
:rtype: Tuple (str, str)
7474
"""
7575
if apikey == 'localhost':
7676
_LOGGER.debug('Using Localhost operation mode')
77-
return 'localhost-standalone'
77+
return 'localhost', 'localhost'
7878

7979
if 'redisHost' in config or 'redisSentinels' in config:
8080
_LOGGER.debug('Using Redis storage operation mode')
81-
return 'redis-consumer'
81+
return 'consumer', 'redis'
8282

83-
if 'storageType' in config:
83+
if config.get('storageType') is not None:
8484
if config.get('storageType').lower() == 'pluggable':
8585
_LOGGER.debug('Using Pluggable storage operation mode')
86-
return 'pluggable'
86+
return 'consumer', 'pluggable'
87+
8788
_LOGGER.warning('You passed an invalid storageType, acceptable value is '
8889
'`pluggable`. Defaulting storage to In-Memory mode.')
8990

9091
_LOGGER.debug('Using In-Memory operation mode')
91-
return 'inmemory-standalone'
92+
return 'standalone', 'memory'
9293

9394

94-
def _sanitize_impressions_mode(operation_mode, mode, refresh_rate=None):
95+
def _sanitize_impressions_mode(storage_type, mode, refresh_rate=None):
9596
"""
9697
Check supplied impressions mode and adjust refresh rate.
9798
@@ -110,7 +111,7 @@ def _sanitize_impressions_mode(operation_mode, mode, refresh_rate=None):
110111
'one of the following values: `debug`, `none` or `optimized`. '
111112
' Defaulting to `optimized` mode.')
112113

113-
if operation_mode == 'pluggable' and mode != ImpressionsMode.DEBUG:
114+
if storage_type == 'pluggable' and mode != ImpressionsMode.DEBUG:
114115
mode = ImpressionsMode.DEBUG
115116
_LOGGER.warning('`pluggable` storageMode only support `debug` impressionMode, adjusting impressionsMode to `debug`. ')
116117

@@ -135,10 +136,10 @@ def sanitize(apikey, config):
135136
:returns: sanitized config
136137
:rtype: dict
137138
"""
138-
config['operationMode'] = _parse_operation_mode(apikey, config)
139+
config['operationMode'], config['storageType'] = _parse_operation_mode(apikey, config)
139140
processed = DEFAULT_CONFIG.copy()
140141
processed.update(config)
141-
imp_mode, imp_rate = _sanitize_impressions_mode(config['operationMode'], config.get('impressionsMode'),
142+
imp_mode, imp_rate = _sanitize_impressions_mode(config['storageType'], config.get('impressionsMode'),
142143
config.get('impressionsRefreshRate'))
143144
processed['impressionsMode'] = imp_mode
144145
processed['impressionsRefreshRate'] = imp_rate

splitio/client/factory.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -671,11 +671,11 @@ def get_factory(api_key, **kwargs):
671671

672672
config = sanitize_config(api_key, kwargs.get('config', {}))
673673

674-
if config['operationMode'] == 'localhost-standalone':
674+
if config['operationMode'] == 'localhost':
675675
split_factory = _build_localhost_factory(config)
676-
elif config['operationMode'] == 'redis-consumer':
676+
elif config['storageType'] == 'redis':
677677
split_factory = _build_redis_factory(api_key, config)
678-
elif config['operationMode'] == 'pluggable':
678+
elif config['storageType'] == 'pluggable':
679679
split_factory = _build_pluggable_factory(api_key, config)
680680
else:
681681
split_factory = _build_in_memory_factory(

splitio/models/telemetry.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,13 @@ class StorageType(Enum):
123123
"""Storage types constants"""
124124
MEMORY = 'memory'
125125
REDIS = 'redis'
126-
LOCALHOST = 'localhost'
127126
PLUGGABLE = 'pluggable'
128127

129128
class OperationMode(Enum):
130129
"""Storage modes constants"""
131-
MEMORY = 'inmemory'
132-
REDIS = 'redis-consumer'
133-
PLUGGABLE = 'pluggable'
130+
STANDALONE = 'standalone'
131+
CONSUMER = 'consumer'
132+
PARTIAL_CONSUMER = 'partial_consumer'
134133

135134
def get_latency_bucket_index(micros):
136135
"""
@@ -727,7 +726,7 @@ def record_config(self, config, extra_config):
727726
Record configurations.
728727
729728
:param config: config dict: {
730-
'operationMode': string, 'storageType': string, 'streamingEnabled': boolean,
729+
'operationMode': int, 'storageType': string, 'streamingEnabled': boolean,
731730
'refreshRate' : {
732731
'featuresRefreshRate': int,
733732
'segmentsRefreshRate': int,
@@ -746,7 +745,7 @@ def record_config(self, config, extra_config):
746745
"""
747746
with self._lock:
748747
self._operation_mode = self._get_operation_mode(config[ConfigParams.OPERATION_MODE.value])
749-
self._storage_type = self._get_storage_type(config[ConfigParams.OPERATION_MODE.value])
748+
self._storage_type = self._get_storage_type(config[ConfigParams.OPERATION_MODE.value], config[ConfigParams.STORAGE_TYPE.value])
750749
self._streaming_enabled = config[ConfigParams.STREAMING_ENABLED.value]
751750
self._refresh_rate = self._get_refresh_rates(config)
752751
self._url_override = self._get_url_overrides(extra_config)
@@ -853,14 +852,14 @@ def _get_operation_mode(self, op_mode):
853852
:rtype: int
854853
"""
855854
with self._lock:
856-
if OperationMode.MEMORY.value in op_mode:
855+
if op_mode == OperationMode.STANDALONE.value:
857856
return 0
858-
elif op_mode == OperationMode.REDIS.value:
857+
elif op_mode == OperationMode.CONSUMER.value:
859858
return 1
860859
else:
861860
return 2
862861

863-
def _get_storage_type(self, op_mode):
862+
def _get_storage_type(self, op_mode, st_type):
864863
"""
865864
Get storage type from operation mode
866865
@@ -871,9 +870,9 @@ def _get_storage_type(self, op_mode):
871870
:rtype: str
872871
"""
873872
with self._lock:
874-
if OperationMode.MEMORY.value in op_mode:
873+
if op_mode == OperationMode.STANDALONE.value:
875874
return StorageType.MEMORY.value
876-
elif StorageType.REDIS.value in op_mode:
875+
elif st_type == StorageType.REDIS.value:
877876
return StorageType.REDIS.value
878877
else:
879878
return StorageType.PLUGGABLE.value

tests/client/test_config.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,31 @@ class ConfigSanitizationTests(object):
1010

1111
def test_parse_operation_mode(self):
1212
"""Make sure operation mode is correctly captured."""
13-
assert config._parse_operation_mode('some', {}) == 'inmemory-standalone'
14-
assert config._parse_operation_mode('localhost', {}) == 'localhost-standalone'
15-
assert config._parse_operation_mode('some', {'redisHost': 'x'}) == 'redis-consumer'
16-
assert config._parse_operation_mode('some', {'storageType': 'pluggable'}) == 'pluggable'
17-
assert config._parse_operation_mode('some', {'storageType': 'custom2'}) == 'inmemory-standalone'
13+
assert (config._parse_operation_mode('some', {})) == ('standalone', 'memory')
14+
assert (config._parse_operation_mode('localhost', {})) == ('localhost', 'localhost')
15+
assert (config._parse_operation_mode('some', {'redisHost': 'x'})) == ('consumer', 'redis')
16+
assert (config._parse_operation_mode('some', {'storageType': 'pluggable'})) == ('consumer', 'pluggable')
17+
assert (config._parse_operation_mode('some', {'storageType': 'custom2'})) == ('standalone', 'memory')
1818

1919
def test_sanitize_imp_mode(self):
2020
"""Test sanitization of impressions mode."""
21-
mode, rate = config._sanitize_impressions_mode('inmemory-standalone', 'OPTIMIZED', 1)
21+
mode, rate = config._sanitize_impressions_mode('memory', 'OPTIMIZED', 1)
2222
assert mode == ImpressionsMode.OPTIMIZED
2323
assert rate == 60
2424

25-
mode, rate = config._sanitize_impressions_mode('inmemory-standalone', 'DEBUG', 1)
25+
mode, rate = config._sanitize_impressions_mode('memory', 'DEBUG', 1)
2626
assert mode == ImpressionsMode.DEBUG
2727
assert rate == 1
2828

29-
mode, rate = config._sanitize_impressions_mode('inmemory-standalone', 'debug', 1)
29+
mode, rate = config._sanitize_impressions_mode('redis', 'OPTIMIZED', 1)
30+
assert mode == ImpressionsMode.OPTIMIZED
31+
assert rate == 60
32+
33+
mode, rate = config._sanitize_impressions_mode('redis', 'debug', 1)
3034
assert mode == ImpressionsMode.DEBUG
3135
assert rate == 1
3236

33-
mode, rate = config._sanitize_impressions_mode('inmemory-standalone', 'ANYTHING', 200)
37+
mode, rate = config._sanitize_impressions_mode('memory', 'ANYTHING', 200)
3438
assert mode == ImpressionsMode.OPTIMIZED
3539
assert rate == 200
3640

@@ -46,15 +50,15 @@ def test_sanitize_imp_mode(self):
4650
assert mode == ImpressionsMode.DEBUG
4751
assert rate == 200
4852

49-
mode, rate = config._sanitize_impressions_mode('inmemory-standalone', 43, -1)
53+
mode, rate = config._sanitize_impressions_mode('memory', 43, -1)
5054
assert mode == ImpressionsMode.OPTIMIZED
5155
assert rate == 60
5256

53-
mode, rate = config._sanitize_impressions_mode('inmemory-standalone', 'OPTIMIZED')
57+
mode, rate = config._sanitize_impressions_mode('memory', 'OPTIMIZED')
5458
assert mode == ImpressionsMode.OPTIMIZED
5559
assert rate == 300
5660

57-
mode, rate = config._sanitize_impressions_mode('inmemory-standalone', 'DEBUG')
61+
mode, rate = config._sanitize_impressions_mode('memory', 'DEBUG')
5862
assert mode == ImpressionsMode.DEBUG
5963
assert rate == 60
6064

tests/engine/test_telemetry.py

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ def test_instances(self):
1919
assert(telemetry_producer._telemetry_init_producer == telemetry_producer.get_telemetry_init_producer())
2020
assert(telemetry_producer._telemetry_runtime_producer == telemetry_producer.get_telemetry_runtime_producer())
2121

22-
class TelemetryInitProducerTest(object):
23-
"""TelemetryInitProducer test."""
24-
2522
def test_record_config(self, mocker):
2623
telemetry_storage = mocker.Mock()
2724
telemetry_init_producer = TelemetryInitProducer(telemetry_storage)
@@ -30,7 +27,7 @@ def record_config(*args, **kwargs):
3027
self.passed_config = args[0]
3128

3229
telemetry_storage.record_config.side_effect = record_config
33-
telemetry_init_producer.record_config({'bT':0, 'nR':0, 'uC': 0})
30+
telemetry_init_producer.record_config({'bT':0, 'nR':0, 'uC': 0}, {})
3431
assert(self.passed_config == {'bT':0, 'nR':0, 'uC': 0})
3532

3633
def test_record_ready_time(self, mocker):
@@ -58,9 +55,6 @@ def test_record_not_ready_usage(self, mocker):
5855
telemetry_init_producer.record_not_ready_usage()
5956
assert(mocker.called)
6057

61-
class TelemetryEvaluationProducerTest(object):
62-
"""Telemetry evaluation producer test class."""
63-
6458
def test_record_latency(self, mocker):
6559
telemetry_storage = mocker.Mock()
6660
telemetry_evaluation_producer = TelemetryEvaluationProducer(telemetry_storage)
@@ -84,10 +78,6 @@ def record_exception(*args, **kwargs):
8478
telemetry_evaluation_producer.record_exception('method')
8579
assert(self.passed_method == 'method')
8680

87-
88-
class TelemetryRuntimeProducerTest(object):
89-
"""Telemetry runtime producer test."""
90-
9181
def test_add_tag(self, mocker):
9282
telemetry_storage = mocker.Mock()
9383
telemetry_runtime_producer = TelemetryRuntimeProducer(telemetry_storage)
@@ -210,9 +200,6 @@ def test_instances(self):
210200
assert(telemetry_consumer._telemetry_init_consumer == telemetry_consumer.get_telemetry_init_consumer())
211201
assert(telemetry_consumer._telemetry_runtime_consumer == telemetry_consumer.get_telemetry_runtime_consumer())
212202

213-
class TelemetryInitConsumerTest(object):
214-
"""TelemetryInitConsumer test."""
215-
216203
@mock.patch('splitio.storage.inmemmory.InMemoryTelemetryStorage.get_bur_time_outs')
217204
def test_get_bur_time_outs(self, mocker):
218205
telemetry_storage = InMemoryTelemetryStorage()
@@ -234,9 +221,6 @@ def get_not_ready_usage(self, mocker):
234221
telemetry_init_consumer.get_config_stats()
235222
assert(mocker.called)
236223

237-
class TelemetryEvaluationConsumerTest(object):
238-
"""TelemetryEvaluationConsumer test."""
239-
240224
@mock.patch('splitio.storage.inmemmory.InMemoryTelemetryStorage.pop_exceptions')
241225
def pop_exceptions(self, mocker):
242226
telemetry_storage = InMemoryTelemetryStorage()
@@ -251,9 +235,6 @@ def pop_latencies(self, mocker):
251235
telemetry_evaluation_consumer.pop_latencies()
252236
assert(mocker.called)
253237

254-
class TelemetryRuntimeConsumerTest(object):
255-
"""TelemetryRuntimeConsumer test."""
256-
257238
def test_get_impressions_stats(self, mocker):
258239
telemetry_storage = mocker.Mock()
259240
telemetry_runtime_consumer = TelemetryRuntimeConsumer(telemetry_storage)

tests/models/test_telemetry_model.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,10 @@ def test_latency_bucket_index(self):
3737
assert(result_bucket == ModelTelemetry.get_latency_bucket_index(latency))
3838

3939
def test_storage_type_and_operation_mode(self, mocker):
40-
assert(StorageType.LOCALHOST.value == 'localhost')
4140
assert(StorageType.MEMORY.value == 'memory')
4241
assert(StorageType.REDIS.value == 'redis')
43-
assert(OperationMode.MEMORY.value == 'inmemory')
44-
assert(OperationMode.REDIS.value == 'redis-consumer')
42+
assert(OperationMode.STANDALONE.value == 'standalone')
43+
assert(OperationMode.CONSUMER.value == 'consumer')
4544

4645
def test_method_latencies(self, mocker):
4746
method_latencies = MethodLatencies()
@@ -238,7 +237,7 @@ def test_streaming_events(self, mocker):
238237

239238
def test_telemetry_config(self):
240239
telemetry_config = TelemetryConfig()
241-
config = {'operationMode': 'inmemory',
240+
config = {'operationMode': 'standalone',
242241
'streamingEnabled': True,
243242
'impressionsQueueSize': 100,
244243
'eventsQueueSize': 200,
@@ -249,10 +248,11 @@ def test_telemetry_config(self):
249248
'impressionsRefreshRate': 60,
250249
'eventsPushRate': 60,
251250
'metricsRefreshRate': 10,
251+
'storageType': None
252252
}
253253
telemetry_config.record_config(config, {})
254254
assert(telemetry_config.get_stats() == {'oM': 0,
255-
'sT': telemetry_config._get_storage_type(config['operationMode']),
255+
'sT': telemetry_config._get_storage_type(config['operationMode'], config['storageType']),
256256
'sE': config['streamingEnabled'],
257257
'rR': {'sp': 30, 'se': 30, 'im': 60, 'ev': 60, 'te': 10},
258258
'uO': {'s': False, 'e': False, 'a': False, 'st': False, 't': False},

tests/storage/test_inmemory_storage.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ def test_resets(self):
477477

478478
def test_record_config(self):
479479
storage = InMemoryTelemetryStorage()
480-
config = {'operationMode': 'inmemory',
480+
config = {'operationMode': 'standalone',
481481
'streamingEnabled': True,
482482
'impressionsQueueSize': 100,
483483
'eventsQueueSize': 200,
@@ -488,11 +488,12 @@ def test_record_config(self):
488488
'impressionsRefreshRate': 60,
489489
'eventsPushRate': 60,
490490
'metricsRefreshRate': 10,
491+
'storageType': None
491492
}
492493
storage.record_config(config, {})
493494
storage.record_active_and_redundant_factories(1, 0)
494495
assert(storage._tel_config.get_stats() == {'oM': 0,
495-
'sT': storage._tel_config._get_storage_type(config['operationMode']),
496+
'sT': storage._tel_config._get_storage_type(config['operationMode'], config['storageType']),
496497
'sE': config['streamingEnabled'],
497498
'rR': {'sp': 30, 'se': 30, 'im': 60, 'ev': 60, 'te': 10},
498499
'uO': {'s': False, 'e': False, 'a': False, 'st': False, 't': False},

tests/storage/test_pluggable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ def expire_keys_mock(*args, **kwargs):
657657

658658
def test_push_config_stats(self):
659659
self.pluggable_telemetry_storage.record_config(
660-
{'operationMode': 'inmemory',
660+
{'operationMode': 'standalone',
661661
'streamingEnabled': True,
662662
'impressionsQueueSize': 100,
663663
'eventsQueueSize': 200,
@@ -668,6 +668,7 @@ def test_push_config_stats(self):
668668
'impressionsRefreshRate': 60,
669669
'eventsPushRate': 60,
670670
'metricsRefreshRate': 10,
671+
'storageType': None
671672
}, {}
672673
)
673674
self.pluggable_telemetry_storage.record_active_and_redundant_factories(2, 1)

tests/sync/test_telemetry.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def test_synchronize_telemetry(self, mocker):
8686
telemetry_storage._http_latencies._token = [0] * 23
8787

8888
telemetry_storage.record_config({'operationMode': 'inmemory',
89+
'storageType': None,
8990
'streamingEnabled': True,
9091
'impressionsQueueSize': 100,
9192
'eventsQueueSize': 200,

0 commit comments

Comments
 (0)