def setUp(self): logname = 'test_config' logger = logging.getLogger('%s.config' % logname) logger_handler = logging.StreamHandler(stream=sys.stderr) log_fmt = '%(asctime)s %(name)-6s %(levelname)-8s %(message)s' logger_handler.setFormatter( logging.Formatter(log_fmt, '%b %d %H:%M:%S')) logger.addHandler(logger_handler) logger.propagate = 0 logger.setLevel(logging.CRITICAL) self.v1_config_hashes, self.v1_dps = dp_parser( 'config/testconfig.yaml', logname) self.v1_dp = self.v1_dps[0] self.v2_config_hashes, v2_dps = dp_parser('config/testconfigv2.yaml', logname) self.v2_dps_by_id = {} for dp in v2_dps: self.v2_dps_by_id[dp.dp_id] = dp self.v2_dp = self.v2_dps_by_id[0xcafef00d] self.v1_watchers = watcher_parser('config/testgaugeconfig.conf', logname) self.v2_watchers = watcher_parser('config/testgaugeconfig.yaml', logname)
def setUp(self): self.v1_dp = dp_parser('config/testconfig.yaml', 'test_config')[0] self.v2_dp = dp_parser('config/testconfigv2.yaml', 'test_config')[0] self.v1_watchers = watcher_parser('config/testgaugeconfig.conf', 'test_config') self.v2_watchers = watcher_parser('config/testgaugeconfig.yaml', 'test_config')
def __init__(self, *args, **kwargs): super(Faucet, self).__init__(*args, **kwargs) # There doesnt seem to be a sensible method of getting command line # options into ryu apps. Instead I am using the environment variable # FAUCET_CONFIG to allow this to be set, if it is not set it will # default to valve.yaml sysprefix = get_sys_prefix() self.config_file = os.getenv( 'FAUCET_CONFIG', sysprefix + '/etc/ryu/faucet/faucet.yaml') self.logfile = os.getenv( 'FAUCET_LOG', sysprefix + '/var/log/ryu/faucet/faucet.log') self.exc_logfile = os.getenv( 'FAUCET_EXCEPTION_LOG', sysprefix + '/var/log/ryu/faucet/faucet_exception.log') # Set the signal handler for reloading config file signal.signal(signal.SIGHUP, self.signal_handler) # Create dpset object for querying Ryu's DPSet application self.dpset = kwargs['dpset'] # Setup logging self.logger = logging.getLogger(self.logname) logger_handler = TimedRotatingFileHandler( self.logfile, when='midnight') log_fmt = '%(asctime)s %(name)-6s %(levelname)-8s %(message)s' logger_handler.setFormatter( logging.Formatter(log_fmt, '%b %d %H:%M:%S')) self.logger.addHandler(logger_handler) self.logger.propagate = 0 self.logger.setLevel(logging.DEBUG) # Set up separate logging for exceptions exc_logger = logging.getLogger(self.exc_logname) exc_logger_handler = logging.FileHandler(self.exc_logfile) exc_logger_handler.setFormatter( logging.Formatter(log_fmt, '%b %d %H:%M:%S')) exc_logger.addHandler(exc_logger_handler) exc_logger.propagate = 1 exc_logger.setLevel(logging.CRITICAL) # Set up a valve object for each datapath self.valves = {} for dp in dp_parser(self.config_file, self.logname): # pylint: disable=no-member valve = valve_factory(dp) if valve is None: self.logger.error('Hardware type not supported for DP: %s' % dp.name) else: self.valves[dp.dp_id] = valve(dp, self.logname) self.gateway_resolve_request_thread = hub.spawn( self.gateway_resolve_request) self.host_expire_request_thread = hub.spawn( self.host_expire_request) self.dp_bgp_speakers = {} self.reset_bgp()
def _load_configs(self, new_config_file): self.config_file = new_config_file self.config_hashes, new_dps = dp_parser( new_config_file, self.logname) deleted_valve_dpids = ( set(list(self.valves.keys())) - set([valve.dp_id for valve in new_dps])) for new_dp in new_dps: cold_start = True if new_dp.dp_id in self.valves: valve = self.valves[new_dp.dp_id] cold_start, flowmods = valve.reload_config(new_dp) self._send_flow_msgs(new_dp.dp_id, flowmods) else: # pylint: disable=no-member valve_cl = valve_factory(new_dp) if valve_cl is None: self.logger.fatal('Could not configure %s', new_dp.name) else: valve = valve_cl(new_dp, self.logname) self.valves[new_dp.dp_id] = valve # pylint: disable=no-member if cold_start: self.metrics.faucet_config_reload_cold.labels( dpid=hex(new_dp.dp_id)).inc() else: self.metrics.faucet_config_reload_warm.labels( dpid=hex(new_dp.dp_id)).inc() valve.update_config_metrics(self.metrics) for deleted_valve_dpid in deleted_valve_dpids: self.logger.info( 'Deleting de-configured %s', dpid_log(deleted_valve_dpid)) del self.valves[deleted_valve_dpid] self._bgp.reset(self.valves, self.metrics)
def __init__(self, *args, **kwargs): super(Faucet, self).__init__(*args, **kwargs) # There doesnt seem to be a sensible method of getting command line # options into ryu apps. Instead I am using the environment variable # FAUCET_CONFIG to allow this to be set, if it is not set it will # default to valve.yaml self.config_file = os.getenv( 'FAUCET_CONFIG', '/etc/ryu/faucet/faucet.yaml') self.logfile = os.getenv( 'FAUCET_LOG', '/var/log/ryu/faucet/faucet.log') self.exc_logfile = os.getenv( 'FAUCET_EXCEPTION_LOG', '/var/log/ryu/faucet/faucet_exception.log') # Set the signal handler for reloading config file signal.signal(signal.SIGHUP, self.signal_handler) # Create dpset object for querying Ryu's DPSet application self.dpset = kwargs['dpset'] # Setup logging self.logger = logging.getLogger(self.logname) logger_handler = TimedRotatingFileHandler( self.logfile, when='midnight') log_fmt = '%(asctime)s %(name)-6s %(levelname)-8s %(message)s' logger_handler.setFormatter( logging.Formatter(log_fmt, '%b %d %H:%M:%S')) self.logger.addHandler(logger_handler) self.logger.propagate = 0 self.logger.setLevel(logging.DEBUG) # Set up separate logging for exceptions exc_logger = logging.getLogger(self.exc_logname) exc_logger_handler = logging.FileHandler(self.exc_logfile) exc_logger_handler.setFormatter( logging.Formatter(log_fmt, '%b %d %H:%M:%S')) exc_logger.addHandler(exc_logger_handler) exc_logger.propagate = 1 exc_logger.setLevel(logging.CRITICAL) # Set up a valve object for each datapath self.valves = {} for dp in dp_parser(self.config_file, self.logname): # pylint: disable=no-member valve = valve_factory(dp)(dp, self.logname) if valve is None: self.logger.error('Hardware type not supported for DP: %s' % dp.name) else: self.valves[dp.dp_id] = valve self.gateway_resolve_request_thread = hub.spawn( self.gateway_resolve_request) self.host_expire_request_thread = hub.spawn( self.host_expire_request) self.dp_bgp_speakers = {} self.reset_bgp()
def reload_config(self, ev): new_config_file = os.getenv('FAUCET_CONFIG', self.config_file) new_dps = dp_parser(new_config_file, self.logname) for new_dp in new_dps: # pylint: disable=no-member flowmods = self.valves[new_dp.dp_id].reload_config(new_dp) ryudp = self.dpset.get(new_dp.dp_id) self.send_flow_msgs(ryudp, flowmods) self.reset_bgp()
def __init__(self, *args, **kwargs): super(Faucet, self).__init__(*args, **kwargs) # There doesnt seem to be a sensible method of getting command line # options into ryu apps. Instead I am using the environment variable # FAUCET_CONFIG to allow this to be set, if it is not set it will # default to valve.yaml sysprefix = get_sys_prefix() self.config_file = os.getenv( 'FAUCET_CONFIG', sysprefix + '/etc/ryu/faucet/faucet.yaml') self.logfile = os.getenv( 'FAUCET_LOG', sysprefix + '/var/log/ryu/faucet/faucet.log') self.exc_logfile = os.getenv( 'FAUCET_EXCEPTION_LOG', sysprefix + '/var/log/ryu/faucet/faucet_exception.log') # Set the signal handler for reloading config file signal.signal(signal.SIGHUP, self.signal_handler) # Create dpset object for querying Ryu's DPSet application self.dpset = kwargs['dpset'] # Setup logging self.logger = get_logger( self.logname, self.logfile, logging.DEBUG, 0) # Set up separate logging for exceptions self.exc_logger = get_logger( self.exc_logname, self.exc_logfile, logging.DEBUG, 1) # Set up a valve object for each datapath self.valves = {} self.config_hashes, valve_dps = dp_parser( self.config_file, self.logname) for valve_dp in valve_dps: # pylint: disable=no-member valve = valve_factory(valve_dp) if valve is None: self.logger.error( 'Hardware type not supported for DP: %s', valve_dp.name) else: self.valves[valve_dp.dp_id] = valve(valve_dp, self.logname) self.gateway_resolve_request_thread = hub.spawn( self.gateway_resolve_request) self.host_expire_request_thread = hub.spawn( self.host_expire_request) self.dp_bgp_speakers = {} self._reset_bgp() # Register to API api = kwargs['faucet_api'] api._register(self) self.send_event_to_observers(EventFaucetAPIRegistered())
def setUp(self): logname = 'test_config' logger = logging.getLogger('%s.config' % logname) logger_handler = logging.StreamHandler(stream=sys.stderr) log_fmt = '%(asctime)s %(name)-6s %(levelname)-8s %(message)s' logger_handler.setFormatter( logging.Formatter(log_fmt, '%b %d %H:%M:%S')) logger.addHandler(logger_handler) logger.propagate = 0 logger.setLevel(logging.CRITICAL) self.v1_config_hashes, self.v1_dps = dp_parser('config/testconfig.yaml', logname) self.v1_dp = self.v1_dps[0] self.v2_config_hashes, v2_dps = dp_parser('config/testconfigv2.yaml', logname) self.v2_dps_by_id = {} for dp in v2_dps: self.v2_dps_by_id[dp.dp_id] = dp self.v2_dp = self.v2_dps_by_id[0xcafef00d] self.v1_watchers = watcher_parser( 'config/testgaugeconfig.conf', logname) self.v2_watchers = watcher_parser( 'config/testgaugeconfig.yaml', logname)
def reload_config(self, ryu_event): """Handle a request to reload configuration. Args: ryu_event (ryu.controller.event.EventReplyBase): triggering event. """ new_config_file = os.getenv('FAUCET_CONFIG', self.config_file) if not self._config_changed(new_config_file): self.logger.info('configuration is unchanged, not reloading') return self.config_file = new_config_file self.config_hashes, new_dps = dp_parser(new_config_file, self.logname) for new_dp in new_dps: # pylint: disable=no-member flowmods = self.valves[new_dp.dp_id].reload_config(new_dp) ryudp = self.dpset.get(new_dp.dp_id) self._send_flow_msgs(ryudp, flowmods) self._reset_bgp()
def _load_configs(self, new_config_file): self.config_file = new_config_file self.config_hashes, new_dps = dp_parser(new_config_file, self.logname) if new_dps is None: self.logger.error('new config bad - rejecting') return deleted_valve_dpids = (set(list(self.valves.keys())) - set([valve.dp_id for valve in new_dps])) for new_dp in new_dps: dp_id = new_dp.dp_id if dp_id in self.valves: valve = self.valves[dp_id] cold_start, flowmods = valve.reload_config(new_dp) # pylint: disable=no-member if flowmods: self._send_flow_msgs(new_dp.dp_id, flowmods) if cold_start: self.metrics.faucet_config_reload_cold.labels( dp_id=hex(dp_id)).inc() else: self.metrics.faucet_config_reload_warm.labels( dp_id=hex(dp_id)).inc() else: # pylint: disable=no-member valve_cl = valve_factory(new_dp) if valve_cl is None: self.logger.error('%s hardware %s must be one of %s', new_dp.name, new_dp.hardware, sorted(list(SUPPORTED_HARDWARE.keys()))) continue else: valve = valve_cl(new_dp, self.logname) self.valves[dp_id] = valve self.logger.info('Add new datapath %s', dpid_log(dp_id)) self.metrics.reset_dpid(dp_id) valve.update_config_metrics(self.metrics) for deleted_valve_dpid in deleted_valve_dpids: self.logger.info('Deleting de-configured %s', dpid_log(deleted_valve_dpid)) del self.valves[deleted_valve_dpid] ryu_dp = self.dpset.get(deleted_valve_dpid) if ryu_dp is not None: ryu_dp.close() self._bgp.reset(self.valves, self.metrics)
def check_config(conf_files): logname = '/dev/null' logger = logging.getLogger('%s.config' % logname) logger_handler = logging.StreamHandler(stream=sys.stderr) logger.addHandler(logger_handler) logger.propagate = 0 logger.setLevel(logging.DEBUG) for conf_file in conf_files: parse_result = dp_parser(conf_file, logname) if parse_result is None: return False else: _, dps = parse_result for dp in dps: valve_dp = valve.valve_factory(dp) if valve_dp is None: return False print((dp.to_conf())) return True
def reload_config(self, ryu_event): """Handle a request to reload configuration. Args: ryu_event (ryu.controller.event.EventReplyBase): triggering event. """ new_config_file = os.getenv('FAUCET_CONFIG', self.config_file) if self._config_changed(new_config_file): self.config_file = new_config_file self.config_hashes, new_dps = dp_parser(new_config_file, self.logname) for new_dp in new_dps: valve = self.valves[new_dp.dp_id] flowmods = valve.reload_config(new_dp) ryudp = self.dpset.get(new_dp.dp_id) if ryudp is not None: self._send_flow_msgs(ryudp, flowmods) self._reset_bgp() valve.update_config_metrics(self.metrics) else: self.logger.info('configuration is unchanged, not reloading') # pylint: disable=no-member self.metrics.faucet_config_reload_requests.inc()
def setUp(self): self.v1_dp = dp_parser("config/testconfig.yaml", "test_config")[0] self.v2_dp = dp_parser("config/testconfigv2.yaml", "test_config")[0] self.v1_watchers = watcher_parser("config/testgaugeconfig.conf", "test_config") self.v2_watchers = watcher_parser("config/testgaugeconfig.yaml", "test_config")