Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
 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')
Exemplo n.º 3
0
    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()
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
    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()
Exemplo n.º 6
0
 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()
Exemplo n.º 7
0
 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()
Exemplo n.º 8
0
    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())
Exemplo n.º 9
0
    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())
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
    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()
Exemplo n.º 12
0
    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()
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
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
Exemplo n.º 15
0
    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()
Exemplo n.º 16
0
 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")