]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph.in: improve the interactive mode
authorKefu Chai <kchai@redhat.com>
Thu, 23 Apr 2015 17:27:44 +0000 (01:27 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 24 Apr 2015 07:25:30 +0000 (15:25 +0800)
* if ceph is not reading from a tty, expect EOF instead of "quit"
  as the end of input.
* do not panic at seeing the EOF
* update the test case test_mon_injectargs_SI(). since we disables
  "ceph injectargs <args,...>" in a458bd83, in which the arguments
  of "injectargs" are supposed to be consumed by "tell" instead.
  so "ceph injectargs ..." is taken as an incomplete command, and
  this command will bring ceph cli into the interactive mode,
  redirecting its stdin to /dev/null helps ceph cli quit the loop,
  but in a way of throwing EOFError exception. this change handles
  the EOF, so the "ceph injectargs ..." does not throws anymore.
  but the side effect is that the test fails since it expects a
  non-zero return code. so replace it with an equivalent "tell"
  command which also fails but due to the non-SI postfix.

Signed-off-by: Kefu Chai <kchai@redhat.com>
qa/workunits/cephtool/test.sh
src/ceph.in

index 594c80cccc6ded4cfb1d18ddc1d265330d113a3b..2c4f9a8316925414be239d951c9c8bbb10ca29e7 100755 (executable)
@@ -232,10 +232,7 @@ function test_mon_injectargs_SI()
   expect_config_value "mon.a" "mon_pg_warn_min_objects" 10240
   ceph tell mon.a injectargs '--mon_pg_warn_min_objects 1G'
   expect_config_value "mon.a" "mon_pg_warn_min_objects" 1073741824
-  # < /dev/null accounts for the fact that ceph will go in interactive mode
-  # because injectargs is discarded (actually saved for the benefit of 
-  # a tell command that never comes)
-  expect_false ceph injectargs mon.a '--mon_pg_warn_min_objects 10F' < /dev/null 2> /dev/null
+  expect_false ceph tell mon.a injectargs '--mon_pg_warn_min_objects 10F'
   $SUDO ceph daemon mon.a config set mon_pg_warn_min_objects $initial_value
 }
 
@@ -446,7 +443,9 @@ function test_auth()
   # (almost) interactive mode
   echo -e 'auth add client.xx mon allow osd "allow *"\n' | ceph
   ceph auth get client.xx
-  ceph auth del client.xx
+  # script mode
+  echo 'auth del client.xx' | ceph
+  expect_false ceph auth get client.xx
 
   #
   # get / set auid
index a56046c360d81e00839eaaaf1a75e5257c8d01c7..476839169ffff038bc1501ec07b9fea8691383a9 100755 (executable)
@@ -333,6 +333,25 @@ def ceph_conf(parsed_args, field, name):
 
 PROMPT = 'ceph> '
 
+if sys.stdin.isatty():
+    def read_input():
+        while True:
+            line = raw_input(PROMPT).rstrip()
+            if line in ['q', 'quit', 'Q']:
+                return None
+            if line:
+                return line
+else:
+    def read_input():
+        while True:
+            line = sys.stdin.readline()
+            if not line:
+                return None
+            line = line.rstrip()
+            if line:
+                return line
+
+
 def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose):
     """
     Do new-style command dance.
@@ -360,18 +379,14 @@ def new_style_command(parsed_args, cmdargs, target, sigdict, inbuf, verbose):
             else:
                 return -errno.EINVAL, '', 'invalid command'
         else:
-            # do the command-interpreter looping
-            # for raw_input to do readline cmd editing
-            import readline
-
             if sys.stdin.isatty():
-                prompt = PROMPT
-            else:
-                prompt = ''
+                # do the command-interpreter looping
+                # for raw_input to do readline cmd editing
+                import readline
 
             while True:
-                interactive_input = raw_input(prompt)
-                if interactive_input in ['q', 'quit', 'Q']:
+                interactive_input = read_input()
+                if interactive_input is None:
                     return 0, '', ''
                 cmdargs = parse_cmdargs(shlex.split(interactive_input))[2]
                 try: