@@ -205,6 +205,7 @@ def test_feature_registration(mock_sonic_db, manifest):
205205 mock_connector = Mock ()
206206 mock_connector .get_entry = Mock (return_value = {})
207207 mock_sonic_db .get_connectors = Mock (return_value = [mock_connector ])
208+ mock_sonic_db .get_initial_db_connector = Mock (return_value = mock_connector )
208209 feature_registry = FeatureRegistry (mock_sonic_db )
209210 feature_registry .register (manifest )
210211 mock_connector .set_entry .assert_called_with ('FEATURE' , 'test' , {
@@ -258,6 +259,7 @@ def test_feature_registration_with_timer(mock_sonic_db, manifest):
258259 mock_connector = Mock ()
259260 mock_connector .get_entry = Mock (return_value = {})
260261 mock_sonic_db .get_connectors = Mock (return_value = [mock_connector ])
262+ mock_sonic_db .get_initial_db_connector = Mock (return_value = mock_connector )
261263 feature_registry = FeatureRegistry (mock_sonic_db )
262264 feature_registry .register (manifest )
263265 mock_connector .set_entry .assert_called_with ('FEATURE' , 'test' , {
@@ -275,6 +277,7 @@ def test_feature_registration_with_non_default_owner(mock_sonic_db, manifest):
275277 mock_connector = Mock ()
276278 mock_connector .get_entry = Mock (return_value = {})
277279 mock_sonic_db .get_connectors = Mock (return_value = [mock_connector ])
280+ mock_sonic_db .get_initial_db_connector = Mock (return_value = mock_connector )
278281 feature_registry = FeatureRegistry (mock_sonic_db )
279282 feature_registry .register (manifest , owner = 'kube' )
280283 mock_connector .set_entry .assert_called_with ('FEATURE' , 'test' , {
@@ -286,3 +289,107 @@ def test_feature_registration_with_non_default_owner(mock_sonic_db, manifest):
286289 'has_global_scope' : 'True' ,
287290 'has_timer' : 'False' ,
288291 })
292+
293+
294+ class AutoTSHelp :
295+ """ Helper class for Auto TS Feature Registry Tests
296+ """
297+ GLOBAL_STATE = {}
298+
299+ @classmethod
300+ def get_entry (cls , table , key ):
301+ if table == "AUTO_TECHSUPPORT" and key == "GLOBAL" :
302+ return AutoTSHelp .GLOBAL_STATE
303+ elif table == "AUTO_TECHSUPPORT_FEATURE" and key == "test" :
304+ return {"state" : "enabled" , "rate_limit_interval" : "600" }
305+ else :
306+ return {}
307+
308+ @classmethod
309+ def get_entry_running_cfg (cls , table , key ):
310+ if table == "AUTO_TECHSUPPORT_FEATURE" and key == "test" :
311+ return {"state" : "disabled" , "rate_limit_interval" : "1000" }
312+ else :
313+ return {}
314+
315+
316+ def test_auto_ts_global_disabled (mock_sonic_db , manifest ):
317+ mock_init_cfg = Mock ()
318+ AutoTSHelp .GLOBAL_STATE = {"state" : "disabled" }
319+ mock_init_cfg .get_entry = Mock (side_effect = AutoTSHelp .get_entry )
320+ mock_sonic_db .get_connectors = Mock (return_value = [mock_init_cfg ])
321+ mock_sonic_db .get_initial_db_connector = Mock (return_value = mock_init_cfg )
322+ feature_registry = FeatureRegistry (mock_sonic_db )
323+ feature_registry .register (manifest )
324+ mock_init_cfg .set_entry .assert_any_call ("AUTO_TECHSUPPORT_FEATURE" , "test" , {
325+ "state" : "disabled" ,
326+ "rate_limit_interval" : "600"
327+ }
328+ )
329+
330+
331+ def test_auto_ts_global_enabled (mock_sonic_db , manifest ):
332+ mock_init_cfg = Mock ()
333+ AutoTSHelp .GLOBAL_STATE = {"state" : "enabled" }
334+ mock_init_cfg .get_entry = Mock (side_effect = AutoTSHelp .get_entry )
335+ mock_sonic_db .get_connectors = Mock (return_value = [mock_init_cfg ])
336+ mock_sonic_db .get_initial_db_connector = Mock (return_value = mock_init_cfg )
337+ feature_registry = FeatureRegistry (mock_sonic_db )
338+ feature_registry .register (manifest )
339+ mock_init_cfg .set_entry .assert_any_call ("AUTO_TECHSUPPORT_FEATURE" , "test" , {
340+ "state" : "enabled" ,
341+ "rate_limit_interval" : "600"
342+ }
343+ )
344+
345+
346+ def test_auto_ts_deregister (mock_sonic_db ):
347+ mock_connector = Mock ()
348+ mock_sonic_db .get_connectors = Mock (return_value = [mock_connector ])
349+ feature_registry = FeatureRegistry (mock_sonic_db )
350+ feature_registry .deregister ("test" )
351+ mock_connector .set_entry .assert_any_call ("AUTO_TECHSUPPORT_FEATURE" , "test" , None )
352+
353+
354+ def test_auto_ts_feature_update_flow (mock_sonic_db , manifest ):
355+ new_manifest = copy .deepcopy (manifest )
356+ new_manifest ['service' ]['name' ] = 'test_new'
357+ new_manifest ['service' ]['delayed' ] = True
358+
359+ AutoTSHelp .GLOBAL_STATE = {"state" : "enabled" }
360+ # Mock init_cfg connector
361+ mock_init_cfg = Mock ()
362+ mock_init_cfg .get_entry = Mock (side_effect = AutoTSHelp .get_entry )
363+
364+ # Mock running/peristent cfg connector
365+ mock_other_cfg = Mock ()
366+ mock_other_cfg .get_entry = Mock (side_effect = AutoTSHelp .get_entry_running_cfg )
367+
368+ # Setup sonic_db class
369+ mock_sonic_db .get_connectors = Mock (return_value = [mock_init_cfg , mock_other_cfg ])
370+ mock_sonic_db .get_initial_db_connector = Mock (return_value = mock_init_cfg )
371+
372+ feature_registry = FeatureRegistry (mock_sonic_db )
373+ feature_registry .update (manifest , new_manifest )
374+
375+ mock_init_cfg .set_entry .assert_has_calls (
376+ [
377+ call ("AUTO_TECHSUPPORT_FEATURE" , "test" , None ),
378+ call ("AUTO_TECHSUPPORT_FEATURE" , "test_new" , {
379+ "state" : "enabled" ,
380+ "rate_limit_interval" : "600"
381+ })
382+ ],
383+ any_order = True
384+ )
385+
386+ mock_other_cfg .set_entry .assert_has_calls (
387+ [
388+ call ("AUTO_TECHSUPPORT_FEATURE" , "test" , None ),
389+ call ("AUTO_TECHSUPPORT_FEATURE" , "test_new" , {
390+ "state" : "disabled" ,
391+ "rate_limit_interval" : "1000"
392+ })
393+ ],
394+ any_order = True
395+ )
0 commit comments