)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"96207a54ec0fafde71b7e1b053ae1ff93da65217","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     lyanchih \u003clyan.h@inwinstack.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-13 07:10:12 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Instance resource quota not observed for non-ephemeral storage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Instance IO resource quotas was working when building an instance from"},{"line_number":10,"context_line":"ephemeral storage, but it does not when booting from a bootable cinder"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9a41bdd9_334712bd","line":7,"updated":"2015-07-13 08:23:32.000000000","message":"this is libvirt related so please prefix this with libvirt:","commit_id":"d1acece4db6fbd080c9c642d49368b76793ea163"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"96207a54ec0fafde71b7e1b053ae1ff93da65217","unresolved":false,"context_lines":[{"line_number":10,"context_line":"ephemeral storage, but it does not when booting from a bootable cinder"},{"line_number":11,"context_line":"volume. Essentially, for non-ephemeral disks, a call is made to"},{"line_number":12,"context_line":"_get_volume_config() which creates a generic LibvirtConfigGuestDisk"},{"line_number":13,"context_line":"object but no further processing is done to add extra-specs (if any)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I9f1f34ef1ffacfd0c082783a4494361fbc172add"},{"line_number":16,"context_line":"Closes-Bug: 1445637"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9a41bdd9_538ad6c0","line":13,"updated":"2015-07-13 08:23:32.000000000","message":"when we use a cinder image that image should have its own flavor extra spec and the volume should have those properties. we should not be inheriting the properties from the instance flavor.","commit_id":"d1acece4db6fbd080c9c642d49368b76793ea163"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"38327b9e546637b2f3afef70f2db13b6fdf2bcd9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Maybe we should also apply attributes for non-ephemeral storage"},{"line_number":20,"context_line":"according to flavor\u0027s extra specs. If cinder also had settings qos"},{"line_number":21,"context_line":"value, we should set the minimum value between them."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I9f1f34ef1ffacfd0c082783a4494361fbc172add"},{"line_number":24,"context_line":"Closes-Bug: 1445637"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a4dcd0f_efbf40f9","line":22,"updated":"2015-08-05 07:48:05.000000000","message":"I think that you need a DocImpact flag here indication that the one may have precedence over the other","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"82e80eb726c9b339f42a2e66443262a7836eb96e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Maybe we should also apply attributes for non-ephemeral storage"},{"line_number":20,"context_line":"according to flavor\u0027s extra specs. If cinder also had settings qos"},{"line_number":21,"context_line":"value, we should set the minimum value between them."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I9f1f34ef1ffacfd0c082783a4494361fbc172add"},{"line_number":24,"context_line":"Closes-Bug: 1445637"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a4dcd0f_4c599dfd","line":22,"in_reply_to":"1a4dcd0f_efbf40f9","updated":"2015-08-05 09:09:37.000000000","message":"I had read https://wiki.openstack.org/wiki/Documentation/DocImpact.\nIt had mention about some case need to add DocImpact. Is this patch will and new feature so needs to add DocImpact?","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c5084c6bf0169dbbf280cdfb9ec4ffdda88e8600","unresolved":false,"context_lines":[{"line_number":20,"context_line":"according to flavor\u0027s extra specs. If cinder also had settings qos"},{"line_number":21,"context_line":"value, we should set the minimum value between them."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"DocImpact"},{"line_number":24,"context_line":"Change-Id: I9f1f34ef1ffacfd0c082783a4494361fbc172add"},{"line_number":25,"context_line":"Closes-Bug: 1445637"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da20952f_f78b9c1c","line":23,"updated":"2015-09-03 09:07:17.000000000","message":"A blueprint should be proposed to refer that new feature","commit_id":"f5ca57df7aa352c3b925dbda4a3b6078ed89162c"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"10023244fc4cf78f0247bf10dd6a1defad4420f2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"according to flavor\u0027s extra specs. If cinder also had settings qos"},{"line_number":21,"context_line":"value, we should set the minimum value between them."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"DocImpact"},{"line_number":24,"context_line":"Change-Id: I9f1f34ef1ffacfd0c082783a4494361fbc172add"},{"line_number":25,"context_line":"Closes-Bug: 1445637"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da20952f_6657db02","line":23,"in_reply_to":"da20952f_b7a2044a","updated":"2015-09-03 09:46:28.000000000","message":"I do not think a spec is necessary, but a bleuprint yes.","commit_id":"f5ca57df7aa352c3b925dbda4a3b6078ed89162c"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"8df0ff46eba270924672a74a6795f9bfad38daa6","unresolved":false,"context_lines":[{"line_number":20,"context_line":"according to flavor\u0027s extra specs. If cinder also had settings qos"},{"line_number":21,"context_line":"value, we should set the minimum value between them."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"DocImpact"},{"line_number":24,"context_line":"Change-Id: I9f1f34ef1ffacfd0c082783a4494361fbc172add"},{"line_number":25,"context_line":"Closes-Bug: 1445637"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da20952f_b7a2044a","line":23,"in_reply_to":"da20952f_f78b9c1c","updated":"2015-09-03 09:18:59.000000000","message":"Is it needs to add spec? I though we should only need to add blueprint. Is it correct?","commit_id":"f5ca57df7aa352c3b925dbda4a3b6078ed89162c"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"38327b9e546637b2f3afef70f2db13b6fdf2bcd9","unresolved":false,"context_lines":[{"line_number":1037,"context_line":"        return encryptor"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"    @staticmethod"},{"line_number":1040,"context_line":"    def _set_connection_qos(connection_info, inst_type):"},{"line_number":1041,"context_line":"        if (inst_type is None or"},{"line_number":1042,"context_line":"            getattr(inst_type, \u0027extra_specs\u0027, None) is None or"},{"line_number":1043,"context_line":"            \u0027data\u0027 not in connection_info):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_0f1aac6e","line":1040,"range":{"start_line":1040,"start_character":45,"end_line":1040,"end_character":54},"updated":"2015-08-05 07:48:05.000000000","message":"why not use flavor here. inst_type was a little confusing\n\nCan this value ever be None?","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"82e80eb726c9b339f42a2e66443262a7836eb96e","unresolved":false,"context_lines":[{"line_number":1037,"context_line":"        return encryptor"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"    @staticmethod"},{"line_number":1040,"context_line":"    def _set_connection_qos(connection_info, inst_type):"},{"line_number":1041,"context_line":"        if (inst_type is None or"},{"line_number":1042,"context_line":"            getattr(inst_type, \u0027extra_specs\u0027, None) is None or"},{"line_number":1043,"context_line":"            \u0027data\u0027 not in connection_info):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_69100ba9","line":1040,"in_reply_to":"1a4dcd0f_0f1aac6e","updated":"2015-08-05 09:09:37.000000000","message":"Oh, I\u0027m reference to inst_type parameter of _get_guest_storage_config function. In fact, I also felt confusing during read code.","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"38327b9e546637b2f3afef70f2db13b6fdf2bcd9","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"    @staticmethod"},{"line_number":1040,"context_line":"    def _set_connection_qos(connection_info, inst_type):"},{"line_number":1041,"context_line":"        if (inst_type is None or"},{"line_number":1042,"context_line":"            getattr(inst_type, \u0027extra_specs\u0027, None) is None or"},{"line_number":1043,"context_line":"            \u0027data\u0027 not in connection_info):"},{"line_number":1044,"context_line":"            return"},{"line_number":1045,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_4f3e74b9","line":1042,"updated":"2015-08-05 07:48:05.000000000","message":"flavor should be an object show flavor.extra_specs shoudl always exist","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"82e80eb726c9b339f42a2e66443262a7836eb96e","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"    @staticmethod"},{"line_number":1040,"context_line":"    def _set_connection_qos(connection_info, inst_type):"},{"line_number":1041,"context_line":"        if (inst_type is None or"},{"line_number":1042,"context_line":"            getattr(inst_type, \u0027extra_specs\u0027, None) is None or"},{"line_number":1043,"context_line":"            \u0027data\u0027 not in connection_info):"},{"line_number":1044,"context_line":"            return"},{"line_number":1045,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_695ecb77","line":1042,"in_reply_to":"1a4dcd0f_4f3e74b9","updated":"2015-08-05 09:09:37.000000000","message":"If input parameter must be flavor, it is really unnecessary to verify this condition.","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"38327b9e546637b2f3afef70f2db13b6fdf2bcd9","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"                    value \u003d qos_value if qos_value \u003c value else value"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"                qos_specs[new_key] \u003d value"},{"line_number":1067,"context_line":"        LOG.debug(qos_specs)"},{"line_number":1068,"context_line":"        connection_info[\u0027data\u0027][\u0027qos_specs\u0027] \u003d qos_specs"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_4f93d4a3","line":1067,"updated":"2015-08-05 07:48:05.000000000","message":"please add some context or information to this debug. just seeing a random dictionary in a log file is a bit difficult to understand","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"82e80eb726c9b339f42a2e66443262a7836eb96e","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"                    value \u003d qos_value if qos_value \u003c value else value"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"                qos_specs[new_key] \u003d value"},{"line_number":1067,"context_line":"        LOG.debug(qos_specs)"},{"line_number":1068,"context_line":"        connection_info[\u0027data\u0027][\u0027qos_specs\u0027] \u003d qos_specs"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_6fac90a0","line":1067,"in_reply_to":"1a4dcd0f_4f93d4a3","updated":"2015-08-05 09:09:37.000000000","message":"nit!! It just test the value. I don\u0027t remove it. I\u0027m sorry.","commit_id":"764d48975081def50c1388733bf93d57445a24e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"080b15b47be504ba864008ca3c0277020ea9f46c","unresolved":false,"context_lines":[{"line_number":1022,"context_line":""},{"line_number":1023,"context_line":"    @staticmethod"},{"line_number":1024,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1025,"context_line":"        if not isinstance(flavor, objects.Flavor):"},{"line_number":1026,"context_line":"            return"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":"        if \u0027data\u0027 not in connection_info:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_325b4856","line":1025,"updated":"2015-08-05 09:54:02.000000000","message":"the flavor should be an object here.","commit_id":"e4860155cf1d76d252e6b71a729193237ddaf89c"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"0b5e935a2484496f058bbfac658aff36834969d8","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"    @staticmethod"},{"line_number":1024,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1025,"context_line":"        if not isinstance(flavor, objects.Flavor):"},{"line_number":1026,"context_line":"            return"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1029,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_4f7d0f6d","line":1026,"updated":"2015-08-05 09:27:27.000000000","message":"are we sure the flavor is object? if so we can remove this check\notherwise can we change to flavor object if it\u0027s a dict?","commit_id":"e4860155cf1d76d252e6b71a729193237ddaf89c"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"9c1702ba78931acc3a0c47207de50bfc3c9aaf5f","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"    @staticmethod"},{"line_number":1024,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1025,"context_line":"        if not isinstance(flavor, objects.Flavor):"},{"line_number":1026,"context_line":"            return"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1029,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_fd97f18d","line":1026,"in_reply_to":"1a4dcd0f_4f7d0f6d","updated":"2015-08-05 10:03:26.000000000","message":"Here will using instance\u0027s flavor to set connection_info\u0027s qos_spec setting.\nIt is not necessary to pass dict here. And I was calling this methods before _connect_volume, those place can receive instance\u0027s flavor. But still have two location need to set connection qos.","commit_id":"e4860155cf1d76d252e6b71a729193237ddaf89c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"080b15b47be504ba864008ca3c0277020ea9f46c","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"    @staticmethod"},{"line_number":1024,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1025,"context_line":"        if not isinstance(flavor, objects.Flavor):"},{"line_number":1026,"context_line":"            return"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1029,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_526e1402","line":1026,"in_reply_to":"1a4dcd0f_4f7d0f6d","updated":"2015-08-05 09:54:02.000000000","message":"the flavor should be an object here.","commit_id":"e4860155cf1d76d252e6b71a729193237ddaf89c"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"0b5e935a2484496f058bbfac658aff36834969d8","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        for key, value in six.iteritems(flavor.extra_specs):"},{"line_number":1039,"context_line":"            if not strutils.is_int_like(value):"},{"line_number":1040,"context_line":"                continue"},{"line_number":1041,"context_line":"            value \u003d int(value)"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"            if key in tune_items:"},{"line_number":1044,"context_line":"                new_key \u003d key[key_offset:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_0fdf076a","line":1041,"updated":"2015-08-05 09:27:27.000000000","message":"not sure this but seems we can move those check after 1043 so we can avoid some check?","commit_id":"e4860155cf1d76d252e6b71a729193237ddaf89c"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"9c1702ba78931acc3a0c47207de50bfc3c9aaf5f","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        for key, value in six.iteritems(flavor.extra_specs):"},{"line_number":1039,"context_line":"            if not strutils.is_int_like(value):"},{"line_number":1040,"context_line":"                continue"},{"line_number":1041,"context_line":"            value \u003d int(value)"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"            if key in tune_items:"},{"line_number":1044,"context_line":"                new_key \u003d key[key_offset:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_ddc47560","line":1041,"in_reply_to":"1a4dcd0f_0fdf076a","updated":"2015-08-05 10:03:26.000000000","message":"Objects flavor\u0027s extra spec is dict object. It will not check whether some value are int or string. And we can\u0027t guaranteed value is correct during update image-metadata. Should we use origin value or replace by floavor\u0027s value when value is incorrect. Of course, if libvirt accept special string, we don\u0027t need concern. But I don\u0027t saw relative information about this.","commit_id":"e4860155cf1d76d252e6b71a729193237ddaf89c"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"fd3c1c757151a23f319cf7f3a6354fdf49731904","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"    @staticmethod"},{"line_number":1093,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1094,"context_line":"        if not isinstance(flavor, objects.Flavor):"},{"line_number":1095,"context_line":"            return"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1098,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_0d06251c","line":1095,"updated":"2015-08-25 14:04:31.000000000","message":"Why don\u0027t you raise exception here?","commit_id":"a568f00db8f2f7af77a2f0ac2a53600f2ea4c320"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"3d099e442618d233ac6cc1bee018c4105cd9543a","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"    @staticmethod"},{"line_number":1093,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1094,"context_line":"        if not isinstance(flavor, objects.Flavor):"},{"line_number":1095,"context_line":"            return"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1098,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_0476fad6","line":1095,"in_reply_to":"fa1b9901_0d06251c","updated":"2015-08-25 15:25:37.000000000","message":"This condition should been remove. Because flavor parameter must be flavor object.","commit_id":"a568f00db8f2f7af77a2f0ac2a53600f2ea4c320"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"fd3c1c757151a23f319cf7f3a6354fdf49731904","unresolved":false,"context_lines":[{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1098,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"},{"line_number":1099,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":1100,"context_line":"        tune_items \u003d [\u0027quota:disk_read_bytes_sec\u0027,"},{"line_number":1101,"context_line":"                      \u0027quota:disk_read_iops_sec\u0027,"},{"line_number":1102,"context_line":"                      \u0027quota:disk_write_bytes_sec\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_edc2d184","line":1099,"updated":"2015-08-25 14:04:31.000000000","message":"A shorter variant:\n\nqos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027, {})","commit_id":"a568f00db8f2f7af77a2f0ac2a53600f2ea4c320"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"3d099e442618d233ac6cc1bee018c4105cd9543a","unresolved":false,"context_lines":[{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1098,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"},{"line_number":1099,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027) or {}"},{"line_number":1100,"context_line":"        tune_items \u003d [\u0027quota:disk_read_bytes_sec\u0027,"},{"line_number":1101,"context_line":"                      \u0027quota:disk_read_iops_sec\u0027,"},{"line_number":1102,"context_line":"                      \u0027quota:disk_write_bytes_sec\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_8450ca33","line":1099,"in_reply_to":"fa1b9901_edc2d184","updated":"2015-08-25 15:25:37.000000000","message":"Oh!!!! Thx.","commit_id":"a568f00db8f2f7af77a2f0ac2a53600f2ea4c320"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ad5f88bc9b587aa820ae2328c9683315816b98a4","unresolved":false,"context_lines":[{"line_number":1113,"context_line":"                    qos_value \u003d int(qos_value)"},{"line_number":1114,"context_line":"                    value \u003d qos_value if qos_value \u003c value else value"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":"                qos_specs[new_key] \u003d value"},{"line_number":1117,"context_line":"        connection_info[\u0027data\u0027][\u0027qos_specs\u0027] \u003d qos_specs"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_63ef7eb1","line":1116,"updated":"2015-08-26 11:35:28.000000000","message":"Is it intentional that if the qos_specs[\u0027new_key\u0027] is not an int then we always overwrite the qos_specs[\u0027new_key\u0027] value with the related flavor.extra_specs value?\n\nI mean we choose the smaller number if the value is a number but we blindly overwrite if it is not.","commit_id":"a8738640242d223b8e48990f5d00a8afacccbd9c"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"d625efa771a5d87188f0b265d02280a37af7ec71","unresolved":false,"context_lines":[{"line_number":1113,"context_line":"                    qos_value \u003d int(qos_value)"},{"line_number":1114,"context_line":"                    value \u003d qos_value if qos_value \u003c value else value"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":"                qos_specs[new_key] \u003d value"},{"line_number":1117,"context_line":"        connection_info[\u0027data\u0027][\u0027qos_specs\u0027] \u003d qos_specs"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_f7e869e4","line":1116,"in_reply_to":"da20952f_df16a1f0","updated":"2015-08-28 14:43:49.000000000","message":"Yes, you are right. Invalid value should be rejected. But cinder\u0027s qos command wouldn\u0027t validate value. Do you think it should be cinder\u0027s bug?","commit_id":"a8738640242d223b8e48990f5d00a8afacccbd9c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bfb4be49e523a18370f0e2c3216daded44200263","unresolved":false,"context_lines":[{"line_number":1113,"context_line":"                    qos_value \u003d int(qos_value)"},{"line_number":1114,"context_line":"                    value \u003d qos_value if qos_value \u003c value else value"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":"                qos_specs[new_key] \u003d value"},{"line_number":1117,"context_line":"        connection_info[\u0027data\u0027][\u0027qos_specs\u0027] \u003d qos_specs"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_86cc196b","line":1116,"in_reply_to":"da20952f_f7e869e4","updated":"2015-08-31 11:33:34.000000000","message":"I think it should be a cinder bug","commit_id":"a8738640242d223b8e48990f5d00a8afacccbd9c"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"df9a59fecf7e562ebfceece037752383d1d5f2a7","unresolved":false,"context_lines":[{"line_number":1113,"context_line":"                    qos_value \u003d int(qos_value)"},{"line_number":1114,"context_line":"                    value \u003d qos_value if qos_value \u003c value else value"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":"                qos_specs[new_key] \u003d value"},{"line_number":1117,"context_line":"        connection_info[\u0027data\u0027][\u0027qos_specs\u0027] \u003d qos_specs"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_d1c6519b","line":1116,"in_reply_to":"fa1b9901_63ef7eb1","updated":"2015-08-26 13:12:55.000000000","message":"IMO, it is not blindly overwrite here. It will using number to overwrite those values which are smaller or not number. Why needs to overwrite values are not number? Maybe users will type wrong number format when define qos specs. I just though flavor\u0027s value should be higher priority.","commit_id":"a8738640242d223b8e48990f5d00a8afacccbd9c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa67046457098e7d6c7a6da06215847e332879ec","unresolved":false,"context_lines":[{"line_number":1113,"context_line":"                    qos_value \u003d int(qos_value)"},{"line_number":1114,"context_line":"                    value \u003d qos_value if qos_value \u003c value else value"},{"line_number":1115,"context_line":""},{"line_number":1116,"context_line":"                qos_specs[new_key] \u003d value"},{"line_number":1117,"context_line":"        connection_info[\u0027data\u0027][\u0027qos_specs\u0027] \u003d qos_specs"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_df16a1f0","line":1116,"in_reply_to":"fa1b9901_d1c6519b","updated":"2015-08-28 13:17:55.000000000","message":"\"Maybe users will type wrong number format when define qos specs\"\nI think that shall be validated and rejected by the API","commit_id":"a8738640242d223b8e48990f5d00a8afacccbd9c"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c5084c6bf0169dbbf280cdfb9ec4ffdda88e8600","unresolved":false,"context_lines":[{"line_number":1075,"context_line":"                      \u0027quota:disk_total_iops_sec\u0027]"},{"line_number":1076,"context_line":"        key_offset \u003d len(\u0027quota:disk_\u0027)"},{"line_number":1077,"context_line":"        for key, value in six.iteritems(flavor.extra_specs):"},{"line_number":1078,"context_line":"            if not strutils.is_int_like(value):"},{"line_number":1079,"context_line":"                continue"},{"line_number":1080,"context_line":"            value \u003d int(value)"},{"line_number":1081,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_175650d2","line":1078,"updated":"2015-09-03 09:07:17.000000000","message":"This check and cast should be after we have verified that \"key is in tune_items\"","commit_id":"f5ca57df7aa352c3b925dbda4a3b6078ed89162c"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c5084c6bf0169dbbf280cdfb9ec4ffdda88e8600","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"                continue"},{"line_number":1080,"context_line":"            value \u003d int(value)"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"            if key in tune_items:"},{"line_number":1083,"context_line":"                qos_key \u003d key[key_offset:]"},{"line_number":1084,"context_line":"                qos_value \u003d qos_specs.get(qos_key)"},{"line_number":1085,"context_line":"                if (qos_value is None or (strutils.is_int_like(qos_value) and"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_f7a4fcb9","line":1082,"updated":"2015-09-03 09:07:17.000000000","message":"If we want give more information to operator if something was wrong when he set quota we should first verify that:\n\n   if key.startswith(key_offset):\n     if key not in tune_items:\n       # log warning or raise exception to stop process.\n     if not strutils.is_int_like(value):\n       # log warning or raise exception to stop process.\n     value \u003d int(value)\n     ....","commit_id":"f5ca57df7aa352c3b925dbda4a3b6078ed89162c"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"10023244fc4cf78f0247bf10dd6a1defad4420f2","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"                continue"},{"line_number":1080,"context_line":"            value \u003d int(value)"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"            if key in tune_items:"},{"line_number":1083,"context_line":"                qos_key \u003d key[key_offset:]"},{"line_number":1084,"context_line":"                qos_value \u003d qos_specs.get(qos_key)"},{"line_number":1085,"context_line":"                if (qos_value is None or (strutils.is_int_like(qos_value) and"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_065e1f12","line":1082,"in_reply_to":"da20952f_d718d886","updated":"2015-09-03 09:46:28.000000000","message":"That check \"startswith\" is used to know whether Operator is trying to update disk quotas.","commit_id":"f5ca57df7aa352c3b925dbda4a3b6078ed89162c"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"8df0ff46eba270924672a74a6795f9bfad38daa6","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"                continue"},{"line_number":1080,"context_line":"            value \u003d int(value)"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"            if key in tune_items:"},{"line_number":1083,"context_line":"                qos_key \u003d key[key_offset:]"},{"line_number":1084,"context_line":"                qos_value \u003d qos_specs.get(qos_key)"},{"line_number":1085,"context_line":"                if (qos_value is None or (strutils.is_int_like(qos_value) and"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_d718d886","line":1082,"in_reply_to":"da20952f_f7a4fcb9","updated":"2015-09-03 09:18:59.000000000","message":"Oh!! First to check whether key is in tune_items will let code more clean, thx. But I don\u0027t though startswith check is needed. Because of those key not start with that will also not exist in tune_items.","commit_id":"f5ca57df7aa352c3b925dbda4a3b6078ed89162c"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c7ca3466d19c58db8ad5ddf559a090f2a2d7441b","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"        return encryptor"},{"line_number":1064,"context_line":""},{"line_number":1065,"context_line":"    @staticmethod"},{"line_number":1066,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1067,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1068,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"},{"line_number":1069,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027, {})"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_11414ea9","line":1066,"updated":"2015-09-04 07:43:53.000000000","message":"I do not think this is only related to driver libvirt, we should probably make it available for all drivers.\n\nSo this method can be in virt/block_devices.attach_volume, to give this feature to all drivers.","commit_id":"00d1af05418d682e8ae3ae447c2a8316b07ca703"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"3b49dee4bb21f4313ae264e265377961341a5b6b","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"        return encryptor"},{"line_number":1064,"context_line":""},{"line_number":1065,"context_line":"    @staticmethod"},{"line_number":1066,"context_line":"    def _set_connection_qos(connection_info, flavor):"},{"line_number":1067,"context_line":"        if \u0027data\u0027 not in connection_info:"},{"line_number":1068,"context_line":"            connection_info[\u0027data\u0027] \u003d {}"},{"line_number":1069,"context_line":"        qos_specs \u003d connection_info[\u0027data\u0027].get(\u0027qos_specs\u0027, {})"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_2beba414","line":1066,"in_reply_to":"da20952f_11414ea9","updated":"2015-11-19 09:16:05.000000000","message":"done","commit_id":"00d1af05418d682e8ae3ae447c2a8316b07ca703"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c7ca3466d19c58db8ad5ddf559a090f2a2d7441b","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"            if not key.startswith(quota_disk_key):"},{"line_number":1080,"context_line":"                continue"},{"line_number":1081,"context_line":"            elif key not in tune_items:"},{"line_number":1082,"context_line":"                LOG.warning(_LW(\u0027Flavor had unacceptable quota disk spec: \u0027"},{"line_number":1083,"context_line":"                                \u0027%(key)s\u0027),"},{"line_number":1084,"context_line":"                            {\u0027key\u0027: key})"},{"line_number":1085,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_f18a9a63","line":1082,"updated":"2015-09-04 07:43:53.000000000","message":"So you choice to only warn Operator here. Hum I think we should stop process since we know that Operator explicitly wants to update quota.","commit_id":"00d1af05418d682e8ae3ae447c2a8316b07ca703"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"3b49dee4bb21f4313ae264e265377961341a5b6b","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"            if not key.startswith(quota_disk_key):"},{"line_number":1080,"context_line":"                continue"},{"line_number":1081,"context_line":"            elif key not in tune_items:"},{"line_number":1082,"context_line":"                LOG.warning(_LW(\u0027Flavor had unacceptable quota disk spec: \u0027"},{"line_number":1083,"context_line":"                                \u0027%(key)s\u0027),"},{"line_number":1084,"context_line":"                            {\u0027key\u0027: key})"},{"line_number":1085,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_35b8e1c7","line":1082,"in_reply_to":"da20952f_f18a9a63","updated":"2015-11-19 09:16:05.000000000","message":"done","commit_id":"00d1af05418d682e8ae3ae447c2a8316b07ca703"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c7ca3466d19c58db8ad5ddf559a090f2a2d7441b","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"                            {\u0027key\u0027: key})"},{"line_number":1085,"context_line":"                continue"},{"line_number":1086,"context_line":"            elif not strutils.is_int_like(value):"},{"line_number":1087,"context_line":"                LOG.warning(_LW(\u0027Flavor had invalid value of quota disk spec: \u0027"},{"line_number":1088,"context_line":"                                \u0027%(key)s\u003d$(value)s\u0027),"},{"line_number":1089,"context_line":"                            {\u0027key\u0027: key, \u0027value\u0027: value})"},{"line_number":1090,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_d1e4363d","line":1087,"updated":"2015-09-04 07:43:53.000000000","message":"Here again, we know that we are explicitly trying to update quota so we can probably stop process to raise an error.","commit_id":"00d1af05418d682e8ae3ae447c2a8316b07ca703"},{"author":{"_account_id":14447,"name":"lyanchih","email":"lyan.h@inwinstack.com","username":"lyanchih"},"change_message_id":"3b49dee4bb21f4313ae264e265377961341a5b6b","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"                            {\u0027key\u0027: key})"},{"line_number":1085,"context_line":"                continue"},{"line_number":1086,"context_line":"            elif not strutils.is_int_like(value):"},{"line_number":1087,"context_line":"                LOG.warning(_LW(\u0027Flavor had invalid value of quota disk spec: \u0027"},{"line_number":1088,"context_line":"                                \u0027%(key)s\u003d$(value)s\u0027),"},{"line_number":1089,"context_line":"                            {\u0027key\u0027: key, \u0027value\u0027: value})"},{"line_number":1090,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_f5ad7984","line":1087,"in_reply_to":"da20952f_d1e4363d","updated":"2015-11-19 09:16:05.000000000","message":"done","commit_id":"00d1af05418d682e8ae3ae447c2a8316b07ca703"}]}
