From 5055074db00f75285034c056b631d85f42cd9086 Mon Sep 17 00:00:00 2001
From: Anne Gentle <agentle@cisco.com>
Date: Mon, 24 Oct 2016 10:55:10 +0200
Subject: [PATCH] Adds information about private key generation for instance
 access

- Also updated the help text in the command itself.

Change-Id: Ib3d4f94ef415a3f12024d0d7c000d2de20de001b
Partial-Bug: 1549410
---
 doc/source/command-objects/keypair.rst        | 22 ++++++++++--------
 openstackclient/compute/v2/keypair.py         | 23 ++++++++++---------
 .../tests/unit/compute/v2/test_keypair.py     |  3 +--
 3 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/doc/source/command-objects/keypair.rst b/doc/source/command-objects/keypair.rst
index af50a6511d..c9bf085b44 100644
--- a/doc/source/command-objects/keypair.rst
+++ b/doc/source/command-objects/keypair.rst
@@ -3,14 +3,16 @@ keypair
 =======
 
 The badly named keypair is really the public key of an OpenSSH key pair to be
-used for access to created servers.
+used for access to created servers. You can also create a private key for
+access to a created server by not passing any argument to the keypair create
+command.
 
 Compute v2
 
 keypair create
 --------------
 
-Create new public key
+Create new public or private key for server ssh access
 
 .. program:: keypair create
 .. code:: bash
@@ -21,16 +23,16 @@ Create new public key
 
 .. option:: --public-key <file>
 
-    Filename for public key to add
+    Filename for public key to add. If not used, creates a private key.
 
 .. describe:: <name>
 
-    New public key name
+    New public or private key name
 
 keypair delete
 --------------
 
-Delete public key(s)
+Delete public or private key(s)
 
 .. program:: keypair delete
 .. code:: bash
@@ -40,12 +42,12 @@ Delete public key(s)
 
 .. describe:: <key>
 
-    Public key(s) to delete (name only)
+    Name of key(s) to delete (name only)
 
 keypair list
 ------------
 
-List public key fingerprints
+List key fingerprints
 
 .. program:: keypair list
 .. code:: bash
@@ -55,7 +57,7 @@ List public key fingerprints
 keypair show
 ------------
 
-Display public key details
+Display key details
 
 .. program:: keypair show
 .. code:: bash
@@ -66,8 +68,8 @@ Display public key details
 
 .. option:: --public-key
 
-    Show only bare public key (name only)
+    Show only bare public key paired with the generated key
 
 .. describe:: <key>
 
-    Public key to display (name only)
+    Public or private key to display (name only)
diff --git a/openstackclient/compute/v2/keypair.py b/openstackclient/compute/v2/keypair.py
index d30fd429e3..d5c682f455 100644
--- a/openstackclient/compute/v2/keypair.py
+++ b/openstackclient/compute/v2/keypair.py
@@ -32,19 +32,20 @@ LOG = logging.getLogger(__name__)
 
 
 class CreateKeypair(command.ShowOne):
-    """Create new public key"""
+    """Create new public or private key for server ssh access"""
 
     def get_parser(self, prog_name):
         parser = super(CreateKeypair, self).get_parser(prog_name)
         parser.add_argument(
             'name',
             metavar='<name>',
-            help=_("New public key name")
+            help=_("New public or private key name")
         )
         parser.add_argument(
             '--public-key',
             metavar='<file>',
-            help=_("Filename for public key to add")
+            help=_("Filename for public key to add. If not used, "
+                   "creates a private key.")
         )
         return parser
 
@@ -82,7 +83,7 @@ class CreateKeypair(command.ShowOne):
 
 
 class DeleteKeypair(command.Command):
-    """Delete public key(s)"""
+    """Delete public or private key(s)"""
 
     def get_parser(self, prog_name):
         parser = super(DeleteKeypair, self).get_parser(prog_name)
@@ -90,7 +91,7 @@ class DeleteKeypair(command.Command):
             'name',
             metavar='<key>',
             nargs='+',
-            help=_("Public key(s) to delete (name only)")
+            help=_("Name of key(s) to delete (name only)")
         )
         return parser
 
@@ -104,19 +105,19 @@ class DeleteKeypair(command.Command):
                 compute_client.keypairs.delete(data.name)
             except Exception as e:
                 result += 1
-                LOG.error(_("Failed to delete public key with name "
+                LOG.error(_("Failed to delete key with name "
                           "'%(name)s': %(e)s")
                           % {'name': n, 'e': e})
 
         if result > 0:
             total = len(parsed_args.name)
-            msg = (_("%(result)s of %(total)s public keys failed "
+            msg = (_("%(result)s of %(total)s keys failed "
                    "to delete.") % {'result': result, 'total': total})
             raise exceptions.CommandError(msg)
 
 
 class ListKeypair(command.Lister):
-    """List public key fingerprints"""
+    """List key fingerprints"""
 
     def take_action(self, parsed_args):
         compute_client = self.app.client_manager.compute
@@ -133,20 +134,20 @@ class ListKeypair(command.Lister):
 
 
 class ShowKeypair(command.ShowOne):
-    """Display public key details"""
+    """Display key details"""
 
     def get_parser(self, prog_name):
         parser = super(ShowKeypair, self).get_parser(prog_name)
         parser.add_argument(
             'name',
             metavar='<key>',
-            help=_("Public key to display (name only)")
+            help=_("Public or private key to display (name only)")
         )
         parser.add_argument(
             '--public-key',
             action='store_true',
             default=False,
-            help=_("Show only bare public key (name only)")
+            help=_("Show only bare public key paired with the generated key")
         )
         return parser
 
diff --git a/openstackclient/tests/unit/compute/v2/test_keypair.py b/openstackclient/tests/unit/compute/v2/test_keypair.py
index cb0085452d..efc5463cc6 100644
--- a/openstackclient/tests/unit/compute/v2/test_keypair.py
+++ b/openstackclient/tests/unit/compute/v2/test_keypair.py
@@ -179,8 +179,7 @@ class TestKeypairDelete(TestKeypair):
                 self.cmd.take_action(parsed_args)
                 self.fail('CommandError should be raised.')
             except exceptions.CommandError as e:
-                self.assertEqual('1 of 2 public keys failed to delete.',
-                                 str(e))
+                self.assertEqual('1 of 2 keys failed to delete.', str(e))
 
             find_mock.assert_any_call(
                 self.keypairs_mock, self.keypairs[0].name)