From a5e087e7a9b88e2ce698ddc32d89e1462509fbb5 Mon Sep 17 00:00:00 2001
From: Florent Flament <florent.flament-ext@cloudwatt.com>
Date: Wed, 18 Dec 2013 15:07:03 +0000
Subject: [PATCH] Displaying curl commands for nova and cinder calls

When using the -v option, displays curl equivalent commands and http
messages exchanged with the nova and cinder API servers. Displays the
same messages as those displayed with the --debug option of
python-novaclient and python-cinderclient.

Implements: blueprint curl-commands-in-debugging-messages for nova and
cinder related calls

Change-Id: Ibc8ef79d874334585b81d652b9c7df9e874fffa9
---
 openstackclient/common/utils.py   | 14 ++++++++++++++
 openstackclient/compute/client.py |  7 ++++++-
 openstackclient/volume/client.py  |  5 +++++
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py
index 91a20895b2..94ea22253a 100644
--- a/openstackclient/common/utils.py
+++ b/openstackclient/common/utils.py
@@ -15,6 +15,7 @@
 
 """Common client utilities"""
 
+import logging
 import os
 import six
 import sys
@@ -215,3 +216,16 @@ def wait_for_status(status_f,
             callback(progress)
         time.sleep(sleep_time)
     return retval
+
+
+def get_effective_log_level():
+    """Returns the lowest logging level considered by logging handlers
+
+    Retrieve an return the smallest log level set among the root
+    logger's handlers (in case of multiple handlers).
+    """
+    root_log = logging.getLogger()
+    min_log_lvl = logging.CRITICAL
+    for handler in root_log.handlers:
+        min_log_lvl = min(min_log_lvl, handler.level)
+    return min_log_lvl
diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py
index 4ccb2f6d40..765a48db99 100644
--- a/openstackclient/compute/client.py
+++ b/openstackclient/compute/client.py
@@ -35,6 +35,10 @@ def make_client(instance):
         instance._api_version[API_NAME],
         API_VERSIONS)
     LOG.debug('instantiating compute client: %s' % compute_client)
+
+    # Set client http_log_debug to True if verbosity level is high enough
+    http_log_debug = utils.get_effective_log_level() <= logging.DEBUG
+
     client = compute_client(
         username=instance._username,
         api_key=instance._password,
@@ -49,7 +53,8 @@ def make_client(instance):
         extensions=[],
         service_type=API_NAME,
         # FIXME(dhellmann): what is service_name?
-        service_name='')
+        service_name='',
+        http_log_debug=http_log_debug)
 
     # Populate the Nova client to skip another auth query to Identity
     if instance._url:
diff --git a/openstackclient/volume/client.py b/openstackclient/volume/client.py
index e04e8cd7b8..a53203f1a8 100644
--- a/openstackclient/volume/client.py
+++ b/openstackclient/volume/client.py
@@ -37,6 +37,10 @@ def make_client(instance):
     )
 
     LOG.debug('instantiating volume client')
+
+    # Set client http_log_debug to True if verbosity level is high enough
+    http_log_debug = utils.get_effective_log_level() <= logging.DEBUG
+
     client = volume_client(
         username=instance._username,
         api_key=instance._password,
@@ -44,6 +48,7 @@ def make_client(instance):
         auth_url=instance._auth_url,
         cacert=instance._cacert,
         insecure=instance._insecure,
+        http_log_debug=http_log_debug
     )
 
     return client