1010class PluggableSplitStorage (SplitStorage ):
1111 """InMemory implementation of a split storage."""
1212
13+ _SPLIT_NAME_LENGTH = 12
14+
1315 def __init__ (self , pluggable_adapter , prefix = None ):
1416 """Constructor."""
1517 self ._pluggable_adapter = pluggable_adapter
16- self ._prefix = "SPLITIO.split."
17- self ._traffic_type_prefix = "SPLITIO.trafficType."
18+ self ._prefix = "SPLITIO.split.{split_name} "
19+ self ._traffic_type_prefix = "SPLITIO.trafficType.{traffic_type_name} "
1820 self ._split_till_prefix = "SPLITIO.splits.till"
1921 if prefix is not None :
2022 self ._prefix = prefix + "." + self ._prefix
@@ -30,10 +32,15 @@ def get(self, split_name):
3032
3133 :rtype: splitio.models.splits.Split
3234 """
33- split = self ._pluggable_adapter .get (self ._prefix + split_name )
34- if not split :
35+ try :
36+ split = self ._pluggable_adapter .get (self ._prefix .format (split_name = split_name ))
37+ if not split :
38+ return None
39+ return splits .from_raw (split )
40+ except Exception :
41+ _LOGGER .error ('Error getting split from storage' )
42+ _LOGGER .debug ('Error: ' , exc_info = True )
3543 return None
36- return splits .from_raw (split )
3744
3845 def fetch_many (self , split_names ):
3946 """
@@ -45,19 +52,29 @@ def fetch_many(self, split_names):
4552 :return: A dict with split objects parsed from queue.
4653 :rtype: dict(split_name, splitio.models.splits.Split)
4754 """
48- prefix_added = [self ._prefix + split for split in split_names ]
49- return {split ['name' ]: splits .from_raw (split ) for split in self ._pluggable_adapter .get_many (prefix_added )}
50-
51- def put_many (self , splits , change_number ):
52- """
53- Store a split.
55+ try :
56+ prefix_added = [self ._prefix .format (split_name = split_name ) for split_name in split_names ]
57+ return {split ['name' ]: splits .from_raw (split ) for split in self ._pluggable_adapter .get_many (prefix_added )}
58+ except Exception :
59+ _LOGGER .error ('Error getting split from storage' )
60+ _LOGGER .debug ('Error: ' , exc_info = True )
61+ return None
5462
55- :param split: Split object.
56- :type split: splitio.models.split.Split
57- """
58- for split in splits :
59- self .put (split )
60- self ._pluggable_adapter .set (self ._split_till_prefix , change_number )
63+ # TODO: To be added when producer mode is aupported
64+ # def put_many(self, splits, change_number):
65+ # """
66+ # Store multiple splits.
67+ #
68+ # :param split: array of Split objects.
69+ # :type split: splitio.models.split.Split[]
70+ # """
71+ # try:
72+ # for split in splits:
73+ # self.put(split)
74+ # self._pluggable_adapter.set(self._split_till_prefix, change_number)
75+ # except Exception:
76+ # _LOGGER.error('Error storing splits in storage')
77+ # _LOGGER.debug('Error: ', exc_info=True)
6178
6279 def remove (self , split_name ):
6380 """
@@ -69,22 +86,33 @@ def remove(self, split_name):
6986 :return: True if the split was found and removed. False otherwise.
7087 :rtype: bool
7188 """
72- split = self .get (split_name )
73- if not split :
74- _LOGGER .warning ("Tried to delete nonexistant split %s. Skipping" , split_name )
75- return False
76-
77- self ._pluggable_adapter .delete (self ._prefix + split_name )
78- self ._decrease_traffic_type_count (split .traffic_type_name )
79- return True
89+ pass
90+ # TODO: To be added when producer mode is aupported
91+ # try:
92+ # split = self.get(split_name)
93+ # if not split:
94+ # _LOGGER.warning("Tried to delete nonexistant split %s. Skipping", split_name)
95+ # return False
96+ # self._pluggable_adapter.delete(self._prefix.format(split_name=split_name))
97+ # self._decrease_traffic_type_count(split.traffic_type_name)
98+ # return True
99+ # except Exception:
100+ # _LOGGER.error('Error removing split from storage')
101+ # _LOGGER.debug('Error: ', exc_info=True)
102+ # return False
80103
81104 def get_change_number (self ):
82105 """
83106 Retrieve latest split change number.
84107
85108 :rtype: int
86109 """
87- return self ._pluggable_adapter .get (self ._split_till_prefix )
110+ try :
111+ return self ._pluggable_adapter .get (self ._split_till_prefix )
112+ except Exception :
113+ _LOGGER .error ('Error getting change number in split storage' )
114+ _LOGGER .debug ('Error: ' , exc_info = True )
115+ return None
88116
89117 def set_change_number (self , new_change_number ):
90118 """
@@ -93,7 +121,14 @@ def set_change_number(self, new_change_number):
93121 :param new_change_number: New change number.
94122 :type new_change_number: int
95123 """
96- self ._pluggable_adapter .set (self ._split_till_prefix , new_change_number )
124+ pass
125+ # TODO: To be added when producer mode is aupported
126+ # try:
127+ # self._pluggable_adapter.set(self._split_till_prefix, new_change_number)
128+ # except Exception:
129+ # _LOGGER.error('Error setting change number in split storage')
130+ # _LOGGER.debug('Error: ', exc_info=True)
131+ # return None
97132
98133 def get_split_names (self ):
99134 """
@@ -102,7 +137,12 @@ def get_split_names(self):
102137 :return: List of split names.
103138 :rtype: list(str)
104139 """
105- return [split .name for split in self .get_all ()]
140+ try :
141+ return [split .name for split in self .get_all ()]
142+ except Exception :
143+ _LOGGER .error ('Error getting split names from storage' )
144+ _LOGGER .debug ('Error: ' , exc_info = True )
145+ return None
106146
107147 def get_all (self ):
108148 """
@@ -111,7 +151,12 @@ def get_all(self):
111151 :return: List of all the splits.
112152 :rtype: list
113153 """
114- return [splits .from_raw (self ._pluggable_adapter .get (key )) for key in self ._pluggable_adapter .get_keys_by_prefix (self ._prefix )]
154+ try :
155+ return [splits .from_raw (self ._pluggable_adapter .get (key )) for key in self ._pluggable_adapter .get_keys_by_prefix (self ._prefix [:- self ._SPLIT_NAME_LENGTH ])]
156+ except Exception :
157+ _LOGGER .error ('Error getting split keys from storage' )
158+ _LOGGER .debug ('Error: ' , exc_info = True )
159+ return None
115160
116161 def traffic_type_exists (self , traffic_type_name ):
117162 """
@@ -123,7 +168,12 @@ def traffic_type_exists(self, traffic_type_name):
123168 :return: True if the traffic type is valid. False otherwise.
124169 :rtype: bool
125170 """
126- return self ._pluggable_adapter .get (self ._traffic_type_prefix + traffic_type_name ) != None
171+ try :
172+ return self ._pluggable_adapter .get (self ._traffic_type_prefix .format (traffic_type_name = traffic_type_name )) != None
173+ except Exception :
174+ _LOGGER .error ('Error getting split info from storage' )
175+ _LOGGER .debug ('Error: ' , exc_info = True )
176+ return None
127177
128178 def kill_locally (self , split_name , default_treatment , change_number ):
129179 """
@@ -136,39 +186,57 @@ def kill_locally(self, split_name, default_treatment, change_number):
136186 :param change_number: change_number
137187 :type change_number: int
138188 """
139- split = self .get (split_name )
140- if not split :
141- return
142- if self .get_change_number () > change_number :
143- return
144- split .local_kill (default_treatment , change_number )
145- self ._pluggable_adapter .set (self ._prefix + split_name , split .to_json ())
146-
147- def _increase_traffic_type_count (self , traffic_type_name ):
148- """
149- Increase by one the count for a specific traffic type name.
150-
151- :param traffic_type_name: Traffic type to increase the count.
152- :type traffic_type_name: str
153-
154- :return: existing count of traffic type
155- :rtype: int
156- """
157- return self ._pluggable_adapter .increment (self ._traffic_type_prefix + traffic_type_name , 1 )
158-
159- def _decrease_traffic_type_count (self , traffic_type_name ):
160- """
161- Decrease by one the count for a specific traffic type name.
189+ pass
190+ # TODO: To be added when producer mode is aupported
191+ # try:
192+ # split = self.get(split_name)
193+ # if not split:
194+ # return
195+ # if self.get_change_number() > change_number:
196+ # return
197+ # split.local_kill(default_treatment, change_number)
198+ # self._pluggable_adapter.set(self._prefix.format(split_name=split_name), split.to_json())
199+ # except Exception:
200+ # _LOGGER.error('Error updating split in storage')
201+ # _LOGGER.debug('Error: ', exc_info=True)
162202
163- :param traffic_type_name: Traffic type to decrease the count.
164- :type traffic_type_name: str
203+ # TODO: To be added when producer mode is aupported
204+ # def _increase_traffic_type_count(self, traffic_type_name):
205+ # """
206+ # Increase by one the count for a specific traffic type name.
207+ #
208+ # :param traffic_type_name: Traffic type to increase the count.
209+ # :type traffic_type_name: str
210+ #
211+ # :return: existing count of traffic type
212+ # :rtype: int
213+ # """
214+ # try:
215+ # return self._pluggable_adapter.increment(self._traffic_type_prefix.format(traffic_type_name=traffic_type_name), 1)
216+ # except Exception:
217+ # _LOGGER.error('Error updating traffic type count in split storage')
218+ # _LOGGER.debug('Error: ', exc_info=True)
219+ # return None
165220
166- :return: existing count of traffic type
167- :rtype: int
168- """
169- return_count = self ._pluggable_adapter .decrement (self ._traffic_type_prefix + traffic_type_name , 1 )
170- if return_count == 0 :
171- self ._pluggable_adapter .delete (self ._traffic_type_prefix + traffic_type_name )
221+ # TODO: To be added when producer mode is aupported
222+ # def _decrease_traffic_type_count(self, traffic_type_name):
223+ # """
224+ # Decrease by one the count for a specific traffic type name.
225+ #
226+ # :param traffic_type_name: Traffic type to decrease the count.
227+ # :type traffic_type_name: str
228+ #
229+ # :return: existing count of traffic type
230+ # :rtype: int
231+ # """
232+ # try:
233+ # return_count = self._pluggable_adapter.decrement(self._traffic_type_prefix.format(traffic_type_name=traffic_type_name), 1)
234+ # if return_count == 0:
235+ # self._pluggable_adapter.delete(self._traffic_type_prefix.format(traffic_type_name=traffic_type_name))
236+ # except Exception:
237+ # _LOGGER.error('Error updating traffic type count in split storage')
238+ # _LOGGER.debug('Error: ', exc_info=True)
239+ # return None
172240
173241 def get_all_splits (self ):
174242 """
@@ -177,7 +245,12 @@ def get_all_splits(self):
177245 :return: List of all the splits.
178246 :rtype: list
179247 """
180- return self .get_all ()
248+ try :
249+ return self .get_all ()
250+ except Exception :
251+ _LOGGER .error ('Error fetching splits from storage' )
252+ _LOGGER .debug ('Error: ' , exc_info = True )
253+ return None
181254
182255 def is_valid_traffic_type (self , traffic_type_name ):
183256 """
@@ -189,7 +262,12 @@ def is_valid_traffic_type(self, traffic_type_name):
189262 :return: True if the traffic type is valid. False otherwise.
190263 :rtype: bool
191264 """
192- return self .traffic_type_exists (traffic_type_name )
265+ try :
266+ return self .traffic_type_exists (traffic_type_name )
267+ except Exception :
268+ _LOGGER .error ('Error getting split info from storage' )
269+ _LOGGER .debug ('Error: ' , exc_info = True )
270+ return None
193271
194272 def put (self , split ):
195273 """
@@ -198,15 +276,22 @@ def put(self, split):
198276 :param split: Split object.
199277 :type split: splitio.models.split.Split
200278 """
201- existing_split = self .get (split .name )
202- self ._pluggable_adapter .set (self ._prefix + split .name , split .to_json ())
203- if existing_split is None :
204- self ._increase_traffic_type_count (split .traffic_type_name )
205- return
206-
207- if existing_split is not None and existing_split .traffic_type_name != split .traffic_type_name :
208- self ._increase_traffic_type_count (split .traffic_type_name )
209- self ._decrease_traffic_type_count (existing_split .traffic_type_name )
279+ pass
280+ # TODO: To be added when producer mode is aupported
281+ # try:
282+ # existing_split = self.get(split.name)
283+ # self._pluggable_adapter.set(self._prefix.format(split_name=split.name), split.to_json())
284+ # if existing_split is None:
285+ # self._increase_traffic_type_count(split.traffic_type_name)
286+ # return
287+ #
288+ # if existing_split is not None and existing_split.traffic_type_name != split.traffic_type_name:
289+ # self._increase_traffic_type_count(split.traffic_type_name)
290+ # self._decrease_traffic_type_count(existing_split.traffic_type_name)
291+ # except Exception:
292+ # _LOGGER.error('Error ADDING split to storage')
293+ # _LOGGER.debug('Error: ', exc_info=True)
294+ # return None
210295
211296
212297class PluggableSegmentStorage (SegmentStorage ):
@@ -234,16 +319,18 @@ def update(self, segment_name, to_add, to_remove, change_number=None):
234319 :param to_remove: List of members to remove from the segment.
235320 :type to_remove: Set
236321 """
237- try :
238- if to_add is not None :
239- self ._pluggable_adapter .add_items (self ._prefix .format (segment_name = segment_name ), to_add )
240- if to_remove is not None :
241- self ._pluggable_adapter .remove_items (self ._prefix .format (segment_name = segment_name ), to_remove )
242- if change_number is not None :
243- self ._pluggable_adapter .set (self ._segment_till_prefix .format (segment_name = segment_name ), change_number )
244- except Exception :
245- _LOGGER .error ('Error updating segment storage' )
246- _LOGGER .debug ('Error: ' , exc_info = True )
322+ pass
323+ # TODO: To be added when producer mode is aupported
324+ # try:
325+ # if to_add is not None:
326+ # self._pluggable_adapter.add_items(self._prefix.format(segment_name=segment_name), to_add)
327+ # if to_remove is not None:
328+ # self._pluggable_adapter.remove_items(self._prefix.format(segment_name=segment_name), to_remove)
329+ # if change_number is not None:
330+ # self._pluggable_adapter.set(self._segment_till_prefix.format(segment_name=segment_name), change_number)
331+ # except Exception:
332+ # _LOGGER.error('Error updating segment storage')
333+ # _LOGGER.debug('Error: ', exc_info=True)
247334
248335 def set_change_number (self , segment_name , change_number ):
249336 """
@@ -361,13 +448,12 @@ def get(self, segment_name):
361448 :rtype: splitio.models.segments.Segment
362449 """
363450 pass
364- # TODO: To be added when producer mode is aupported
365- # try:
366- # return segments.from_raw({'name': segment_name, 'added': list(self._pluggable_adapter.get(self._prefix.format(segment_name=segment_name))), 'removed': [], 'till': self._pluggable_adapter.get(self._segment_till_prefix.format(segment_name=segment_name))})
367- # except Exception:
368- # _LOGGER.error('Error getting segment')
369- # _LOGGER.debug('Error: ', exc_info=True)
370- # return None
451+ try :
452+ return segments .from_raw ({'name' : segment_name , 'added' : list (self ._pluggable_adapter .get (self ._prefix .format (segment_name = segment_name ))), 'removed' : [], 'till' : self ._pluggable_adapter .get (self ._segment_till_prefix .format (segment_name = segment_name ))})
453+ except Exception :
454+ _LOGGER .error ('Error getting segment' )
455+ _LOGGER .debug ('Error: ' , exc_info = True )
456+ return None
371457
372458 def put (self , segment ):
373459 """
0 commit comments