Ejemplo n.º 1
0
class ServiceManagerTest(unittest.TestCase):
    def setUp(self):
        magma_service_mock = MagicMock()
        magma_service_mock.mconfig = PipelineD()
        magma_service_mock.mconfig.services.extend(
            [PipelineD.ENFORCEMENT, PipelineD.DPI, PipelineD.METERING])
        magma_service_mock.config = {
            'static_services': ['arpd', 'access_control']
        }
        self.service_manager = ServiceManager(magma_service_mock)

    def test_get_table_num(self):
        self.assertEqual(self.service_manager.get_table_num(INGRESS), 1)
        self.assertEqual(self.service_manager.get_table_num(EGRESS), 20)
        self.assertEqual(
            self.service_manager.get_table_num(ArpController.APP_NAME), 2)
        self.assertEqual(
            self.service_manager.get_table_num(
                AccessControlController.APP_NAME), 3)
        self.assertEqual(
            self.service_manager.get_table_num(EnforcementController.APP_NAME),
            4)
        self.assertEqual(
            self.service_manager.get_table_num(DPIController.APP_NAME), 5)
        self.assertEqual(
            self.service_manager.get_table_num(MeterController.APP_NAME), 6)
        self.assertEqual(
            self.service_manager.get_table_num(MeterStatsController.APP_NAME),
            6)

    def test_get_next_table_num(self):
        self.assertEqual(self.service_manager.get_next_table_num(INGRESS), 2)
        self.assertEqual(
            self.service_manager.get_next_table_num(ArpController.APP_NAME), 3)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                AccessControlController.APP_NAME), 4)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                EnforcementController.APP_NAME), 5)
        self.assertEqual(
            self.service_manager.get_next_table_num(DPIController.APP_NAME), 6)
        self.assertEqual(
            self.service_manager.get_next_table_num(MeterController.APP_NAME),
            20)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                MeterStatsController.APP_NAME), 20)

    def test_is_app_enabled(self):
        self.assertTrue(
            self.service_manager.is_app_enabled(
                EnforcementController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(DPIController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(MeterController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(MeterStatsController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(
                EnforcementStatsController.APP_NAME))

        self.assertFalse(
            self.service_manager.is_app_enabled("Random name lol"))

    def test_allocate_scratch_tables(self):
        self.assertEqual(
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 1), [21])
        self.assertEqual(
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 2), [22, 23])

        # There are a total of 255 tables. First 20 tables are reserved as
        # main tables and 3 scratch tables are allocated above.
        with self.assertRaises(TableNumException):
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 255 - 20 - 3)

    def test_get_scratch_table_nums(self):
        enforcement_scratch = \
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 2) + \
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 3)

        self.assertEqual(
            self.service_manager.get_scratch_table_nums(
                EnforcementController.APP_NAME), enforcement_scratch)
        self.assertEqual(
            self.service_manager.get_scratch_table_nums(
                MeterController.APP_NAME), [])

    def test_get_all_table_assignments(self):
        self.service_manager.allocate_scratch_tables(
            EnforcementController.APP_NAME, 1)
        self.service_manager.allocate_scratch_tables(
            EnforcementStatsController.APP_NAME, 2)

        result = self.service_manager.get_all_table_assignments()
        expected = OrderedDict([
            ('ingress', Tables(main_table=1, scratch_tables=[])),
            ('arpd', Tables(main_table=2, scratch_tables=[])),
            ('access_control', Tables(main_table=3, scratch_tables=[])),
            ('enforcement', Tables(main_table=4, scratch_tables=[21])),
            ('enforcement_stats', Tables(main_table=4, scratch_tables=[22,
                                                                       23])),
            ('dpi', Tables(main_table=5, scratch_tables=[])),
            ('meter', Tables(main_table=6, scratch_tables=[])),
            ('meter_stats', Tables(main_table=6, scratch_tables=[])),
            ('subscriber', Tables(main_table=6, scratch_tables=[])),
            ('egress', Tables(main_table=20, scratch_tables=[])),
        ])

        self.assertEqual(len(result), len(expected))
        for result_key, expected_key in zip(result, expected):
            self.assertEqual(result_key, expected_key)
            self.assertEqual(result[result_key].main_table,
                             expected[expected_key].main_table)
            self.assertEqual(result[result_key].scratch_tables,
                             expected[expected_key].scratch_tables)
Ejemplo n.º 2
0
class ServiceManagerTest(unittest.TestCase):
    def setUp(self):
        magma_service_mock = MagicMock()
        magma_service_mock.mconfig = PipelineD()
        magma_service_mock.mconfig.services.extend(
            [PipelineD.ENFORCEMENT, PipelineD.DPI])
        magma_service_mock.config = {
            'static_services': ['arpd', 'access_control', 'ipfix', 'proxy'],
            '5G_feature_set': {'enable': False}
        }
        # mock the get_default_client function used to return a fakeredis object
        func_mock = MagicMock(return_value=fakeredis.FakeStrictRedis())
        with mock.patch(
            'magma.pipelined.rule_mappers.get_default_client',
            func_mock):
            self.service_manager = ServiceManager(magma_service_mock)

    def test_get_table_num(self):
        self.assertEqual(self.service_manager.get_table_num(INGRESS), 1)
        self.assertEqual(self.service_manager.get_table_num(EGRESS), 20)
        self.assertEqual(
            self.service_manager.get_table_num(ArpController.APP_NAME), 2)
        self.assertEqual(
            self.service_manager.get_table_num(
                AccessControlController.APP_NAME), 3)
        self.assertEqual(
            self.service_manager.get_table_num(DPIController.APP_NAME),
            11)
        self.assertEqual(
            self.service_manager.get_table_num(GYController.APP_NAME),
            12)
        self.assertEqual(
            self.service_manager.get_table_num(EnforcementController.APP_NAME),
            13)
        self.assertEqual(
            self.service_manager.get_table_num(EnforcementStatsController.APP_NAME),
            14)
        self.assertEqual(
            self.service_manager.get_table_num(IPFIXController.APP_NAME),
            15)
        self.assertEqual(
            self.service_manager.get_table_num(PHYSICAL_TO_LOGICAL),
            10)

    def test_get_next_table_num(self):
        self.assertEqual(self.service_manager.get_next_table_num(INGRESS), 2)
        self.assertEqual(
            self.service_manager.get_next_table_num(ArpController.APP_NAME), 3)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                AccessControlController.APP_NAME), 4)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                HeaderEnrichmentController.APP_NAME), 10)
        self.assertEqual(
            self.service_manager.get_next_table_num(DPIController.APP_NAME),
            12)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                GYController.APP_NAME),
            13)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                EnforcementController.APP_NAME),
            14)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                EnforcementStatsController.APP_NAME),
            15)
        self.assertEqual(
            self.service_manager.get_next_table_num(IPFIXController.APP_NAME),
            20)
        self.assertEqual(
            self.service_manager.get_next_table_num(PHYSICAL_TO_LOGICAL),
            11)
        with self.assertRaises(TableNumException):
            self.service_manager.get_next_table_num(EGRESS)

    def test_is_app_enabled(self):
        self.assertTrue(self.service_manager.is_app_enabled(
            EnforcementController.APP_NAME))
        self.assertTrue(self.service_manager.is_app_enabled(
            DPIController.APP_NAME))
        self.assertTrue(self.service_manager.is_app_enabled(
            EnforcementStatsController.APP_NAME))

        self.assertFalse(
            self.service_manager.is_app_enabled("Random name lol"))

    def test_allocate_scratch_tables(self):
        self.assertEqual(self.service_manager.allocate_scratch_tables(
            EnforcementController.APP_NAME, 1), [21])
        self.assertEqual(self.service_manager.allocate_scratch_tables(
            EnforcementController.APP_NAME, 2), [22, 23])

        # There are a total of 200 tables. First 20 tables are reserved as
        # main tables and 3 scratch tables are allocated above.
        with self.assertRaises(TableNumException):
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 200 - 20 - 3)

    def test_get_scratch_table_nums(self):
        enforcement_scratch = \
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 2) + \
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 3)

        self.assertEqual(self.service_manager.get_scratch_table_nums(
            EnforcementController.APP_NAME), enforcement_scratch)

    def test_get_all_table_assignments(self):
        self.service_manager.allocate_scratch_tables(
            EnforcementController.APP_NAME, 1)
        self.service_manager.allocate_scratch_tables(
            EnforcementStatsController.APP_NAME, 2)

        result = self.service_manager.get_all_table_assignments()
        print(result)
        expected = OrderedDict([
            ('mme', Tables(main_table=0, scratch_tables=[],
                           type=ControllerType.SPECIAL)),
            ('ingress', Tables(main_table=1, scratch_tables=[],
                               type=ControllerType.SPECIAL)),
            ('arpd', Tables(main_table=2, scratch_tables=[],
                            type=ControllerType.PHYSICAL)),
            ('access_control', Tables(main_table=3, scratch_tables=[],
                                      type=ControllerType.PHYSICAL)),
            ('proxy', Tables(main_table=4, scratch_tables=[],
                                      type=ControllerType.PHYSICAL)),
            ('middle', Tables(main_table=10, scratch_tables=[], type=None)),
            ('dpi', Tables(main_table=11, scratch_tables=[],
                           type=ControllerType.LOGICAL)),
            ('gy', Tables(main_table=12, scratch_tables=[],
                                   type=ControllerType.LOGICAL)),
            ('enforcement', Tables(main_table=13, scratch_tables=[21],
                                   type=ControllerType.LOGICAL)),
            ('enforcement_stats', Tables(main_table=14, scratch_tables=[22, 23],
                                         type=ControllerType.LOGICAL)),
            ('ipfix', Tables(main_table=15, scratch_tables=[],
                                   type=ControllerType.LOGICAL)),
            ('egress', Tables(main_table=20, scratch_tables=[],
                              type=ControllerType.SPECIAL)),
        ])

        self.assertEqual(len(result), len(expected))
        for result_key, expected_key in zip(result, expected):
            self.assertEqual(result_key, expected_key)
            self.assertEqual(result[result_key].main_table,
                             expected[expected_key].main_table)
            self.assertEqual(result[result_key].scratch_tables,
                             expected[expected_key].scratch_tables)
Ejemplo n.º 3
0
class ServiceManagerTest(unittest.TestCase):
    def setUp(self):
        magma_service_mock = MagicMock()
        magma_service_mock.mconfig = PipelineD()
        magma_service_mock.mconfig.services.extend(
            [PipelineD.ENFORCEMENT, PipelineD.DPI, PipelineD.METERING])
        magma_service_mock.config = {
            'static_services': ['arpd', 'access_control']
        }
        # Hack since service manager is supposed to be a singleton.
        ServiceManager._instance = None
        self.service_manager = ServiceManager(magma_service_mock)

    def test_get_table_num(self):
        self.assertEqual(self.service_manager.get_table_num(INGRESS), 1)
        self.assertEqual(self.service_manager.get_table_num(EGRESS), 20)
        self.assertEqual(
            self.service_manager.get_table_num(ArpController.APP_NAME), 2)
        self.assertEqual(
            self.service_manager.get_table_num(
                AccessControlController.APP_NAME), 3)
        self.assertEqual(
            self.service_manager.get_table_num(EnforcementController.APP_NAME),
            4)
        self.assertEqual(
            self.service_manager.get_table_num(DPIController.APP_NAME), 5)
        self.assertEqual(
            self.service_manager.get_table_num(MeterController.APP_NAME), 6)
        self.assertEqual(
            self.service_manager.get_table_num(MeterStatsController.APP_NAME),
            6)

    def test_get_next_table_num(self):
        self.assertEqual(self.service_manager.get_next_table_num(INGRESS), 2)
        self.assertEqual(
            self.service_manager.get_next_table_num(ArpController.APP_NAME), 3)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                AccessControlController.APP_NAME), 4)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                EnforcementController.APP_NAME), 5)
        self.assertEqual(
            self.service_manager.get_next_table_num(DPIController.APP_NAME), 6)
        self.assertEqual(
            self.service_manager.get_next_table_num(MeterController.APP_NAME),
            20)
        self.assertEqual(
            self.service_manager.get_next_table_num(
                MeterStatsController.APP_NAME), 20)

    def test_is_app_enabled(self):
        self.assertTrue(
            self.service_manager.is_app_enabled(
                EnforcementController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(DPIController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(MeterController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(MeterStatsController.APP_NAME))
        self.assertTrue(
            self.service_manager.is_app_enabled(
                EnforcementStatsController.APP_NAME))

        self.assertFalse(
            self.service_manager.is_app_enabled("Random name lol"))

    def test_allocate_scratch_tables(self):
        self.assertEqual(
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 1), [21])
        self.assertEqual(
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 2), [22, 23])

        # There are a total of 255 tables. First 20 tables are reserved as
        # main tables and 3 scratch tables are allocated above.
        with self.assertRaises(TableNumException):
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 255 - 20 - 3)

    def test_get_scratch_table_nums(self):
        enforcement_scratch = \
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 2) + \
            self.service_manager.allocate_scratch_tables(
                EnforcementController.APP_NAME, 3)

        self.assertEqual(
            self.service_manager.get_scratch_table_nums(
                EnforcementController.APP_NAME), enforcement_scratch)
        self.assertEqual(
            self.service_manager.get_scratch_table_nums(
                MeterController.APP_NAME), [])