)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Use of the decorator has been added to NetApp drivers."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Drivers can make use of this facility by adding the"},{"line_number":18,"context_line":"@cinder.utils.trace_method() decorator to any method"},{"line_number":19,"context_line":"calls they would like to allow tracing for or using trace_flags"},{"line_number":20,"context_line":"for any other developer targeted debug logs. The trace_method"},{"line_number":21,"context_line":"decorator can easily be added to every function of a class by"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba3cc151_fcd8a2f1","line":18,"updated":"2015-06-29 21:11:09.000000000","message":"Shouldn\u0027t this be without the parenthesis?\n\n @cinder.utils.trace_method","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Drivers can make use of this facility by adding the"},{"line_number":18,"context_line":"@cinder.utils.trace_method() decorator to any method"},{"line_number":19,"context_line":"calls they would like to allow tracing for or using trace_flags"},{"line_number":20,"context_line":"for any other developer targeted debug logs. The trace_method"},{"line_number":21,"context_line":"decorator can easily be added to every function of a class by"},{"line_number":22,"context_line":"using the cinder.utils.TraceWrapperMetaclass or"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba3cc151_991ac816","line":19,"updated":"2015-06-29 21:11:09.000000000","message":"s/using/use","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":21,"context_line":"decorator can easily be added to every function of a class by"},{"line_number":22,"context_line":"using the cinder.utils.TraceWrapperMetaclass or"},{"line_number":23,"context_line":"cinder.utils.TraceWrapperWithABCMetaclass metaclasses."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"For example:"},{"line_number":26,"context_line":"@six.add_metaclass(cinder.utils.TraceWrapperMetaclass)"},{"line_number":27,"context_line":"class MyClass(object):"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba3cc151_79d82454","line":24,"updated":"2015-06-29 21:11:09.000000000","message":"It should be mentioned here that the decorator should always be defined as the outermost decorator.","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":26,"context_line":"@six.add_metaclass(cinder.utils.TraceWrapperMetaclass)"},{"line_number":27,"context_line":"class MyClass(object):"},{"line_number":28,"context_line":"    pass"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Change-Id: Ib9b9d3f40a272bb9c7ebccd1dc63df68a555eac5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba3cc151_c69cef6b","line":29,"updated":"2015-06-29 21:11:09.000000000","message":"Adding a new configuration option, should have DocImpact, right?","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0aeddd5836da2c71ab7490be700f0aeb36d09894","unresolved":false,"context_lines":[{"line_number":24,"context_line":"advised to use the added decorators as the outer most decorator"},{"line_number":25,"context_line":"for a function in order to avoid side-effects with other"},{"line_number":26,"context_line":"decorators."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"For example:"},{"line_number":29,"context_line":"@six.add_metaclass(cinder.utils.TraceWrapperMetaclass)"},{"line_number":30,"context_line":"class MyClass(object):"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"ba3cc151_e590c597","line":27,"updated":"2015-07-07 16:21:23.000000000","message":"API methods can use @cinder.util.trace_api instead.","commit_id":"886202d25588fdf52cbd1ed081e28d6c350f6748"}],"cinder/tests/unit/test_dellfc.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"e5a072fb9a6fb498ef3d936ec69d8019078414df","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        self.configuration.dell_sc_server_folder \u003d \u0027opnstktst\u0027"},{"line_number":148,"context_line":"        self.configuration.dell_sc_volume_folder \u003d \u0027opnstktst\u0027"},{"line_number":149,"context_line":"        self.configuration.dell_sc_api_port \u003d 3033"},{"line_number":150,"context_line":"        self.configuration.trace_flags \u003d None"},{"line_number":151,"context_line":"        self._context \u003d context.get_admin_context()"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        self.driver \u003d dell_storagecenter_fc.DellStorageCenterFCDriver("}],"source_content_type":"text/x-python","patch_set":8,"id":"7ad32947_7876cb3f","line":150,"updated":"2015-04-27 21:59:08.000000000","message":"Why do we need to add this into all of the driver tests? Shouldn\u0027t it only affect tests that interact with the new trace functionality?","commit_id":"5a4cfd19ec73927a913aa1cc6ea58804dd823ca0"}],"cinder/utils.py":[{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"72cee6707f16d160d27e3d51e813a51503d65b35","unresolved":false,"context_lines":[{"line_number":839,"context_line":"                logger.debug(\u0027Entering method %s\u0027, func_name)"},{"line_number":840,"context_line":"            result \u003d f(*args, **kwargs)"},{"line_number":841,"context_line":"            if TRACE_METHOD:"},{"line_number":842,"context_line":"                logger.debug(\u0027Leaving method %s\u0027, func_name)"},{"line_number":843,"context_line":"            return result"},{"line_number":844,"context_line":"        return trace_wrapper"},{"line_number":845,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7ad32947_bf37a2e2","line":842,"updated":"2015-04-28 05:50:44.000000000","message":"Will it be advisable to log the time taken to execute the function ?","commit_id":"5a4cfd19ec73927a913aa1cc6ea58804dd823ca0"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"f56045723f1570e9b2355d4eac88254ca3164bf4","unresolved":false,"context_lines":[{"line_number":831,"context_line":""},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"def trace(f):"},{"line_number":834,"context_line":"    \"\"\"Trace calls to the decorated function"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"    This decorator should always be defined as the outermost decorator so it"},{"line_number":837,"context_line":"    is defined last. This is important so it does not interfere"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_58f06567","line":834,"updated":"2015-06-16 21:52:47.000000000","message":"Docstring summary line should end with a period.","commit_id":"90a3ab305b01afe05918b1cc4e9db4bce9edb4bf"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"f56045723f1570e9b2355d4eac88254ca3164bf4","unresolved":false,"context_lines":[{"line_number":857,"context_line":""},{"line_number":858,"context_line":"        # NOTE(ameade): Don\u0027t bother going any further if DEBUG log level"},{"line_number":859,"context_line":"        # is not enabled for the logger."},{"line_number":860,"context_line":"        # The `LoggerAdapter` implementation in Python 2.6 does not have"},{"line_number":861,"context_line":"        # the \u0027isEnabledFor\u0027 method (added in Python 2.7). We just assume the"},{"line_number":862,"context_line":"        # log level is enabled in that case."},{"line_number":863,"context_line":"        if not getattr(logger, \u0027isEnabledFor\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_d804754b","line":860,"updated":"2015-06-16 21:52:47.000000000","message":"2.6 is no longer supported, so this check is unnecessary.","commit_id":"90a3ab305b01afe05918b1cc4e9db4bce9edb4bf"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"f56045723f1570e9b2355d4eac88254ca3164bf4","unresolved":false,"context_lines":[{"line_number":888,"context_line":""},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"def setup_tracing(trace_flags):"},{"line_number":891,"context_line":"    \"\"\"Set global variables for each trace flag"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"    Sets variables TRACE_METHOD and TRACE_API, which represent"},{"line_number":894,"context_line":"    whether to log method and api traces."}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_38a2414c","line":891,"updated":"2015-06-16 21:52:47.000000000","message":"Ending period.","commit_id":"90a3ab305b01afe05918b1cc4e9db4bce9edb4bf"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":58,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":59,"context_line":"ISO_TIME_FORMAT \u003d \"%Y-%m-%dT%H:%M:%S\""},{"line_number":60,"context_line":"PERFECT_TIME_FORMAT \u003d \"%Y-%m-%dT%H:%M:%S.%f\""},{"line_number":61,"context_line":"VALID_TRACE_FLAGS \u003d [\u0027method\u0027, \u0027api\u0027]"},{"line_number":62,"context_line":"TRACE_METHOD \u003d False"},{"line_number":63,"context_line":"TRACE_API \u003d False"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_06d977f3","line":61,"updated":"2015-06-29 21:11:09.000000000","message":"Why not init this as a set if that\u0027s the only way it\u0027s being going to be used?","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"99a7528a79db5ff70464609cf0b3e6f1c4a129c3","unresolved":false,"context_lines":[{"line_number":58,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":59,"context_line":"ISO_TIME_FORMAT \u003d \"%Y-%m-%dT%H:%M:%S\""},{"line_number":60,"context_line":"PERFECT_TIME_FORMAT \u003d \"%Y-%m-%dT%H:%M:%S.%f\""},{"line_number":61,"context_line":"VALID_TRACE_FLAGS \u003d [\u0027method\u0027, \u0027api\u0027]"},{"line_number":62,"context_line":"TRACE_METHOD \u003d False"},{"line_number":63,"context_line":"TRACE_API \u003d False"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_23e6ede8","line":61,"in_reply_to":"ba3cc151_06d977f3","updated":"2015-07-06 14:34:29.000000000","message":"done","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":868,"context_line":"        if not logger.isEnabledFor(py_logging.DEBUG):"},{"line_number":869,"context_line":"            return f(*args, **kwargs)"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"        if sys.version_info \u003e\u003d (2, 7):"},{"line_number":872,"context_line":"            all_args \u003d inspect.getcallargs(f, *args, **kwargs)"},{"line_number":873,"context_line":"            logger.debug(\u0027\u003d\u003d\u003e %s: call %r\u0027, func_name,"},{"line_number":874,"context_line":"                         all_args)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_7917c4a3","line":871,"updated":"2015-06-29 21:11:09.000000000","message":"Do we intend to backport this to Juno?  Otherwise we should drop this version check.","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"99a7528a79db5ff70464609cf0b3e6f1c4a129c3","unresolved":false,"context_lines":[{"line_number":868,"context_line":"        if not logger.isEnabledFor(py_logging.DEBUG):"},{"line_number":869,"context_line":"            return f(*args, **kwargs)"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"        if sys.version_info \u003e\u003d (2, 7):"},{"line_number":872,"context_line":"            all_args \u003d inspect.getcallargs(f, *args, **kwargs)"},{"line_number":873,"context_line":"            logger.debug(\u0027\u003d\u003d\u003e %s: call %r\u0027, func_name,"},{"line_number":874,"context_line":"                         all_args)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_63b5d5ce","line":871,"in_reply_to":"ba3cc151_7917c4a3","updated":"2015-07-06 14:34:29.000000000","message":"done","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":880,"context_line":"            result \u003d f(*args, **kwargs)"},{"line_number":881,"context_line":"        except Exception as exc:"},{"line_number":882,"context_line":"            total_time \u003d int(round(time.time() * 1000)) - start_time"},{"line_number":883,"context_line":"            logger.debug(\u0027\u003c\u003d\u003d %s: exception (%dms) %r\u0027, func_name,"},{"line_number":884,"context_line":"                         total_time, exc)"},{"line_number":885,"context_line":"            raise"},{"line_number":886,"context_line":"        total_time \u003d int(round(time.time() * 1000)) - start_time"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_5cd3ce38","line":883,"updated":"2015-06-29 21:11:09.000000000","message":"This should use named interpolation instead of positional interpolation.","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"99a7528a79db5ff70464609cf0b3e6f1c4a129c3","unresolved":false,"context_lines":[{"line_number":880,"context_line":"            result \u003d f(*args, **kwargs)"},{"line_number":881,"context_line":"        except Exception as exc:"},{"line_number":882,"context_line":"            total_time \u003d int(round(time.time() * 1000)) - start_time"},{"line_number":883,"context_line":"            logger.debug(\u0027\u003c\u003d\u003d %s: exception (%dms) %r\u0027, func_name,"},{"line_number":884,"context_line":"                         total_time, exc)"},{"line_number":885,"context_line":"            raise"},{"line_number":886,"context_line":"        total_time \u003d int(round(time.time() * 1000)) - start_time"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_83ba59bf","line":883,"in_reply_to":"ba3cc151_5cd3ce38","updated":"2015-07-06 14:34:29.000000000","message":"done","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":885,"context_line":"            raise"},{"line_number":886,"context_line":"        total_time \u003d int(round(time.time() * 1000)) - start_time"},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"        logger.debug(\u0027\u003c\u003d\u003d %s: return (%dms) %r\u0027, func_name,"},{"line_number":889,"context_line":"                     total_time, result)"},{"line_number":890,"context_line":"        return result"},{"line_number":891,"context_line":"    return trace_logging_wrapper"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_1cdd4642","line":888,"updated":"2015-06-29 21:11:09.000000000","message":"This should use named interpolation instead of positional interpolation.","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":904,"context_line":"    def __new__(meta, classname, bases, classDict):"},{"line_number":905,"context_line":"        newClassDict \u003d {}"},{"line_number":906,"context_line":"        for attributeName, attribute in classDict.items():"},{"line_number":907,"context_line":"            if isinstance(attribute, types.FunctionType):"},{"line_number":908,"context_line":"                # replace it with a wrapped version"},{"line_number":909,"context_line":"                attribute \u003d functools.update_wrapper(trace_method(attribute),"},{"line_number":910,"context_line":"                                                     attribute)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_f9ac34ef","line":907,"updated":"2015-06-29 21:11:09.000000000","message":"Why bother wrapping it when TRACE_METHOD is disabled?  Wouldn\u0027t it be better to only change dict and wrap methods if it is enabled?","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"91d2d8d241f581aa2885278fed3192824ed3c13f","unresolved":false,"context_lines":[{"line_number":904,"context_line":"    def __new__(meta, classname, bases, classDict):"},{"line_number":905,"context_line":"        newClassDict \u003d {}"},{"line_number":906,"context_line":"        for attributeName, attribute in classDict.items():"},{"line_number":907,"context_line":"            if isinstance(attribute, types.FunctionType):"},{"line_number":908,"context_line":"                # replace it with a wrapped version"},{"line_number":909,"context_line":"                attribute \u003d functools.update_wrapper(trace_method(attribute),"},{"line_number":910,"context_line":"                                                     attribute)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_e53445df","line":907,"in_reply_to":"ba3cc151_63871513","updated":"2015-07-07 16:22:15.000000000","message":"Very good idea, indeed.","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"99a7528a79db5ff70464609cf0b3e6f1c4a129c3","unresolved":false,"context_lines":[{"line_number":904,"context_line":"    def __new__(meta, classname, bases, classDict):"},{"line_number":905,"context_line":"        newClassDict \u003d {}"},{"line_number":906,"context_line":"        for attributeName, attribute in classDict.items():"},{"line_number":907,"context_line":"            if isinstance(attribute, types.FunctionType):"},{"line_number":908,"context_line":"                # replace it with a wrapped version"},{"line_number":909,"context_line":"                attribute \u003d functools.update_wrapper(trace_method(attribute),"},{"line_number":910,"context_line":"                                                     attribute)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_63871513","line":907,"in_reply_to":"ba3cc151_f9ac34ef","updated":"2015-07-06 14:34:29.000000000","message":"I\u0027m not sure why it would be better. Also, at this point in execution, setup_tracing probably hasn\u0027t been called yet and I rather that not be implicitly required. (temporal coupling)","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":932,"context_line":"        trace_flags \u003d [flag.strip() for flag in trace_flags]"},{"line_number":933,"context_line":"    except TypeError:  # Handle when trace_flags is None or a test mock"},{"line_number":934,"context_line":"        trace_flags \u003d []"},{"line_number":935,"context_line":"    for invalid_flag in list(set(trace_flags) - set(VALID_TRACE_FLAGS)):"},{"line_number":936,"context_line":"        LOG.warning(_LW(\u0027Invalid trace flag: %s\u0027), invalid_flag)"},{"line_number":937,"context_line":"    TRACE_METHOD \u003d \u0027method\u0027 in trace_flags"},{"line_number":938,"context_line":"    TRACE_API \u003d \u0027api\u0027 in trace_flags"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_a649abd2","line":935,"updated":"2015-06-29 21:11:09.000000000","message":"Why convert it to a list? The set is already an iterable","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"99a7528a79db5ff70464609cf0b3e6f1c4a129c3","unresolved":false,"context_lines":[{"line_number":932,"context_line":"        trace_flags \u003d [flag.strip() for flag in trace_flags]"},{"line_number":933,"context_line":"    except TypeError:  # Handle when trace_flags is None or a test mock"},{"line_number":934,"context_line":"        trace_flags \u003d []"},{"line_number":935,"context_line":"    for invalid_flag in list(set(trace_flags) - set(VALID_TRACE_FLAGS)):"},{"line_number":936,"context_line":"        LOG.warning(_LW(\u0027Invalid trace flag: %s\u0027), invalid_flag)"},{"line_number":937,"context_line":"    TRACE_METHOD \u003d \u0027method\u0027 in trace_flags"},{"line_number":938,"context_line":"    TRACE_API \u003d \u0027api\u0027 in trace_flags"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_23afcd7e","line":935,"in_reply_to":"ba3cc151_a649abd2","updated":"2015-07-06 14:34:29.000000000","message":"done","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0aeddd5836da2c71ab7490be700f0aeb36d09894","unresolved":false,"context_lines":[{"line_number":59,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":60,"context_line":"ISO_TIME_FORMAT \u003d \"%Y-%m-%dT%H:%M:%S\""},{"line_number":61,"context_line":"PERFECT_TIME_FORMAT \u003d \"%Y-%m-%dT%H:%M:%S.%f\""},{"line_number":62,"context_line":"VALID_TRACE_FLAGS \u003d set([\u0027method\u0027, \u0027api\u0027])"},{"line_number":63,"context_line":"TRACE_METHOD \u003d False"},{"line_number":64,"context_line":"TRACE_API \u003d False"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba3cc151_ea773400","line":62,"updated":"2015-07-07 16:21:23.000000000","message":"That would first build a list and then a set:\n\n VALID_TRACE_FLAGS \u003d {\u0027method\u0027, \u0027api\u0027}","commit_id":"886202d25588fdf52cbd1ed081e28d6c350f6748"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0aeddd5836da2c71ab7490be700f0aeb36d09894","unresolved":false,"context_lines":[{"line_number":900,"context_line":"            result \u003d f(*args, **kwargs)"},{"line_number":901,"context_line":"        except Exception as exc:"},{"line_number":902,"context_line":"            total_time \u003d int(round(time.time() * 1000)) - start_time"},{"line_number":903,"context_line":"            logger.debug(\u0027\u003c\u003d\u003d %s: exception (%dms) %r\u0027, func_name,"},{"line_number":904,"context_line":"                         total_time, exc)"},{"line_number":905,"context_line":"            raise"},{"line_number":906,"context_line":"        total_time \u003d int(round(time.time() * 1000)) - start_time"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba3cc151_0a8ff8cc","line":903,"updated":"2015-07-07 16:21:23.000000000","message":"This is still using positional interpolation instead of named interpolation.\n\nMaybe it\u0027s not clear what I mean by named interpolation:\n\nThis should be something like:\n\n  logger.debug(\u0027\u003c\u003d\u003d %(name)s: exception (%(time)dms) %(exc)r\u0027,\n                  {\u0027name\u0027: func_name, \u0027time\u0027: total_time, \u0027exc\u0027: exc})","commit_id":"886202d25588fdf52cbd1ed081e28d6c350f6748"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0aeddd5836da2c71ab7490be700f0aeb36d09894","unresolved":false,"context_lines":[{"line_number":905,"context_line":"            raise"},{"line_number":906,"context_line":"        total_time \u003d int(round(time.time() * 1000)) - start_time"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        logger.debug(\u0027\u003c\u003d\u003d %s: return (%dms) %r\u0027, func_name,"},{"line_number":909,"context_line":"                     total_time, result)"},{"line_number":910,"context_line":"        return result"},{"line_number":911,"context_line":"    return trace_logging_wrapper"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba3cc151_aabccc6c","line":908,"updated":"2015-07-07 16:21:23.000000000","message":"Same here","commit_id":"886202d25588fdf52cbd1ed081e28d6c350f6748"}],"cinder/volume/driver.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f7e49233c1470a120b70229b1cbbfe02f42def93","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                default\u003dNone,"},{"line_number":226,"context_line":"                help\u003d\u0027List of options that control which trace info \u0027"},{"line_number":227,"context_line":"                     \u0027is written to the DEBUG log level to assist \u0027"},{"line_number":228,"context_line":"                     \u0027developers. Values include method and api.\u0027),"},{"line_number":229,"context_line":"]"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"# for backward compatibility"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_86bb47c4","line":228,"updated":"2015-06-29 21:11:09.000000000","message":"\"Values include\" may not be the best way to phrase it, as it looks like there are other available values.  \"Possible values are\" could be better phrasing.","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"99a7528a79db5ff70464609cf0b3e6f1c4a129c3","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                default\u003dNone,"},{"line_number":226,"context_line":"                help\u003d\u0027List of options that control which trace info \u0027"},{"line_number":227,"context_line":"                     \u0027is written to the DEBUG log level to assist \u0027"},{"line_number":228,"context_line":"                     \u0027developers. Values include method and api.\u0027),"},{"line_number":229,"context_line":"]"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"# for backward compatibility"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_23fd8d6e","line":228,"in_reply_to":"ba3cc151_86bb47c4","updated":"2015-07-06 14:34:29.000000000","message":"done","commit_id":"10677a24026a0228f39edc3a63f0ac18ee4c8c68"}],"cinder/volume/drivers/netapp/dataontap/block_7mode.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"7784adf29893239198a61a04823b4eae9e1906aa","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.configuration.append_config_values(na_opts.netapp_7mode_opts)"},{"line_number":51,"context_line":"        self.driver_mode \u003d \u00277mode\u0027"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @utils.trace_method"},{"line_number":54,"context_line":"    def do_setup(self, context):"},{"line_number":55,"context_line":"        super(NetAppBlockStorage7modeLibrary, self).do_setup(context)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_f94c0278","line":53,"updated":"2015-06-22 19:54:35.000000000","message":"I\u0027m not a fan of such solutions. Can we implement it using metaclasses?","commit_id":"75c5d52a177fd40293cd528847054f7128e111e6"}],"cinder/volume/drivers/netapp/dataontap/client/api.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"f56045723f1570e9b2355d4eac88254ca3164bf4","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"EONTAPI_EINVAL \u003d \u002722\u0027"},{"line_number":38,"context_line":"EVOLUMEOFFLINE \u003d \u002713042\u0027"},{"line_number":39,"context_line":"EINTERNALERROR \u003d \u002713114\u0027"},{"line_number":40,"context_line":"EDUPLICATEENTRY \u003d \u002713130\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_786a09f0","line":37,"updated":"2015-06-16 21:52:47.000000000","message":"These constants look unrelated to this change.","commit_id":"90a3ab305b01afe05918b1cc4e9db4bce9edb4bf"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"dca7d048e3e7242c43e8b3b7d9f2a47f3a20848d","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"EONTAPI_EINVAL \u003d \u002722\u0027"},{"line_number":38,"context_line":"EVOLUMEOFFLINE \u003d \u002713042\u0027"},{"line_number":39,"context_line":"EINTERNALERROR \u003d \u002713114\u0027"},{"line_number":40,"context_line":"EDUPLICATEENTRY \u003d \u002713130\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_36653e1d","line":37,"in_reply_to":"fa32b979_786a09f0","updated":"2015-06-17 20:03:06.000000000","message":"weird, no idea where these came from.","commit_id":"90a3ab305b01afe05918b1cc4e9db4bce9edb4bf"}],"cinder/volume/drivers/netapp/options.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"b3f2af730fe7f655c3a32889759defe2ea662c47","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                     \u0027cinder-volume process to execute the file.\u0027)), ]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"netapp_support_opts \u003d ["},{"line_number":180,"context_line":"    cfg.StrOpt(\u0027netapp_trace_flags\u0027,"},{"line_number":181,"context_line":"               default\u003dNone,"},{"line_number":182,"context_line":"               help\u003d\u0027Comma-separated list of options that control which \u0027"},{"line_number":183,"context_line":"                    \u0027trace info is written to the debug logs.  Values \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa041b7_4c523cdf","line":180,"updated":"2015-04-01 19:20:47.000000000","message":"Please, use cfg.ListOpt instead of cfg.StrOpt","commit_id":"ee318477cd929ee68937ed8911948d0e058df8d8"}],"cinder/volume/drivers/netapp/utils.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"b3f2af730fe7f655c3a32889759defe2ea662c47","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        flags \u003d trace_flags_string.split(\u0027,\u0027)"},{"line_number":174,"context_line":"        flags \u003d [flag.strip() for flag in flags]"},{"line_number":175,"context_line":"        for invalid_flag in list(set(flags) - set(VALID_TRACE_FLAGS)):"},{"line_number":176,"context_line":"            LOG.warning(_LW(\u0027Invalid trace flag: %s\u0027) % invalid_flag)"},{"line_number":177,"context_line":"        TRACE_METHOD \u003d \u0027method\u0027 in flags"},{"line_number":178,"context_line":"        TRACE_API \u003d \u0027api\u0027 in flags"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baa041b7_cc13ec0c","line":176,"updated":"2015-04-01 19:20:47.000000000","message":"Please, replace % \u003d\u003e ,","commit_id":"ee318477cd929ee68937ed8911948d0e058df8d8"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"b3f2af730fe7f655c3a32889759defe2ea662c47","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        def trace_wrapper(*args, **kwargs):"},{"line_number":199,"context_line":"            if TRACE_METHOD:"},{"line_number":200,"context_line":"                logger.debug(\u0027Entering method %s\u0027 % func_name)"},{"line_number":201,"context_line":"            result \u003d f(*args, **kwargs)"},{"line_number":202,"context_line":"            if TRACE_METHOD:"},{"line_number":203,"context_line":"                logger.debug(\u0027Leaving method %s\u0027 % func_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa041b7_2c05b8c1","line":200,"updated":"2015-04-01 19:20:47.000000000","message":"Please, replace % \u003d\u003e ,","commit_id":"ee318477cd929ee68937ed8911948d0e058df8d8"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"b3f2af730fe7f655c3a32889759defe2ea662c47","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                logger.debug(\u0027Entering method %s\u0027 % func_name)"},{"line_number":201,"context_line":"            result \u003d f(*args, **kwargs)"},{"line_number":202,"context_line":"            if TRACE_METHOD:"},{"line_number":203,"context_line":"                logger.debug(\u0027Leaving method %s\u0027 % func_name)"},{"line_number":204,"context_line":"            return result"},{"line_number":205,"context_line":"        return trace_wrapper"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baa041b7_0c0af4d2","line":203,"updated":"2015-04-01 19:20:47.000000000","message":"Please, replace % \u003d\u003e ,","commit_id":"ee318477cd929ee68937ed8911948d0e058df8d8"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"3e94732e4899bbed0fb170dc936113f483ee3d72","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    TRACE_API \u003d \u0027api\u0027 in trace_flags"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def trace(logger\u003dNone, original_function_name\u003dNone):"},{"line_number":179,"context_line":"    \"\"\"Logs before and after the wrapped function is called."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    This decorator should always be defined as the outermost decorator so it"}],"source_content_type":"text/x-python","patch_set":7,"id":"dac4157f_b1ff9466","line":178,"updated":"2015-04-21 21:46:59.000000000","message":"I was just adding something almost exactly like this to the Pure Storage driver :D Would you mind moving this into the higher level cinder utils file so we can all use the same one?","commit_id":"8fe8077b732dec8b136b6adf5d8e07c8a067c4d4"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"726c6e4c6be9c319a4580e2f17412315a5a298e1","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    TRACE_API \u003d \u0027api\u0027 in trace_flags"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def trace(logger\u003dNone, original_function_name\u003dNone):"},{"line_number":179,"context_line":"    \"\"\"Logs before and after the wrapped function is called."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    This decorator should always be defined as the outermost decorator so it"}],"source_content_type":"text/x-python","patch_set":7,"id":"bab921fb_96800048","line":178,"in_reply_to":"bab921fb_c4105bab","updated":"2015-04-24 12:42:53.000000000","message":"Yeah, my thinking is that since we are pretty printing the API requests/responses it\u0027s not really LOG friendly for a production system so I wanted the config option.","commit_id":"8fe8077b732dec8b136b6adf5d8e07c8a067c4d4"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"1813d21801fbfe65c80fcbe3b93da0d50d777455","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    TRACE_API \u003d \u0027api\u0027 in trace_flags"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def trace(logger\u003dNone, original_function_name\u003dNone):"},{"line_number":179,"context_line":"    \"\"\"Logs before and after the wrapped function is called."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    This decorator should always be defined as the outermost decorator so it"}],"source_content_type":"text/x-python","patch_set":7,"id":"dac4157f_fe037e40","line":178,"in_reply_to":"dac4157f_b1ff9466","updated":"2015-04-22 13:03:11.000000000","message":"I was hoping someone would suggest this. Sure thing! i\u0027ll push up a followup when I get a chance today. I may refactor it a tad if it will be common. Do you think I should make them options for all backends? And the respective backends can add the wrappers if they want?","commit_id":"8fe8077b732dec8b136b6adf5d8e07c8a067c4d4"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"9310ec488d78164514b4c07971407e0f1afad99a","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    TRACE_API \u003d \u0027api\u0027 in trace_flags"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def trace(logger\u003dNone, original_function_name\u003dNone):"},{"line_number":179,"context_line":"    \"\"\"Logs before and after the wrapped function is called."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    This decorator should always be defined as the outermost decorator so it"}],"source_content_type":"text/x-python","patch_set":7,"id":"bab921fb_c4105bab","line":178,"in_reply_to":"dac4157f_fe037e40","updated":"2015-04-23 01:01:33.000000000","message":"Not sure whats best with the options, the version I intended to use was a little more primitive, it just relied on the debug log filtering to handle turning it on or off. My thinking was that if you turn on debug logging you would probably want tracing as well where it is available. The assumption being you already kind of expect pretty verbose logs and don\u0027t mind the performance hit or anything like that.\n\nThat being said, I don\u0027t have any opposition to using the config options for it. Especially if you see a good use case where you want more fine grained control. I would think the best behavior is to work like the verbose and debug options are right now in cinder.conf, just a new trace\u003dTrue one that turns this on, or sticking with the flags maybe trace_flags\u003dmethod,api,etc.","commit_id":"8fe8077b732dec8b136b6adf5d8e07c8a067c4d4"}]}
