)]}'
{"cloudkitty/api/v1/controllers/info.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"OLD_METADATA \u003d collector.get_collector_metadata()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class MetricInfoController(rest.RestController):"},{"line_number":42,"context_line":"    \"\"\"REST Controller mananging collected metrics information.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @wsme_pecan.wsexpose(info_models.CloudkittyMetricInfoCollection)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_db60c835","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":48},"updated":"2018-02-06 09:31:09.000000000","message":"please describe this endpoint","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class MetricInfoController(rest.RestController):"},{"line_number":42,"context_line":"    \"\"\"REST Controller mananging collected metrics information.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @wsme_pecan.wsexpose(info_models.CloudkittyMetricInfoCollection)"},{"line_number":45,"context_line":"    def get_all(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_9b69e026","line":42,"range":{"start_line":42,"start_character":23,"end_line":42,"end_character":32},"updated":"2018-02-06 09:31:09.000000000","message":"typo","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"METRICS_CONF \u003d ck_utils.get_metrics_conf(CONF.collect.metrics_conf)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"METADATA \u003d collector.get_metrics_based_collector_metadata()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# NOTE(mc): Deprecated but kept for backward compatibility."},{"line_number":38,"context_line":"OLD_METADATA \u003d collector.get_services_based_collector_metadata()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class MetricInfoController(rest.RestController):"},{"line_number":42,"context_line":"    \"\"\"REST Controller managing collected metrics information"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    independently of their services."},{"line_number":45,"context_line":"    If no metrics are defined in conf, return 405 for each endpoint."},{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @wsme_pecan.wsexpose(info_models.CloudkittyMetricInfoCollection)"},{"line_number":49,"context_line":"    def get_all(self):"},{"line_number":50,"context_line":"        \"\"\"Get the metric list."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :return: List of every metrics."},{"line_number":53,"context_line":"        \"\"\""},{"line_number":54,"context_line":"        if \u0027metrics\u0027 not in METRICS_CONF:"},{"line_number":55,"context_line":"            msg \u003d \u0027Invalid endpoint: no metrics in current configuration.\u0027"},{"line_number":56,"context_line":"            pecan.abort(405, msg)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        policy.authorize(pecan.request.context, \u0027info:list_metrics_info\u0027, {})"},{"line_number":59,"context_line":"        metrics_info_list \u003d []"},{"line_number":60,"context_line":"        for metric, metadata in METADATA.items():"},{"line_number":61,"context_line":"            info \u003d metadata.copy()"},{"line_number":62,"context_line":"            info[\u0027metric_id\u0027] \u003d metric"},{"line_number":63,"context_line":"            metrics_info_list.append("},{"line_number":64,"context_line":"                info_models.CloudkittyMetricInfo(**info))"},{"line_number":65,"context_line":"        return info_models.CloudkittyMetricInfoCollection("},{"line_number":66,"context_line":"            metrics\u003dmetrics_info_list)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @wsme_pecan.wsexpose(info_models.CloudkittyMetricInfo, wtypes.text)"},{"line_number":69,"context_line":"    def get_one(self, metric_name):"},{"line_number":70,"context_line":"        \"\"\"Return a metric."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param metric_name: name of the metric."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        if \u0027metrics\u0027 not in METRICS_CONF:"},{"line_number":75,"context_line":"            msg \u003d \u0027Invalid endpoint: no metrics in current configuration.\u0027"},{"line_number":76,"context_line":"            pecan.abort(405, msg)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        policy.authorize(pecan.request.context, \u0027info:get_metric_info\u0027, {})"},{"line_number":79,"context_line":"        try:"},{"line_number":80,"context_line":"            info \u003d METADATA[metric_name].copy()"},{"line_number":81,"context_line":"            info[\u0027metric_id\u0027] \u003d metric_name"},{"line_number":82,"context_line":"            return info_models.CloudkittyMetricInfo(**info)"},{"line_number":83,"context_line":"        except KeyError:"},{"line_number":84,"context_line":"            pecan.abort(404, six.text_type(metric_name))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class ServiceInfoController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_77094c93","line":84,"range":{"start_line":35,"start_character":0,"end_line":84,"end_character":56},"updated":"2018-03-21 16:48:40.000000000","message":"Shouldn\u0027t API modifications be part of another patch ?","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"cc33e397ba1c8624462fc61cf796518d6a8fdc18","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"METRICS_CONF \u003d ck_utils.get_metrics_conf(CONF.collect.metrics_conf)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"METADATA \u003d collector.get_metrics_based_collector_metadata()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# NOTE(mc): Deprecated but kept for backward compatibility."},{"line_number":38,"context_line":"OLD_METADATA \u003d collector.get_services_based_collector_metadata()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class MetricInfoController(rest.RestController):"},{"line_number":42,"context_line":"    \"\"\"REST Controller managing collected metrics information"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    independently of their services."},{"line_number":45,"context_line":"    If no metrics are defined in conf, return 405 for each endpoint."},{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @wsme_pecan.wsexpose(info_models.CloudkittyMetricInfoCollection)"},{"line_number":49,"context_line":"    def get_all(self):"},{"line_number":50,"context_line":"        \"\"\"Get the metric list."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        :return: List of every metrics."},{"line_number":53,"context_line":"        \"\"\""},{"line_number":54,"context_line":"        if \u0027metrics\u0027 not in METRICS_CONF:"},{"line_number":55,"context_line":"            msg \u003d \u0027Invalid endpoint: no metrics in current configuration.\u0027"},{"line_number":56,"context_line":"            pecan.abort(405, msg)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        policy.authorize(pecan.request.context, \u0027info:list_metrics_info\u0027, {})"},{"line_number":59,"context_line":"        metrics_info_list \u003d []"},{"line_number":60,"context_line":"        for metric, metadata in METADATA.items():"},{"line_number":61,"context_line":"            info \u003d metadata.copy()"},{"line_number":62,"context_line":"            info[\u0027metric_id\u0027] \u003d metric"},{"line_number":63,"context_line":"            metrics_info_list.append("},{"line_number":64,"context_line":"                info_models.CloudkittyMetricInfo(**info))"},{"line_number":65,"context_line":"        return info_models.CloudkittyMetricInfoCollection("},{"line_number":66,"context_line":"            metrics\u003dmetrics_info_list)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @wsme_pecan.wsexpose(info_models.CloudkittyMetricInfo, wtypes.text)"},{"line_number":69,"context_line":"    def get_one(self, metric_name):"},{"line_number":70,"context_line":"        \"\"\"Return a metric."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param metric_name: name of the metric."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        if \u0027metrics\u0027 not in METRICS_CONF:"},{"line_number":75,"context_line":"            msg \u003d \u0027Invalid endpoint: no metrics in current configuration.\u0027"},{"line_number":76,"context_line":"            pecan.abort(405, msg)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        policy.authorize(pecan.request.context, \u0027info:get_metric_info\u0027, {})"},{"line_number":79,"context_line":"        try:"},{"line_number":80,"context_line":"            info \u003d METADATA[metric_name].copy()"},{"line_number":81,"context_line":"            info[\u0027metric_id\u0027] \u003d metric_name"},{"line_number":82,"context_line":"            return info_models.CloudkittyMetricInfo(**info)"},{"line_number":83,"context_line":"        except KeyError:"},{"line_number":84,"context_line":"            pecan.abort(404, six.text_type(metric_name))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class ServiceInfoController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":30,"id":"bf659307_d8cead5a","line":84,"range":{"start_line":35,"start_character":0,"end_line":84,"end_character":56},"in_reply_to":"df7087c5_77094c93","updated":"2018-04-04 15:23:16.000000000","message":"As discussed together, I didn\u0027t made it in another patch because of the service reorganization.","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"}],"cloudkitty/api/v1/datamodels/info.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def get_metrics_list():"},{"line_number":28,"context_line":"    METRICS_CONF \u003d ck_utils.get_metrics_conf(CONF.collect.metrics_conf)"},{"line_number":29,"context_line":"    try:"},{"line_number":30,"context_line":"        metrics \u003d list(METRICS_CONF[\u0027metrics\u0027].keys())"},{"line_number":31,"context_line":"        CLOUDKITTY_METRICS \u003d wtypes.Enum(wtypes.text, *metrics)"}],"source_content_type":"text/x-python","patch_set":35,"id":"bf659307_09bd27d7","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":16},"updated":"2018-04-16 11:35:05.000000000","message":"According to pep8, non-global variable names should be lowercase","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    try:"},{"line_number":30,"context_line":"        metrics \u003d list(METRICS_CONF[\u0027metrics\u0027].keys())"},{"line_number":31,"context_line":"        CLOUDKITTY_METRICS \u003d wtypes.Enum(wtypes.text, *metrics)"},{"line_number":32,"context_line":"    except Exception:"},{"line_number":33,"context_line":"        metrics \u003d list(ck_utils.get_default_metrics_conf()[\u0027metrics\u0027].keys())"},{"line_number":34,"context_line":"        CLOUDKITTY_METRICS \u003d wtypes.Enum(wtypes.text, *metrics)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"bf659307_e9b793f4","line":32,"range":{"start_line":32,"start_character":11,"end_line":32,"end_character":20},"updated":"2018-04-16 11:35:05.000000000","message":"KeyError","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        metrics \u003d list(METRICS_CONF[\u0027metrics\u0027].keys())"},{"line_number":31,"context_line":"        CLOUDKITTY_METRICS \u003d wtypes.Enum(wtypes.text, *metrics)"},{"line_number":32,"context_line":"    except Exception:"},{"line_number":33,"context_line":"        metrics \u003d list(ck_utils.get_default_metrics_conf()[\u0027metrics\u0027].keys())"},{"line_number":34,"context_line":"        CLOUDKITTY_METRICS \u003d wtypes.Enum(wtypes.text, *metrics)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    return CLOUDKITTY_METRICS"}],"source_content_type":"text/x-python","patch_set":35,"id":"bf659307_8956175c","line":33,"range":{"start_line":33,"start_character":32,"end_line":33,"end_character":58},"updated":"2018-04-16 11:35:05.000000000","message":"The default value here should be an empty list, as the dict returned by this function does not match the configuration that is actually used by the collector (see comment for this function)","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"}],"cloudkitty/collector/__init__.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    if not transformers:"},{"line_number":40,"context_line":"        transformers \u003d transformer.get_transformers()"},{"line_number":41,"context_line":"    collector_args \u003d {"},{"line_number":42,"context_line":"        \u0027period\u0027: OS_CONF[\u0027period\u0027],"},{"line_number":43,"context_line":"        \u0027transformers\u0027: transformers}"},{"line_number":44,"context_line":"    collector \u003d driver.DriverManager("},{"line_number":45,"context_line":"        COLLECTORS_NAMESPACE,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_8a42813d","line":42,"range":{"start_line":42,"start_character":9,"end_line":42,"end_character":16},"updated":"2018-01-30 16:56:13.000000000","message":"You could pass this as a kwarg to avoid code duplication in orchestrator","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"}],"cloudkitty/collector/gnocchi.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def __init__(self, transformers, **kwargs):"},{"line_number":90,"context_line":"        super(GnocchiCollector, self).__init__(transformers, **kwargs)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        self.conf \u003d kwargs[\u0027conf\u0027]"},{"line_number":93,"context_line":"        self.t_gnocchi \u003d self.transformers[\u0027GnocchiTransformer\u0027]"},{"line_number":94,"context_line":"        self.t_cloudkitty \u003d self.transformers[\u0027CloudKittyFormatTransformer\u0027]"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_366301df","line":92,"range":{"start_line":92,"start_character":8,"end_line":92,"end_character":34},"updated":"2018-02-06 09:31:09.000000000","message":"If you do this in each collector, it can be done in collector.BaseCollector.","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            value \u003d 1"},{"line_number":309,"context_line":"            # Unit conversion"},{"line_number":310,"context_line":"            try:"},{"line_number":311,"context_line":"                if unit not in [\u0027instance\u0027, \u0027ip\u0027, \u0027unknown\u0027]:"},{"line_number":312,"context_line":"                    resource_data[resource_name] \u003d ck_utils.convert_unit("},{"line_number":313,"context_line":"                        resource_data[resource_name],"},{"line_number":314,"context_line":"                        self.conf[\u0027metrics\u0027][resource_name].get(\u0027factor\u0027, 1),"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_36ac618b","line":311,"range":{"start_line":311,"start_character":16,"end_line":311,"end_character":61},"updated":"2018-02-06 09:31:09.000000000","message":"We can\u0027t have any special case. We don\u0027t know if a metric defined by the user will match this condition","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"0143a73b17c0636725926afd60e9164d52c930d2","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                if unit not in [\u0027instance\u0027, \u0027ip\u0027, \u0027unknown\u0027]:"},{"line_number":312,"context_line":"                    resource_data[resource_name] \u003d ck_utils.convert_unit("},{"line_number":313,"context_line":"                        resource_data[resource_name],"},{"line_number":314,"context_line":"                        self.conf[\u0027metrics\u0027][resource_name].get(\u0027factor\u0027, 1),"},{"line_number":315,"context_line":"                        self.conf[\u0027metrics\u0027][resource_name].get(\u0027offset\u0027, 0),"},{"line_number":316,"context_line":"                    )"},{"line_number":317,"context_line":"                    value \u003d resource_data[resource_name]"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_32754a96","line":314,"range":{"start_line":314,"start_character":74,"end_line":314,"end_character":75},"updated":"2018-02-06 11:06:55.000000000","message":"argument of type \u0027int\u0027 is not iterable","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                    value \u003d qty if isinstance(qty, int) else resource_data[qty]"},{"line_number":333,"context_line":"                elif resource.get(\u0027type\u0027) \u003d\u003d \u0027ceph_account\u0027:"},{"line_number":334,"context_line":"                    resource_data[qty] \u003d ("},{"line_number":335,"context_line":"                        decimal.Decimal(resource_data[qty]) / units.Gi"},{"line_number":336,"context_line":"                    )"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"            data \u003d self.t_cloudkitty.format_item("},{"line_number":339,"context_line":"                resource_data,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_f6b7d9d7","line":336,"range":{"start_line":335,"start_character":70,"end_line":336,"end_character":21},"updated":"2018-02-06 09:31:09.000000000","message":"This was already pep8 compliant","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            # [point_date, granularity, value]"},{"line_number":192,"context_line":"            # [\"2015-11-24T00:00:00+00:00\", 86400.0, 64.0]"},{"line_number":193,"context_line":"            resource[name] \u003d values[0][2]"},{"line_number":194,"context_line":"        except IndexError:"},{"line_number":195,"context_line":"            resource[name] \u003d 0"},{"line_number":196,"context_line":"        except KeyError:"},{"line_number":197,"context_line":"            # Skip metrics not found"},{"line_number":198,"context_line":"            pass"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def _expand_metrics(self, resources, mappings, start, end,"},{"line_number":201,"context_line":"                        resource_name, deprecated\u003dNone):"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_f239ea3e","line":198,"range":{"start_line":194,"start_character":8,"end_line":198,"end_character":16},"updated":"2018-03-21 16:48:40.000000000","message":"To avoid the potential KeyError l. 322, this should be changed to:\n\nexcept (IndexError, KeyError):\n    resource[name] \u003d 0","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        try:"},{"line_number":271,"context_line":"            met \u003d self.conf[\u0027metrics\u0027][resource_name]"},{"line_number":272,"context_line":"            unit \u003d met[\u0027unit\u0027]"},{"line_number":273,"context_line":"            qty \u003d 1 if met.get(\u0027countable_unit\u0027) else met[\u0027resource\u0027]"},{"line_number":274,"context_line":"        # NOTE(mc): deprecated except part kept for backward compatibility."},{"line_number":275,"context_line":"        except KeyError:"},{"line_number":276,"context_line":"            deprecated \u003d True"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_522e9643","line":273,"range":{"start_line":273,"start_character":12,"end_line":273,"end_character":69},"updated":"2018-03-21 16:48:40.000000000","message":"If we have the \u0027image.size\u0027 here, qty will be \u0027image\u0027... (1/2)","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":319,"context_line":"                if isinstance(qty, str):"},{"line_number":320,"context_line":"                    resource_data[resource_name] \u003d ck_utils.convert_unit("},{"line_number":321,"context_line":"                        resource_data[resource_name],"},{"line_number":322,"context_line":"                        self.conf[\u0027metrics\u0027][resource_name].get(\u0027factor\u0027, 1),"},{"line_number":323,"context_line":"                        self.conf[\u0027metrics\u0027][resource_name].get(\u0027offset\u0027, 0),"},{"line_number":324,"context_line":"                    )"},{"line_number":325,"context_line":"                    value \u003d resource_data[resource_name]"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_f29d6a57","line":322,"range":{"start_line":322,"start_character":45,"end_line":322,"end_character":58},"updated":"2018-03-21 16:48:40.000000000","message":"KeyError: image.serve. See comment l. 194-198","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                    )"},{"line_number":335,"context_line":"                elif resource.get(\u0027type\u0027) \u003d\u003d \u0027image\u0027:"},{"line_number":336,"context_line":"                    resource_data[qty] \u003d ("},{"line_number":337,"context_line":"                        decimal.Decimal(resource_data[qty]) / units.Mi"},{"line_number":338,"context_line":"                    )"},{"line_number":339,"context_line":"                elif resource.get(\u0027type\u0027) \u003d\u003d \u0027ceph_account\u0027:"},{"line_number":340,"context_line":"                    resource_data[qty] \u003d ("}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_322be230","line":337,"range":{"start_line":337,"start_character":40,"end_line":337,"end_character":58},"updated":"2018-03-21 16:48:40.000000000","message":"...leading to a KeyError here (2/2)","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"}],"cloudkitty/collector/monasca.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            resource_qty \u003d qty"},{"line_number":358,"context_line":"            if not (isinstance(qty, int) or isinstance(qty, decimal.Decimal)):"},{"line_number":359,"context_line":"                try:"},{"line_number":360,"context_line":"                    resource_qty \u003d METRICS_CONF[\u0027metric\u0027]"},{"line_number":361,"context_line":"                # NOTE(mc): deprecated except part kept for backward compat."},{"line_number":362,"context_line":"                except KeyError:"},{"line_number":363,"context_line":"                    LOG.warning(\u0027Error when trying to use yaml metrology conf\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_76550950","line":360,"range":{"start_line":360,"start_character":49,"end_line":360,"end_character":55},"updated":"2018-02-06 09:31:09.000000000","message":"This key does not exist","commit_id":"c85680944d68121792c22a6663820905d15a951c"}],"cloudkitty/fetcher/keystone.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                   tenant_attr: tenant})"},{"line_number":83,"context_line":"            if \u0027rating\u0027 not in [role.name for role in roles]:"},{"line_number":84,"context_line":"                tenant_list.remove(tenant)"},{"line_number":85,"context_line":"        conf \u003d [cnf for cnf in base_conf if cnf[\u0027fetcher\u0027] \u003d\u003d self.name][0]"},{"line_number":86,"context_line":"        res \u003d [{\u0027tenant_id\u0027: tenant.id} for tenant in tenant_list]"},{"line_number":87,"context_line":"        for tenant in res:"},{"line_number":88,"context_line":"            tenant.update(conf)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_3659c159","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":75},"updated":"2018-02-06 09:31:09.000000000","message":"What if base_conf is not specified in get_tenants() ?","commit_id":"c85680944d68121792c22a6663820905d15a951c"}],"cloudkitty/orchestrator.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":258,"context_line":"                except NoMatches as exc:"},{"line_number":259,"context_line":"                    LOG.warning(\u0027No %s fetcher found\u0027, fetcher_name)"},{"line_number":260,"context_line":"                    LOG.warning(exc)"},{"line_number":261,"context_line":"                    continue"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        # NOTE(mc): Deprecated except part kept for backward compatibility."},{"line_number":264,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_cffdfb6e","line":261,"range":{"start_line":261,"start_character":20,"end_line":261,"end_character":28},"updated":"2018-01-30 16:56:13.000000000","message":"Last statement of loop, not needed","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            LOG.warning(\u0027Error when trying to use yaml metrology conf.\u0027)"},{"line_number":266,"context_line":"            LOG.warning(\u0027Fallback on the deprecated oslo config method.\u0027)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def _get_collector(self, collector, period):"},{"line_number":269,"context_line":"        collector_args \u003d {"},{"line_number":270,"context_line":"            \u0027period\u0027: period,"},{"line_number":271,"context_line":"            \u0027transformers\u0027: transformer.get_transformers(),"},{"line_number":272,"context_line":"        }"},{"line_number":273,"context_line":"        return driver.DriverManager("},{"line_number":274,"context_line":"            COLLECTORS_NAMESPACE,"},{"line_number":275,"context_line":"            collector,"},{"line_number":276,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":277,"context_line":"            invoke_kwds\u003dcollector_args).driver"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _get_storage(self, storage, period, collector):"},{"line_number":280,"context_line":"        storage_args \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_efad579b","line":277,"range":{"start_line":268,"start_character":4,"end_line":277,"end_character":46},"updated":"2018-01-30 16:56:13.000000000","message":"Why don\u0027t you use collector.get_collector ?","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"27addc81f05bfdd88b4b5e808cd9a5923f014647","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            LOG.warning(\u0027Error when trying to use yaml metrology conf.\u0027)"},{"line_number":266,"context_line":"            LOG.warning(\u0027Fallback on the deprecated oslo config method.\u0027)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def _get_collector(self, collector, period):"},{"line_number":269,"context_line":"        collector_args \u003d {"},{"line_number":270,"context_line":"            \u0027period\u0027: period,"},{"line_number":271,"context_line":"            \u0027transformers\u0027: transformer.get_transformers(),"},{"line_number":272,"context_line":"        }"},{"line_number":273,"context_line":"        return driver.DriverManager("},{"line_number":274,"context_line":"            COLLECTORS_NAMESPACE,"},{"line_number":275,"context_line":"            collector,"},{"line_number":276,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":277,"context_line":"            invoke_kwds\u003dcollector_args).driver"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _get_storage(self, storage, period, collector):"},{"line_number":280,"context_line":"        storage_args \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa0c359_28b44f7f","line":277,"range":{"start_line":268,"start_character":4,"end_line":277,"end_character":46},"in_reply_to":"5f93b717_efad579b","updated":"2018-02-15 11:05:54.000000000","message":"At first I was looking for a new way to do it because of the deprecation, but then I centralized some code and so, collector.get_collector and storage.get_storage are correctly used.","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":277,"context_line":"            invoke_kwds\u003dcollector_args).driver"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _get_storage(self, storage, period, collector):"},{"line_number":280,"context_line":"        storage_args \u003d {"},{"line_number":281,"context_line":"            \u0027period\u0027: period,"},{"line_number":282,"context_line":"            \u0027collector\u0027: collector,"},{"line_number":283,"context_line":"        }"},{"line_number":284,"context_line":"        return driver.DriverManager("},{"line_number":285,"context_line":"            STORAGES_NAMESPACE,"},{"line_number":286,"context_line":"            storage,"},{"line_number":287,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":288,"context_line":"            invoke_kwds\u003dstorage_args).driver"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def _lock(self, tenant_id):"},{"line_number":291,"context_line":"        lock_name \u003d b\"cloudkitty-\" + str(tenant_id).encode(\u0027ascii\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_efb8f7e5","line":288,"range":{"start_line":279,"start_character":4,"end_line":288,"end_character":44},"updated":"2018-01-30 16:56:13.000000000","message":"Why don\u0027t you use storage.get_storage ?","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                self.coord.start()"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"                for tenant in self.tenants:"},{"line_number":341,"context_line":"                    self.collector \u003d self._get_collector("},{"line_number":342,"context_line":"                        tenant[\u0027collector\u0027],"},{"line_number":343,"context_line":"                        tenant[\u0027period\u0027],"},{"line_number":344,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_6f8dc7d1","line":341,"range":{"start_line":341,"start_character":20,"end_line":341,"end_character":34},"updated":"2018-01-30 16:56:13.000000000","message":"If this is overwritten on each iteration, it shouldn\u0027t be an attribute of the Orchestrator instance","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":343,"context_line":"                        tenant[\u0027period\u0027],"},{"line_number":344,"context_line":"                    )"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"                    self.storage \u003d self._get_storage("},{"line_number":347,"context_line":"                        tenant[\u0027storage\u0027],"},{"line_number":348,"context_line":"                        tenant[\u0027period\u0027],"},{"line_number":349,"context_line":"                        self.collector,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_cf389bef","line":346,"range":{"start_line":346,"start_character":20,"end_line":346,"end_character":32},"updated":"2018-01-30 16:56:13.000000000","message":"Same remark as above","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            LOG.warning(\u0027Error when trying to use yaml metrology conf.\u0027)"},{"line_number":263,"context_line":"            LOG.warning(\u0027Fallback on the deprecated oslo config method.\u0027)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def _get_collector(self, collector, period, conf):"},{"line_number":266,"context_line":"        collector_args \u003d {"},{"line_number":267,"context_line":"            \u0027period\u0027: period,"},{"line_number":268,"context_line":"            \u0027transformers\u0027: transformer.get_transformers(),"},{"line_number":269,"context_line":"            \u0027conf\u0027: conf,"},{"line_number":270,"context_line":"        }"},{"line_number":271,"context_line":"        return driver.DriverManager("},{"line_number":272,"context_line":"            COLLECTORS_NAMESPACE,"},{"line_number":273,"context_line":"            collector,"},{"line_number":274,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":275,"context_line":"            invoke_kwds\u003dcollector_args).driver"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def _get_storage(self, storage, period, collector, conf):"},{"line_number":278,"context_line":"        storage_args \u003d {"},{"line_number":279,"context_line":"            \u0027period\u0027: period,"},{"line_number":280,"context_line":"            \u0027collector\u0027: collector,"},{"line_number":281,"context_line":"        }"},{"line_number":282,"context_line":"        if conf:"},{"line_number":283,"context_line":"            storage_args.update({\u0027conf\u0027: conf})"},{"line_number":284,"context_line":"        return driver.DriverManager("},{"line_number":285,"context_line":"            STORAGES_NAMESPACE,"},{"line_number":286,"context_line":"            storage,"},{"line_number":287,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":288,"context_line":"            invoke_kwds\u003dstorage_args).driver"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def _lock(self, tenant_id):"},{"line_number":291,"context_line":"        lock_name \u003d b\"cloudkitty-\" + str(tenant_id).encode(\u0027ascii\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_11528f14","line":288,"range":{"start_line":265,"start_character":3,"end_line":288,"end_character":44},"updated":"2018-02-06 09:31:09.000000000","message":"Why do you reimplement these methods ?","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"80306eee1eacafd1bbc649e7821315b506bc584d","unresolved":false,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def _load_tenant_list(self):"},{"line_number":295,"context_line":"        self._tenants \u003d self.fetcher.get_tenants()"},{"line_number":296,"context_line":"        random.shuffle(self._tenants)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def _init_messaging(self):"},{"line_number":299,"context_line":"        target \u003d oslo_messaging.Target(topic\u003d\u0027cloudkitty\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_12412e0c","line":296,"range":{"start_line":296,"start_character":8,"end_line":296,"end_character":37},"updated":"2018-02-06 11:22:28.000000000","message":"What is this for ?","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"80306eee1eacafd1bbc649e7821315b506bc584d","unresolved":false,"context_lines":[{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def process(self):"},{"line_number":322,"context_line":"        while True:"},{"line_number":323,"context_line":"            random.shuffle(self.fetchers)"},{"line_number":324,"context_line":"            for fetcher in self.fetchers:"},{"line_number":325,"context_line":"                self.tenants \u003d fetcher.get_tenants(METRICS_CONF)"},{"line_number":326,"context_line":"                random.shuffle(self.tenants)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_f247e21c","line":323,"range":{"start_line":323,"start_character":12,"end_line":323,"end_character":41},"updated":"2018-02-06 11:22:28.000000000","message":"ditto","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"80306eee1eacafd1bbc649e7821315b506bc584d","unresolved":false,"context_lines":[{"line_number":323,"context_line":"            random.shuffle(self.fetchers)"},{"line_number":324,"context_line":"            for fetcher in self.fetchers:"},{"line_number":325,"context_line":"                self.tenants \u003d fetcher.get_tenants(METRICS_CONF)"},{"line_number":326,"context_line":"                random.shuffle(self.tenants)"},{"line_number":327,"context_line":"                LOG.info(\u0027Tenants loaded for fetcher %s\u0027, fetcher.name)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"                # RPC"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_b2515adb","line":326,"range":{"start_line":326,"start_character":16,"end_line":326,"end_character":44},"updated":"2018-02-06 11:22:28.000000000","message":"ditto","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"80306eee1eacafd1bbc649e7821315b506bc584d","unresolved":false,"context_lines":[{"line_number":372,"context_line":"                        lock.release()"},{"line_number":373,"context_line":"                    self.coord.heartbeat()"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"            # NOTE(sheeprine): Slow down looping if all tenants are"},{"line_number":376,"context_line":"            # being processed"},{"line_number":377,"context_line":"            eventlet.sleep(1)"},{"line_number":378,"context_line":"        # FIXME(sheeprine): We may cause a drift here"},{"line_number":379,"context_line":"        eventlet.sleep(self._period)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def terminate(self):"},{"line_number":382,"context_line":"        self.coord.stop()"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_520576c1","line":379,"range":{"start_line":375,"start_character":0,"end_line":379,"end_character":36},"updated":"2018-02-06 11:22:28.000000000","message":"Indent this","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23173,"name":"Maxime Cottret","email":"maxime.cottret@gmail.com","username":"aolwas"},"change_message_id":"9f362c798bd97feac0b4697f31aad2a63ca8cf55","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            random.shuffle(self.tenants)"},{"line_number":275,"context_line":"            LOG.info(\u0027Tenants loaded for fetcher %s\u0027, self.fetcher.name)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"            # RPC"},{"line_number":278,"context_line":"            self.server \u003d None"},{"line_number":279,"context_line":"            self._rating_endpoint \u003d RatingEndpoint(self)"},{"line_number":280,"context_line":"            self._init_messaging()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"            # DLM"},{"line_number":283,"context_line":"            self.coord \u003d coordination.get_coordinator("},{"line_number":284,"context_line":"                CONF.orchestrator.coordination_url,"},{"line_number":285,"context_line":"                uuidutils.generate_uuid().encode(\u0027ascii\u0027))"},{"line_number":286,"context_line":"            self.coord.start()"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            for tenant in self.tenants:"},{"line_number":289,"context_line":"                period \u003d tenant[\u0027period\u0027]"}],"source_content_type":"text/x-python","patch_set":29,"id":"df7087c5_9d526cdd","line":286,"range":{"start_line":277,"start_character":0,"end_line":286,"end_character":30},"updated":"2018-03-16 16:43:50.000000000","message":"this is the initialisation of global services for the processor ... it should be done at processor startup only","commit_id":"fca1e1d50d0ddde256ce2fb2075436249a179bdb"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"0c87df32df9400244c33834fa27370b7c7b236cf","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            random.shuffle(self.tenants)"},{"line_number":275,"context_line":"            LOG.info(\u0027Tenants loaded for fetcher %s\u0027, self.fetcher.name)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"            # RPC"},{"line_number":278,"context_line":"            self.server \u003d None"},{"line_number":279,"context_line":"            self._rating_endpoint \u003d RatingEndpoint(self)"},{"line_number":280,"context_line":"            self._init_messaging()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"            # DLM"},{"line_number":283,"context_line":"            self.coord \u003d coordination.get_coordinator("},{"line_number":284,"context_line":"                CONF.orchestrator.coordination_url,"},{"line_number":285,"context_line":"                uuidutils.generate_uuid().encode(\u0027ascii\u0027))"},{"line_number":286,"context_line":"            self.coord.start()"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            for tenant in self.tenants:"},{"line_number":289,"context_line":"                period \u003d tenant[\u0027period\u0027]"}],"source_content_type":"text/x-python","patch_set":29,"id":"df7087c5_20d4f0bc","line":286,"range":{"start_line":277,"start_character":0,"end_line":286,"end_character":30},"in_reply_to":"df7087c5_9d526cdd","updated":"2018-03-21 13:56:45.000000000","message":"Fixed","commit_id":"fca1e1d50d0ddde256ce2fb2075436249a179bdb"},{"author":{"_account_id":23173,"name":"Maxime Cottret","email":"maxime.cottret@gmail.com","username":"aolwas"},"change_message_id":"9f362c798bd97feac0b4697f31aad2a63ca8cf55","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            self.coord.start()"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            for tenant in self.tenants:"},{"line_number":289,"context_line":"                period \u003d tenant[\u0027period\u0027]"},{"line_number":290,"context_line":"                worker_collector \u003d collector.get_collector("},{"line_number":291,"context_line":"                    collector\u003dtenant[\u0027collector\u0027],"},{"line_number":292,"context_line":"                    period\u003dtenant[\u0027period\u0027],"},{"line_number":293,"context_line":"                    conf\u003dtenant,"},{"line_number":294,"context_line":"                )"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"                lock \u003d self._lock(tenant[\u0027tenant_id\u0027])"},{"line_number":297,"context_line":"                if lock.acquire(blocking\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":29,"id":"df7087c5_7a9afe13","line":294,"range":{"start_line":289,"start_character":16,"end_line":294,"end_character":17},"updated":"2018-03-16 16:43:50.000000000","message":"Since we decide to have only one collector per processor, I think we should keep the global loading of the configuration","commit_id":"fca1e1d50d0ddde256ce2fb2075436249a179bdb"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"0c87df32df9400244c33834fa27370b7c7b236cf","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            self.coord.start()"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            for tenant in self.tenants:"},{"line_number":289,"context_line":"                period \u003d tenant[\u0027period\u0027]"},{"line_number":290,"context_line":"                worker_collector \u003d collector.get_collector("},{"line_number":291,"context_line":"                    collector\u003dtenant[\u0027collector\u0027],"},{"line_number":292,"context_line":"                    period\u003dtenant[\u0027period\u0027],"},{"line_number":293,"context_line":"                    conf\u003dtenant,"},{"line_number":294,"context_line":"                )"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"                lock \u003d self._lock(tenant[\u0027tenant_id\u0027])"},{"line_number":297,"context_line":"                if lock.acquire(blocking\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":29,"id":"df7087c5_409564e3","line":294,"range":{"start_line":289,"start_character":16,"end_line":294,"end_character":17},"in_reply_to":"df7087c5_7a9afe13","updated":"2018-03-21 13:56:45.000000000","message":"I agree with you and I made the corresponding changes","commit_id":"fca1e1d50d0ddde256ce2fb2075436249a179bdb"},{"author":{"_account_id":23173,"name":"Maxime Cottret","email":"maxime.cottret@gmail.com","username":"aolwas"},"change_message_id":"9f362c798bd97feac0b4697f31aad2a63ca8cf55","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                    lock.release()"},{"line_number":315,"context_line":"                self.coord.heartbeat()"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"            # NOTE(sheeprine): Slow down looping if all tenants are"},{"line_number":318,"context_line":"            # being processed"},{"line_number":319,"context_line":"            eventlet.sleep(1)"},{"line_number":320,"context_line":"            # FIXME(sheeprine): We may cause a drift here"},{"line_number":321,"context_line":"            eventlet.sleep(period)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    def terminate(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"df7087c5_c72ed38a","line":320,"range":{"start_line":317,"start_character":1,"end_line":320,"end_character":1},"updated":"2018-03-16 16:43:50.000000000","message":"I think there is an indentation error here: it should be IN the for block","commit_id":"fca1e1d50d0ddde256ce2fb2075436249a179bdb"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"0c87df32df9400244c33834fa27370b7c7b236cf","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                    lock.release()"},{"line_number":315,"context_line":"                self.coord.heartbeat()"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"            # NOTE(sheeprine): Slow down looping if all tenants are"},{"line_number":318,"context_line":"            # being processed"},{"line_number":319,"context_line":"            eventlet.sleep(1)"},{"line_number":320,"context_line":"            # FIXME(sheeprine): We may cause a drift here"},{"line_number":321,"context_line":"            eventlet.sleep(period)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    def terminate(self):"}],"source_content_type":"text/x-python","patch_set":29,"id":"df7087c5_e08358a8","line":320,"range":{"start_line":317,"start_character":1,"end_line":320,"end_character":1},"in_reply_to":"df7087c5_c72ed38a","updated":"2018-03-21 13:56:45.000000000","message":"Fixed","commit_id":"fca1e1d50d0ddde256ce2fb2075436249a179bdb"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    def process(self):"},{"line_number":285,"context_line":"        while True:"},{"line_number":286,"context_line":"            self.tenants \u003d self.fetcher.get_tenants(METRICS_CONF)"},{"line_number":287,"context_line":"            random.shuffle(self.tenants)"},{"line_number":288,"context_line":"            LOG.info(\u0027Tenants loaded for fetcher %s\u0027, self.fetcher.name)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"            for tenant in self.tenants:"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_9748a0cc","line":287,"range":{"start_line":287,"start_character":12,"end_line":287,"end_character":40},"updated":"2018-03-21 16:48:40.000000000","message":"What is this for ?","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                        tenant[\u0027tenant_id\u0027],"},{"line_number":295,"context_line":"                        tenant[\u0027period\u0027],"},{"line_number":296,"context_line":"                        tenant[\u0027wait_periods\u0027],"},{"line_number":297,"context_line":"                        self.storage,"},{"line_number":298,"context_line":"                    )"},{"line_number":299,"context_line":"                    if not state:"},{"line_number":300,"context_line":"                        self.tenants.remove(tenant)"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_7765cc44","line":297,"range":{"start_line":297,"start_character":24,"end_line":297,"end_character":37},"updated":"2018-03-21 16:48:40.000000000","message":"We should not pass instance attributes to member functions","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                    except Exception as e:"},{"line_number":202,"context_line":"                        LOG.warning("},{"line_number":203,"context_line":"                            \u0027Error while collecting service/metric \u0027"},{"line_number":204,"context_line":"                            \u0027%(service/metric)s: %(error)s\u0027,"},{"line_number":205,"context_line":"                            {\u0027service/metric\u0027: metric, \u0027error\u0027: e})"},{"line_number":206,"context_line":"                        raise collector.NoDataCollected(\u0027\u0027, metric)"},{"line_number":207,"context_line":"                except collector.NoDataCollected:"}],"source_content_type":"text/x-python","patch_set":35,"id":"bf659307_c8092d2b","line":204,"range":{"start_line":204,"start_character":31,"end_line":204,"end_character":38},"updated":"2018-04-16 11:35:05.000000000","message":"Should we leave this ? maybe \"metric\" only ?","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"}],"cloudkitty/storage/__init__.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"633d39481c49f7e41b6dd64fd772d88733e0203a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d cfg.CONF"},{"line_number":37,"context_line":"CONF.register_opts(storage_opts, group\u003d\u0027storage\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"METRICS_CONF \u003d ck_utils.get_metrics_conf(CONF.collect.metrics_conf)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f93b717_84fd9ab2","side":"PARENT","line":37,"range":{"start_line":37,"start_character":0,"end_line":37,"end_character":49},"updated":"2018-01-30 15:59:44.000000000","message":"Why do you remove this ?","commit_id":"2db75a1f015757d530ff5a82df7753c7dcd505c6"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"27addc81f05bfdd88b4b5e808cd9a5923f014647","unresolved":false,"context_lines":[{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d cfg.CONF"},{"line_number":37,"context_line":"CONF.register_opts(storage_opts, group\u003d\u0027storage\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"METRICS_CONF \u003d ck_utils.get_metrics_conf(CONF.collect.metrics_conf)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_48251b08","side":"PARENT","line":37,"range":{"start_line":37,"start_character":0,"end_line":37,"end_character":49},"in_reply_to":"5f93b717_84fd9ab2","updated":"2018-02-15 11:05:54.000000000","message":"Moved in utils.py","commit_id":"2db75a1f015757d530ff5a82df7753c7dcd505c6"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def get_storage(collector\u003dNone):"},{"line_number":48,"context_line":"    storage_args \u003d {"},{"line_number":49,"context_line":"        \u0027period\u0027: OS_CONF[\u0027period\u0027],"},{"line_number":50,"context_line":"        \u0027collector\u0027: collector if collector else ck_collector.get_collector()}"},{"line_number":51,"context_line":"    backend \u003d driver.DriverManager("},{"line_number":52,"context_line":"        STORAGES_NAMESPACE,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_ea59c534","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":16},"updated":"2018-01-30 16:56:13.000000000","message":"You could pass this as a kwarg to avoid code duplication in orchestrator","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"storage_opts \u003d ["},{"line_number":31,"context_line":"    cfg.StrOpt(\u0027backend\u0027,"},{"line_number":32,"context_line":"               default\u003d\u0027sqlalchemy\u0027,"},{"line_number":33,"context_line":"               help\u003d\u0027Name of the storage backend driver.\u0027)"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d cfg.CONF"},{"line_number":37,"context_line":"CONF.register_opts(storage_opts, group\u003d\u0027storage\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"METRICS_CONF \u003d ck_utils.get_metrics_conf(CONF.collect.metrics_conf)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_f1836355","side":"PARENT","line":37,"range":{"start_line":30,"start_character":0,"end_line":37,"end_character":49},"updated":"2018-02-06 09:31:09.000000000","message":"Why is this deleted ?","commit_id":"3ae0e9b780b5aa3acd39a8b6c8c9e0b6dcb1735d"}],"cloudkitty/storage/hybrid/backends/gnocchi.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @staticmethod"},{"line_number":104,"context_line":"    def _get_service_metrics(service_name, conf):"},{"line_number":105,"context_line":"        metrics \u003d conf[\u0027services_metrics\u0027][service_name]"},{"line_number":106,"context_line":"        metric_list \u003d [\u0027price\u0027]"},{"line_number":107,"context_line":"        for metric in metrics:"},{"line_number":108,"context_line":"            metric_list.append(list(metric.keys())[0])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa0c359_1fdc0745","line":105,"range":{"start_line":105,"start_character":24,"end_line":105,"end_character":40},"updated":"2018-02-06 09:31:09.000000000","message":"This key doesn\u0027t exist anymore","commit_id":"a3ae6d8e14926822df4153d138551cba8f21ae6a"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                service_dict[\u0027metrics\u0027] \u003d list()"},{"line_number":133,"context_line":"            service_dict[\u0027name\u0027] \u003d RESOURCE_TYPE_NAME_ROOT + service"},{"line_number":134,"context_line":"            service_dict[\u0027qty_metric\u0027] \u003d 1"},{"line_number":135,"context_line":"            if service not in [\u0027compute\u0027, \u0027network.floating\u0027]:"},{"line_number":136,"context_line":"                try:"},{"line_number":137,"context_line":"                    resource \u003d self.conf[\u0027metrics\u0027][service][\u0027resource\u0027]"},{"line_number":138,"context_line":"                    service_dict[\u0027qty_metric\u0027] \u003d resource"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa0c359_7fd74b25","line":135,"range":{"start_line":135,"start_character":12,"end_line":135,"end_character":61},"updated":"2018-02-06 09:31:09.000000000","message":"We must not have special cases in storage backends.","commit_id":"a3ae6d8e14926822df4153d138551cba8f21ae6a"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @staticmethod"},{"line_number":104,"context_line":"    def _get_service_metrics(service_name, conf):"},{"line_number":105,"context_line":"        metrics \u003d conf[\u0027services_metrics\u0027][service_name]"},{"line_number":106,"context_line":"        metric_list \u003d [\u0027price\u0027]"},{"line_number":107,"context_line":"        for metric in metrics:"},{"line_number":108,"context_line":"            metric_list.append(list(metric.keys())[0])"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_fbdca419","line":105,"range":{"start_line":105,"start_character":24,"end_line":105,"end_character":40},"updated":"2018-02-06 09:31:09.000000000","message":"This key doesn\u0027t exist anymore","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            try:"},{"line_number":125,"context_line":"                service_dict[\u0027metrics\u0027] \u003d self._get_service_metrics("},{"line_number":126,"context_line":"                    service,"},{"line_number":127,"context_line":"                    self.conf,"},{"line_number":128,"context_line":"                )"},{"line_number":129,"context_line":"            except KeyError:"},{"line_number":130,"context_line":"                LOG.warning("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_1b307056","line":127,"range":{"start_line":127,"start_character":20,"end_line":127,"end_character":29},"updated":"2018-02-06 09:31:09.000000000","message":"Do not pass class attributes to a member function","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8b0c28edc48c41990932ed8484c7e149f1ff04a3","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                service_dict[\u0027metrics\u0027] \u003d list()"},{"line_number":133,"context_line":"            service_dict[\u0027name\u0027] \u003d RESOURCE_TYPE_NAME_ROOT + service"},{"line_number":134,"context_line":"            service_dict[\u0027qty_metric\u0027] \u003d 1"},{"line_number":135,"context_line":"            if service not in [\u0027compute\u0027, \u0027network.floating\u0027]:"},{"line_number":136,"context_line":"                try:"},{"line_number":137,"context_line":"                    resource \u003d self.conf[\u0027metrics\u0027][service][\u0027resource\u0027]"},{"line_number":138,"context_line":"                    service_dict[\u0027qty_metric\u0027] \u003d resource"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_7bd094f8","line":135,"range":{"start_line":135,"start_character":12,"end_line":135,"end_character":62},"updated":"2018-02-06 09:31:09.000000000","message":"We must not have special cases in storage backends.","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"27addc81f05bfdd88b4b5e808cd9a5923f014647","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                service_dict[\u0027metrics\u0027] \u003d list()"},{"line_number":133,"context_line":"            service_dict[\u0027name\u0027] \u003d RESOURCE_TYPE_NAME_ROOT + service"},{"line_number":134,"context_line":"            service_dict[\u0027qty_metric\u0027] \u003d 1"},{"line_number":135,"context_line":"            if service not in [\u0027compute\u0027, \u0027network.floating\u0027]:"},{"line_number":136,"context_line":"                try:"},{"line_number":137,"context_line":"                    resource \u003d self.conf[\u0027metrics\u0027][service][\u0027resource\u0027]"},{"line_number":138,"context_line":"                    service_dict[\u0027qty_metric\u0027] \u003d resource"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa0c359_985578fd","line":135,"range":{"start_line":135,"start_character":12,"end_line":135,"end_character":62},"in_reply_to":"3fa0c359_7bd094f8","updated":"2018-02-15 11:05:54.000000000","message":"I was wondering how we can handle this. I made a parameter in configuration file for this.","commit_id":"c85680944d68121792c22a6663820905d15a951c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _init_resource_types(self):"},{"line_number":115,"context_line":"        transformer \u003d gtransformer.GnocchiTransformer()"},{"line_number":116,"context_line":"        services \u003d self.conf[\u0027services\u0027]"},{"line_number":117,"context_line":"        for service in services:"},{"line_number":118,"context_line":"            service_dict \u003d dict()"},{"line_number":119,"context_line":"            service_dict[\u0027attributes\u0027] \u003d list()"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_57d3e838","line":116,"range":{"start_line":116,"start_character":8,"end_line":116,"end_character":40},"updated":"2018-03-21 16:48:40.000000000","message":"\"services \u003d self.conf[\u0027metrics\u0027].keys()\" ? (See comments below)","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            service_dict[\u0027qty_metric\u0027] \u003d 1"},{"line_number":138,"context_line":"            try:"},{"line_number":139,"context_line":"                if self.conf[\u0027metrics\u0027][service].get(\u0027countable_unit\u0027):"},{"line_number":140,"context_line":"                    resource \u003d self.conf[\u0027metrics\u0027][service][\u0027resource\u0027]"},{"line_number":141,"context_line":"                    service_dict[\u0027qty_metric\u0027] \u003d resource"},{"line_number":142,"context_line":"            except KeyError:"},{"line_number":143,"context_line":"                LOG.warning(\u0027Error when trying to use yaml metrology conf\u0027)"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_cc552b52","line":140,"range":{"start_line":140,"start_character":20,"end_line":140,"end_character":72},"updated":"2018-03-21 16:48:40.000000000","message":"KeyError: compute","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                if self.conf[\u0027metrics\u0027][service].get(\u0027countable_unit\u0027):"},{"line_number":140,"context_line":"                    resource \u003d self.conf[\u0027metrics\u0027][service][\u0027resource\u0027]"},{"line_number":141,"context_line":"                    service_dict[\u0027qty_metric\u0027] \u003d resource"},{"line_number":142,"context_line":"            except KeyError:"},{"line_number":143,"context_line":"                LOG.warning(\u0027Error when trying to use yaml metrology conf\u0027)"},{"line_number":144,"context_line":"                LOG.warning(\u0027Fallback on the deprecated oslo conf method\u0027)"},{"line_number":145,"context_line":"                mapping \u003d {"},{"line_number":146,"context_line":"                    \u0027compute\u0027: 1,"},{"line_number":147,"context_line":"                    \u0027network.floating\u0027: 1,"},{"line_number":148,"context_line":"                    \u0027volume\u0027: \u0027volume.size\u0027,"},{"line_number":149,"context_line":"                    \u0027network.bw.in\u0027: \u0027network.incoming.bytes\u0027,"},{"line_number":150,"context_line":"                    \u0027network.bw.out\u0027: \u0027network.outgoing.bytes\u0027,"},{"line_number":151,"context_line":"                    \u0027image\u0027: \u0027image.size\u0027,"},{"line_number":152,"context_line":"                }"},{"line_number":153,"context_line":"                service_dict[\u0027qty_metric\u0027] \u003d mapping[service]"},{"line_number":154,"context_line":"            self._resource_type_data[service] \u003d service_dict"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_2c8627dd","line":152,"range":{"start_line":142,"start_character":12,"end_line":152,"end_character":17},"updated":"2018-03-21 16:48:40.000000000","message":"The hybrid storage came in the same release as the new configuration, so we don\u0027t need to be backward compatible. IMO, we should complexify the code, but rather force the usage of the new conf.","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        try:"},{"line_number":225,"context_line":"            resource_type \u003d self._resource_type_data[resource_type][\u0027name\u0027]"},{"line_number":226,"context_line":"        except KeyError:"},{"line_number":227,"context_line":"            raise UnknownResourceType("},{"line_number":228,"context_line":"                \"Unknown resource type \u0027{}\u0027\".format(resource_type))"},{"line_number":229,"context_line":"        query \u003d {"},{"line_number":230,"context_line":"            \u0027\u003d\u0027: {"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_9702e0b3","line":227,"range":{"start_line":227,"start_character":12,"end_line":227,"end_character":38},"updated":"2018-03-21 16:48:40.000000000","message":"... or an exception will be raised here. (2/2)","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            CONF.storage_gnocchi.archive_policy_name)"},{"line_number":274,"context_line":"        self._archive_policy_definition \u003d json.loads("},{"line_number":275,"context_line":"            CONF.storage_gnocchi.archive_policy_definition)"},{"line_number":276,"context_line":"        self._period \u003d self.conf[\u0027period\u0027]"},{"line_number":277,"context_line":"        if \"period\" in kwargs:"},{"line_number":278,"context_line":"            self._period \u003d kwargs[\"period\"]"},{"line_number":279,"context_line":"        self._measurements \u003d dict()"},{"line_number":280,"context_line":"        self._resource_type_data \u003d dict()"},{"line_number":281,"context_line":"        self._init_resource_types()"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_6c3adf98","line":278,"range":{"start_line":276,"start_character":7,"end_line":278,"end_character":43},"updated":"2018-03-21 16:48:40.000000000","message":"What is this used for ?","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"cc33e397ba1c8624462fc61cf796518d6a8fdc18","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            CONF.storage_gnocchi.archive_policy_name)"},{"line_number":274,"context_line":"        self._archive_policy_definition \u003d json.loads("},{"line_number":275,"context_line":"            CONF.storage_gnocchi.archive_policy_definition)"},{"line_number":276,"context_line":"        self._period \u003d self.conf[\u0027period\u0027]"},{"line_number":277,"context_line":"        if \"period\" in kwargs:"},{"line_number":278,"context_line":"            self._period \u003d kwargs[\"period\"]"},{"line_number":279,"context_line":"        self._measurements \u003d dict()"},{"line_number":280,"context_line":"        self._resource_type_data \u003d dict()"},{"line_number":281,"context_line":"        self._init_resource_types()"}],"source_content_type":"text/x-python","patch_set":30,"id":"bf659307_f867f150","line":278,"range":{"start_line":276,"start_character":7,"end_line":278,"end_character":43},"in_reply_to":"df7087c5_6c3adf98","updated":"2018-04-04 15:23:16.000000000","message":"It seems like this code allow a period override through parameters. I just ensured that the value from the yaml conf is correctly used here.","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e67f19cffd783317beba871ce4947b82084730d4","unresolved":false,"context_lines":[{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def append_time_frame(self, res_type, frame, tenant_id):"},{"line_number":356,"context_line":"        flat_frame \u003d ck_utils.flat_dict(frame)"},{"line_number":357,"context_line":"        resource \u003d self._find_resource(res_type, flat_frame[\u0027resource_id\u0027])"},{"line_number":358,"context_line":"        if not resource:"},{"line_number":359,"context_line":"            resource \u003d self._create_resource(res_type, tenant_id, flat_frame)"},{"line_number":360,"context_line":"        self._append_measurements(resource, flat_frame, tenant_id)"}],"source_content_type":"text/x-python","patch_set":30,"id":"df7087c5_570528c1","line":357,"range":{"start_line":357,"start_character":39,"end_line":357,"end_character":47},"updated":"2018-03-21 16:48:40.000000000","message":"Before this patch, res_type was the name of a service. Now, it is the name of a metric. This means that gnocchi rating_* resource types must now be created based on metric types and not service types... (1/2)","commit_id":"cd840b68b732a3619f856c6a57ee78e89c52a270"}],"cloudkitty/tests/test_keystone_fetcher.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                               \u0027cloudkitty.fetcher.keystone\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @unittest.SkipTest"},{"line_number":78,"context_line":"    def test_keystone_keystone_fetcher_filter_list(self):"},{"line_number":79,"context_line":"        kclient \u003d \u0027keystoneclient.client.Client\u0027"},{"line_number":80,"context_line":"        with mock.patch(kclient) as kclientmock:"},{"line_number":81,"context_line":"            kclientmock.return_value \u003d Client()"}],"source_content_type":"text/x-python","patch_set":35,"id":"bf659307_8a5d897a","line":78,"range":{"start_line":78,"start_character":13,"end_line":78,"end_character":31},"updated":"2018-04-16 11:35:05.000000000","message":"not sure about this name :)","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"}],"cloudkitty/utils.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        with open(conf_path) as conf:"},{"line_number":273,"context_line":"            res \u003d yaml.load(conf)"},{"line_number":274,"context_line":"            if not check_metrics_conf(res):"},{"line_number":275,"context_line":"                LOG.warning(\u0027Duplicated source name in metrics configuration.\u0027)"},{"line_number":276,"context_line":"    except Exception as exc:"},{"line_number":277,"context_line":"        LOG.warning(\u0027Error when trying to retrieve yaml metrology conf file.\u0027)"},{"line_number":278,"context_line":"        LOG.warning(exc)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f93b717_4f19eb1f","line":275,"range":{"start_line":275,"start_character":15,"end_line":275,"end_character":79},"updated":"2018-01-30 16:56:13.000000000","message":"I think this should be in check_metrics_conf function, in case we want to extend it.","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"27addc81f05bfdd88b4b5e808cd9a5923f014647","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        with open(conf_path) as conf:"},{"line_number":273,"context_line":"            res \u003d yaml.load(conf)"},{"line_number":274,"context_line":"            if not check_metrics_conf(res):"},{"line_number":275,"context_line":"                LOG.warning(\u0027Duplicated source name in metrics configuration.\u0027)"},{"line_number":276,"context_line":"    except Exception as exc:"},{"line_number":277,"context_line":"        LOG.warning(\u0027Error when trying to retrieve yaml metrology conf file.\u0027)"},{"line_number":278,"context_line":"        LOG.warning(exc)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa0c359_e87e67ad","line":275,"range":{"start_line":275,"start_character":15,"end_line":275,"end_character":79},"in_reply_to":"5f93b717_4f19eb1f","updated":"2018-02-15 11:05:54.000000000","message":"Good suggestion! It\u0027s done :)","commit_id":"433ed89a3a807f97db9d07d1232ee740d2851f90"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        return {}"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"def get_default_metrics_conf():"},{"line_number":297,"context_line":"    \"\"\"Return the default yaml metrology configuration.\"\"\""},{"line_number":298,"context_line":"    # NOTE(mc): This function is done in order to retrieve default"},{"line_number":299,"context_line":"    # metrology configuration without loading a test sample or getting"}],"source_content_type":"text/x-python","patch_set":35,"id":"bf659307_a9d8bbee","line":296,"range":{"start_line":296,"start_character":4,"end_line":296,"end_character":28},"updated":"2018-04-16 11:35:05.000000000","message":"Shouldn\u0027t this rather be a test sample ? (See datamodels/info.py)","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"}],"etc/cloudkitty/metrics.yml":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"633d39481c49f7e41b6dd64fd772d88733e0203a","unresolved":false,"context_lines":[{"line_number":2,"context_line":""},{"line_number":3,"context_line":"  fetcher: keystone"},{"line_number":4,"context_line":"  collector: gnocchi"},{"line_number":5,"context_line":"  storage: sqlalchemy"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"  period: 3600"},{"line_number":8,"context_line":"  wait_periods: 2"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5f93b717_c4496231","line":5,"range":{"start_line":5,"start_character":1,"end_line":5,"end_character":21},"updated":"2018-01-30 15:59:44.000000000","message":"I think we should keep this file for metrics only","commit_id":"812c7abcef2865ab84726610f5d74521035b242a"},{"author":{"_account_id":26767,"name":"Martin CAMEY","email":"martin.camey@objectif-libre.com","username":"MC"},"change_message_id":"27addc81f05bfdd88b4b5e808cd9a5923f014647","unresolved":false,"context_lines":[{"line_number":2,"context_line":""},{"line_number":3,"context_line":"  fetcher: keystone"},{"line_number":4,"context_line":"  collector: gnocchi"},{"line_number":5,"context_line":"  storage: sqlalchemy"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"  period: 3600"},{"line_number":8,"context_line":"  wait_periods: 2"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"3fa0c359_95122162","line":5,"range":{"start_line":5,"start_character":1,"end_line":5,"end_character":21},"in_reply_to":"5f93b717_c4496231","updated":"2018-02-15 11:05:54.000000000","message":"This field is needed as we allow operators to set a storage backend by metric source.","commit_id":"812c7abcef2865ab84726610f5d74521035b242a"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"633d39481c49f7e41b6dd64fd772d88733e0203a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"      unit: instance"},{"line_number":32,"context_line":"      factor: 1"},{"line_number":33,"context_line":"      aggregation_method: max"},{"line_number":34,"context_line":"      "},{"line_number":35,"context_line":"    memory:"},{"line_number":36,"context_line":"      collector: gnocchi"},{"line_number":37,"context_line":"      resource: instance"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5f93b717_246286af","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":6},"updated":"2018-01-30 15:59:44.000000000","message":"whitespace","commit_id":"812c7abcef2865ab84726610f5d74521035b242a"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":80,"context_line":"      unit: MiB"},{"line_number":81,"context_line":"      factor: 1/1048576"},{"line_number":82,"context_line":"      aggregation_method: max"},{"line_number":83,"context_line":"  "},{"line_number":84,"context_line":"    volume.size:"},{"line_number":85,"context_line":"      collector: gnocchi"},{"line_number":86,"context_line":"      resource: volume"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5f93b717_a478d6c3","line":83,"range":{"start_line":83,"start_character":0,"end_line":83,"end_character":2},"updated":"2018-01-30 16:56:13.000000000","message":"whitespace","commit_id":"812c7abcef2865ab84726610f5d74521035b242a"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":88,"context_line":"      factor: 1"},{"line_number":89,"context_line":"      aggregation_method: max"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    network.bw.out:"},{"line_number":92,"context_line":"      collector: gnocchi"},{"line_number":93,"context_line":"      resource: instance_network_interface"},{"line_number":94,"context_line":"      unit: MB"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5f93b717_cf1f3b59","line":91,"range":{"start_line":91,"start_character":4,"end_line":91,"end_character":18},"updated":"2018-01-30 16:56:13.000000000","message":"this should be called network.outgoing.bytes","commit_id":"812c7abcef2865ab84726610f5d74521035b242a"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"b8994e5d43027764e3c8d59690382573d9978895","unresolved":false,"context_lines":[{"line_number":95,"context_line":"      factor: 1/1000000"},{"line_number":96,"context_line":"      aggregation_method: max"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    network.bw.in:"},{"line_number":99,"context_line":"      collector: gnocchi"},{"line_number":100,"context_line":"      resource: instance_network_interface"},{"line_number":101,"context_line":"      unit: MB"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5f93b717_ef2477b1","line":98,"range":{"start_line":98,"start_character":4,"end_line":98,"end_character":18},"updated":"2018-01-30 16:56:13.000000000","message":"this should be called network.incoming.bytes","commit_id":"812c7abcef2865ab84726610f5d74521035b242a"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"0143a73b17c0636725926afd60e9164d52c930d2","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    volume.size:"},{"line_number":85,"context_line":"      collector: gnocchi"},{"line_number":86,"context_line":"      resource: volume"},{"line_number":87,"context_line":"      unit: GB"},{"line_number":88,"context_line":"      factor: 1"},{"line_number":89,"context_line":"      aggregation_method: max"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa0c359_5284965e","line":87,"range":{"start_line":87,"start_character":12,"end_line":87,"end_character":14},"updated":"2018-02-06 11:06:55.000000000","message":"GiB","commit_id":"c85680944d68121792c22a6663820905d15a951c"}],"releasenotes/notes/change-metrology-organization-1e11900eb30780cc.yaml":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Cloudkitty now based itself on metrics and no more on services for data"},{"line_number":5,"context_line":"    valorization. The metrics.yml file information has been reorganized"},{"line_number":6,"context_line":"    accordingly."}],"source_content_type":"text/x-yaml","patch_set":35,"id":"bf659307_899857c0","line":4,"range":{"start_line":4,"start_character":19,"end_line":4,"end_character":24},"updated":"2018-04-16 11:35:05.000000000","message":"bases","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"}],"releasenotes/notes/deprecate-info-services-endpoints-0c5018cb08a30d5f.yaml":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"deprecations:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The /v1/info/services and /v1/info/services/\u003cservice\u003e endpoints has"},{"line_number":5,"context_line":"    been deprecated. The /v1/info/metrics and /v1/info/metrics/\u003cmetric\u003e"},{"line_number":6,"context_line":"    endpoints should be used instead."}],"source_content_type":"text/x-yaml","patch_set":35,"id":"bf659307_829f944e","line":4,"range":{"start_line":4,"start_character":68,"end_line":4,"end_character":71},"updated":"2018-04-16 11:35:05.000000000","message":"have","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"}],"releasenotes/notes/source-fetcher-43c4352508f7f944.yaml":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"942b052267897865a5e3df72b0af501f1e93c80e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A Source Fetcher has been added, allowing to add new collectors to scap"},{"line_number":5,"context_line":"    metrics from non-OpenStack sources."}],"source_content_type":"text/x-yaml","patch_set":35,"id":"bf659307_c2b26ce5","line":4,"range":{"start_line":4,"start_character":71,"end_line":4,"end_character":75},"updated":"2018-04-16 11:35:05.000000000","message":"scrap","commit_id":"9cda8590fdb8b5f1f4b50a44a4571c4c1871b609"}]}
