On Tue, 25 Jul 2017 10:32:25 +0900,
IWASE Yusuke wrote:
> 
> Currently, CLI/file configration option are defined in each application,
> but in this case, if that application is not loaded before the
> initialization in "ryu/cmd/manager.py" (ryu-manager), the application's
> option is NOT enabled.
> For example, "ovsdb-timeout" option which defined in
> "ryu/lib/ovsdb/bridge.py" is not loaded in ryu-manager, so this option
> is not shown in ryu-manager CLI option.
> 
> This patch moves the option definitions into flags.py and avoids this
> problem.

For example, OpenStack ovs-agent imports ryu.controller.controller but
not ryu.cmd.manager.
I haven't tested but it seems this change would break such a use case.

> Signed-off-by: IWASE Yusuke <iwase.yusu...@gmail.com>
> ---
>  ryu/app/wsgi.py                            |  13 ----
>  ryu/cmd/manager.py                         |   4 +-
>  ryu/controller/controller.py               |  29 -------
>  ryu/flags.py                               | 119 
> ++++++++++++++++++++++++++++-
>  ryu/lib/ovs/bridge.py                      |   6 --
>  ryu/services/protocols/ovsdb/manager.py    |  31 +-------
>  ryu/services/protocols/vrrp/rpc_manager.py |  10 +--
>  ryu/topology/switches.py                   |  14 ----
>  8 files changed, 123 insertions(+), 103 deletions(-)
> 
> diff --git a/ryu/app/wsgi.py b/ryu/app/wsgi.py
> index 0b98df9..5eead67 100644
> --- a/ryu/app/wsgi.py
> +++ b/ryu/app/wsgi.py
> @@ -31,21 +31,8 @@ import webob.exc
>  from webob.request import Request as webob_Request
>  from webob.response import Response as webob_Response
>  
> -from ryu import cfg
>  from ryu.lib import hub
>  
> -DEFAULT_WSGI_HOST = '0.0.0.0'
> -DEFAULT_WSGI_PORT = 8080
> -
> -CONF = cfg.CONF
> -CONF.register_cli_opts([
> -    cfg.StrOpt(
> -        'wsapi-host', default=DEFAULT_WSGI_HOST,
> -        help='webapp listen host (default %s)' % DEFAULT_WSGI_HOST),
> -    cfg.IntOpt(
> -        'wsapi-port', default=DEFAULT_WSGI_PORT,
> -        help='webapp listen port (default %s)' % DEFAULT_WSGI_PORT),
> -])
>  
>  HEX_PATTERN = r'0x[0-9a-z]+'
>  DIGIT_PATTERN = r'[1-9][0-9]*'
> diff --git a/ryu/cmd/manager.py b/ryu/cmd/manager.py
> index 797d8d5..c801131 100755
> --- a/ryu/cmd/manager.py
> +++ b/ryu/cmd/manager.py
> @@ -28,12 +28,10 @@ import logging
>  from ryu import log
>  log.early_init_log(logging.DEBUG)
>  
> -from ryu import flags
> +from ryu import flags  # to load registered option definitions
>  from ryu import version
>  from ryu.app import wsgi
>  from ryu.base.app_manager import AppManager
> -from ryu.controller import controller
> -from ryu.topology import switches
>  
>  
>  CONF = cfg.CONF
> diff --git a/ryu/controller/controller.py b/ryu/controller/controller.py
> index 62bca5f..0c6cef9 100644
> --- a/ryu/controller/controller.py
> +++ b/ryu/controller/controller.py
> @@ -27,11 +27,9 @@ from ryu import cfg
>  import logging
>  from ryu.lib import hub
>  from ryu.lib.hub import StreamServer
> -import traceback
>  import random
>  import ssl
>  from socket import IPPROTO_TCP, TCP_NODELAY, SHUT_RDWR, timeout as 
> SocketTimeout
> -import warnings
>  
>  import ryu.base.app_manager
>  
> @@ -48,34 +46,7 @@ from ryu.lib.dpid import dpid_to_str
>  
>  LOG = logging.getLogger('ryu.controller.controller')
>  
> -DEFAULT_OFP_HOST = '0.0.0.0'
> -
>  CONF = cfg.CONF
> -CONF.register_cli_opts([
> -    cfg.StrOpt('ofp-listen-host', default=DEFAULT_OFP_HOST,
> -               help='openflow listen host (default %s)' % DEFAULT_OFP_HOST),
> -    cfg.IntOpt('ofp-tcp-listen-port', default=None,
> -               help='openflow tcp listen port '
> -                    '(default: %d)' % ofproto_common.OFP_TCP_PORT),
> -    cfg.IntOpt('ofp-ssl-listen-port', default=None,
> -               help='openflow ssl listen port '
> -                    '(default: %d)' % ofproto_common.OFP_SSL_PORT),
> -    cfg.StrOpt('ctl-privkey', default=None, help='controller private key'),
> -    cfg.StrOpt('ctl-cert', default=None, help='controller certificate'),
> -    cfg.StrOpt('ca-certs', default=None, help='CA certificates')
> -])
> -CONF.register_opts([
> -    cfg.FloatOpt('socket-timeout',
> -                 default=5.0,
> -                 help='Time, in seconds, to await completion of socket 
> operations.'),
> -    cfg.FloatOpt('echo-request-interval',
> -                 default=15.0,
> -                 help='Time, in seconds, between sending echo requests to a 
> datapath.'),
> -    cfg.IntOpt('maximum-unreplied-echo-requests',
> -               default=0,
> -               min=0,
> -               help='Maximum number of unreplied echo requests before 
> datapath is disconnected.')
> -])
>  
>  
>  class OpenFlowController(object):
> diff --git a/ryu/flags.py b/ryu/flags.py
> index 69eb3d2..40dc724 100644
> --- a/ryu/flags.py
> +++ b/ryu/flags.py
> @@ -18,9 +18,74 @@ global flags
>  """
>  
>  from ryu import cfg
> +from ryu.ofproto import ofproto_common
>  
>  CONF = cfg.CONF
>  
> +DEFAULT_OFP_HOST = '0.0.0.0'
> +
> +CONF.register_cli_opts([
> +    cfg.StrOpt(
> +        'ofp-listen-host', default=DEFAULT_OFP_HOST,
> +        help='openflow listen host (default %s)' % DEFAULT_OFP_HOST),
> +    cfg.IntOpt(
> +        'ofp-tcp-listen-port', default=None,
> +        help='openflow tcp listen port'
> +             ' (default: %d)' % ofproto_common.OFP_TCP_PORT),
> +    cfg.IntOpt(
> +        'ofp-ssl-listen-port', default=None,
> +        help='openflow ssl listen port'
> +             ' (default: %d)' % ofproto_common.OFP_SSL_PORT),
> +    cfg.StrOpt(
> +        'ctl-privkey', default=None,
> +        help='controller private key'),
> +    cfg.StrOpt(
> +        'ctl-cert', default=None,
> +        help='controller certificate'),
> +    cfg.StrOpt(
> +        'ca-certs', default=None,
> +        help='CA certificates'),
> +    cfg.BoolOpt(
> +        'observe-links', default=False,
> +        help='observe link discovery events.'),
> +    cfg.BoolOpt(
> +        'install-lldp-flow', default=True,
> +        help='link discovery: explicitly install flow entry'
> +             ' to send lldp packet to controller'),
> +    cfg.BoolOpt(
> +        'explicit-drop', default=True,
> +        help='link discovery: explicitly drop lldp packet in'),
> +])  # group='default'
> +
> +# Note: The following option should not be exposed to CLI, because these
> +# options are supposed not to be normally configured by command line.
> +CONF.register_opts([
> +    cfg.FloatOpt(
> +        'socket-timeout', default=5.0,
> +        help='Time, in seconds, to await completion of socket operations.'),
> +    cfg.FloatOpt(
> +        'echo-request-interval', default=15.0,
> +        help='Time, in seconds, between sending echo requests to a 
> datapath.'),
> +    cfg.IntOpt(
> +        'maximum-unreplied-echo-requests', default=0, min=0,
> +        help='Maximum number of unreplied echo requests'
> +             ' before datapath is disconnected.'),
> +])  # group='default'
> +
> +
> +DEFAULT_WSGI_HOST = '0.0.0.0'
> +DEFAULT_WSGI_PORT = 8080
> +
> +CONF.register_cli_opts([
> +    cfg.StrOpt(
> +        'host', default=DEFAULT_WSGI_HOST,
> +        help='webapp listen host (default %s)' % DEFAULT_WSGI_HOST),
> +    cfg.IntOpt(
> +        'port', default=DEFAULT_WSGI_PORT,
> +        help='webapp listen port (default %s)' % DEFAULT_WSGI_PORT),
> +], group='wsapi')
> +
> +
>  CONF.register_cli_opts([
>      # tests/switch/tester
>      cfg.StrOpt('target', default='0000000000000001', help='target sw dp-id'),
> @@ -59,6 +124,49 @@ CONF.register_cli_opts([
>  ], group='test-switch')
>  
>  
> +DEFAULT_OVSDB_TIMEOUT = 2
> +
> +CONF.register_cli_opts([
> +    cfg.IntOpt(
> +        'timeout', default=DEFAULT_OVSDB_TIMEOUT,
> +        help='ovsdb timeout'),
> +    cfg.StrOpt(
> +        'address', default='0.0.0.0',
> +        help='OVSDB address'),
> +    cfg.IntOpt(
> +        'port', default=6640,
> +        help='OVSDB port'),
> +    cfg.IntOpt(
> +        'probe-interval',
> +        help='OVSDB reconnect probe interval'),
> +    cfg.IntOpt(
> +        'min-backoff',
> +        help='OVSDB reconnect minimum milliseconds'
> +             ' between connection attempts'),
> +    cfg.IntOpt(
> +        'max-backoff',
> +        help='OVSDB reconnect maximum milliseconds'
> +             ' between connection attempts'),
> +    cfg.StrOpt(
> +        'mngr-privkey', default=None,
> +        help='manager private key'),
> +    cfg.StrOpt(
> +        'mngr-cert', default=None,
> +        help='manager certificate'),
> +    cfg.ListOpt(
> +        'whitelist', default=[],
> +        help='Whitelist of address to allow to connect'),
> +    cfg.ListOpt(
> +        'schema-tables', default=[],
> +        help='Tables in the OVSDB schema to configure'),
> +    cfg.ListOpt(
> +        'schema-exclude-columns', default=[],
> +        help='Table columns in the OVSDB schema to filter out.'
> +             ' Values should be in the format: <table>.<column>.'
> +             ' Ex: Bridge.netflow,Interface.statistics'),
> +], group='ovsdb')
> +
> +
>  DEFAULT_RPC_PORT = 50002
>  DEFAULT_RPC_HOST = '0.0.0.0'
>  
> @@ -69,10 +177,19 @@ CONF.register_cli_opts([
>                 help='IP for RPC server (default: %s)' % DEFAULT_RPC_HOST),
>      cfg.StrOpt('config-file', default=None,
>                 help='The config file formatted in Python source file. '
> -                    'Please refer to "bgp_sample_conf.py" for details.')
> +                    'Please refer to "bgp_sample_conf.py" for details.'),
>  ], group='bgp-app')
>  
>  
> +DEFAULT_VRRP_RPC_PORT = 50004  # should be random
> +
> +CONF.register_cli_opts([
> +    cfg.IntOpt(
> +        'rpc-port', default=DEFAULT_VRRP_RPC_PORT,
> +        help='port for vrrp rpc interface'),
> +], group='vrrp')
> +
> +
>  DEFAULT_ZSERV_HOST = '/var/run/quagga/zserv.api'
>  DEFAULT_ZSERV_PORT = 2600
>  DEFAULT_ZSERV_VERSION = 2  # Version of Ubuntu 16.04 LTS packaged Quagga
> diff --git a/ryu/lib/ovs/bridge.py b/ryu/lib/ovs/bridge.py
> index 337867e..55eb37e 100644
> --- a/ryu/lib/ovs/bridge.py
> +++ b/ryu/lib/ovs/bridge.py
> @@ -21,18 +21,12 @@ slimmed down version of OVSBridge in quantum agent
>  import functools
>  import logging
>  
> -from ryu import cfg
>  import ryu.exception as ryu_exc
>  import ryu.lib.dpid as dpid_lib
>  import ryu.lib.ovs.vsctl as ovs_vsctl
>  
>  LOG = logging.getLogger(__name__)
>  
> -CONF = cfg.CONF
> -CONF.register_opts([
> -    cfg.IntOpt('ovsdb-timeout', default=2, help='ovsdb timeout')
> -])
> -
>  
>  class OVSBridgeNotFound(ryu_exc.RyuException):
>      message = 'no bridge for datapath_id %(datapath_id)s'
> diff --git a/ryu/services/protocols/ovsdb/manager.py 
> b/ryu/services/protocols/ovsdb/manager.py
> index 9822503..6c52df3 100644
> --- a/ryu/services/protocols/ovsdb/manager.py
> +++ b/ryu/services/protocols/ovsdb/manager.py
> @@ -16,7 +16,6 @@
>  import ssl
>  import socket
>  
> -from ryu import cfg
>  from ryu.base import app_manager
>  from ryu.lib import hub
>  from ryu.services.protocols.ovsdb import client
> @@ -24,30 +23,6 @@ from ryu.services.protocols.ovsdb import event
>  from ryu.controller import handler
>  
>  
> -opts = (cfg.StrOpt('address', default='0.0.0.0', help='OVSDB address'),
> -        cfg.IntOpt('port', default=6640, help='OVSDB port'),
> -        cfg.IntOpt('probe-interval', help='OVSDB reconnect probe interval'),
> -        cfg.IntOpt('min-backoff',
> -                   help=('OVSDB reconnect minimum milliseconds between '
> -                         'connection attemps')),
> -        cfg.IntOpt('max-backoff',
> -                   help=('OVSDB reconnect maximum milliseconds between '
> -                         'connection attemps')),
> -        cfg.StrOpt('mngr-privkey', default=None, help='manager private key'),
> -        cfg.StrOpt('mngr-cert', default=None, help='manager certificate'),
> -        cfg.ListOpt('whitelist', default=[],
> -                    help='Whitelist of address to allow to connect'),
> -        cfg.ListOpt('schema-tables', default=[],
> -                    help='Tables in the OVSDB schema to configure'),
> -        cfg.ListOpt('schema-exclude-columns', default=[],
> -                    help='Table columns in the OVSDB schema to filter out.  '
> -                         'Values should be in the format: <table>.<column>.'
> -                         'Ex: Bridge.netflow,Interface.statistics')
> -        )
> -
> -cfg.CONF.register_opts(opts, 'ovsdb')
> -
> -
>  class OVSDB(app_manager.RyuApp):
>      _EVENTS = [event.EventNewOVSDBConnection,
>                 event.EventModifyRequest,
> @@ -126,10 +101,10 @@ class OVSDB(app_manager.RyuApp):
>          return self.send_event(client_name, ev)
>  
>      def _start_remote(self, sock, client_address):
> -        schema_tables = cfg.CONF.ovsdb.schema_tables
> +        schema_tables = self.CONF.ovsdb.schema_tables
>          schema_ex_col = {}
> -        if cfg.CONF.ovsdb.schema_exclude_columns:
> -            for c in cfg.CONF.ovsdb.schema_exclude_columns:
> +        if self.CONF.ovsdb.schema_exclude_columns:
> +            for c in self.CONF.ovsdb.schema_exclude_columns:
>                  tbl, col = c.split('.')
>                  if tbl in schema_ex_col:
>                      schema_ex_col[tbl].append(col)
> diff --git a/ryu/services/protocols/vrrp/rpc_manager.py 
> b/ryu/services/protocols/vrrp/rpc_manager.py
> index 6ac07b1..f78dd48 100644
> --- a/ryu/services/protocols/vrrp/rpc_manager.py
> +++ b/ryu/services/protocols/vrrp/rpc_manager.py
> @@ -13,10 +13,8 @@
>  # See the License for the specific language governing permissions and
>  # limitations under the License.
>  
> -from ryu import cfg
> -import socket
> -
>  import netaddr
> +
>  from ryu.base import app_manager
>  from ryu.controller import handler
>  from ryu.services.protocols.vrrp import event as vrrp_event
> @@ -25,8 +23,6 @@ from ryu.lib import rpc
>  from ryu.lib import hub
>  from ryu.lib import mac
>  
> -VRRP_RPC_PORT = 50004  # random
> -
>  
>  class RPCError(Exception):
>      pass
> @@ -44,10 +40,6 @@ class Peer(object):
>  class RpcVRRPManager(app_manager.RyuApp):
>      def __init__(self, *args, **kwargs):
>          super(RpcVRRPManager, self).__init__(*args, **kwargs)
> -        self.CONF.register_opts([
> -            cfg.IntOpt('vrrp-rpc-port', default=VRRP_RPC_PORT,
> -                       help='port for vrrp rpc interface')])
> -
>          self._args = args
>          self._kwargs = kwargs
>          self._peers = []
> diff --git a/ryu/topology/switches.py b/ryu/topology/switches.py
> index 644a1fe..f0995e9 100644
> --- a/ryu/topology/switches.py
> +++ b/ryu/topology/switches.py
> @@ -17,7 +17,6 @@ import logging
>  import six
>  import struct
>  import time
> -from ryu import cfg
>  
>  from ryu.topology import event
>  from ryu.base import app_manager
> @@ -43,19 +42,6 @@ from ryu.ofproto import ofproto_v1_4
>  LOG = logging.getLogger(__name__)
>  
>  
> -CONF = cfg.CONF
> -
> -CONF.register_cli_opts([
> -    cfg.BoolOpt('observe-links', default=False,
> -                help='observe link discovery events.'),
> -    cfg.BoolOpt('install-lldp-flow', default=True,
> -                help='link discovery: explicitly install flow entry '
> -                     'to send lldp packet to controller'),
> -    cfg.BoolOpt('explicit-drop', default=True,
> -                help='link discovery: explicitly drop lldp packet in')
> -])
> -
> -
>  class Port(object):
>      # This is data class passed by EventPortXXX
>      def __init__(self, dpid, ofproto, ofpport):
> -- 
> 2.7.4
> 
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Ryu-devel mailing list
> Ryu-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ryu-devel
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to