)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b2262fc8a673d43490125ad7fb0177453e89500d","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-08-03 18:14:33 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Update OVS driver to work with objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Partially-Implements: blueprint quantum-qos-api"},{"line_number":10,"context_line":"Change-Id: I8926adb0a30728e4f82e55d71ad7e76676a22086"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a4dcd0f_f6a0cf92","line":8,"updated":"2015-08-03 22:20:28.000000000","message":"Also, please expand on commit message since we were asked to be more verbose before.","commit_id":"1e77c19878357d9795b732b9a4996f004a3593e0"}],"neutron/agent/l2/extensions/qos_agent.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2ed26c5e985935166bbf47f63c15d161ca85e754","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \"\"\"Apply Qos rules on port for the first time."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param port: port object."},{"line_number":47,"context_line":"        :param qos_policy: he Qos policy to be apply on port."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        #TODO(Qos) we may want to provide default implementations of calling"},{"line_number":50,"context_line":"        #delete and then update"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_3f7e7faf","line":47,"updated":"2015-07-28 12:50:45.000000000","message":"the","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"af83960d13372a8ce4559ca00c2e2f7750d3fa8e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \"\"\"Apply Qos rules on port for the first time."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param port: port object."},{"line_number":47,"context_line":"        :param qos_policy: he Qos policy to be apply on port."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        #TODO(Qos) we may want to provide default implementations of calling"},{"line_number":50,"context_line":"        #delete and then update"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_059c8a0c","line":47,"in_reply_to":"3a50d1a3_3f7e7faf","updated":"2015-07-28 16:08:30.000000000","message":"Done","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2ed26c5e985935166bbf47f63c15d161ca85e754","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Apply Qos rules on port."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param port: port object."},{"line_number":58,"context_line":"        :param qos_policy: the Qos policy to be apply on port."},{"line_number":59,"context_line":"        \"\"\""},{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_7f5f2741","line":58,"updated":"2015-07-28 12:50:45.000000000","message":"I suggest using QoS acronym everywhere except in class names (there, it\u0027s better to use Qos).","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"af83960d13372a8ce4559ca00c2e2f7750d3fa8e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Apply Qos rules on port."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param port: port object."},{"line_number":58,"context_line":"        :param qos_policy: the Qos policy to be apply on port."},{"line_number":59,"context_line":"        \"\"\""},{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_659b0e19","line":58,"in_reply_to":"3a50d1a3_7f5f2741","updated":"2015-07-28 16:08:30.000000000","message":"Done","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"3916a83ed636027ebeea6d2337a3d73c049cfd94","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        :param port: port object."},{"line_number":47,"context_line":"        :param qos_policy: the QoS policy to be apply on port."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        #TODO(QoS) we may want to provide default implementations of calling"},{"line_number":50,"context_line":"        #delete and then update"},{"line_number":51,"context_line":"        pass"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_55058ebf","line":49,"updated":"2015-08-02 13:36:05.000000000","message":"about this todo, I know it\u0027s unrelated. But I believe that the delete/update sequence could be very specific to OVS or reference implementation but other implementations could need the different events.","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1d9c9b7cd04b383496f90eea9daf341b9dd9a146","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Apply QoS rules on port."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param port: port object."},{"line_number":58,"context_line":"        :param qos_policy: the QoS policy to be apply on port."},{"line_number":59,"context_line":"        \"\"\""},{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_8e81104d","line":58,"updated":"2015-08-04 13:16:35.000000000","message":"Nit: apply -\u003e applied","commit_id":"1753187d490758238a09827f867a2d6542ee941b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6a78df4c3b990ee1f3a528cc51a7da868cfbc631","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Apply QoS rules on port."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param port: port object."},{"line_number":58,"context_line":"        :param qos_policy: the QoS policy to be apply on port."},{"line_number":59,"context_line":"        \"\"\""},{"line_number":60,"context_line":"        pass"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_490a2228","line":58,"in_reply_to":"1a4dcd0f_8e81104d","updated":"2015-08-04 13:32:39.000000000","message":"Done","commit_id":"1753187d490758238a09827f867a2d6542ee941b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1d9c9b7cd04b383496f90eea9daf341b9dd9a146","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        \"\"\"Remove QoS rules from port."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :param port: port object."},{"line_number":67,"context_line":"        :param qos_policy: the QoS policy to be removed from port."},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        pass"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_6e7cc472","line":67,"updated":"2015-08-04 13:16:35.000000000","message":"Nit: apply -\u003e applied","commit_id":"1753187d490758238a09827f867a2d6542ee941b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6a78df4c3b990ee1f3a528cc51a7da868cfbc631","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        \"\"\"Remove QoS rules from port."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :param port: port object."},{"line_number":67,"context_line":"        :param qos_policy: the QoS policy to be removed from port."},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        pass"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_09041a15","line":67,"in_reply_to":"1a4dcd0f_6e7cc472","updated":"2015-08-04 13:32:39.000000000","message":"Done","commit_id":"1753187d490758238a09827f867a2d6542ee941b"}],"neutron/common/utils.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4f8dfeaca3a8af188c73042caee20c9479dd349","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    return \u0027\u0027.join(s.replace(\u0027_\u0027, \u0027 \u0027).title().split())"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def pluralize(s):"},{"line_number":445,"context_line":"    return re.sub("},{"line_number":446,"context_line":"        r\u0027[A-Z]\u0027, lambda m: \"_%s\" % m.group(0).lower(), s)[1:]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_9ceb0fdc","line":444,"updated":"2015-07-28 19:43:02.000000000","message":"How is it pluralizing anything? Shouldn\u0027t it be uncamelize() to match camelize()?","commit_id":"749201923788d6cd4523bb8b2eee49cb801839e3"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"94412b72301701f9b589521609a52d83e24dd686","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    return \u0027\u0027.join(s.replace(\u0027_\u0027, \u0027 \u0027).title().split())"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def pluralize(s):"},{"line_number":445,"context_line":"    return re.sub("},{"line_number":446,"context_line":"        r\u0027[A-Z]\u0027, lambda m: \"_%s\" % m.group(0).lower(), s)[1:]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_7f2b7982","line":444,"in_reply_to":"3a50d1a3_9ceb0fdc","updated":"2015-07-29 07:17:25.000000000","message":"Done","commit_id":"749201923788d6cd4523bb8b2eee49cb801839e3"}],"neutron/plugins/ml2/drivers/openvswitch/agent/extension_drivers/qos_driver.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2ed26c5e985935166bbf47f63c15d161ca85e754","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_4a314bec","line":36,"updated":"2015-07-28 12:50:45.000000000","message":"Just a thought: you could easily construct the handler name dynamically.","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"16c91bbc34a14a5361cff9529bc7c4bfd7447fa1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_4af94b4d","line":36,"in_reply_to":"3a50d1a3_2ae39fda","updated":"2015-07-28 13:03:08.000000000","message":"to find the method, you would:\n\ngetattr(self, \u0027_%(op)s_%(type)s_rule\u0027)(...)","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41cf5df16a98abfb9c83b68570e3cb79c782cb95","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_2ae39fda","line":36,"in_reply_to":"3a50d1a3_4a314bec","updated":"2015-07-28 12:58:58.000000000","message":"I am not sure what you mean","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b3437fb839195b3cb7a0999a553a0eadd621f2a5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_9a7ebe19","line":36,"in_reply_to":"3a50d1a3_4af94b4d","updated":"2015-07-28 13:51:45.000000000","message":"I am change the mapping key to \n(\u0027update\u0027, \u0027QosBandwidthLimitRule\u0027) because we will kill the type attribute. \nso to do what you are asking I need to update the function like \nupdate_qosbandwidthlimitrule is it fine by you?","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"af83960d13372a8ce4559ca00c2e2f7750d3fa8e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_25a18646","line":36,"in_reply_to":"3a50d1a3_90221d53","updated":"2015-07-28 16:08:30.000000000","message":"Done","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8e144c5e72bee7bed5f81bd8b583a73a5c07867a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_90221d53","line":36,"in_reply_to":"3a50d1a3_9a7ebe19","updated":"2015-07-28 14:22:17.000000000","message":"We can have a helper function that will be the opposite to camelize().","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41cf5df16a98abfb9c83b68570e3cb79c782cb95","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":55,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":56,"context_line":"            handler \u003d self.handlers.get((action, str(rule.type)))"},{"line_number":57,"context_line":"            if handler is not None:"},{"line_number":58,"context_line":"                handler(port, rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_ca7ebb1a","line":55,"updated":"2015-07-28 12:58:58.000000000","message":"I don\u0027t like this. we should put all rules in a list not list per rule type","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"16c91bbc34a14a5361cff9529bc7c4bfd7447fa1","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":55,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":56,"context_line":"            handler \u003d self.handlers.get((action, str(rule.type)))"},{"line_number":57,"context_line":"            if handler is not None:"},{"line_number":58,"context_line":"                handler(port, rule)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_8adc33e5","line":55,"in_reply_to":"3a50d1a3_ca7ebb1a","updated":"2015-07-28 13:03:08.000000000","message":"Agreed.","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41cf5df16a98abfb9c83b68570e3cb79c782cb95","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":55,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":56,"context_line":"            handler \u003d self.handlers.get((action, str(rule.type)))"},{"line_number":57,"context_line":"            if handler is not None:"},{"line_number":58,"context_line":"                handler(port, rule)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_2a32bfa7","line":56,"updated":"2015-07-28 12:58:58.000000000","message":"I think we should use obj_name() instead rule.type\nwhy do we have the type field?","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"16c91bbc34a14a5361cff9529bc7c4bfd7447fa1","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":55,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":56,"context_line":"            handler \u003d self.handlers.get((action, str(rule.type)))"},{"line_number":57,"context_line":"            if handler is not None:"},{"line_number":58,"context_line":"                handler(port, rule)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_ead297d0","line":56,"in_reply_to":"3a50d1a3_2a32bfa7","updated":"2015-07-28 13:03:08.000000000","message":"type field is going away in https://review.openstack.org/#/c/205762/2/neutron/objects/qos/rule.py","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"af83960d13372a8ce4559ca00c2e2f7750d3fa8e","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":55,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":56,"context_line":"            handler \u003d self.handlers.get((action, str(rule.type)))"},{"line_number":57,"context_line":"            if handler is not None:"},{"line_number":58,"context_line":"                handler(port, rule)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_c58a22bf","line":56,"in_reply_to":"3a50d1a3_ead297d0","updated":"2015-07-28 16:08:30.000000000","message":"Done","commit_id":"a335a8c76bb6a7c2850bf8fc37333781338212fe"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c634b4c027c553fabdbbf9fe702d5cfd0395da71","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_e76ff728","line":47,"updated":"2015-07-29 12:08:07.000000000","message":"This doesn\u0027t make sense. rule.obj_name() below will be always bandwidth_limit_rule. I think it\u0027s better to call _\u003caction\u003e_qos_bandwidth_limit_rule directly from \u003caction\u003e method.","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"37b62c795817552518e06f765c4e19595bac00c8","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_a2c6bd65","line":47,"in_reply_to":"3a50d1a3_22c86da7","updated":"2015-07-29 12:18:45.000000000","message":"we should change the bandwidth_limit_rules to be just list of object rules, but it is need a spec update","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"8c641906cc9c8dfd6a8cd294844cff96c2fa0eaf","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_6265151c","line":47,"in_reply_to":"3a50d1a3_425b3986","updated":"2015-07-29 12:29:27.000000000","message":"ok I will respin it with TODO","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"daba776f9c4ff8ccc687229b8bc13d16bd4b1f99","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_c26f495e","line":47,"in_reply_to":"3a50d1a3_a2c6bd65","updated":"2015-07-29 12:20:35.000000000","message":"I presume we\u0027ll update the spec post dev.","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c046dd32f323e42e64e03a49fe26efec61e6f74b","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_425b3986","line":47,"in_reply_to":"3a50d1a3_c26f495e","updated":"2015-07-29 12:26:43.000000000","message":"Ah, ok. I talked to Ihar and now I get the glitch in design :)","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c3ff4cff2583c4a6c9041480a4b3a713e7760122","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_22cf0d2a","line":47,"in_reply_to":"3a50d1a3_c26f495e","updated":"2015-07-29 12:26:30.000000000","message":"I suggest to add a TODO here to clean it up when we do switch to single list and go forward.","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"76dfcb396af3f57f23294dc164384d0bd7d41c09","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._handle_rules(\u0027delete\u0027, port, qos_policy)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_22c86da7","line":47,"in_reply_to":"3a50d1a3_e76ff728","updated":"2015-07-29 12:14:24.000000000","message":"It may be other type later.","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2113c59be84f18ab2cf7bb44b1f5d9b8d1d27831","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_861db563","side":"PARENT","line":36,"updated":"2015-07-29 22:06:56.000000000","message":"I\u0027d love to see the generic handlers restored, it\u0027s a good structure to let it grow in the future.\n\nI guess it\u0027s now possible with https://review.openstack.org/#/c/207043/6/neutron/objects/qos/rule.py","commit_id":"85655ee1a6fe07c61a81051c4d073fab7c4911b6"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"d97d8d35a025e041117df89939615ef3f5e32805","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.handlers \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def initialize(self):"},{"line_number":36,"context_line":"        self.handlers[(\u0027update\u0027, qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":37,"context_line":"            self._update_bw_limit_rule)"},{"line_number":38,"context_line":"        self.handlers[(\u0027create\u0027, qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)] \u003d ("},{"line_number":39,"context_line":"            self._update_bw_limit_rule)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_3f1b83cc","side":"PARENT","line":36,"in_reply_to":"3a50d1a3_861db563","updated":"2015-07-29 23:21:33.000000000","message":"I don\u0027t understand this comment . you prefer the handles dict instead of creating the method dynamically from \u003caction\u003e_\u003crule_type\u003e.\nhow is that so different","commit_id":"85655ee1a6fe07c61a81051c4d073fab7c4911b6"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2113c59be84f18ab2cf7bb44b1f5d9b8d1d27831","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        #TODO(QoS) We should switch to single list which contains"},{"line_number":48,"context_line":"        # all rules to allow support of future rules."},{"line_number":49,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":50,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":51,"context_line":"            handler \u003d getattr("}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_0b045015","line":48,"updated":"2015-07-29 22:06:56.000000000","message":"You may want to rebase your patch on top of:\n\nhttps://review.openstack.org/#/c/207043/\n\nSo you will have a list of generic rules.","commit_id":"4546ba5e62770aa06063a9fb2fc96b767a721f9e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4c683f84424f146f29ad5648ab6206728e74e216","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        #TODO(QoS) We should switch to single list which contains"},{"line_number":48,"context_line":"        # all rules to allow support of future rules."},{"line_number":49,"context_line":"        for rule in qos_policy.bandwidth_limit_rules:"},{"line_number":50,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":51,"context_line":"            handler \u003d getattr("}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_6b1b7881","line":48,"in_reply_to":"3a50d1a3_0b045015","updated":"2015-07-30 12:01:30.000000000","message":"Done","commit_id":"4546ba5e62770aa06063a9fb2fc96b767a721f9e"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"52bd2ab0956a706704cdabe45107bec2bdba0dd7","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_a0caf618","line":48,"updated":"2015-07-30 13:50:40.000000000","message":"I believe we should validate here that we actually support the rule types. Probably by filtering out everything out of qos_supported_rule_types defined on OVS mech driver.","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"9372f5bf239816a203b9701b1970afb88d9f64c4","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_3a3b6d3a","line":48,"in_reply_to":"3a50d1a3_03ae54e7","updated":"2015-07-30 15:39:39.000000000","message":"Ok I will do it, I will wait we pushing it up until some of the dependency commits will be merged. let let the gate to breath a little :)","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4d3dbc83ae40420ec4db60e604be22aa5fcab805","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_52dda412","line":48,"in_reply_to":"3a50d1a3_363d6fdd","updated":"2015-08-02 12:12:13.000000000","message":"Done","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d61ce2e6c60b5b343d5d5066283f8c8b5c345710","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_363d6fdd","line":48,"in_reply_to":"3a50d1a3_3a3b6d3a","updated":"2015-08-02 06:47:41.000000000","message":"+1 to filtering in agent. Probably server should do it, but It\u0027s not bad to limit the damage if something goes wrong by adding an extra check here.","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"af5f75cdc359cb825e40ecdad4836010c84235c9","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_c02dc2a9","line":48,"in_reply_to":"3a50d1a3_a0caf618","updated":"2015-07-30 13:54:55.000000000","message":"but, currently we have only just one rule type and I thought that if rule is not support it will be failed on the server side...\ndid I get it wrong?","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"603132e652adf0075c6c094b6cdce9bf3fc4ab59","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_03ae54e7","line":48,"in_reply_to":"3a50d1a3_c02dc2a9","updated":"2015-07-30 13:58:19.000000000","message":"Let\u0027s say you upgrade your L server to M, and in M, we introduced dctp rule type. Then your agent may get it, right?\n\nFrom the other side... The server will probably backport the object for the agent\u0027s version by cutting out those new rules from the object... Hm, probably you are right: if server does its backporting job properly, we\u0027ll see only those types that we support.\n\nThat said, I would still try to be explicit and validate instead of potentially crashing due to bad payload on the wire.\n\nBut I don\u0027t insist now that I thought it thru better. :)","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"232c8d5c1dcfb9bef34c203f84cda1de00bc0904","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"},{"line_number":52,"context_line":"                handler(port, rule)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_8f722949","line":49,"updated":"2015-08-02 10:14:06.000000000","message":"It will raise AttributeError if no handler. Catch and LOG.warning on it.","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"4d3dbc83ae40420ec4db60e604be22aa5fcab805","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":47,"context_line":"        for rule in qos_policy.rules:"},{"line_number":48,"context_line":"            uncamelize_rule_name \u003d utils.uncamelize(rule.obj_name())"},{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"},{"line_number":52,"context_line":"                handler(port, rule)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_12e39cd9","line":49,"in_reply_to":"3a50d1a3_8f722949","updated":"2015-08-02 12:12:13.000000000","message":"Done","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"2d7f4d35a17ee760581cfe8d4fefd572f8acb430","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"},{"line_number":52,"context_line":"                handler(port, rule)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _create_qos_bandwidth_limit_rule(self, port, rule):"},{"line_number":55,"context_line":"        self._update_qos_bandwidth_limit_rule(port, rule)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_b402dfb2","line":52,"updated":"2015-08-01 15:12:17.000000000","message":"If you fixing this, its probably worth adding an error/warning log if the handler is None (or alternatively delete the is not None check so an exception is raised)","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d61ce2e6c60b5b343d5d5066283f8c8b5c345710","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            handler \u003d getattr("},{"line_number":50,"context_line":"                self, \"\".join((\"_\", action, \"_\", uncamelize_rule_name)))"},{"line_number":51,"context_line":"            if handler is not None:"},{"line_number":52,"context_line":"                handler(port, rule)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _create_qos_bandwidth_limit_rule(self, port, rule):"},{"line_number":55,"context_line":"        self._update_qos_bandwidth_limit_rule(port, rule)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_2c21a39e","line":52,"in_reply_to":"3a50d1a3_b402dfb2","updated":"2015-08-02 06:47:41.000000000","message":"while at it: \"if handler is not None\" isn\u0027t equivalent to \"if handler\"","commit_id":"b3293c31cc8ba79c44463e1f2c0ecfd72de6d003"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"921a0f7c99655cd2cd407c0379a666327705b6fb","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class QosOVSAgentDriver(qos_agent.QosAgentDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    _SUPPORTED_RULES \u003d (qos_rule.QosBandwidthLimitRule.obj_name(), )"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self):"},{"line_number":32,"context_line":"        super(QosOVSAgentDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_328498d1","line":29,"updated":"2015-08-02 12:41:37.000000000","message":"This information is already available from ovs mech_driver. We should reuse it from there. If you think it\u0027s not correct to access mech driver class from the agent code, then consider moving the list of supported qos rules into some neutral place and reuse it from both here and the driver class.","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"8b7d501b2f974e8ecafbd6608662742728e093c7","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class QosOVSAgentDriver(qos_agent.QosAgentDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    _SUPPORTED_RULES \u003d (qos_rule.QosBandwidthLimitRule.obj_name(), )"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self):"},{"line_number":32,"context_line":"        super(QosOVSAgentDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_d513de5a","line":29,"in_reply_to":"3a50d1a3_328498d1","updated":"2015-08-02 13:04:15.000000000","message":"maybe I should move the all the validation under \nservices/qos/ml2_validation.py which will contain all the mech drivers validation. \n\n\nalso I don\u0027t understand why we need qos_consts.RULE_TYPE_BANDWIDTH_LIMIT\nwhy not just use the name of the class and then we can kill the rule_type\nthe class name should imply the rule type or I am missing something...","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b9a41771b75c1a92a49f7c7831bf1b80bbda6992","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class QosOVSAgentDriver(qos_agent.QosAgentDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    _SUPPORTED_RULES \u003d (qos_rule.QosBandwidthLimitRule.obj_name(), )"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self):"},{"line_number":32,"context_line":"        super(QosOVSAgentDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_d55cbcef","line":29,"in_reply_to":"3a50d1a3_555eeee9","updated":"2015-08-03 15:30:53.000000000","message":"for now I just import from ml2 we can revisit it later","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6099916a386cdfe04aaaee092bbc67c2600c91f3","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class QosOVSAgentDriver(qos_agent.QosAgentDriver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    _SUPPORTED_RULES \u003d (qos_rule.QosBandwidthLimitRule.obj_name(), )"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self):"},{"line_number":32,"context_line":"        super(QosOVSAgentDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_555eeee9","line":29,"in_reply_to":"3a50d1a3_d513de5a","updated":"2015-08-02 13:28:40.000000000","message":"Yes, we can get rule_type for the object dynamically based on class name. Patches are welcome. :)\n\nAs for the ml2 part, I don\u0027t believe it belongs into services/ directory since it\u0027s specific to ml2.","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"921a0f7c99655cd2cd407c0379a666327705b6fb","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":51,"context_line":"        for rule in qos_policy.rules:"},{"line_number":52,"context_line":"            if rule.obj_name() in self._SUPPORTED_RULES:"},{"line_number":53,"context_line":"                handler_name \u003d (\"\".join((\"_\", action, \"_\","},{"line_number":54,"context_line":"                    utils.uncamelize(rule.obj_name()))))"},{"line_number":55,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_f2d870f1","line":52,"updated":"2015-08-02 12:41:37.000000000","message":"If you go the route suggested above, you would need to determine the type string for each rule. You can do it by accessing rule.rule_type.","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b9a41771b75c1a92a49f7c7831bf1b80bbda6992","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _handle_rules(self, action, port, qos_policy):"},{"line_number":51,"context_line":"        for rule in qos_policy.rules:"},{"line_number":52,"context_line":"            if rule.obj_name() in self._SUPPORTED_RULES:"},{"line_number":53,"context_line":"                handler_name \u003d (\"\".join((\"_\", action, \"_\","},{"line_number":54,"context_line":"                    utils.uncamelize(rule.obj_name()))))"},{"line_number":55,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_b50ed0e3","line":52,"in_reply_to":"3a50d1a3_f2d870f1","updated":"2015-08-03 15:30:53.000000000","message":"Done","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"921a0f7c99655cd2cd407c0379a666327705b6fb","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        for rule in qos_policy.rules:"},{"line_number":52,"context_line":"            if rule.obj_name() in self._SUPPORTED_RULES:"},{"line_number":53,"context_line":"                handler_name \u003d (\"\".join((\"_\", action, \"_\","},{"line_number":54,"context_line":"                    utils.uncamelize(rule.obj_name()))))"},{"line_number":55,"context_line":"                try:"},{"line_number":56,"context_line":"                    handler \u003d getattr(self, handler_name)"},{"line_number":57,"context_line":"                    handler(port, rule)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_b2f50852","line":54,"updated":"2015-08-02 12:41:37.000000000","message":"Since you would have rle.rule_type already, you could avoid uncamelize step, meaning the helper function becomes YAGNI and can be just killed from the patch.","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"3916a83ed636027ebeea6d2337a3d73c049cfd94","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        for rule in qos_policy.rules:"},{"line_number":52,"context_line":"            if rule.obj_name() in self._SUPPORTED_RULES:"},{"line_number":53,"context_line":"                handler_name \u003d (\"\".join((\"_\", action, \"_\","},{"line_number":54,"context_line":"                    utils.uncamelize(rule.obj_name()))))"},{"line_number":55,"context_line":"                try:"},{"line_number":56,"context_line":"                    handler \u003d getattr(self, handler_name)"},{"line_number":57,"context_line":"                    handler(port, rule)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_552cae49","line":54,"in_reply_to":"3a50d1a3_b2f50852","updated":"2015-08-02 13:36:05.000000000","message":"I agree using rule_type may be easier now. (yikes, lots of back and forth here...).","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"921a0f7c99655cd2cd407c0379a666327705b6fb","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    handler(port, rule)"},{"line_number":58,"context_line":"                except AttributeError:"},{"line_number":59,"context_line":"                    LOG.error("},{"line_number":60,"context_line":"                        _LE(\u0027getattr failed to get handler %s\u0027), handler_name)"},{"line_number":61,"context_line":"            else:"},{"line_number":62,"context_line":"                LOG.warning(_LW(\u0027rule id %(rule_id)s of type %s(rule_type)s \u0027"},{"line_number":63,"context_line":"                                \u0027was filtered\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_12e4fca5","line":60,"updated":"2015-08-02 12:41:37.000000000","message":"Seems too python specific. Instead, say something like: \"Failed to locate a handler for %(rule_type) rules; skipping.\"","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b9a41771b75c1a92a49f7c7831bf1b80bbda6992","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    handler(port, rule)"},{"line_number":58,"context_line":"                except AttributeError:"},{"line_number":59,"context_line":"                    LOG.error("},{"line_number":60,"context_line":"                        _LE(\u0027getattr failed to get handler %s\u0027), handler_name)"},{"line_number":61,"context_line":"            else:"},{"line_number":62,"context_line":"                LOG.warning(_LW(\u0027rule id %(rule_id)s of type %s(rule_type)s \u0027"},{"line_number":63,"context_line":"                                \u0027was filtered\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_75f928c8","line":60,"in_reply_to":"3a50d1a3_12e4fca5","updated":"2015-08-03 15:30:53.000000000","message":"Done","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"921a0f7c99655cd2cd407c0379a666327705b6fb","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    LOG.error("},{"line_number":60,"context_line":"                        _LE(\u0027getattr failed to get handler %s\u0027), handler_name)"},{"line_number":61,"context_line":"            else:"},{"line_number":62,"context_line":"                LOG.warning(_LW(\u0027rule id %(rule_id)s of type %s(rule_type)s \u0027"},{"line_number":63,"context_line":"                                \u0027was filtered\u0027),"},{"line_number":64,"context_line":"                            {\u0027rule_id\u0027: rule.id, \u0027rule_type\u0027: rule.obj_name()})"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_f28630b8","line":62,"updated":"2015-08-02 12:41:37.000000000","message":"\"Unsupported QoS rule type for %(rule_id)s: %(rule_type)s; skipping.\"","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b9a41771b75c1a92a49f7c7831bf1b80bbda6992","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    LOG.error("},{"line_number":60,"context_line":"                        _LE(\u0027getattr failed to get handler %s\u0027), handler_name)"},{"line_number":61,"context_line":"            else:"},{"line_number":62,"context_line":"                LOG.warning(_LW(\u0027rule id %(rule_id)s of type %s(rule_type)s \u0027"},{"line_number":63,"context_line":"                                \u0027was filtered\u0027),"},{"line_number":64,"context_line":"                            {\u0027rule_id\u0027: rule.id, \u0027rule_type\u0027: rule.obj_name()})"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_3503a0ba","line":62,"in_reply_to":"3a50d1a3_f28630b8","updated":"2015-08-03 15:30:53.000000000","message":"Done","commit_id":"9b634b581341fc11187eca53370883787501ec37"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"06c34f02943d5f61648af24176f9c170a79503b9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self._update_bandwidth_limit(port, rule)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _update_bandwidth_limit(self, port, rule):"},{"line_number":72,"context_line":"        port_name \u003d port.get(\u0027name\u0027)"},{"line_number":73,"context_line":"        max_kbps \u003d rule.max_kbps"},{"line_number":74,"context_line":"        max_burst_kbps \u003d rule.max_burst_kbps"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_16821b01","line":72,"updated":"2015-08-03 22:19:03.000000000","message":"I\u0027ve played with the patch a bit in devstack and I think there is a bug that we haven\u0027t spotted yet: port_name should be extracted as port.get(\u0027vif_port\u0027).port_name. Port dicts don\u0027t generally have names themselves, and we need to rely on VIF object here. Otherwise port_name is None, and then ovs_lib crashes when attempting to apply QoS to \"None\" port.\n\nThis should be caught by upcoming functional tests but still, we should fix it before that.","commit_id":"1e77c19878357d9795b732b9a4996f004a3593e0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"5bd3e0d7d28048681dcafdc1c65cbf9c8879115c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self._update_bandwidth_limit(port, rule)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _update_bandwidth_limit(self, port, rule):"},{"line_number":71,"context_line":"        port_name \u003d port[\u0027vif_port\u0027].port_name"},{"line_number":72,"context_line":"        max_kbps \u003d rule.max_kbps"},{"line_number":73,"context_line":"        max_burst_kbps \u003d rule.max_burst_kbps"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a4dcd0f_52409956","line":71,"updated":"2015-08-04 10:38:16.000000000","message":"I look into ovs_neutron_agent.py, and it seems to me that vif_port is set only if there is binding to do. We may need to change that there so that we always have vif_port.","commit_id":"5a3ae06e9b3aab72359b485a25d871932600c8cf"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9717204600d08c0976e59106c19dbc7aa0d58a67","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            if rule.rule_type in self._SUPPORTED_RULES:"},{"line_number":54,"context_line":"                handler_name \u003d (\"\".join((\"_\", action, \"_\", rule.rule_type)))"},{"line_number":55,"context_line":"                try:"},{"line_number":56,"context_line":"                    handler \u003d getattr(self, handler_name)"},{"line_number":57,"context_line":"                    handler(port, rule)"},{"line_number":58,"context_line":"                except AttributeError:"},{"line_number":59,"context_line":"                    LOG.error("}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_0e4740bc","line":56,"updated":"2015-08-04 13:17:50.000000000","message":"I think we shouldn\u0027t handle missing handler. The fact we didn\u0027t implement handler for supported type is a fatal error that shouldn\u0027t happen.","commit_id":"1753187d490758238a09827f867a2d6542ee941b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1eb561a872dadaf55d47a53ccd639a32fc3eb2a8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            if rule.rule_type in self._SUPPORTED_RULES:"},{"line_number":54,"context_line":"                handler_name \u003d (\"\".join((\"_\", action, \"_\", rule.rule_type)))"},{"line_number":55,"context_line":"                try:"},{"line_number":56,"context_line":"                    handler \u003d getattr(self, handler_name)"},{"line_number":57,"context_line":"                    handler(port, rule)"},{"line_number":58,"context_line":"                except AttributeError:"},{"line_number":59,"context_line":"                    LOG.error("}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_497a2226","line":56,"in_reply_to":"1a4dcd0f_0e4740bc","updated":"2015-08-04 13:19:47.000000000","message":"I wouldn\u0027t mind I guess.","commit_id":"1753187d490758238a09827f867a2d6542ee941b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6a78df4c3b990ee1f3a528cc51a7da868cfbc631","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            if rule.rule_type in self._SUPPORTED_RULES:"},{"line_number":54,"context_line":"                handler_name \u003d (\"\".join((\"_\", action, \"_\", rule.rule_type)))"},{"line_number":55,"context_line":"                try:"},{"line_number":56,"context_line":"                    handler \u003d getattr(self, handler_name)"},{"line_number":57,"context_line":"                    handler(port, rule)"},{"line_number":58,"context_line":"                except AttributeError:"},{"line_number":59,"context_line":"                    LOG.error("}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a48f4d22","line":56,"in_reply_to":"1a4dcd0f_497a2226","updated":"2015-08-04 13:32:39.000000000","message":"Done","commit_id":"1753187d490758238a09827f867a2d6542ee941b"}],"neutron/tests/unit/common/test_utils.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c634b4c027c553fabdbbf9fe702d5cfd0395da71","unresolved":false,"context_lines":[{"line_number":696,"context_line":"    def test_uncamelize(self):"},{"line_number":697,"context_line":"        data \u003d {\u0027bandwidth_limit\u0027: \u0027BandwidthLimit\u0027,"},{"line_number":698,"context_line":"                \u0027test\u0027: \u0027Test\u0027,"},{"line_number":699,"context_line":"                \u0027a_penguin_walks_into_a_bar\u0027: \u0027APenguinWalksIntoABar\u0027}"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        for expected, s in data.items():"},{"line_number":702,"context_line":"            self.assertEqual(expected, utils.uncamelize(s))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_a77fafa9","line":699,"updated":"2015-07-29 12:08:07.000000000","message":"\u003cnot_funny_joke\u003e Given that penguin walks into a bar in camelize(), shouldn\u0027t it go out in uncamelize()? \u003c/not_funny_joke\u003e","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"76dfcb396af3f57f23294dc164384d0bd7d41c09","unresolved":false,"context_lines":[{"line_number":696,"context_line":"    def test_uncamelize(self):"},{"line_number":697,"context_line":"        data \u003d {\u0027bandwidth_limit\u0027: \u0027BandwidthLimit\u0027,"},{"line_number":698,"context_line":"                \u0027test\u0027: \u0027Test\u0027,"},{"line_number":699,"context_line":"                \u0027a_penguin_walks_into_a_bar\u0027: \u0027APenguinWalksIntoABar\u0027}"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        for expected, s in data.items():"},{"line_number":702,"context_line":"            self.assertEqual(expected, utils.uncamelize(s))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_0249b130","line":699,"in_reply_to":"3a50d1a3_a77fafa9","updated":"2015-07-29 12:14:24.000000000","message":"I think pengiuns should not be bound to each other. They are individuals, and should have freedom to fail independently.","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"}],"neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/extension_drivers/test_qos_driver.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c634b4c027c553fabdbbf9fe702d5cfd0395da71","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    ovs_test_base)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class OVSQoSAgentDriverBwLimitRule(ovs_test_base.OVSAgentConfigTestBase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(OVSQoSAgentDriverBwLimitRule, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_a72d6fa9","line":25,"updated":"2015-07-29 12:08:07.000000000","message":"QosOVSAgentDriverTestCase?","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"37b62c795817552518e06f765c4e19595bac00c8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    ovs_test_base)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class OVSQoSAgentDriverBwLimitRule(ovs_test_base.OVSAgentConfigTestBase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(OVSQoSAgentDriverBwLimitRule, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_22a94d90","line":25,"in_reply_to":"3a50d1a3_a72d6fa9","updated":"2015-07-29 12:18:45.000000000","message":"I can respin it and update the name","commit_id":"d7337e84c03e9dc002eb9e5730928c436b4c4cdd"}]}
