예제 #1
0
def main():
    """
    Loads the Ryu apps we want to run from the config file.
    This should exit on keyboard interrupt.
    """

    # Run asyncio loop in a greenthread so we can evaluate other eventlets
    # TODO: Remove once Ryu migrates to asyncio
    asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy())

    service = MagmaService('pipelined')
    service_config = service.config

    if environment.is_dev_mode():
        of_rest_server.configure(service_config)

    # Set Ryu config params
    cfg.CONF.ofp_listen_host = "127.0.0.1"

    # Load the ryu apps
    service_manager = ServiceManager(service)
    service_manager.load()

    def callback(returncode):
        if returncode != 0:
            logging.error(
                "Failed to set MASQUERADE: %d", returncode
            )

    if service.mconfig.nat_enabled:
        call_process('iptables -t nat -A POSTROUTING -o %s -j MASQUERADE'
                     % service.config['nat_iface'],
                     callback,
                     service.loop
                     )

    service.loop.create_task(monitor_ifaces(
        service.config['monitored_ifaces'],
        service.loop),
    )

    manager = AppManager.get_instance()
    # Add pipelined rpc servicer
    pipelined_srv = PipelinedRpcServicer(
        service.loop,
        manager.applications.get('MeterStatsController', None),
        manager.applications.get('EnforcementController', None),
        manager.applications.get('EnforcementStatsController', None),
        manager.applications.get('DPIController', None),
        service_manager)
    pipelined_srv.add_to_server(service.rpc_server)

    # Run the service loop
    service.run()

    # Cleanup the service
    service.close()
예제 #2
0
 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)
예제 #3
0
 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)
예제 #4
0
 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
         }
     }
     self.service_manager = ServiceManager(magma_service_mock)
예제 #5
0
 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)
예제 #6
0
def create_service_manager(services: List[int],
                           static_services: List[str] = None):
    """
    Creates a service manager from the given list of services.
    Args:
        services ([int]): Enums of the service from mconfig proto
    Returns:
        A service manager instance from the given config
    """
    mconfig = PipelineD(services=services)
    magma_service = MagicMock()
    magma_service.mconfig = mconfig
    if static_services is None:
        static_services = []
    magma_service.config = {
        'static_services': static_services,
        '5G_feature_set': {
            'enable': False
        }
    }
    service_manager = ServiceManager(magma_service)

    # Workaround as we don't use redis in unit tests
    service_manager.rule_id_mapper._rule_nums_by_rule = {}
    service_manager.rule_id_mapper._rules_by_rule_num = {}
    service_manager.session_rule_version_mapper._version_by_imsi_and_rule = {}
    service_manager.interface_to_prefix_mapper._prefix_by_interface = {}
    service_manager.tunnel_id_mapper._tunnel_map = {}

    return service_manager
예제 #7
0
 def setUpClass(cls):
     magma_service_mock = MagicMock()
     magma_service_mock.mconfig = PipelineD(relay_enabled=False)
     magma_service_mock.mconfig.services.extend(
         [PipelineD.ENFORCEMENT, PipelineD.DPI, PipelineD.METERING])
     magma_service_mock.config = {'static_apps': ['arpd', 'access_control']}
     cls.service_manager = ServiceManager(magma_service_mock)
예제 #8
0
def create_service_manager(services: List[int],
                           static_services: List[str] = None):
    """
    Creates a service manager from the given list of services.
    Args:
        services ([int]): Enums of the service from mconfig proto
    Returns:
        A service manager instance from the given config
    """
    mconfig = PipelineD(services=services)
    magma_service = MagicMock()
    magma_service.mconfig = mconfig
    if static_services is None:
        static_services = []
    magma_service.config = {
        'static_services': static_services,
        '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):
        service_manager = ServiceManager(magma_service)

    # Workaround as we don't use redis in unit tests
    service_manager.rule_id_mapper._rule_nums_by_rule = {}
    service_manager.rule_id_mapper._rules_by_rule_num = {}
    service_manager.session_rule_version_mapper._version_by_imsi_and_rule = {}
    service_manager.interface_to_prefix_mapper._prefix_by_interface = {}
    service_manager.tunnel_id_mapper._tunnel_map = {}

    return service_manager
예제 #9
0
def create_service_manager(services=list):
    """
    Creates a service manager from the given list of services.
    Args:
        services ([int]): Enums of the service from mconfig proto
    Returns:
        A service manager instance from the given config
    """
    mconfig = PipelineD(relay_enabled=True, services=services)
    magma_service = MagicMock()
    magma_service.mconfig = mconfig
    magma_service.config = {'static_services': ['arpd', 'access_control']}
    return ServiceManager(magma_service)
예제 #10
0
def create_service_manager(services: List[int], include_ue_mac=False):
    """
    Creates a service manager from the given list of services.
    Args:
        services ([int]): Enums of the service from mconfig proto
    Returns:
        A service manager instance from the given config
    """
    mconfig = PipelineD(relay_enabled=True, services=services)
    magma_service = MagicMock()
    magma_service.mconfig = mconfig

    static_services = (['ue_mac', 'arpd', 'access_control', 'tunnel_learn']
                       if include_ue_mac else ['arpd', 'access_control'])
    magma_service.config = {'static_services': static_services}
    return ServiceManager(magma_service)
예제 #11
0
def create_service_manager(services: List[int],
                           static_services: List[str] = None):
    """
    Creates a service manager from the given list of services.
    Args:
        services ([int]): Enums of the service from mconfig proto
    Returns:
        A service manager instance from the given config
    """
    mconfig = PipelineD(relay_enabled=True, services=services)
    magma_service = MagicMock()
    magma_service.mconfig = mconfig
    if static_services is None:
        static_services = []
    magma_service.config = {'static_services': static_services}
    return ServiceManager(magma_service)
예제 #12
0
def main():
    """
    Loads the Ryu apps we want to run from the config file.
    This should exit on keyboard interrupt.
    """

    # Run asyncio loop in a greenthread so we can evaluate other eventlets
    # TODO: Remove once Ryu migrates to asyncio
    asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy())

    service = MagmaService('pipelined', mconfigs_pb2.PipelineD())

    # Optionally pipe errors to Sentry
    sentry_init(service_name=service.name)

    service_config = service.config

    if environment.is_dev_mode():
        of_rest_server.configure(service_config)

    # Set Ryu config params
    cfg.CONF.ofp_listen_host = "127.0.0.1"

    # override mconfig using local config.
    # TODO: move config compilation to separate module.
    enable_nat = service.config.get('enable_nat', service.mconfig.nat_enabled)
    service.config['enable_nat'] = enable_nat
    logging.info("Nat: %s", enable_nat)
    vlan_tag = service.config.get(
        'sgi_management_iface_vlan',
        service.mconfig.sgi_management_iface_vlan,
    )
    service.config['sgi_management_iface_vlan'] = vlan_tag

    sgi_ip = service.config.get(
        'sgi_management_iface_ip_addr',
        service.mconfig.sgi_management_iface_ip_addr,
    )
    service.config['sgi_management_iface_ip_addr'] = sgi_ip

    sgi_gateway_ip = service.config.get(
        'sgi_management_iface_gw',
        service.mconfig.sgi_management_iface_gw,
    )
    service.config['sgi_management_iface_gw'] = sgi_gateway_ip

    # Keep router mode off for smooth upgrade path
    service.config['dp_router_enabled'] = service.config.get(
        'dp_router_enabled',
        False,
    )
    if 'virtual_mac' not in service.config:
        if service.config['dp_router_enabled']:
            up_bridge_name = service.config.get(
                'uplink_bridge', UPLINK_OVS_BRIDGE_NAME,
            )
            mac_addr = get_if_hwaddr(up_bridge_name)
        else:
            mac_addr = get_if_hwaddr(service.config.get('bridge_name'))

        service.config['virtual_mac'] = mac_addr

    # this is not read from yml file.
    service.config['uplink_port'] = OFPP_LOCAL
    uplink_port_name = service.config.get('ovs_uplink_port_name', None)
    if enable_nat is False and uplink_port_name is not None:
        service.config['uplink_port'] = BridgeTools.get_ofport(
            uplink_port_name,
        )

    # header enrichment related configuration.
    service.config['proxy_port_name'] = PROXY_PORT_NAME
    he_enabled_flag = False
    if service.mconfig.he_config:
        he_enabled_flag = service.mconfig.he_config.enable_header_enrichment
    he_enabled = service.config.get('he_enabled', he_enabled_flag)
    service.config['he_enabled'] = he_enabled

    # monitoring related configuration
    mtr_interface = service.config.get('mtr_interface', None)
    if mtr_interface:
        mtr_ip = get_ip_from_if(mtr_interface)
        service.config['mtr_ip'] = mtr_ip

    # Load the ryu apps
    service_manager = ServiceManager(service)
    service_manager.load()

    def callback(returncode):
        if returncode != 0:
            logging.error(
                "Failed to set MASQUERADE: %d", returncode,
            )

    # TODO fix this hack for XWF
    if enable_nat is True or service.config.get('setup_type') == 'XWF':
        call_process(
            'iptables -t nat -A POSTROUTING -o %s -j MASQUERADE'
            % service.config['nat_iface'],
            callback,
            service.loop,
        )

    service.loop.create_task(
        monitor_ifaces(
            service.config['monitored_ifaces'],
        ),
    )

    manager = AppManager.get_instance()
    # Add pipelined rpc servicer
    pipelined_srv = PipelinedRpcServicer(
        service.loop,
        manager.applications.get('GYController', None),
        manager.applications.get('EnforcementController', None),
        manager.applications.get('EnforcementStatsController', None),
        manager.applications.get('DPIController', None),
        manager.applications.get('UEMacAddressController', None),
        manager.applications.get('CheckQuotaController', None),
        manager.applications.get('IPFIXController', None),
        manager.applications.get('VlanLearnController', None),
        manager.applications.get('TunnelLearnController', None),
        manager.applications.get('Classifier', None),
        manager.applications.get('InOutController', None),
        manager.applications.get('NGServiceController', None),
        service.config,
        service_manager,
    )
    pipelined_srv.add_to_server(service.rpc_server)

    if service.config['setup_type'] == 'CWF':
        bridge_ip = service.config['bridge_ip_address']
        has_quota_port = service.config['has_quota_port']
        no_quota_port = service.config['no_quota_port']

        def on_exit_server_thread():
            service.StopService(None, None)

        # For CWF start quota check servers
        start_check_quota_server(
            run_flask, bridge_ip, has_quota_port, True,
            on_exit_server_thread,
        )
        start_check_quota_server(
            run_flask, bridge_ip, no_quota_port, False,
            on_exit_server_thread,
        )

    if service.config['setup_type'] == 'LTE':
        polling_interval = service.config.get(
            'ovs_gtp_stats_polling_interval',
            MIN_OVSDB_DUMP_POLLING_INTERVAL,
        )
        collector = GTPStatsCollector(
            polling_interval,
            service.loop,
        )
        collector.start()

    # Run the service loop
    service.run()

    # Cleanup the service
    service.close()
예제 #13
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), [])
예제 #14
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)
예제 #15
0
파일: main.py 프로젝트: remo5000/magma
def main():
    """
    Loads the Ryu apps we want to run from the config file.
    This should exit on keyboard interrupt.
    """

    # Run asyncio loop in a greenthread so we can evaluate other eventlets
    # TODO: Remove once Ryu migrates to asyncio
    asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy())

    service = MagmaService('pipelined', mconfigs_pb2.PipelineD())
    service_config = service.config

    if environment.is_dev_mode():
        of_rest_server.configure(service_config)

    # Set Ryu config params
    cfg.CONF.ofp_listen_host = "127.0.0.1"

    # Load the ryu apps
    service_manager = ServiceManager(service)
    service_manager.load()

    def callback(returncode):
        if returncode != 0:
            logging.error(
                "Failed to set MASQUERADE: %d", returncode
            )

    if service.mconfig.nat_enabled:
        call_process('iptables -t nat -A POSTROUTING -o %s -j MASQUERADE'
                     % service.config['nat_iface'],
                     callback,
                     service.loop
                     )

    service.loop.create_task(monitor_ifaces(
        service.config['monitored_ifaces'],
        service.loop),
    )

    manager = AppManager.get_instance()
    # Add pipelined rpc servicer
    pipelined_srv = PipelinedRpcServicer(
        service.loop,
        manager.applications.get('MeterStatsController', None),
        manager.applications.get('EnforcementController', None),
        manager.applications.get('EnforcementStatsController', None),
        manager.applications.get('DPIController', None),
        manager.applications.get('UEMacAddressController', None),
        manager.applications.get('CheckQuotaController', None),
        service_manager)
    pipelined_srv.add_to_server(service.rpc_server)

    if service.config['setup_type'] == 'CWF':
        bridge_ip = service.config['bridge_ip_address']
        has_quota_port = service.config['has_quota_port']
        no_quota_port = service.config['no_quota_port']

        def on_exit_server_thread():
            service.StopService(None, None)

        # For CWF start quota check servers
        start_check_quota_server(run_flask, bridge_ip, has_quota_port, True,
                                 on_exit_server_thread)
        start_check_quota_server(run_flask, bridge_ip, no_quota_port, False,
                                 on_exit_server_thread)

    # Run the service loop
    service.run()

    # Cleanup the service
    service.close()
예제 #16
0
파일: main.py 프로젝트: ashish-pr/magma
def main():
    """
    Loads the Ryu apps we want to run from the config file.
    This should exit on keyboard interrupt.
    """

    # Run asyncio loop in a greenthread so we can evaluate other eventlets
    # TODO: Remove once Ryu migrates to asyncio
    asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy())

    service = MagmaService('pipelined', mconfigs_pb2.PipelineD())
    service_config = service.config

    if environment.is_dev_mode():
        of_rest_server.configure(service_config)

    # Set Ryu config params
    cfg.CONF.ofp_listen_host = "127.0.0.1"

    # override mconfig using local config.
    # TODO: move config compilation to separate module.
    enable_nat = service.config.get('enable_nat', service.mconfig.nat_enabled)
    service.config['enable_nat'] = enable_nat
    logging.info("Nat: %s", enable_nat)
    vlan_tag = service.config.get('sgi_management_iface_vlan',
                                  service.mconfig.sgi_management_iface_vlan)
    service.config['sgi_management_iface_vlan'] = vlan_tag

    sgi_ip = service.config.get('sgi_management_iface_ip_addr',
                                service.mconfig.sgi_management_iface_ip_addr)
    service.config['sgi_management_iface_ip_addr'] = sgi_ip

    if 'virtual_mac' not in service.config:
        service.config['virtual_mac'] = get_if_hwaddr(
            service.config.get('bridge_name'))

    # Load the ryu apps
    service_manager = ServiceManager(service)
    service_manager.load()

    def callback(returncode):
        if returncode != 0:
            logging.error("Failed to set MASQUERADE: %d", returncode)

    # TODO fix this hack for XWF
    if enable_nat is True or service.config.get('setup_type') == 'XWF':
        call_process(
            'iptables -t nat -A POSTROUTING -o %s -j MASQUERADE' %
            service.config['nat_iface'], callback, service.loop)

    service.loop.create_task(
        monitor_ifaces(service.config['monitored_ifaces'], service.loop), )

    manager = AppManager.get_instance()
    # Add pipelined rpc servicer
    pipelined_srv = PipelinedRpcServicer(
        service.loop, manager.applications.get('GYController', None),
        manager.applications.get('EnforcementController', None),
        manager.applications.get('EnforcementStatsController', None),
        manager.applications.get('DPIController', None),
        manager.applications.get('UEMacAddressController', None),
        manager.applications.get('CheckQuotaController', None),
        manager.applications.get('IPFIXController', None),
        manager.applications.get('VlanLearnController', None),
        manager.applications.get('TunnelLearnController', None),
        service_manager)
    pipelined_srv.add_to_server(service.rpc_server)

    if service.config['setup_type'] == 'CWF':
        bridge_ip = service.config['bridge_ip_address']
        has_quota_port = service.config['has_quota_port']
        no_quota_port = service.config['no_quota_port']

        def on_exit_server_thread():
            service.StopService(None, None)

        # For CWF start quota check servers
        start_check_quota_server(run_flask, bridge_ip, has_quota_port, True,
                                 on_exit_server_thread)
        start_check_quota_server(run_flask, bridge_ip, no_quota_port, False,
                                 on_exit_server_thread)

    if service.config['setup_type'] == 'LTE':
        polling_interval = service.config.get('ovs_gtp_stats_polling_interval',
                                              MIN_OVSDB_DUMP_POLLING_INTERVAL)
        collector = GTPStatsCollector(polling_interval, service.loop)
        collector.start()

    # Run the service loop
    service.run()

    # Cleanup the service
    service.close()
예제 #17
0
def main():
    """
    Loads the Ryu apps we want to run from the config file.
    This should exit on keyboard interrupt.
    """

    # Run asyncio loop in a greenthread so we can evaluate other eventlets
    # TODO: Remove once Ryu migrates to asyncio
    asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy())

    service = MagmaService('pipelined', mconfigs_pb2.PipelineD())

    # Optionally pipe errors to Sentry
    sentry_init(service_name=service.name, sentry_mconfig=service.shared_mconfig.sentry_config)

    service_config = service.config

    if environment.is_dev_mode():
        of_rest_server.configure(service_config)

    # Set Ryu config params
    cfg.CONF.ofp_listen_host = "127.0.0.1"

    # override mconfig using local config.
    # TODO: move config compilation to separate module.
    enable_nat = service.config.get('enable_nat', service.mconfig.nat_enabled)
    service.config['enable_nat'] = enable_nat
    logging.info("Nat: %s", enable_nat)
    enable5g_features = service.config.get(
        'enable5g_features',
        service.mconfig.enable5g_features,
    )
    service.config['enable5g_features'] = enable5g_features
    logging.info("enable5g_features: %s", enable5g_features)
    vlan_tag = service.config.get(
        'sgi_management_iface_vlan',
        service.mconfig.sgi_management_iface_vlan,
    )
    service.config['sgi_management_iface_vlan'] = vlan_tag

    sgi_ip = service.config.get(
        'sgi_management_iface_ip_addr',
        service.mconfig.sgi_management_iface_ip_addr,
    )
    service.config['sgi_management_iface_ip_addr'] = sgi_ip

    sgi_gateway_ip = service.config.get(
        'sgi_management_iface_gw',
        service.mconfig.sgi_management_iface_gw,
    )
    service.config['sgi_management_iface_gw'] = sgi_gateway_ip

    # SGi IPv6 address conf
    sgi_ipv6 = service.config.get(
        'sgi_management_iface_ipv6_addr',
        service.mconfig.sgi_management_iface_ipv6_addr,
    )
    service.config['sgi_management_iface_ipv6_addr'] = sgi_ipv6

    sgi_gateway_ipv6 = service.config.get(
        'sgi_management_iface_ipv6_gw',
        service.mconfig.sgi_management_iface_ipv6_gw,
    )
    service.config['sgi_management_iface_ipv6_gw'] = sgi_gateway_ipv6

    # Keep router mode off for smooth upgrade path
    service.config['dp_router_enabled'] = service.config.get(
        'dp_router_enabled',
        False,
    )
    if 'virtual_mac' not in service.config:
        if service.config['dp_router_enabled']:
            up_iface_name = service.config.get('nat_iface', None)
            mac_addr = get_if_hwaddr(up_iface_name)
        else:
            mac_addr = get_if_hwaddr(service.config.get('bridge_name'))

        service.config['virtual_mac'] = mac_addr

    # this is not read from yml file.
    service.config['uplink_port'] = OFPP_LOCAL
    uplink_port_name = service.config.get('ovs_uplink_port_name', None)
    if enable_nat is False and uplink_port_name is not None:
        service.config['uplink_port'] = BridgeTools.get_ofport(
            uplink_port_name,
        )

    # header enrichment related configuration.
    service.config['proxy_port_name'] = PROXY_PORT_NAME
    he_enabled_flag = False
    if service.mconfig.he_config:
        he_enabled_flag = service.mconfig.he_config.enable_header_enrichment
        if he_enabled_flag:
            bridge = service.config.get('bridge_name')
            BridgeTools.add_ovs_port(bridge, PROXY_PORT_NAME, PROXY_OF_PORT)

    he_enabled = service.config.get('he_enabled', he_enabled_flag)
    service.config['he_enabled'] = he_enabled

    # tune datapath according to config
    configure_tso(service.config)
    setup_sgi_tunnel(service.config, service.loop)
    tune_datapath(service.config)
    setup_masquerade_rule(service.config, service.loop)

    # monitoring related configuration
    mtr_interface = service.config.get('mtr_interface', None)
    if mtr_interface:
        try:
            service.config['mtr_ip'] = get_ip_from_if(mtr_interface)
        except ValueError:
            logging.warning("Unable to set up mtr interface", exc_info=True)

    # Load the ryu apps
    service_manager = ServiceManager(service)
    service_manager.load()

    service.loop.create_task(
        monitor_ifaces(
            service.config['monitored_ifaces'],
        ),
    )

    manager = AppManager.get_instance()
    # Add pipelined rpc servicer
    pipelined_srv = PipelinedRpcServicer(
        service.loop,
        manager.applications.get('GYController', None),
        manager.applications.get('EnforcementController', None),
        manager.applications.get('EnforcementStatsController', None),
        manager.applications.get('DPIController', None),
        manager.applications.get('UEMacAddressController', None),
        manager.applications.get('CheckQuotaController', None),
        manager.applications.get('IPFIXController', None),
        manager.applications.get('VlanLearnController', None),
        manager.applications.get('TunnelLearnController', None),
        manager.applications.get('Classifier', None),
        manager.applications.get('InOutController', None),
        manager.applications.get('NGServiceController', None),
        service.config,
        service_manager,
    )
    pipelined_srv.add_to_server(service.rpc_server)

    if service.config['setup_type'] == 'CWF':
        bridge_ip = service.config['bridge_ip_address']
        has_quota_port = service.config['has_quota_port']
        no_quota_port = service.config['no_quota_port']

        def on_exit_server_thread():
            service.StopService(None, None)

        # For CWF start quota check servers
        start_check_quota_server(
            run_flask, bridge_ip, has_quota_port, True,
            on_exit_server_thread,
        )
        start_check_quota_server(
            run_flask, bridge_ip, no_quota_port, False,
            on_exit_server_thread,
        )

    if service.config['setup_type'] == 'LTE':
        polling_interval = service.config.get(
            'ovs_gtp_stats_polling_interval',
            MIN_OVSDB_DUMP_POLLING_INTERVAL,
        )
        collector = GTPStatsCollector(
            polling_interval,
            service.loop,
        )
        collector.start()

    # Run the service loop
    service.run()

    # Cleanup the service
    service.close()
예제 #18
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)