]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph.in: handle polling commands
authorMohamad Gebai <mgebai@suse.com>
Wed, 28 Feb 2018 23:12:19 +0000 (18:12 -0500)
committerMohamad Gebai <mgebai@suse.com>
Thu, 12 Apr 2018 04:26:24 +0000 (00:26 -0400)
Signed-off-by: Mohamad Gebai <mgebai@suse.com>
src/ceph.in

index 7484a54dfc8f87fe4e238ba9fee0e3a6f4d3c283..9bc8a1fcef4417896bab902f8c8d753f52a49c01 100755 (executable)
@@ -43,6 +43,7 @@ CEPH_RELEASE_TYPE = "@CEPH_RELEASE_TYPE@"
 FLAG_NOFORWARD = (1 << 0)
 FLAG_OBSOLETE = (1 << 1)
 FLAG_DEPRECATED = (1 << 2)
+FLAG_POLL = (1 << 4)
 
 # priorities from src/common/perf_counters.h
 PRIO_CRITICAL = 10
@@ -515,6 +516,56 @@ else:
             if line:
                 return line
 
+def run_and_print_cmd(target, cmdargs, valid_dict, sigdict, inbuf, verbose):
+    ret, outbuf, outs = json_command(cluster_handle, target=target, argdict=valid_dict,
+        inbuf=inbuf)
+
+    if ret:
+        ret = abs(ret)
+        print('Error: {0} {1}'.format(ret, errno.errorcode.get(ret, 'Unknown')),
+                file=sys.stderr)
+    if outbuf:
+        print(outbuf)
+    if outs:
+        print(outs, file=sys.stderr)
+
+    return ret, outbuf, outs
+
+
+def do_command(parsed_args, target, cmdargs, sigdict, inbuf, verbose):
+    ''' Validate a command, and handle the polling flag '''
+
+    valid_dict = validate_command(sigdict, cmdargs, verbose)
+    # Validate input args against list of sigs
+    if valid_dict:
+        if parsed_args.output_format:
+            valid_dict['format'] = parsed_args.output_format
+        if verbose:
+            print("Submitting command: ", valid_dict, file=sys.stderr)
+    else:
+        return -errno.EINVAL, '', 'invalid command'
+
+    while True:
+        ret, outbuf, outs = json_command(cluster_handle, target=target, argdict=valid_dict,
+                inbuf=inbuf)
+        if 'poll' not in valid_dict or not valid_dict['poll']:
+            # Don't print here if it's not a polling command
+            break
+        if ret:
+            ret = abs(ret)
+            print('Error: {0} {1}'.format(ret, errno.errorcode.get(ret, 'Unknown')),
+                    file=sys.stderr)
+            break
+        if outbuf:
+            print(outbuf.decode('utf-8'))
+        if outs:
+            print(outs, file=sys.stderr)
+        if parsed_args.period <= 0:
+            break
+        sleep(parsed_args.period)
+
+    return ret, outbuf, outs
+
 
 def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose):
     """
@@ -532,14 +583,10 @@ def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose):
 
     if True:
         if cmdargs:
-            # Validate input args against list of sigs
-            valid_dict = validate_command(sigdict, cmdargs, verbose)
-            if valid_dict:
-                if parsed_args.output_format:
-                    valid_dict['format'] = parsed_args.output_format
-            else:
-                return -errno.EINVAL, '', 'invalid command'
+            # Non interactive mode
+            ret, outbuf, outs = do_command(parsed_args, target, cmdargs, sigdict, inbuf, verbose)
         else:
+            # Interactive mode (ceph cli)
             if sys.stdin.isatty():
                 # do the command-interpreter looping
                 # for input to do readline cmd editing
@@ -564,30 +611,9 @@ def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose):
                     print('Can not use \'tell\' in interactive mode.',
                           file=sys.stderr)
                     continue
-                valid_dict = validate_command(sigdict, cmdargs, verbose)
-                if valid_dict:
-                    if parsed_args.output_format:
-                        valid_dict['format'] = parsed_args.output_format
-                    if verbose:
-                        print("Submitting command: ", valid_dict, file=sys.stderr)
-                    ret, outbuf, outs = json_command(cluster_handle,
-                                                     target=target,
-                                                     argdict=valid_dict)
-                    if ret:
-                        ret = abs(ret)
-                        print('Error: {0} {1}'.format(ret, errno.errorcode.get(ret, 'Unknown')),
-                              file=sys.stderr)
-                    if outbuf:
-                        print(outbuf)
-                    if outs:
-                        print('Status:\n', outs, file=sys.stderr)
-                else:
-                    print("Invalid command", file=sys.stderr)
+                do_command(parsed_args, target, cmdargs, sigdict, inbuf, verbose)
 
-    if verbose:
-        print("Submitting command: ", valid_dict, file=sys.stderr)
-    return json_command(cluster_handle, target=target, argdict=valid_dict,
-                        inbuf=inbuf)
+    return ret, outbuf, outs
 
 
 def complete(sigdict, args, target):