summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-10-22 13:32:01 -0700
committerSage Weil <sage@inktank.com>2013-10-22 13:32:01 -0700
commitdbbf9938e308c29633ade363ef5231d629ce5f90 (patch)
tree2e9c4456a8fb7a117cc88819c5ecaffdf17768d2
parent5cf31bf9e7a0a031fa853274dfd3ef376b27db56 (diff)
parent1821ad781ba0a49e1fd1f87c7d182283808edbd9 (diff)
downloadceph-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-xsrc/ceph.in60
-rw-r--r--src/pybind/rados.py7
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: