diff --git a/os_doc_tools/commands.py b/os_doc_tools/commands.py
index 05d10f25..8058863f 100644
--- a/os_doc_tools/commands.py
+++ b/os_doc_tools/commands.py
@@ -497,20 +497,18 @@ def generate_subcommand(os_command, os_subcommand, os_file, extra_params,
os_file.write(" \n")
-def generate_subcommands(os_command, os_file, subcommands, extra_params,
- suffix, title_suffix):
- """Convert os_command help subcommands for all subcommands to DocBook.
+def discover_subcommands(os_command, subcommands, extra_params):
+ """Discover all help subcommands for the given command"
- :param os_command: client command to document
- :param os_file: open filehandle for output of DocBook file
+ :param os_command: client command whose subcommands need to be discovered
:param subcommands: list or type ('complete' or 'bash-completion')
of subcommands to document
:param extra_params: Extra parameter to pass to os_command.
- :param suffix: Extra suffix to add to xml:id
- :param title_suffix: Extra suffix for title
+ :return: the list of subcommands discovered
+ :rtype: list(str)
"""
-
- print("Documenting '%s' subcommands..." % os_command)
+ print(("Discovering subcommands of '%s' %s ..."
+ % (os_command, extra_params)))
blacklist = ['bash-completion', 'complete', 'help']
if type(subcommands) is str:
args = [os_command]
@@ -535,12 +533,46 @@ def generate_subcommands(os_command, os_file, subcommands, extra_params,
subcommands = sorted([o for o in subcommands if not (o.startswith('-') or
o in blacklist)])
+
+ print("%d subcommands discovered." % len(subcommands))
+ return subcommands
+
+
+def generate_subcommands(os_command, os_file, subcommands, extra_params,
+ suffix, title_suffix):
+ """Convert os_command help subcommands for all subcommands to DocBook.
+
+ :param os_command: client command to document
+ :param os_file: open filehandle for output of DocBook file
+ :param subcommands: list or type ('complete' or 'bash-completion')
+ of subcommands to document
+ :param extra_params: Extra parameter to pass to os_command.
+ :param suffix: Extra suffix to add to xml:id
+ :param title_suffix: Extra suffix for title
+ """
for subcommand in subcommands:
generate_subcommand(os_command, subcommand, os_file, extra_params,
suffix, title_suffix)
print("%d subcommands documented." % len(subcommands))
+def discover_and_generate_subcommands(os_command, os_file, subcommands,
+ extra_params, suffix, title_suffix):
+ """Convert os_command help subcommands for all subcommands to DocBook.
+
+ :param os_command: client command to document
+ :param os_file: open filehandle for output of DocBook file
+ :param subcommands: list or type ('complete' or 'bash-completion')
+ of subcommands to document
+ :param extra_params: Extra parameter to pass to os_command.
+ :param suffix: Extra suffix to add to xml:id
+ :param title_suffix: Extra suffix for title
+ """
+ subcommands = discover_subcommands(os_command, subcommands, extra_params)
+ generate_subcommands(os_command, os_file, subcommands, extra_params,
+ suffix, title_suffix)
+
+
def generate_end(os_file):
"""Finish writing file.
@@ -588,18 +620,29 @@ def document_single_project(os_command, output_dir):
out_file.write("""
Block Storage API v1 commands\n""")
- if os_command == 'openstack':
- generate_subcommands(os_command, out_file, subcommands,
- ["--os-auth-type", "token"], "", "")
+ generate_subcommands(os_command, out_file, subcommands, None, "", "")
+ elif os_command == 'openstack':
+ out_file.write("""
+
+ OpenStack with Identity API v2 commands\n""")
+ auth_type_token = ["--os-auth-type", "token"]
+ identity_api_v2 = ["--os-identity-api-version", "2"]
+ extra_params = auth_type_token + identity_api_v2
+ subcommands_v2 = discover_subcommands(os_command, subcommands,
+ extra_params)
+ generate_subcommands(os_command, out_file, subcommands_v2,
+ extra_params, "_with_identity_api_v2", "")
elif os_command == 'glance':
out_file.write("""
Image service API v1 commands\n""")
- generate_subcommands(os_command, out_file, subcommands,
- ["--os-image-api-version", "1"], "_v1", " (v1)")
+ discover_and_generate_subcommands(os_command, out_file, subcommands,
+ ["--os-image-api-version", "1"],
+ "_v1", " (v1)")
else:
generate_subcommands(os_command, out_file, subcommands, None, "", "")
+ # Print subcommands for different API versions
if os_command == 'cinder':
out_file.write(" \n")
out_file.write("""
@@ -613,8 +656,38 @@ def document_single_project(os_command, output_dir):
"export OS_VOLUME_API_VERSION=2\n"
"\n")
- generate_subcommands(os_command, out_file, subcommands,
- ["--os-volume-api-version", "2"], "_v2", " (v2)")
+ discover_and_generate_subcommands(os_command, out_file, subcommands,
+ ["--os-volume-api-version", "2"],
+ "_v2", " (v2)")
+ out_file.write(" \n")
+ if os_command == 'openstack':
+ # Print the additional subcommands possible by using v3 of identity API
+ out_file.write("""
+ \n
+
+ OpenStack with Identity API v3 commands (diff)
+
+ You can select the Identity API version to use by adding the
+ --os-identity-api-version parameter or by setting
+ the corresponding environment variable:\n""")
+ out_file.write("$ "
+ "export OS_IDENTITY_API_VERSION=3"
+ "\n\n")
+ out_file.write("\n"
+ "This section documents only the difference in"
+ " subcommands available for the openstack client when"
+ " the identity API version is changed from v2 to v3.\n"
+ "\n")
+
+ identity_api_v3 = ["--os-identity-api-version", "3"]
+ extra_params = auth_type_token + identity_api_v3
+ subcommands_v3 = discover_subcommands(os_command, subcommands,
+ extra_params)
+ subcommands_delta = sorted(list(set(subcommands_v3) -
+ set(subcommands_v2)))
+ generate_subcommands(os_command, out_file, subcommands_delta,
+ extra_params, "_with_identity_api_v3",
+ " (Identity API v3)")
out_file.write(" \n")
if os_command == 'glance':
out_file.write("""
@@ -629,8 +702,9 @@ def document_single_project(os_command, output_dir):
"export OS_IMAGE_API_VERSION=2\n"
"\n")
- generate_subcommands(os_command, out_file, subcommands,
- ["--os-image-api-version", "2"], "_v2", " (v2)")
+ discover_and_generate_subcommands(os_command, out_file, subcommands,
+ ["--os-image-api-version", "2"],
+ "_v2", " (v2)")
out_file.write(" \n")
generate_end(out_file)