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()
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 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 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)
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 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
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)
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
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)
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)
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)
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()
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), [])
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)
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()
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()
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()
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)