)]}'
{"cinder/api/contrib/qos_specs_manage.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9180b3f9e8c4966ee32648765a7dbf253ab3e06d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                                    max_length\u003d255, remove_whitespaces\u003dTrue)"},{"line_number":91,"context_line":"        name \u003d name.strip()"},{"line_number":92,"context_line":"        # Remove name from \u0027specs\u0027 since passing it in as separate param"},{"line_number":93,"context_line":"        del specs[\u0027name\u0027]"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            spec \u003d qos_specs.create(context, name, specs)"},{"line_number":96,"context_line":"            rpc.get_notifier(\u0027QoSSpecs\u0027).info(context,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_86efbee8","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":25},"updated":"2016-07-01 15:11:49.000000000","message":"nit: Then on L84 you should do:\n\n name \u003d specs.pop(\u0027name\u0027, None)","commit_id":"ec0ebb01fe5be8658f9cebdec941236201a58073"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ff36625ebc646a4fd9b746928ca0e7fc63f8af2e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        del specs[\u0027name\u0027]"},{"line_number":93,"context_line":"        try:"},{"line_number":94,"context_line":"            spec \u003d qos_specs.create(context, name, specs)"},{"line_number":95,"context_line":"            rpc.get_notifier(\u0027QoSSpecs\u0027).info(context,"},{"line_number":96,"context_line":"                                              \u0027qos_specs.create\u0027,"},{"line_number":97,"context_line":"                                              spec)"},{"line_number":98,"context_line":"        except exception.InvalidQoSSpecs as err:"},{"line_number":99,"context_line":"            notifier_err \u003d dict(name\u003dname, error_message\u003derr)"},{"line_number":100,"context_line":"            self._notify_qos_specs_error(context,"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_73902f44","line":97,"range":{"start_line":95,"start_character":0,"end_line":97,"end_character":51},"updated":"2016-07-05 15:04:04.000000000","message":"I think we\u0027re changing the notification format here, which we really shouldn\u0027t as someone\u0027s automation may rely on that. I can see qos_specs.create result is a dict with id and name only, and before the change notifier_info included name and specs dict (including redundant name in specs dict).\n\nPlease make sure that we\u0027re not modifying notification format.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"6ad9f79b4cbd0e2b03464ea3a2b2a639b86f53a2","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        del specs[\u0027name\u0027]"},{"line_number":93,"context_line":"        try:"},{"line_number":94,"context_line":"            spec \u003d qos_specs.create(context, name, specs)"},{"line_number":95,"context_line":"            rpc.get_notifier(\u0027QoSSpecs\u0027).info(context,"},{"line_number":96,"context_line":"                                              \u0027qos_specs.create\u0027,"},{"line_number":97,"context_line":"                                              spec)"},{"line_number":98,"context_line":"        except exception.InvalidQoSSpecs as err:"},{"line_number":99,"context_line":"            notifier_err \u003d dict(name\u003dname, error_message\u003derr)"},{"line_number":100,"context_line":"            self._notify_qos_specs_error(context,"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_9c53e8e1","line":97,"range":{"start_line":95,"start_character":0,"end_line":97,"end_character":51},"in_reply_to":"1aa78d24_73902f44","updated":"2016-07-13 15:58:19.000000000","message":"After discussion with Ryan, we need to follow Michal\u0027s suggestion to add \u0027notifier_info\u0027 instead of \u0027spec\u0027\n\nRyan\u0027s comment:\n\nif Michal\u0027s suggesting something there I\u0027d definitely defer\nto his judgment","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"86931ac150e980d8c7d1168b72027631e01819f2","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        try:"},{"line_number":94,"context_line":"            spec \u003d qos_specs.create(context, name, specs)"},{"line_number":95,"context_line":"            notifier_info \u003d dict(name\u003dname, specs\u003dspecs)"},{"line_number":96,"context_line":"            rpc.get_notifier(\u0027QoSSpecs\u0027).info(context,"},{"line_number":97,"context_line":"                                              \u0027qos_specs.create\u0027,"},{"line_number":98,"context_line":"                                              notifier_info)"},{"line_number":99,"context_line":"        except exception.InvalidQoSSpecs as err:"},{"line_number":100,"context_line":"            notifier_err \u003d dict(name\u003dname, error_message\u003derr)"},{"line_number":101,"context_line":"            self._notify_qos_specs_error(context,"}],"source_content_type":"text/x-python","patch_set":27,"id":"1aa78d24_b670f8dd","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":60},"updated":"2016-07-14 16:27:22.000000000","message":"Thanks for switching this back - even if code looks a little bad we don\u0027t want to risk breaking someone\u0027s integration.","commit_id":"e9c217fb5dc38d074d8b62039021ebd409980daa"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"3e8904107dab8b540984fbc913b8d5b2bbee5c84","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        try:"},{"line_number":94,"context_line":"            spec \u003d qos_specs.create(context, name, specs)"},{"line_number":95,"context_line":"            notifier_info \u003d dict(name\u003dname, specs\u003dspecs)"},{"line_number":96,"context_line":"            rpc.get_notifier(\u0027QoSSpecs\u0027).info(context,"},{"line_number":97,"context_line":"                                              \u0027qos_specs.create\u0027,"},{"line_number":98,"context_line":"                                              notifier_info)"},{"line_number":99,"context_line":"        except exception.InvalidQoSSpecs as err:"},{"line_number":100,"context_line":"            notifier_err \u003d dict(name\u003dname, error_message\u003derr)"},{"line_number":101,"context_line":"            self._notify_qos_specs_error(context,"}],"source_content_type":"text/x-python","patch_set":27,"id":"1aa78d24_b95584fb","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":60},"in_reply_to":"1aa78d24_b670f8dd","updated":"2016-07-14 18:33:51.000000000","message":"Michal;\n\nThank you very much for code review, both Ryan and me think that we should follow the rule and could avoid the other people breaking the integration.","commit_id":"e9c217fb5dc38d074d8b62039021ebd409980daa"}],"cinder/api/views/qos_specs.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def summary(self, request, qos_spec):"},{"line_number":38,"context_line":"        \"\"\"Generic, non-detailed view of a qos_specs.\"\"\""},{"line_number":39,"context_line":"        return {"},{"line_number":40,"context_line":"            \u0027qos_specs\u0027: qos_spec,"},{"line_number":41,"context_line":"            \u0027links\u0027: self._get_links(request,"},{"line_number":42,"context_line":"                                     qos_spec[\u0027id\u0027]),"},{"line_number":43,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_9bfcf23f","line":40,"range":{"start_line":40,"start_character":25,"end_line":40,"end_character":33},"updated":"2015-12-23 11:20:53.000000000","message":"Doesn\u0027t this one need similar change as below?","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def summary(self, request, qos_spec):"},{"line_number":38,"context_line":"        \"\"\"Generic, non-detailed view of a qos_specs.\"\"\""},{"line_number":39,"context_line":"        return {"},{"line_number":40,"context_line":"            \u0027qos_specs\u0027: qos_spec,"},{"line_number":41,"context_line":"            \u0027links\u0027: self._get_links(request,"},{"line_number":42,"context_line":"                                     qos_spec[\u0027id\u0027]),"},{"line_number":43,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_428408d3","line":40,"range":{"start_line":40,"start_character":25,"end_line":40,"end_character":33},"in_reply_to":"1a7b0d38_9bfcf23f","updated":"2016-01-05 19:23:27.000000000","message":"Done","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"86931ac150e980d8c7d1168b72027631e01819f2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                \u0027id\u0027: qos_spec.id,"},{"line_number":42,"context_line":"                \u0027name\u0027: qos_spec.name,"},{"line_number":43,"context_line":"                \u0027consumer\u0027: qos_spec.consumer,"},{"line_number":44,"context_line":"                \u0027specs\u0027: qos_spec.specs"},{"line_number":45,"context_line":"            },"},{"line_number":46,"context_line":"            \u0027links\u0027: self._get_links(request,"},{"line_number":47,"context_line":"                                     qos_spec.id),"}],"source_content_type":"text/x-python","patch_set":27,"id":"1aa78d24_0a256009","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":39},"updated":"2016-07-14 16:27:22.000000000","message":"Missing comma.","commit_id":"e9c217fb5dc38d074d8b62039021ebd409980daa"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"3e8904107dab8b540984fbc913b8d5b2bbee5c84","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                \u0027id\u0027: qos_spec.id,"},{"line_number":42,"context_line":"                \u0027name\u0027: qos_spec.name,"},{"line_number":43,"context_line":"                \u0027consumer\u0027: qos_spec.consumer,"},{"line_number":44,"context_line":"                \u0027specs\u0027: qos_spec.specs"},{"line_number":45,"context_line":"            },"},{"line_number":46,"context_line":"            \u0027links\u0027: self._get_links(request,"},{"line_number":47,"context_line":"                                     qos_spec.id),"}],"source_content_type":"text/x-python","patch_set":27,"id":"1aa78d24_597c60eb","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":39},"in_reply_to":"1aa78d24_0a256009","updated":"2016-07-14 18:33:51.000000000","message":"Michal; I will fix the issue in a dependent patch.","commit_id":"e9c217fb5dc38d074d8b62039021ebd409980daa"}],"cinder/db/api.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"12647cdfe57ee9e588ca011edadd40567957a7bf","unresolved":false,"context_lines":[{"line_number":604,"context_line":""},{"line_number":605,"context_line":"def quality_of_service_specs_get(context, qos_specs_id):"},{"line_number":606,"context_line":"    \"\"\"Get all specification for a given qos_specs.\"\"\""},{"line_number":607,"context_line":"    return IMPL.quality_of_service_specs_get(context, qos_specs_id)"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":""},{"line_number":610,"context_line":"def qos_specs_get_all(context, filters\u003dNone, marker\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a9d85d2_68cb4354","line":607,"updated":"2016-06-21 02:59:46.000000000","message":"Why renaming this?  All other qos functions are still named as \"qos_specs_xxxx\".","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":604,"context_line":""},{"line_number":605,"context_line":"def quality_of_service_specs_get(context, qos_specs_id):"},{"line_number":606,"context_line":"    \"\"\"Get all specification for a given qos_specs.\"\"\""},{"line_number":607,"context_line":"    return IMPL.quality_of_service_specs_get(context, qos_specs_id)"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":""},{"line_number":610,"context_line":"def qos_specs_get_all(context, filters\u003dNone, marker\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_45d72923","line":607,"in_reply_to":"5a9d85d2_68cb4354","updated":"2016-06-23 09:07:56.000000000","message":"I guess it\u0027s because of [1]. Can we use [2] to add an exception instead?\n\n[1] https://review.openstack.org/#/c/218012/\n[2] https://github.com/openstack/cinder/blob/5447efe7b5b679c60c7e3e839201bc50249ec240/cinder/db/sqlalchemy/api.py#L4742-L4748","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":3319,"context_line":"    extend qos specs association to other entities, such as volumes,"},{"line_number":3320,"context_line":"    sometime in future."},{"line_number":3321,"context_line":"    \"\"\""},{"line_number":3322,"context_line":"    # Raise QoSSpecsNotFound if no specs found"},{"line_number":3323,"context_line":"    _qos_specs_get_ref(context, qos_specs_id, None)"},{"line_number":3324,"context_line":"    return volume_type_qos_associations_get(context, qos_specs_id)"},{"line_number":3325,"context_line":""},{"line_number":3326,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_05f9a14d","side":"PARENT","line":3323,"range":{"start_line":3322,"start_character":0,"end_line":3323,"end_character":51},"updated":"2016-06-23 09:07:56.000000000","message":"Hm, looks like you\u0027ve added it to volume_type_qos_associations_get and removed from here?","commit_id":"c6c1d34100187648c4dcd5548354b5dcd03e2550"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"12647cdfe57ee9e588ca011edadd40567957a7bf","unresolved":false,"context_lines":[{"line_number":2856,"context_line":"def volume_type_qos_associations_get(context, qos_specs_id, inactive\u003dFalse):"},{"line_number":2857,"context_line":"    read_deleted \u003d \"yes\" if inactive else \"no\""},{"line_number":2858,"context_line":"    # Raise QoSSpecsNotFound if no specs found"},{"line_number":2859,"context_line":"    _qos_specs_get_ref(context, qos_specs_id, None)"},{"line_number":2860,"context_line":"    return model_query(context, models.VolumeTypes,"},{"line_number":2861,"context_line":"                       read_deleted\u003dread_deleted). \\"},{"line_number":2862,"context_line":"        filter_by(qos_specs_id\u003dqos_specs_id).all()"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a9d85d2_c815179c","line":2859,"updated":"2016-06-21 02:59:46.000000000","message":"What\u0027s reason for adding this call?  Just to check if QoS spec exists?","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"12647cdfe57ee9e588ca011edadd40567957a7bf","unresolved":false,"context_lines":[{"line_number":3118,"context_line":"    :param values dictionary that contains specifications for QoS"},{"line_number":3119,"context_line":"          e.g. {\u0027name\u0027: \u0027Name\u0027,"},{"line_number":3120,"context_line":"                \u0027consumer\u0027: \u0027front-end\u0027,"},{"line_number":3121,"context_line":"                \u0027qos_specs\u0027: {"},{"line_number":3122,"context_line":"                    \u0027total_iops_sec\u0027: 1000,"},{"line_number":3123,"context_line":"                    \u0027total_bytes_sec\u0027: 1024000"},{"line_number":3124,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a9d85d2_0be1d9fe","line":3121,"updated":"2016-06-21 02:59:46.000000000","message":"\u0027qos_specs\u0027 is changed to \u0027specs\u0027 on line 3158.","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"12647cdfe57ee9e588ca011edadd40567957a7bf","unresolved":false,"context_lines":[{"line_number":3149,"context_line":"            consumer \u003d {\u0027key\u0027: \u0027consumer\u0027,"},{"line_number":3150,"context_line":"                        \u0027value\u0027: values[\u0027consumer\u0027],"},{"line_number":3151,"context_line":"                        \u0027specs_id\u0027: specs_id,"},{"line_number":3152,"context_line":"                        \u0027id\u0027: str(uuid.uuid4())}"},{"line_number":3153,"context_line":"            cons_entry \u003d models.QualityOfServiceSpecs()"},{"line_number":3154,"context_line":"            cons_entry.update(consumer)"},{"line_number":3155,"context_line":"            cons_entry.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a9d85d2_cb2fd13c","line":3152,"updated":"2016-06-21 02:59:46.000000000","message":"str -\u003e six.text_type","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"12647cdfe57ee9e588ca011edadd40567957a7bf","unresolved":false,"context_lines":[{"line_number":3233,"context_line":""},{"line_number":3234,"context_line":""},{"line_number":3235,"context_line":"@require_admin_context"},{"line_number":3236,"context_line":"def quality_of_service_specs_get(context, qos_specs_id, inactive\u003dFalse):"},{"line_number":3237,"context_line":"    rows \u003d _qos_specs_get_ref(context, qos_specs_id, None, inactive)"},{"line_number":3238,"context_line":"    return _dict_with_qos_specs(rows)[0]"},{"line_number":3239,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a9d85d2_4bcac16f","line":3236,"updated":"2016-06-21 02:59:46.000000000","message":"Why renaming here?  Seems inconsistent.","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":3233,"context_line":""},{"line_number":3234,"context_line":""},{"line_number":3235,"context_line":"@require_admin_context"},{"line_number":3236,"context_line":"def quality_of_service_specs_get(context, qos_specs_id, inactive\u003dFalse):"},{"line_number":3237,"context_line":"    rows \u003d _qos_specs_get_ref(context, qos_specs_id, None, inactive)"},{"line_number":3238,"context_line":"    return _dict_with_qos_specs(rows)[0]"},{"line_number":3239,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_051d21bd","line":3236,"in_reply_to":"5a9d85d2_4bcac16f","updated":"2016-06-23 09:07:56.000000000","message":"I agree, no need to introduce inconsistency, I\u0027ve explained on db.api module how to workaround that.","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9180b3f9e8c4966ee32648765a7dbf253ab3e06d","unresolved":false,"context_lines":[{"line_number":2858,"context_line":"def volume_type_qos_associations_get(context, qos_specs_id, inactive\u003dFalse):"},{"line_number":2859,"context_line":"    read_deleted \u003d \"yes\" if inactive else \"no\""},{"line_number":2860,"context_line":"    # Raise QoSSpecsNotFound if no specs found"},{"line_number":2861,"context_line":"    _qos_specs_get_ref(context, qos_specs_id, None)"},{"line_number":2862,"context_line":"    return model_query(context, models.VolumeTypes,"},{"line_number":2863,"context_line":"                       read_deleted\u003dread_deleted). \\"},{"line_number":2864,"context_line":"        filter_by(qos_specs_id\u003dqos_specs_id).all()"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_66ed72b7","line":2861,"range":{"start_line":2861,"start_character":4,"end_line":2861,"end_character":51},"updated":"2016-07-01 15:11:49.000000000","message":"-1: Use `resource_exists` method instead of getting the data since you don\u0027t want the QoS data.","commit_id":"ec0ebb01fe5be8658f9cebdec941236201a58073"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9180b3f9e8c4966ee32648765a7dbf253ab3e06d","unresolved":false,"context_lines":[{"line_number":3146,"context_line":"            specs_root.update(root)"},{"line_number":3147,"context_line":"            specs_root.save(session\u003dsession)"},{"line_number":3148,"context_line":""},{"line_number":3149,"context_line":"            # Save \u0027consumer\u0027 value directly as it will not be in"},{"line_number":3150,"context_line":"            # values[\u0027specs\u0027] and so we avoid modifying/copying passed in dict"},{"line_number":3151,"context_line":"            consumer \u003d {\u0027key\u0027: \u0027consumer\u0027,"},{"line_number":3152,"context_line":"                        \u0027value\u0027: values[\u0027consumer\u0027],"},{"line_number":3153,"context_line":"                        \u0027specs_id\u0027: specs_id,"},{"line_number":3154,"context_line":"                        \u0027id\u0027: six.text_type(uuid.uuid4())}"},{"line_number":3155,"context_line":"            cons_entry \u003d models.QualityOfServiceSpecs()"},{"line_number":3156,"context_line":"            cons_entry.update(consumer)"},{"line_number":3157,"context_line":"            cons_entry.save(session\u003dsession)"},{"line_number":3158,"context_line":""},{"line_number":3159,"context_line":"            # Insert all specification entries for QoS specs"},{"line_number":3160,"context_line":"            for k, v in values.get(\u0027specs\u0027, {}).items():"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_e614c24e","line":3157,"range":{"start_line":3149,"start_character":0,"end_line":3157,"end_character":44},"updated":"2016-07-01 15:11:49.000000000","message":"-1: Why are we changing the location of consumer?  As far as I see it\u0027s just adding more code.","commit_id":"ec0ebb01fe5be8658f9cebdec941236201a58073"}],"cinder/objects/__init__.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    __import__(\u0027cinder.objects.volume\u0027)"},{"line_number":33,"context_line":"    __import__(\u0027cinder.objects.volume_attachment\u0027)"},{"line_number":34,"context_line":"    __import__(\u0027cinder.objects.volume_type\u0027)"},{"line_number":35,"context_line":"    __import__(\u0027cinder.objects.qos_specs\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_8580f147","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":42},"updated":"2016-06-23 09:07:56.000000000","message":"Not really important, but if we\u0027re already keeping that in alphabetical order…","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"}],"cinder/objects/fields.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ff36625ebc646a4fd9b746928ca0e7fc63f8af2e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    AUTO_TYPE \u003d SnapshotStatus()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"class ValidConsumerValues(Enum):"},{"line_number":110,"context_line":"    BACK_END \u003d \u0027back-end\u0027"},{"line_number":111,"context_line":"    FRONT_END \u003d \u0027front-end\u0027"},{"line_number":112,"context_line":"    BOTH \u003d \u0027both\u0027"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_10ee01ec","line":109,"range":{"start_line":109,"start_character":6,"end_line":109,"end_character":25},"updated":"2016-07-05 15:04:04.000000000","message":"QoSConsumer or QoSConsumerValues is a better name IMO.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"6ad9f79b4cbd0e2b03464ea3a2b2a639b86f53a2","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    AUTO_TYPE \u003d SnapshotStatus()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"class ValidConsumerValues(Enum):"},{"line_number":110,"context_line":"    BACK_END \u003d \u0027back-end\u0027"},{"line_number":111,"context_line":"    FRONT_END \u003d \u0027front-end\u0027"},{"line_number":112,"context_line":"    BOTH \u003d \u0027both\u0027"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_a20fd52c","line":109,"range":{"start_line":109,"start_character":6,"end_line":109,"end_character":25},"in_reply_to":"1aa78d24_10ee01ec","updated":"2016-07-13 15:58:19.000000000","message":"Yes, the class name ValidConsumerValues has been changed to QoSConsumerValues which is more meaningful.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ff36625ebc646a4fd9b746928ca0e7fc63f8af2e","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            valid_values\u003dValidConsumerValues.ALL)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"class ValidConsumerField(BaseEnumField):"},{"line_number":122,"context_line":"    AUTO_TYPE \u003d ValidConsumerValues()"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_f0cff57c","line":121,"range":{"start_line":121,"start_character":6,"end_line":121,"end_character":24},"updated":"2016-07-05 15:04:04.000000000","message":"QoSConsumerField sounds better here.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"6ad9f79b4cbd0e2b03464ea3a2b2a639b86f53a2","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            valid_values\u003dValidConsumerValues.ALL)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"class ValidConsumerField(BaseEnumField):"},{"line_number":122,"context_line":"    AUTO_TYPE \u003d ValidConsumerValues()"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_8258d933","line":121,"range":{"start_line":121,"start_character":6,"end_line":121,"end_character":24},"in_reply_to":"1aa78d24_f0cff57c","updated":"2016-07-13 15:58:19.000000000","message":"Yes, ValidConsumerField has been changed to QoSConsumerField which is more meaningful.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"}],"cinder/objects/qos_specs.py":[{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"0f544ff9d653f4516332ea6a6037f17ce76653b1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":32,"context_line":"class QualityOfServiceSpecs(base.CinderObject,"},{"line_number":33,"context_line":"                            base.CinderPersistentObject,"},{"line_number":34,"context_line":"                            base.CinderObjectDictCompat,"},{"line_number":35,"context_line":"                            base.CinderComparableObject):"},{"line_number":36,"context_line":"    # Version"},{"line_number":37,"context_line":"    #   1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_88f98f82","line":34,"range":{"start_line":34,"start_character":28,"end_line":34,"end_character":55},"updated":"2015-12-11 21:09:00.000000000","message":"I guess I\u0027ve never seen PersistentObject and ComparableObject before, but try to stay away from using the ObjectDictCompat mixin. This mixin only exists to make the dict syntax on newer objects not blow up. It\u0027s not the end of the world if you leave this in, but if this work goes in the same direction as nova, you\u0027ll eventually start building up tech debt to try to clear it all out (https://github.com/openstack/nova/blob/master/nova/objects/bandwidth_usage.py#L18)","commit_id":"065854875dd20b6882159f39949aae2d7c1702df"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"3152ed785fb8d97bce49ccd3d3264c5cb6d91cb1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":32,"context_line":"class QualityOfServiceSpecs(base.CinderObject,"},{"line_number":33,"context_line":"                            base.CinderPersistentObject,"},{"line_number":34,"context_line":"                            base.CinderObjectDictCompat,"},{"line_number":35,"context_line":"                            base.CinderComparableObject):"},{"line_number":36,"context_line":"    # Version"},{"line_number":37,"context_line":"    #   1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_ebaccda0","line":34,"in_reply_to":"7a740942_88f98f82","updated":"2015-12-11 21:32:29.000000000","message":"Yea, definitely - I\u0027m going to have a follow up patch that makes the conversion to use the newer object style notation everywhere, but wanted to keep this changeset smaller.","commit_id":"065854875dd20b6882159f39949aae2d7c1702df"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"0f544ff9d653f4516332ea6a6037f17ce76653b1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    #   1.0: Initial version"},{"line_number":38,"context_line":"    VERSION \u003d \"1.0\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    VALID_CONSUMER_VALUES \u003d [\u0027front-end\u0027, \u0027back-end\u0027, \u0027both\u0027]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    fields \u003d {"},{"line_number":43,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_08a27fae","line":40,"updated":"2015-12-11 21:09:00.000000000","message":"o.vo has some good infrastructure already in place for asserting valid values. I wipped up a quick patch (https://review.openstack.org/#/c/256737/) that lays down some of the infrastructure to get this into cinder, along with a quick (and partially implemented) way to make these fields.\n\nBy migrating this into fields, we can use them elsewhere in the code, so you can do things like\n\n    spec.consumer \u003d\u003d fields.Consumer.FRONT_END\n\ninstead of\n\n    spec.consumer \u003d\u003d \u0027front-end\u0027\n\nso that way the number of hard-coded strings around is cut down.","commit_id":"065854875dd20b6882159f39949aae2d7c1702df"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"3152ed785fb8d97bce49ccd3d3264c5cb6d91cb1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    #   1.0: Initial version"},{"line_number":38,"context_line":"    VERSION \u003d \"1.0\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    VALID_CONSUMER_VALUES \u003d [\u0027front-end\u0027, \u0027back-end\u0027, \u0027both\u0027]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    fields \u003d {"},{"line_number":43,"context_line":"        \u0027id\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_0b891926","line":40,"in_reply_to":"7a740942_08a27fae","updated":"2015-12-11 21:32:29.000000000","message":"Interesting, thanks for the tip, will look to leverage that.","commit_id":"065854875dd20b6882159f39949aae2d7c1702df"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":32,"context_line":"class QualityOfServiceSpecs(base.CinderObject,"},{"line_number":33,"context_line":"                            base.CinderObjectDictCompat,"},{"line_number":34,"context_line":"                            base.CinderComparableObject):"},{"line_number":35,"context_line":"    # Version"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_9b771202","line":32,"updated":"2015-12-23 11:20:53.000000000","message":"Don\u0027t you need a test module for this class in cinder.tests.unit.objects?","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":32,"context_line":"class QualityOfServiceSpecs(base.CinderObject,"},{"line_number":33,"context_line":"                            base.CinderObjectDictCompat,"},{"line_number":34,"context_line":"                            base.CinderComparableObject):"},{"line_number":35,"context_line":"    # Version"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_e2a65c52","line":32,"in_reply_to":"1a7b0d38_9b771202","updated":"2016-01-05 19:23:27.000000000","message":"Good catch, will add these.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":43,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":45,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":46,"context_line":"        \u0027specs\u0027: fields.DictOfStringsField(),"},{"line_number":47,"context_line":"        \u0027volume_types\u0027: fields.ListOfObjectsField(\u0027VolumeType\u0027, nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_24004434","line":45,"updated":"2015-12-23 11:20:53.000000000","message":"Seems like consumer can be NULL too… Am I wrong?","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":43,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":45,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":46,"context_line":"        \u0027specs\u0027: fields.DictOfStringsField(),"},{"line_number":47,"context_line":"        \u0027volume_types\u0027: fields.ListOfObjectsField(\u0027VolumeType\u0027, nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_e2f89c4b","line":45,"in_reply_to":"1a7b0d38_24004434","updated":"2016-01-05 19:23:27.000000000","message":"Previous behavior had consumer always set, just when it\u0027s not specified it defaults to back-end.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":45,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":46,"context_line":"        \u0027specs\u0027: fields.DictOfStringsField(),"},{"line_number":47,"context_line":"        \u0027volume_types\u0027: fields.ListOfObjectsField(\u0027VolumeType\u0027, nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_e4555c1d","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":79},"updated":"2015-12-23 11:20:53.000000000","message":"Any pointers why this can\u0027t be a VolumeTypeList? And this is a backref relationship, so you should add it also to VolumeType object.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":45,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":46,"context_line":"        \u0027specs\u0027: fields.DictOfStringsField(),"},{"line_number":47,"context_line":"        \u0027volume_types\u0027: fields.ListOfObjectsField(\u0027VolumeType\u0027, nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_16daa84c","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":79},"in_reply_to":"1a7b0d38_e4555c1d","updated":"2016-01-05 19:23:27.000000000","message":"Good suggestion to change this to VolumeTypeList, hadn\u0027t thought about that.  \n\nRegarding the backref, if I understand you\u0027re suggested adding a method to retrieve QoS from VolumeType and add property to VolumeType with this?  If so, I\u0027ll be adding this in a follow up patch which will also move all the VolumeType usage of QoS to the new QoS VO.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        if attrname \u003d\u003d \u0027volume_types\u0027:"},{"line_number":107,"context_line":"            vol_type_list \u003d []"},{"line_number":108,"context_line":"            for db_vol_type in db.qos_specs_associations_get(self._context,"},{"line_number":109,"context_line":"                                                             self.id):"},{"line_number":110,"context_line":"                vol_type \u003d objects.VolumeType._from_db_object("},{"line_number":111,"context_line":"                    self._context, objects.VolumeType(), db_vol_type)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_c42f00a0","line":108,"range":{"start_line":108,"start_character":34,"end_line":108,"end_character":60},"updated":"2015-12-23 11:20:53.000000000","message":"If volume_types was VolumeTypeList object you would be able to add a method for retrieving this list into VolumeTypeList.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        if attrname \u003d\u003d \u0027volume_types\u0027:"},{"line_number":107,"context_line":"            vol_type_list \u003d []"},{"line_number":108,"context_line":"            for db_vol_type in db.qos_specs_associations_get(self._context,"},{"line_number":109,"context_line":"                                                             self.id):"},{"line_number":110,"context_line":"                vol_type \u003d objects.VolumeType._from_db_object("},{"line_number":111,"context_line":"                    self._context, objects.VolumeType(), db_vol_type)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_d01c42c3","line":108,"range":{"start_line":108,"start_character":34,"end_line":108,"end_character":60},"in_reply_to":"1a7b0d38_c42f00a0","updated":"2016-01-05 19:23:27.000000000","message":"Done","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"            self.volume_types \u003d vol_type_list"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def delete_specs_key(self, keys):"},{"line_number":117,"context_line":"        for key in keys:"},{"line_number":118,"context_line":"            if key not in self.specs:"},{"line_number":119,"context_line":"                raise exception.QoSSpecsKeyNotFound(specs_key\u003dkey,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_d813605b","line":116,"range":{"start_line":116,"start_character":0,"end_line":116,"end_character":37},"updated":"2015-12-23 11:20:53.000000000","message":"I think this should be done in another way. Main concern is that this won\u0027t accumulate changes and wait for .save().","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"            self.volume_types \u003d vol_type_list"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def delete_specs_key(self, keys):"},{"line_number":117,"context_line":"        for key in keys:"},{"line_number":118,"context_line":"            if key not in self.specs:"},{"line_number":119,"context_line":"                raise exception.QoSSpecsKeyNotFound(specs_key\u003dkey,"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_bd2294a1","line":116,"range":{"start_line":116,"start_character":0,"end_line":116,"end_character":37},"in_reply_to":"1a7b0d38_d813605b","updated":"2016-01-05 19:23:27.000000000","message":"Fixed it up to be more inline with the .save() paradigm.  It\u0027s still slightly clunky because we need to explicitly specify which keys were removed as part of changes, but overall seems better.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                                                 qos_specs\u003dself.specs)"},{"line_number":151,"context_line":"        # Save ID with the object"},{"line_number":152,"context_line":"        updates[\u0027id\u0027] \u003d create_ret[\u0027id\u0027]"},{"line_number":153,"context_line":"        self._from_db_object(self._context, self, updates)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @base.remotable"},{"line_number":156,"context_line":"    def save(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_3881444b","line":153,"range":{"start_line":153,"start_character":50,"end_line":153,"end_character":57},"updated":"2015-12-23 11:20:53.000000000","message":"Wouldn\u0027t it be easier to just pass create_ret here?","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                                                 qos_specs\u003dself.specs)"},{"line_number":151,"context_line":"        # Save ID with the object"},{"line_number":152,"context_line":"        updates[\u0027id\u0027] \u003d create_ret[\u0027id\u0027]"},{"line_number":153,"context_line":"        self._from_db_object(self._context, self, updates)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @base.remotable"},{"line_number":156,"context_line":"    def save(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_5ddfff0c","line":153,"range":{"start_line":153,"start_character":50,"end_line":153,"end_character":57},"in_reply_to":"1a7b0d38_3881444b","updated":"2016-01-05 19:23:27.000000000","message":"Would be reasonable, but create_ret only has name and id in dict (same behavior as before) so I\u0027m keeping that same behavior unless there\u0027s a benefit to changing it.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.objects import base"},{"line_number":22,"context_line":"from oslo_versionedobjects import fields"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":"OPTIONAL_FIELDS \u003d [\u0027volume_types\u0027]"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_cfacda37","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":15},"updated":"2016-06-23 09:07:56.000000000","message":"Looks like you\u0027re not using CONF here.","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":"OPTIONAL_FIELDS \u003d [\u0027volume_types\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_ef039640","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":15},"updated":"2016-06-23 09:07:56.000000000","message":"OPTIONAL_FIELDS should be inside the object. See [1] for reference.\n\n[1] https://github.com/openstack/cinder/blob/504b466295f3d97307216095f450ff8421796319/cinder/objects/volume.py#L60-L62","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    fields \u003d {"},{"line_number":41,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":42,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":43,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":44,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":45,"context_line":"        \u0027specs\u0027: fields.DictOfStringsField(),"},{"line_number":46,"context_line":"        \u0027volume_types\u0027: fields.ObjectField(\u0027VolumeTypeList\u0027, nullable\u003dTrue),"},{"line_number":47,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_4f2f4af6","line":44,"range":{"start_line":43,"start_character":0,"end_line":44,"end_character":73},"updated":"2016-06-23 09:07:56.000000000","message":"Can we move that to a new class like [1]. I think that\u0027s the pattern we\u0027ve established. Also normally there are some tests for enums as well. Also it would be cool to use mnemonics from enum instead of strings.\n\n[1] https://github.com/openstack/cinder/blob/7369aaee2a1d643cafe791513145e77b6bcb1790/cinder/objects/fields.py#L67-L85","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"12647cdfe57ee9e588ca011edadd40567957a7bf","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":43,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":44,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":45,"context_line":"        \u0027specs\u0027: fields.DictOfStringsField(),"},{"line_number":46,"context_line":"        \u0027volume_types\u0027: fields.ObjectField(\u0027VolumeTypeList\u0027, nullable\u003dTrue),"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a9d85d2_cbe071cf","line":45,"updated":"2016-06-21 02:59:46.000000000","message":"See the following commit.  extra_specs is changed to \n\u0027extra_specs\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue)\n\nhttps://github.com/openstack/cinder/commit/dae983163aa1fe2b231663bf97ce635e533f803c#diff-3b170e1f51cfea02b34cf46ab381de97R41\n\nI think \u0027specs\u0027 should be changed to the same.","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":43,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":44,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":45,"context_line":"        \u0027specs\u0027: fields.DictOfStringsField(),"},{"line_number":46,"context_line":"        \u0027volume_types\u0027: fields.ObjectField(\u0027VolumeTypeList\u0027, nullable\u003dTrue),"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_2fc63e48","line":45,"in_reply_to":"5a9d85d2_cbe071cf","updated":"2016-06-23 09:07:56.000000000","message":"The fact both entities have \"specs\" in the name doesn\u0027t mean these are any similar. :)\n\nBut in this case you\u0027re right, we\u0027re able to create QoS spec key without a value, so this should be changed:\n\n mdulko:cinder/ (master) $ cinder qos-key 4e674d9a-9c88-480e-86dd-22333798d5da set def\n mdulko:cinder/ (master) $ cinder qos-show 4e674d9a-9c88-480e-86dd-22333798d5da       \n +----------+--------------------------------------+\n | Property | Value                                |\n +----------+--------------------------------------+\n | consumer | back-end                             |\n | id       | 4e674d9a-9c88-480e-86dd-22333798d5da |\n | name     | test                                 |\n | specs    | {\u0027abc\u0027: \u0027def\u0027, \u0027def\u0027: \u0027None\u0027}        |\n +----------+--------------------------------------+","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        super(QualityOfServiceSpecs, self).__init__(*args, **kwargs)"},{"line_number":51,"context_line":"        self._init_specs \u003d {}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __setattr__(self, name, value):"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            super(QualityOfServiceSpecs, self).__setattr__(name, value)"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            if name \u003d\u003d \u0027consumer\u0027:"},{"line_number":58,"context_line":"                # Give more descriptive error message for invalid \u0027consumer\u0027"},{"line_number":59,"context_line":"                msg \u003d (_(\"Valid consumer of QoS specs are: %s\") %"},{"line_number":60,"context_line":"                       self.VALID_CONSUMER_VALUES)"},{"line_number":61,"context_line":"                raise exception.InvalidQoSSpecs(reason\u003dmsg)"},{"line_number":62,"context_line":"            else:"},{"line_number":63,"context_line":"                raise"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def obj_reset_changes(self, fields\u003dNone, recursive\u003dFalse):"},{"line_number":66,"context_line":"        super(QualityOfServiceSpecs, self).obj_reset_changes(fields, recursive)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_0f7ee2ad","line":63,"range":{"start_line":53,"start_character":0,"end_line":63,"end_character":21},"updated":"2016-06-23 09:07:56.000000000","message":"Shouldn\u0027t this be handled by EnumField itself if it would be in a new class?","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        for name, field in qos_spec.fields.items():"},{"line_number":120,"context_line":"            if name not in OPTIONAL_FIELDS:"},{"line_number":121,"context_line":"                value \u003d db_qos_spec.get(name)"},{"line_number":122,"context_line":"                # \u0027specs\u0027 could be null if only a consumer is given, so make"},{"line_number":123,"context_line":"                # it an empty dict instead of None"},{"line_number":124,"context_line":"                if not value and isinstance(field, fields.DictOfStringsField):"},{"line_number":125,"context_line":"                    value \u003d {}"},{"line_number":126,"context_line":"                setattr(qos_spec, name, value)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        qos_spec._context \u003d context"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_92e15501","line":125,"range":{"start_line":122,"start_character":0,"end_line":125,"end_character":30},"updated":"2016-06-23 09:07:56.000000000","message":"Why not simply allow nullable\u003dTrue for specs field?","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                                                 qos_specs\u003dself.specs)"},{"line_number":148,"context_line":"        # Save ID with the object"},{"line_number":149,"context_line":"        updates[\u0027id\u0027] \u003d create_ret[\u0027id\u0027]"},{"line_number":150,"context_line":"        self._from_db_object(self._context, self, updates)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def save(self):"},{"line_number":153,"context_line":"        updates \u003d self.cinder_obj_get_changes()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_b29a9161","line":150,"range":{"start_line":150,"start_character":50,"end_line":150,"end_character":57},"updated":"2016-06-23 09:07:56.000000000","message":"Why can\u0027t we just use create_ret here?","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027QualityOfServiceSpecs\u0027),"},{"line_number":186,"context_line":"    }"},{"line_number":187,"context_line":"    child_versions \u003d {"},{"line_number":188,"context_line":"        \u00271.0\u0027: \u00271.0\u0027"},{"line_number":189,"context_line":"    }"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_d23bdd36","line":188,"updated":"2016-06-23 09:07:56.000000000","message":"Missing comma at the end (OpenStack hacking guidelines).","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":189,"context_line":"    }"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    @classmethod"},{"line_number":192,"context_line":"    def get_all(self, context, *args, **kwargs):"},{"line_number":193,"context_line":"        specs \u003d db.qos_specs_get_all(context, *args, **kwargs)"},{"line_number":194,"context_line":"        return base.obj_make_list(context, self(context),"},{"line_number":195,"context_line":"                                  objects.QualityOfServiceSpecs, specs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_32dd010f","line":192,"range":{"start_line":192,"start_character":16,"end_line":192,"end_character":20},"updated":"2016-06-23 09:07:56.000000000","message":"Python\u0027s convention is to name first parameter cls in classmethods.","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"22370fcf68fa50d624cb5978cc7b035a00e5ad66","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":43,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027consumer\u0027: fields.EnumField(default\u003d\u0027back-end\u0027,"},{"line_number":45,"context_line":"                                     valid_values\u003dVALID_CONSUMER_VALUES),"},{"line_number":46,"context_line":"        \u0027specs\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027volume_types\u0027: fields.ObjectField(\u0027VolumeTypeList\u0027, nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":23,"id":"3aaa91ec_7bf4d686","line":45,"updated":"2016-06-27 18:59:56.000000000","message":"In the last patch set, Michal asked you to move this to a new class as follows.  Looks like this is not addressed.\n\nhttps://github.com/openstack/cinder/blob/7369aaee2a1d643cafe791513145e77b6bcb1790/cinder/objects/fields.py#L67-L85","commit_id":"0a8aafd5fbe73677ba43f8f21e1f81096bcf68c7"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9c7a6ce25b1109423c91c5b7c49f81d636bc6937","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            LOG.exception(msg)"},{"line_number":145,"context_line":"            raise exception.Invalid(msg)"},{"line_number":146,"context_line":"        except db_exc.DBError:"},{"line_number":147,"context_line":"            LOG.exception(_LE(\u0027DB error:\u0027))"},{"line_number":148,"context_line":"            raise exception.QoSSpecsCreateFailed(name\u003dself.name,"},{"line_number":149,"context_line":"                                                 qos_specs\u003dself.specs)"},{"line_number":150,"context_line":"        # Save ID with the object"}],"source_content_type":"text/x-python","patch_set":24,"id":"3aaa91ec_3dc4b75d","line":147,"updated":"2016-06-29 01:15:25.000000000","message":"Can you make this message more clear?  For example, change it to \"DB error occurred when creating QoS specs.\"","commit_id":"6297e97c68cdc6fd3dd08f71050dd116b7427d69"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"606a85ec346ff0db54626775d63eaba3bb25d9ba","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            LOG.exception(msg)"},{"line_number":143,"context_line":"            raise exception.Invalid(msg)"},{"line_number":144,"context_line":"        except db_exc.DBError:"},{"line_number":145,"context_line":"            LOG.exception(_LE(\u0027DB error occured when creating QoS specs:\u0027))"},{"line_number":146,"context_line":"            raise exception.QoSSpecsCreateFailed(name\u003dself.name,"},{"line_number":147,"context_line":"                                                 qos_specs\u003dself.specs)"},{"line_number":148,"context_line":"        # Save ID with the object"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_fa703c74","line":145,"updated":"2016-06-29 21:36:03.000000000","message":"nit: Replace : with . at the end.","commit_id":"ec0ebb01fe5be8658f9cebdec941236201a58073"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ff36625ebc646a4fd9b746928ca0e7fc63f8af2e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from cinder.objects import fields as c_fields"},{"line_number":23,"context_line":"from oslo_versionedobjects import fields"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_5093694f","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":15},"updated":"2016-07-05 15:04:04.000000000","message":"Looks like CONF is still unused here.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"6ad9f79b4cbd0e2b03464ea3a2b2a639b86f53a2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from cinder.objects import fields as c_fields"},{"line_number":23,"context_line":"from oslo_versionedobjects import fields"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_4e19fd87","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":15},"in_reply_to":"1aa78d24_5093694f","updated":"2016-07-13 15:58:19.000000000","message":"Yes, this line as well as the import code have been removed from next PatchSet","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ff36625ebc646a4fd9b746928ca0e7fc63f8af2e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        super(QualityOfServiceSpecs, self).__init__(*args, **kwargs)"},{"line_number":51,"context_line":"        self._init_specs \u003d {}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __setattr__(self, name, value):"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            super(QualityOfServiceSpecs, self).__setattr__(name, value)"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            if name \u003d\u003d \u0027consumer\u0027:"},{"line_number":58,"context_line":"                # Give more descriptive error message for invalid \u0027consumer\u0027"},{"line_number":59,"context_line":"                msg \u003d (_(\"Valid consumer of QoS specs are: %s\") %"},{"line_number":60,"context_line":"                       c_fields.ValidConsumerField())"},{"line_number":61,"context_line":"                raise exception.InvalidQoSSpecs(reason\u003dmsg)"},{"line_number":62,"context_line":"            else:"},{"line_number":63,"context_line":"                raise"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def obj_reset_changes(self, fields\u003dNone, recursive\u003dFalse):"},{"line_number":66,"context_line":"        super(QualityOfServiceSpecs, self).obj_reset_changes(fields, recursive)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_d05ab94f","line":63,"range":{"start_line":53,"start_character":0,"end_line":63,"end_character":21},"updated":"2016-07-05 15:04:04.000000000","message":"So again, do we need that? I\u0027ve tried removing it and I\u0027m getting ValueError when trying to set the value. IMO that\u0027s fine, why are we repacking (and hiding) the exception here? I think we should do it on a higher level when needed.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"6ad9f79b4cbd0e2b03464ea3a2b2a639b86f53a2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        super(QualityOfServiceSpecs, self).__init__(*args, **kwargs)"},{"line_number":51,"context_line":"        self._init_specs \u003d {}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __setattr__(self, name, value):"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            super(QualityOfServiceSpecs, self).__setattr__(name, value)"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            if name \u003d\u003d \u0027consumer\u0027:"},{"line_number":58,"context_line":"                # Give more descriptive error message for invalid \u0027consumer\u0027"},{"line_number":59,"context_line":"                msg \u003d (_(\"Valid consumer of QoS specs are: %s\") %"},{"line_number":60,"context_line":"                       c_fields.ValidConsumerField())"},{"line_number":61,"context_line":"                raise exception.InvalidQoSSpecs(reason\u003dmsg)"},{"line_number":62,"context_line":"            else:"},{"line_number":63,"context_line":"                raise"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def obj_reset_changes(self, fields\u003dNone, recursive\u003dFalse):"},{"line_number":66,"context_line":"        super(QualityOfServiceSpecs, self).obj_reset_changes(fields, recursive)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_90dbf24e","line":63,"range":{"start_line":53,"start_character":0,"end_line":63,"end_character":21},"in_reply_to":"1aa78d24_d05ab94f","updated":"2016-07-13 15:58:19.000000000","message":"Michal, thank you very much for reviewing code.\n\nWhy are we repacking the exception here? \n\nThe reason that we throw(re-packing) that particular error\nis to exactly mimic the previous behavior, which threw a\nInvalidQosSpec error as opposed to just a value error which is not very meaningful. This seemed like the common entry point to put this.\n\nPlease let me know if you want me to re-wrap the error at some where else.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"86931ac150e980d8c7d1168b72027631e01819f2","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        super(QualityOfServiceSpecs, self).__init__(*args, **kwargs)"},{"line_number":49,"context_line":"        self._init_specs \u003d {}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __setattr__(self, name, value):"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            super(QualityOfServiceSpecs, self).__setattr__(name, value)"},{"line_number":54,"context_line":"        except ValueError:"},{"line_number":55,"context_line":"            if name \u003d\u003d \u0027consumer\u0027:"},{"line_number":56,"context_line":"                # Give more descriptive error message for invalid \u0027consumer\u0027"},{"line_number":57,"context_line":"                msg \u003d (_(\"Valid consumer of QoS specs are: %s\") %"},{"line_number":58,"context_line":"                       c_fields.QoSConsumerField())"},{"line_number":59,"context_line":"                raise exception.InvalidQoSSpecs(reason\u003dmsg)"},{"line_number":60,"context_line":"            else:"},{"line_number":61,"context_line":"                raise"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def obj_reset_changes(self, fields\u003dNone, recursive\u003dFalse):"},{"line_number":64,"context_line":"        super(QualityOfServiceSpecs, self).obj_reset_changes(fields, recursive)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1aa78d24_cd1ed25e","line":61,"range":{"start_line":51,"start_character":0,"end_line":61,"end_character":21},"updated":"2016-07-14 16:27:22.000000000","message":"I think overriding coerce() method on QoSConsumerValues to repack the exception would be a little more elegant, but it\u0027s also not completely pretty…","commit_id":"e9c217fb5dc38d074d8b62039021ebd409980daa"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"3e8904107dab8b540984fbc913b8d5b2bbee5c84","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        super(QualityOfServiceSpecs, self).__init__(*args, **kwargs)"},{"line_number":49,"context_line":"        self._init_specs \u003d {}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __setattr__(self, name, value):"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            super(QualityOfServiceSpecs, self).__setattr__(name, value)"},{"line_number":54,"context_line":"        except ValueError:"},{"line_number":55,"context_line":"            if name \u003d\u003d \u0027consumer\u0027:"},{"line_number":56,"context_line":"                # Give more descriptive error message for invalid \u0027consumer\u0027"},{"line_number":57,"context_line":"                msg \u003d (_(\"Valid consumer of QoS specs are: %s\") %"},{"line_number":58,"context_line":"                       c_fields.QoSConsumerField())"},{"line_number":59,"context_line":"                raise exception.InvalidQoSSpecs(reason\u003dmsg)"},{"line_number":60,"context_line":"            else:"},{"line_number":61,"context_line":"                raise"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def obj_reset_changes(self, fields\u003dNone, recursive\u003dFalse):"},{"line_number":64,"context_line":"        super(QualityOfServiceSpecs, self).obj_reset_changes(fields, recursive)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1aa78d24_59ec6029","line":61,"range":{"start_line":51,"start_character":0,"end_line":61,"end_character":21},"in_reply_to":"1aa78d24_cd1ed25e","updated":"2016-07-14 18:33:51.000000000","message":"Michal;\n\nthank you very much for your suggestion. maybe I will add another enhancement.","commit_id":"e9c217fb5dc38d074d8b62039021ebd409980daa"}],"cinder/objects/volume_type.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027is_public\u0027: fields.BooleanField(default\u003dTrue, nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027projects\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027extra_specs\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":46,"context_line":"        super(VolumeType, self).obj_make_compatible(primitive, target_version)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_72c82923","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":5},"updated":"2016-06-23 09:07:56.000000000","message":"I think we should also add qos_specs relationship here to match db model of vt [1].\n\n[1] https://github.com/openstack/cinder/blob/20152e022cf44aaab2e2ccca08da16cfe9917f8b/cinder/db/sqlalchemy/models.py#L344-L344","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c9b440ffc6a1e7bae644d13f0566d0a964ba3e66","unresolved":false,"context_lines":[{"line_number":114,"context_line":"class VolumeTypeList(base.ObjectListBase, base.CinderObject):"},{"line_number":115,"context_line":"    # Version 1.0: Initial version"},{"line_number":116,"context_line":"    # Version 1.1: Add pagination support to volume type"},{"line_number":117,"context_line":"    # Version 1.2: Add method to retrieve volume types by QoS"},{"line_number":118,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_d2fe3d37","line":117,"range":{"start_line":117,"start_character":0,"end_line":117,"end_character":61},"updated":"2016-06-23 09:07:56.000000000","message":"Oh, since [1] there\u0027s no need to bump version when we\u0027re just adding a new method.\n\n[1] https://review.openstack.org/#/c/312929/","commit_id":"fda73bdaee29f9d20df6878b1523f8091033b1ee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9180b3f9e8c4966ee32648765a7dbf253ab3e06d","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    # Version 1.0: Initial version"},{"line_number":116,"context_line":"    # Version 1.1: Add pagination support to volume type"},{"line_number":117,"context_line":"    # Version 1.2: Add method to retrieve volume types by QoS"},{"line_number":118,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    fields \u003d {"},{"line_number":121,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027VolumeType\u0027),"}],"source_content_type":"text/x-python","patch_set":25,"id":"3aaa91ec_213514db","line":118,"range":{"start_line":118,"start_character":4,"end_line":118,"end_character":19},"updated":"2016-07-01 15:11:49.000000000","message":"-1: We don\u0027t need a new version when we introduce a new method.","commit_id":"ec0ebb01fe5be8658f9cebdec941236201a58073"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ff36625ebc646a4fd9b746928ca0e7fc63f8af2e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027is_public\u0027: fields.BooleanField(default\u003dTrue, nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027projects\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027extra_specs\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":46,"context_line":"        super(VolumeType, self).obj_make_compatible(primitive, target_version)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_3364e7e2","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":5},"updated":"2016-07-05 15:04:04.000000000","message":"Relationship with qos_specs is missing as I\u0027ve stated in comments for patchset 22.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"6ad9f79b4cbd0e2b03464ea3a2b2a639b86f53a2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027is_public\u0027: fields.BooleanField(default\u003dTrue, nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027projects\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027extra_specs\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":46,"context_line":"        super(VolumeType, self).obj_make_compatible(primitive, target_version)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_113ebe8b","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":5},"in_reply_to":"1aa78d24_3364e7e2","updated":"2016-07-13 15:58:19.000000000","message":"Michal; thank you very much for your code review and direction how to debug and implement the relationship between \u0027qos_specs\u0027 and \u0027VolumeType\u0027.\n\nFollowing your instruction and sample code, we fix the issue.\n\nMichal\u0027s comment:\n\n \u003cdulek\u003e Yeah - look how snapshots field is added here: https://review.openstack.org/#/c/240847/11/cinder/objects/volume.py@95","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"}],"cinder/tests/unit/api/contrib/test_qos_specs_manage.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9c7a6ce25b1109423c91c5b7c49f81d636bc6937","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        else:"},{"line_number":149,"context_line":"            specs \u003d {\u0027name\u0027: name,"},{"line_number":150,"context_line":"                     \u0027consumer\u0027: \u0027back-end\u0027,"},{"line_number":151,"context_line":"                     \u0027qos_specs\u0027: {"},{"line_number":152,"context_line":"                         \u0027key1\u0027: \u0027value1\u0027,"},{"line_number":153,"context_line":"                         \u0027key2\u0027: \u0027value2\u0027}}"},{"line_number":154,"context_line":"        return db.qos_specs_create(self.ctxt, specs)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"3aaa91ec_7d2e3ffb","line":151,"updated":"2016-06-29 01:15:25.000000000","message":"You changed this from \u0027qos_specs\u0027 to \u0027specs\u0027 earlier:\n\nhttps://review.openstack.org/#/c/251989/24/cinder/db/sqlalchemy/api.py","commit_id":"6297e97c68cdc6fd3dd08f71050dd116b7427d69"}],"cinder/tests/unit/objects/test_objects.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"9db5a9a774b315f3584bc926afa2de4acb60d916","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from cinder.objects import base"},{"line_number":20,"context_line":"from cinder import test"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# NOTE: The hashes in this list should only be changed if they come with a"},{"line_number":24,"context_line":"# corresponding version bump in the affected objects."},{"line_number":25,"context_line":"object_data \u003d {"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_98755afc","side":"PARENT","line":22,"updated":"2016-06-15 10:20:27.000000000","message":"Please don\u0027t remove this line.","commit_id":"1c9b6f116f8c56cfaa8018cc0dfcaebeeeff07e3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"9db5a9a774b315f3584bc926afa2de4acb60d916","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \u0027VolumeAttachment\u0027: \u00271.0-b30dacf62b2030dd83d8a1603f1064ff\u0027,"},{"line_number":39,"context_line":"    \u0027VolumeAttachmentList\u0027: \u00271.0-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027,"},{"line_number":40,"context_line":"    \u0027VolumeType\u0027: \u00271.0-6673dd9ce7c27e9c85279afb20833877\u0027,"},{"line_number":41,"context_line":"    \u0027QualityOfServiceSpecs\u0027: \u00271.0-631f84b6680ff67d5da653113a90c20c\u0027,"},{"line_number":42,"context_line":"    \u0027QualityOfServiceSpecsList\u0027: \u00271.0-1b54e51ad0fc1f3a8878f5010e7e16dc\u0027,"},{"line_number":43,"context_line":"    \u0027VolumeTypeList\u0027: \u00271.2-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027"},{"line_number":44,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":20,"id":"7aa08908_781b4ecb","line":41,"range":{"start_line":41,"start_character":34,"end_line":41,"end_character":66},"updated":"2016-06-15 10:20:27.000000000","message":"You need to update the hash here to  289b802dd89c328f9a08c7fed28aa1ac to get rid of one of the test errors.","commit_id":"f7799fd40530d59161f9f8406f85927d515141a3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ff36625ebc646a4fd9b746928ca0e7fc63f8af2e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \u0027VolumeAttachment\u0027: \u00271.0-b30dacf62b2030dd83d8a1603f1064ff\u0027,"},{"line_number":42,"context_line":"    \u0027VolumeAttachmentList\u0027: \u00271.0-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027,"},{"line_number":43,"context_line":"    \u0027VolumeType\u0027: \u00271.1-6673dd9ce7c27e9c85279afb20833877\u0027,"},{"line_number":44,"context_line":"    \u0027VolumeTypeList\u0027: \u00271.1-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027"},{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_f3dedf6b","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":60},"updated":"2016-07-05 15:04:04.000000000","message":"Please don\u0027t remove this comma.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"},{"author":{"_account_id":21144,"name":"Xinli Guan","email":"xinli@us.ibm.com","username":"xinli"},"change_message_id":"6ad9f79b4cbd0e2b03464ea3a2b2a639b86f53a2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \u0027VolumeAttachment\u0027: \u00271.0-b30dacf62b2030dd83d8a1603f1064ff\u0027,"},{"line_number":42,"context_line":"    \u0027VolumeAttachmentList\u0027: \u00271.0-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027,"},{"line_number":43,"context_line":"    \u0027VolumeType\u0027: \u00271.1-6673dd9ce7c27e9c85279afb20833877\u0027,"},{"line_number":44,"context_line":"    \u0027VolumeTypeList\u0027: \u00271.1-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027"},{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"1aa78d24_86b8fbe6","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":60},"in_reply_to":"1aa78d24_f3dedf6b","updated":"2016-07-13 15:58:19.000000000","message":"I will fix it again, regression issue.","commit_id":"c1b3f9a4d73bb955e5de1942c7db029799e216c7"}],"cinder/volume/qos_specs.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    except KeyError:"},{"line_number":61,"context_line":"        # Default consumer is back-end, i.e Cinder volume service"},{"line_number":62,"context_line":"        if create:"},{"line_number":63,"context_line":"            specs[\u0027consumer\u0027] \u003d \u0027back-end\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    return specs"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_3bcffeb1","side":"PARENT","line":63,"updated":"2015-12-23 11:20:53.000000000","message":"How do we handle this default now?","commit_id":"85a93f679a9ef2fa623964f3b1393ad3f71976bd"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    except KeyError:"},{"line_number":61,"context_line":"        # Default consumer is back-end, i.e Cinder volume service"},{"line_number":62,"context_line":"        if create:"},{"line_number":63,"context_line":"            specs[\u0027consumer\u0027] \u003d \u0027back-end\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    return specs"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_dd38a8a2","side":"PARENT","line":63,"in_reply_to":"1a7b0d38_3bcffeb1","updated":"2016-01-05 19:23:27.000000000","message":"All of this logic has been pushed up into the QoS versioned object.  consumer defaults to \u0027backend\u0027 in the enum and the validation of it is done as part of setting","commit_id":"85a93f679a9ef2fa623964f3b1393ad3f71976bd"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e53df0763e48448b2c4d9d0b9080a7b06007ab8f","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    qos_spec \u003d objects.QualityOfServiceSpecs.get_by_id("},{"line_number":111,"context_line":"        context, qos_specs_id)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    if qos_spec.volume_types:"},{"line_number":114,"context_line":"        if not force:"},{"line_number":115,"context_line":"            raise exception.QoSSpecsInUse(specs_id\u003dqos_specs_id)"},{"line_number":116,"context_line":"        else:"},{"line_number":117,"context_line":"            # remove all association"},{"line_number":118,"context_line":"            db.qos_specs_disassociate_all(context, qos_specs_id)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    qos_spec.destroy()"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_3bb5becc","line":118,"range":{"start_line":113,"start_character":0,"end_line":118,"end_character":64},"updated":"2015-12-23 11:20:53.000000000","message":"I think this should be a part of destroy method in the object.","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"c3d08802910612ea872c296aa15aac243b4440a0","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    qos_spec \u003d objects.QualityOfServiceSpecs.get_by_id("},{"line_number":111,"context_line":"        context, qos_specs_id)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    if qos_spec.volume_types:"},{"line_number":114,"context_line":"        if not force:"},{"line_number":115,"context_line":"            raise exception.QoSSpecsInUse(specs_id\u003dqos_specs_id)"},{"line_number":116,"context_line":"        else:"},{"line_number":117,"context_line":"            # remove all association"},{"line_number":118,"context_line":"            db.qos_specs_disassociate_all(context, qos_specs_id)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    qos_spec.destroy()"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_bd0e148a","line":118,"range":{"start_line":113,"start_character":0,"end_line":118,"end_character":64},"in_reply_to":"1a7b0d38_3bb5becc","updated":"2016-01-05 19:23:27.000000000","message":"Done","commit_id":"bf1ba6439fc01d81bd90ce9b71214688860eb708"}]}
