diff options
author | Sage Weil <sage@inktank.com> | 2013-10-22 13:32:01 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-10-22 13:32:01 -0700 |
commit | dbbf9938e308c29633ade363ef5231d629ce5f90 (patch) | |
tree | 2e9c4456a8fb7a117cc88819c5ecaffdf17768d2 | |
parent | 5cf31bf9e7a0a031fa853274dfd3ef376b27db56 (diff) | |
parent | 1821ad781ba0a49e1fd1f87c7d182283808edbd9 (diff) | |
download | ceph-dbbf9938e308c29633ade363ef5231d629ce5f90.tar.gz |
Merge remote-tracking branch 'gh/wip-6242-b' into next
Reviewed-by: Greg Farnum <greg@inktank.com>
Reviewed-by: Dan Mick <dan.mick@inktank.com>
-rwxr-xr-x | src/ceph.in | 60 | ||||
-rw-r--r-- | src/pybind/rados.py | 7 |
2 files changed, 49 insertions, 18 deletions
diff --git a/src/ceph.in b/src/ceph.in index 075ec80c20b..56422f6ed82 100755 --- a/src/ceph.in +++ b/src/ceph.in @@ -1,8 +1,10 @@ +# -*- mode:python -*- +# vim: ts=4 sw=4 smarttab expandtab # # Processed in Makefile to add python #! line and version variable # # -# vim: ts=4 sw=4 smarttab expandtab + """ ceph.in becomes ceph, the command-line management tool for Ceph clusters. @@ -159,17 +161,28 @@ def parse_cmdargs(args=None, target=''): parser.add_argument('-f', '--format', choices=['json', 'json-pretty', 'xml', 'xml-pretty', 'plain'], dest='output_format') + parser.add_argument('--connect-timeout', dest='cluster_timeout', + type=int, + help='set a timeout for connecting to the cluster') + # returns a Namespace with the parsed args, and a list of all extras parsed_args, extras = parser.parse_known_args(args) return parser, parsed_args, extras -def do_help(parser, args): + +def hdr(s): + print '\n', s, '\n', '=' * len(s) + +def do_basic_help(parser, args): """ Print basic parser help If the cluster is available, get and print monitor help """ + hdr('General usage:') + parser.print_help() +def do_extended_help(parser, args): def help_for_sigs(sigs, partial=None): sys.stdout.write(format_help(parse_json_funcsigs(sigs, 'cli'), partial=partial)) @@ -185,18 +198,9 @@ def do_help(parser, args): else: help_for_sigs(outbuf, partial) - - def hdr(s): - print '\n', s, '\n', '=' * len(s) - - hdr('Monitor commands:') partial = ' '.join(args) - parser.print_help() - print '\n' - - if (cluster_handle): + if (cluster_handle.state == "connected"): help_for_target(target=('mon', ''), partial=partial) - return 0 DONTSPLIT = string.letters + '{[<>]}' @@ -540,6 +544,14 @@ def main(): return errno.EINVAL return 0 + timeout = None + if parsed_args.cluster_timeout: + timeout = parsed_args.cluster_timeout + + # basic help + if parsed_args.help: + do_basic_help(parser, childargs) + # handle any 'generic' ceph arguments that we didn't parse here global cluster_handle @@ -556,10 +568,16 @@ def main(): if parsed_args.cluster: clustername = parsed_args.cluster - cluster_handle = rados.Rados(name=name, clustername=clustername, - conf_defaults=conf_defaults, conffile=conffile) + try: + cluster_handle = rados.Rados(name=name, clustername=clustername, + conf_defaults=conf_defaults, + conffile=conffile) + retargs = cluster_handle.conf_parse_argv(childargs) + except rados.Error as e: + print >> sys.stderr, 'Error initializing cluster client: {0}'.\ + format(e.__class__.__name__) + return 1 - retargs = cluster_handle.conf_parse_argv(childargs) #tmp = childargs childargs = retargs if not childargs: @@ -577,8 +595,16 @@ def main(): print >> sys.stderr, '"{0} tell" is deprecated; try "tell {0}.<id>" instead (id can be "*") '.format(childargs[0]) return 1 + if parsed_args.help: + # short default timeout for -h + if not timeout: + timeout = 5 + + hdr('Monitor commands:') + print '[Contacting monitor, timeout after %d seconds]' % timeout + try: - cluster_handle.connect() + cluster_handle.connect(timeout=timeout) except KeyboardInterrupt: print >> sys.stderr, 'Cluster connection aborted' return 1 @@ -588,7 +614,7 @@ def main(): return 1 if parsed_args.help: - return do_help(parser, childargs) + return do_extended_help(parser, childargs) # implement -w/--watch_* # This is ugly, but Namespace() isn't quite rich enough. diff --git a/src/pybind/rados.py b/src/pybind/rados.py index a0e5bf42ba9..d977c1a298a 100644 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -19,6 +19,10 @@ class Error(Exception): """ `Error` class, derived from `Exception` """ pass +class InterruptedOrTimeoutError(Error): + """ `InterruptedOrTimeoutError` class, derived from `Error` """ + pass + class PermissionError(Error): """ `PermissionError` class, derived from `Error` """ pass @@ -80,7 +84,8 @@ def make_ex(ret, msg): errno.EIO : IOError, errno.ENOSPC : NoSpace, errno.EEXIST : ObjectExists, - errno.ENODATA : NoData + errno.ENODATA : NoData, + errno.EINTR : InterruptedOrTimeoutError } ret = abs(ret) if ret in errors: |