)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06ad1081613f672220764e4fc0e5b92bb88837fb","unresolved":false,"context_lines":[{"line_number":9,"context_line":"New way of validation if QoS policy can be applied on port/network based on"},{"line_number":10,"context_line":"port_types."},{"line_number":11,"context_line":"In ML2 core plugin it base on vif_type and/or vnic type for unbound"},{"line_number":12,"context_line":"ports. For example bandiwdth_limit_rule can have parameter \"direction\" with"},{"line_number":13,"context_line":"possible values \"ingress\" and \"egress\". Some of mechanism drivers can support"},{"line_number":14,"context_line":"only one of those directions."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"1aa78d24_2d2132b5","line":12,"range":{"start_line":12,"start_character":19,"end_line":12,"end_character":28},"updated":"2016-07-05 11:53:26.000000000","message":"nit: bandwidth","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a2756e8578d039aa07f6573f915e361faed26445","unresolved":false,"context_lines":[{"line_number":9,"context_line":"New way of validation if QoS policy can be applied on port/network based on"},{"line_number":10,"context_line":"port_types."},{"line_number":11,"context_line":"In ML2 core plugin it base on vif_type and/or vnic type for unbound"},{"line_number":12,"context_line":"ports. For example bandiwdth_limit_rule can have parameter \"direction\" with"},{"line_number":13,"context_line":"possible values \"ingress\" and \"egress\". Some of mechanism drivers can support"},{"line_number":14,"context_line":"only one of those directions."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"1aa78d24_98f4c687","line":12,"range":{"start_line":12,"start_character":19,"end_line":12,"end_character":28},"in_reply_to":"1aa78d24_2d2132b5","updated":"2016-07-05 20:18:33.000000000","message":"fixed. You are sniper to find something like that :) thx","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"New way of validation of QoS policy can be applied on port/network based on"},{"line_number":10,"context_line":"port_types. It can validate if port can support rule by rule_type and also by"},{"line_number":11,"context_line":"rule parameters or some values of parameters."},{"line_number":12,"context_line":"In ML2 core plugin it base on vif_type and/or vnic type for unbound"},{"line_number":13,"context_line":"ports. For example bandwidth_limit_rule can have parameter \"direction\" with"},{"line_number":14,"context_line":"possible values \"ingress\" and \"egress\". Some of mechanism drivers can support"},{"line_number":15,"context_line":"only one of those directions."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"bacf61ea_f4634fda","line":12,"updated":"2016-07-29 15:43:02.000000000","message":"in the future, consider splitting sections with newlines...","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":9,"context_line":"New way of validation of QoS policy can be applied on port/network based on"},{"line_number":10,"context_line":"port_types. It can validate if port can support rule by rule_type and also by"},{"line_number":11,"context_line":"rule parameters or some values of parameters."},{"line_number":12,"context_line":"In ML2 core plugin it base on vif_type and/or vnic type for unbound"},{"line_number":13,"context_line":"ports. For example bandwidth_limit_rule can have parameter \"direction\" with"},{"line_number":14,"context_line":"possible values \"ingress\" and \"egress\". Some of mechanism drivers can support"},{"line_number":15,"context_line":"only one of those directions."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"bacf61ea_3bc64c9a","line":12,"in_reply_to":"bacf61ea_f4634fda","updated":"2016-08-01 21:28:34.000000000","message":"Ok. I will remember that.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Co-Authored-By: Miguel Angel Ajo \u003cmajopela@redhat.com\u003e"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I293b09934a08b7af803d674f7eeea963a078acdd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"bacf61ea_74f47ff1","line":28,"updated":"2016-07-29 15:43:02.000000000","message":"missing RFE bug number. Do we also have a bp?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Co-Authored-By: Miguel Angel Ajo \u003cmajopela@redhat.com\u003e"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I293b09934a08b7af803d674f7eeea963a078acdd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"bacf61ea_fb3e7489","line":28,"in_reply_to":"bacf61ea_74f47ff1","updated":"2016-08-01 21:28:34.000000000","message":"I removed it temporary in one of earlier PS because bug status was changed from triaged to \"in progress\" each time I pushed new PS.\nNow it is added again.\nBlueprint for this is also created so I added info about it too.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"098cfb80f14049ee48e444818fff3310eea003ad","unresolved":false,"context_lines":[{"line_number":10,"context_line":"port_types. It can validate if port can support rule by rule_type and also by"},{"line_number":11,"context_line":"rule parameters or some values of parameters."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"In ML2 core plugin it base on vif_type and/or vnic type for unbound"},{"line_number":14,"context_line":"ports. For example bandwidth_limit_rule can have parameter \"direction\" with"},{"line_number":15,"context_line":"possible values \"ingress\" and \"egress\". Some of mechanism drivers can support"},{"line_number":16,"context_line":"only one of those directions."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"fa6399be_9840aaa7","line":13,"range":{"start_line":13,"start_character":60,"end_line":13,"end_character":67},"updated":"2016-10-12 10:28:01.000000000","message":"have you considered to validate at bind_port time (ie. reject binding) for unbound ports?","commit_id":"80e2e6c4ed271ab214fbeb5865e80ceb37244d68"}],"doc/source/devref/quality_of_service.rst":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"098cfb80f14049ee48e444818fff3310eea003ad","unresolved":false,"context_lines":[{"line_number":99,"context_line":"Any plugin or Ml2 mechanism driver can claim support for some QoS rule types by"},{"line_number":100,"context_line":"providing a plugin/driver class property called \u0027supported_qos_rule_types\u0027 that"},{"line_number":101,"context_line":"should return a dict of rule types as keys and dict with supported parameter"},{"line_number":102,"context_line":"names with supported values. Such dict should looks like:"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":".. code_block:: python"},{"line_number":105,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":27,"id":"fa6399be_f81c46c3","line":102,"range":{"start_line":102,"start_character":46,"end_line":102,"end_character":51},"updated":"2016-10-12 10:28:01.000000000","message":"look","commit_id":"80e2e6c4ed271ab214fbeb5865e80ceb37244d68"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"098cfb80f14049ee48e444818fff3310eea003ad","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        \u0027DSCP_MARK\u0027: {\u0027dscp_mark\u0027: qos_consts.ANY_VALUE},"},{"line_number":107,"context_line":"        \u0027BANDWIDTH_LIMIT\u0027: {\u0027max_kbps\u0027 : qos_consts.ANY_VALUE,"},{"line_number":108,"context_line":"                            \u0027direction\u0027: [\u0027egress\u0027]}}"},{"line_number":109,"context_line":"    }"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"In this example, BANDWIDTH_LIMIT does support max_kbps with any possible value"},{"line_number":112,"context_line":"and direction with value \"egress\"."}],"source_content_type":"text/x-rst","patch_set":27,"id":"fa6399be_38c07ee0","line":109,"updated":"2016-10-12 10:28:01.000000000","message":"have you considered to use the validator api similar to (or same as) api extensions?","commit_id":"80e2e6c4ed271ab214fbeb5865e80ceb37244d68"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"098cfb80f14049ee48e444818fff3310eea003ad","unresolved":false,"context_lines":[{"line_number":111,"context_line":"In this example, BANDWIDTH_LIMIT does support max_kbps with any possible value"},{"line_number":112,"context_line":"and direction with value \"egress\"."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"For Ml2 plugin, the list of supported QoS rule types is defined as aggregated"},{"line_number":115,"context_line":"set of rules supported by all active mechanism drivers."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":27,"id":"fa6399be_18065ace","line":114,"range":{"start_line":114,"start_character":67,"end_line":114,"end_character":77},"updated":"2016-10-12 10:28:01.000000000","message":"to me, from this text it wasn\u0027t obvious how those dicts are supposed to be aggregated.","commit_id":"80e2e6c4ed271ab214fbeb5865e80ceb37244d68"}],"neutron/extensions/qos.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027rules\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False, \u0027is_visible\u0027: True},"},{"line_number":65,"context_line":"    },"},{"line_number":66,"context_line":"    \u0027rule_types\u0027: {"},{"line_number":67,"context_line":"        \u0027port_type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":68,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":69,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_97c65147","line":66,"updated":"2016-05-31 08:16:50.000000000","message":"I think this modifies also the semantics of get_rule_types function.","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027rules\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False, \u0027is_visible\u0027: True},"},{"line_number":65,"context_line":"    },"},{"line_number":66,"context_line":"    \u0027rule_types\u0027: {"},{"line_number":67,"context_line":"        \u0027port_type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":68,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":69,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_a437b7fd","line":66,"in_reply_to":"9abb7d3a_97c65147","updated":"2016-05-31 20:15:15.000000000","message":"I think that it\u0027s not. New attributes are optional. This is response which I have in my devstack to old API call:\n\nDEBUG: keystoneauth.session REQ: curl -g -i -X GET http://127.0.0.1:9696/v2.0/qos/rule-types.json -H \"User-Agent: python-neutronclient\" -H \"Accept: application/json\" -H \"X-Auth-Token: {SHA1}37593acb288f731cd0debbbf237d7be02295fe4b\"\nDEBUG: keystoneauth.session RESP: [200] Content-Type: application/json Content-Length: 71 X-Openstack-Request-Id: req-cc155c62-3a4c-43f5-9af1-e9a040432023 Date: Tue, 31 May 2016 19:42:54 GMT Connection: keep-alive \nRESP BODY: {\"rule_types\": [{\"type\": \"dscp_marking\"}, {\"type\": \"bandwidth_limit\"}]}","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        pass"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    @abc.abstractmethod"},{"line_number":296,"context_line":"    def get_rule_types_per_driver(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":297,"context_line":"                                 sorts\u003dNone, limit\u003dNone, marker\u003dNone,"},{"line_number":298,"context_line":"                                 page_reverse\u003dFalse):"},{"line_number":299,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_57022970","line":296,"updated":"2016-05-31 08:16:50.000000000","message":"I\u0027d say _per_port_type, as \"driver\" is very ml2 specific.","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        pass"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    @abc.abstractmethod"},{"line_number":296,"context_line":"    def get_rule_types_per_driver(self, context, filters\u003dNone, fields\u003dNone,"},{"line_number":297,"context_line":"                                 sorts\u003dNone, limit\u003dNone, marker\u003dNone,"},{"line_number":298,"context_line":"                                 page_reverse\u003dFalse):"},{"line_number":299,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_c7eabd0e","line":296,"in_reply_to":"9abb7d3a_57022970","updated":"2016-05-31 20:15:15.000000000","message":"Done","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027rules\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False, \u0027is_visible\u0027: True},"},{"line_number":65,"context_line":"    },"},{"line_number":66,"context_line":"    \u0027rule_types\u0027: {"},{"line_number":67,"context_line":"        \u0027port_type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":68,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":69,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_e67a4987","line":66,"range":{"start_line":66,"start_character":0,"end_line":66,"end_character":19},"updated":"2016-06-08 13:12:01.000000000","message":"I believe you get 404 for rule_types_per_port_type because you need to declare a new entry here \u0027rule_types_per_port_type\u0027 instead of modifying the old one.","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9c435247eaab2da10a3fa1c2bafafaeb1f514137","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":64,"context_line":"        \u0027rules\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False, \u0027is_visible\u0027: True},"},{"line_number":65,"context_line":"    },"},{"line_number":66,"context_line":"    \u0027rule_types\u0027: {"},{"line_number":67,"context_line":"        \u0027port_type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":68,"context_line":"                      \u0027is_visible\u0027: True},"},{"line_number":69,"context_line":"        \u0027type\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_6ee60be9","line":66,"range":{"start_line":66,"start_character":0,"end_line":66,"end_character":19},"in_reply_to":"7aa08908_e67a4987","updated":"2016-06-11 20:15:13.000000000","message":"Yes. I thought so :) It\u0027s working now","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"}],"neutron/objects/qos/rule_type.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    fields \u003d {"},{"line_number":40,"context_line":"        \u0027type\u0027: RuleTypeField(),"},{"line_number":41,"context_line":"        \u0027parameters\u0027: obj_fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027agent_type\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    # we don\u0027t receive context because we don\u0027t need db access at all"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_ebade9e9","line":42,"updated":"2016-06-08 13:12:01.000000000","message":"agent_type is something bound to ml2 or agent-based plugins. I believe we should come up with a more neutral name.","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9c435247eaab2da10a3fa1c2bafafaeb1f514137","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    fields \u003d {"},{"line_number":40,"context_line":"        \u0027type\u0027: RuleTypeField(),"},{"line_number":41,"context_line":"        \u0027parameters\u0027: obj_fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027agent_type\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    # we don\u0027t receive context because we don\u0027t need db access at all"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_0e1827d2","line":42,"in_reply_to":"7aa08908_ebade9e9","updated":"2016-06-11 20:15:13.000000000","message":"Maybe \"port_type\" would be better?","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"}],"neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    supported_qos_rule_types \u003d {"},{"line_number":61,"context_line":"        qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":62,"context_line":"            \"max_kbps\": [],"},{"line_number":63,"context_line":"            \"max_burst_kbps\": [],"},{"line_number":64,"context_line":"        }"},{"line_number":65,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_1416e3a6","line":62,"updated":"2016-07-29 15:43:02.000000000","message":"doesn\u0027t it make those parameters not supported? then what is supported? it seems like all the rule has.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    supported_qos_rule_types \u003d {"},{"line_number":61,"context_line":"        qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":62,"context_line":"            \"max_kbps\": [],"},{"line_number":63,"context_line":"            \"max_burst_kbps\": [],"},{"line_number":64,"context_line":"        }"},{"line_number":65,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_712d83a7","line":62,"in_reply_to":"bacf61ea_1416e3a6","updated":"2016-08-01 21:28:34.000000000","message":"I forgot to change it. Fixed","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    supported_qos_rule_types \u003d {"},{"line_number":61,"context_line":"        qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":62,"context_line":"            \"max_kbps\": [],"},{"line_number":63,"context_line":"            \"max_burst_kbps\": [],"},{"line_number":64,"context_line":"        }"},{"line_number":65,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_bb021808","line":62,"in_reply_to":"bacf61ea_1416e3a6","updated":"2016-08-01 14:56:55.000000000","message":"It makes them supported, but I guess we have to change this to make it more inline with the spec now.\n\nqos_consts.ANY_VALUE ?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/plugins/ml2/drivers/openvswitch/mech_driver/mech_openvswitch.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"00dba258ccf9c3fb55527003e28f7a4e3c2e39dd","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        },"},{"line_number":48,"context_line":"        # empty dict of parameters means that it supports all parameters for"},{"line_number":49,"context_line":"        # this rule:"},{"line_number":50,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {}"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_276277d8","line":50,"updated":"2016-05-23 09:07:56.000000000","message":"May be we should add the existing fields, this way if new fields are added to the rule, but the existing implementation is not updated (or can\u0027t handle it) the rules with those fields will not be accepted for the port.","commit_id":"72be46e70e089f956edaddf09fdca242ec74afec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"be1a5030964099942b6feb6493c740d9e79b0f98","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        },"},{"line_number":48,"context_line":"        # empty dict of parameters means that it supports all parameters for"},{"line_number":49,"context_line":"        # this rule:"},{"line_number":50,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {}"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_7d2367bd","line":50,"in_reply_to":"bab6814e_276277d8","updated":"2016-05-23 11:35:04.000000000","message":"I made it like that because I didn\u0027t want to list here all parameters and all possibly values which are supported. IMHO it\u0027s easier to set empty dict which will mean that this rule is supported \"in genera\" with all parameters.\nWhat You think?","commit_id":"72be46e70e089f956edaddf09fdca242ec74afec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"00dba258ccf9c3fb55527003e28f7a4e3c2e39dd","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        # empty dict of parameters means that it supports all parameters for"},{"line_number":49,"context_line":"        # this rule:"},{"line_number":50,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {}"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self):"},{"line_number":54,"context_line":"        sg_enabled \u003d securitygroups_rpc.is_firewall_enabled()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_078bf368","line":51,"updated":"2016-05-23 09:07:56.000000000","message":"may be we should add another parameter to the mechanism driver, indicating which specific vnic types are handled by the mech driver. (not sure if we already have that).\n\nThat way we could match which mechanism driver will handle things by vnic type.","commit_id":"72be46e70e089f956edaddf09fdca242ec74afec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"be1a5030964099942b6feb6493c740d9e79b0f98","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        # empty dict of parameters means that it supports all parameters for"},{"line_number":49,"context_line":"        # this rule:"},{"line_number":50,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {}"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self):"},{"line_number":54,"context_line":"        sg_enabled \u003d securitygroups_rpc.is_firewall_enabled()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_3d143f4b","line":51,"in_reply_to":"bab6814e_078bf368","updated":"2016-05-23 11:35:04.000000000","message":"You mean \"binding type\" or something else?\nBut what with applying policy to the network? should it then be checked for all ports in network?\nImagine network in which You have ports bound with openvswitch and linuxbridge mech_drivers. Ovs supports dscp_mark and linuxbridge not. If user will apply new QoS policy with dscp_mark rule to such network what should be expected behaviour? Should it fails because can\u0027t be applied to some ports or maybe should be applied on ports on which it is possible?\nI assumed for now that if You have linuxbridge and ovs mech_drivers loaded then You don\u0027t have available dscp_mark rule at all.","commit_id":"72be46e70e089f956edaddf09fdca242ec74afec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"54c2a6b0e7ea50a0de34dff88014db355b1a08d5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        # empty dict of parameters means that it supports all parameters for"},{"line_number":49,"context_line":"        # this rule:"},{"line_number":50,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {}"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self):"},{"line_number":54,"context_line":"        sg_enabled \u003d securitygroups_rpc.is_firewall_enabled()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_80233755","line":51,"in_reply_to":"bab6814e_3d143f4b","updated":"2016-05-23 14:30:02.000000000","message":"Ok. I think it could be like:\n\n* if policy is applied to port, then binding of this port is checked and if according to this binding type qos rules from policy are validated. If binding type not supports QoS rule/rules or some parameters of rules then API will return error\n\n* if policy is applied to network than all ports from such network are checked and if any of them has got binding which doesn\u0027t support QoS rule or parameters then it also fails\n\nWhat You think about such solution?","commit_id":"72be46e70e089f956edaddf09fdca242ec74afec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    supported_qos_rule_types \u003d {"},{"line_number":45,"context_line":"        qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":46,"context_line":"            \"max_kbps\": [],"},{"line_number":47,"context_line":"            \"max_burst_kbps\": []"},{"line_number":48,"context_line":"        },"},{"line_number":49,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":50,"context_line":"            \"dscp_mark\": []"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_54317959","line":47,"updated":"2016-06-13 07:47:09.000000000","message":"please add a comma here to be consistant with:\nhttps://review.openstack.org/#/c/319694/15/neutron/plugins/ml2/drivers/linuxbridge/mech_driver/mech_linuxbridge.py","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    supported_qos_rule_types \u003d {"},{"line_number":45,"context_line":"        qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":46,"context_line":"            \"max_kbps\": [],"},{"line_number":47,"context_line":"            \"max_burst_kbps\": []"},{"line_number":48,"context_line":"        },"},{"line_number":49,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":50,"context_line":"            \"dscp_mark\": []"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_b81d1275","line":47,"in_reply_to":"7aa08908_54317959","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            \"max_burst_kbps\": []"},{"line_number":48,"context_line":"        },"},{"line_number":49,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":50,"context_line":"            \"dscp_mark\": []"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":"    }"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_b4325d5c","line":50,"updated":"2016-06-13 07:47:09.000000000","message":"ditto","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            \"max_burst_kbps\": []"},{"line_number":48,"context_line":"        },"},{"line_number":49,"context_line":"        qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":50,"context_line":"            \"dscp_mark\": []"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":"    }"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_180f063a","line":50,"in_reply_to":"7aa08908_b4325d5c","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"}],"neutron/plugins/ml2/managers.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # types dynamically"},{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_265bb1f7","line":374,"updated":"2016-06-08 13:12:01.000000000","message":"warning: we\u0027re using a private attribute here, may be we should provide a public version of it.","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7075dc116a89b9d44233070851427ceee8e2effe","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # types dynamically"},{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_512f8b87","line":374,"in_reply_to":"7aa08908_265bb1f7","updated":"2016-06-08 14:16:21.000000000","message":"I can change it but it was (and is) like that in method supported_qos_rule_types (L343). Should I change it in both places?","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9c435247eaab2da10a3fa1c2bafafaeb1f514137","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # types dynamically"},{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_ee767b04","line":374,"in_reply_to":"7aa08908_30f46759","updated":"2016-06-11 20:15:13.000000000","message":"ok :)","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2d9be01ee0c7f571cf9799795ad7175eaf28dbea","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        # types dynamically"},{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_30f46759","line":374,"in_reply_to":"7aa08908_512f8b87","updated":"2016-06-08 18:45:30.000000000","message":"Well, it\u0027s a simple method that check\u0027s if the base MechanismDriver method bind_port was changed.\n\nSince this is all under the ml2 tree, it\u0027s unlikely to get broken, ignore my comment :)","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"},{"line_number":378,"context_line":"                        driver_obj.supported_qos_rule_types"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_34478dbd","line":375,"updated":"2016-06-13 07:47:09.000000000","message":"please use brackets instead of the \\","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"},{"line_number":378,"context_line":"                        driver_obj.supported_qos_rule_types"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_f3217b9f","line":375,"in_reply_to":"7aa08908_34478dbd","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"46bcde99358e2ac05953b89268859bd48782113d","unresolved":false,"context_lines":[{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"},{"line_number":378,"context_line":"                        driver_obj.supported_qos_rule_types"},{"line_number":379,"context_line":"        return supported_rules"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_aab31499","line":377,"updated":"2016-06-13 08:56:54.000000000","message":"same here \"\\\" to brackets.","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and\\"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0:"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d \\"},{"line_number":378,"context_line":"                        driver_obj.supported_qos_rule_types"},{"line_number":379,"context_line":"        return supported_rules"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_533b2fd1","line":377,"in_reply_to":"7aa08908_aab31499","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"c33841e284551bb32426afb63095f04e67866e51","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if (hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0):"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d ("},{"line_number":378,"context_line":"                        driver_obj.supported_qos_rule_types)"},{"line_number":379,"context_line":"        return supported_rules"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_090b3ed6","line":376,"range":{"start_line":375,"start_character":19,"end_line":376,"end_character":67},"updated":"2016-06-18 00:35:59.000000000","message":"I think only one condition will suffice. \n(hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) if it return false then we know len(driver_obj.supported_qos_rule_types) is gonna return 0","commit_id":"1d5553083a03b3875f553361ba9be8745048bcb7"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"0ec1feb8bf5b1d8c93477c16ae87c683abfbe805","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":373,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":374,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":375,"context_line":"                if (hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and"},{"line_number":376,"context_line":"                    len(driver_obj.supported_qos_rule_types) !\u003d 0):"},{"line_number":377,"context_line":"                    supported_rules[driver.name] \u003d ("},{"line_number":378,"context_line":"                        driver_obj.supported_qos_rule_types)"},{"line_number":379,"context_line":"        return supported_rules"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a9d85d2_312403ae","line":376,"range":{"start_line":375,"start_character":19,"end_line":376,"end_character":67},"in_reply_to":"7aa08908_090b3ed6","updated":"2016-06-21 20:05:05.000000000","message":"but if hasattr will return True then still supported_qos_rule_types dict can be empty that\u0027s why we are checking lenght of it also.","commit_id":"1d5553083a03b3875f553361ba9be8745048bcb7"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06ad1081613f672220764e4fc0e5b92bb88837fb","unresolved":false,"context_lines":[{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        if binding_driver_found:"},{"line_number":357,"context_line":"            rule_types \u003d list(set(rule_types))"},{"line_number":358,"context_line":"        else:"},{"line_number":359,"context_line":"            rule_types \u003d []"},{"line_number":360,"context_line":"        LOG.debug(\"Supported QoS rule types \""},{"line_number":361,"context_line":"                  \"(common subset for all mech drivers): %s\", rule_types)"},{"line_number":362,"context_line":"        return rule_types"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_4d42be3f","line":359,"range":{"start_line":358,"start_character":8,"end_line":359,"end_character":27},"updated":"2016-07-05 11:53:26.000000000","message":"Like the comment in line 366 - this can be removed since if binding_driver_found\u003dFalse, rule_types is initialized to an empty list anyhow and it should not have changed during the loop.","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a2756e8578d039aa07f6573f915e361faed26445","unresolved":false,"context_lines":[{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        if binding_driver_found:"},{"line_number":357,"context_line":"            rule_types \u003d list(set(rule_types))"},{"line_number":358,"context_line":"        else:"},{"line_number":359,"context_line":"            rule_types \u003d []"},{"line_number":360,"context_line":"        LOG.debug(\"Supported QoS rule types \""},{"line_number":361,"context_line":"                  \"(common subset for all mech drivers): %s\", rule_types)"},{"line_number":362,"context_line":"        return rule_types"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_18e1f6d0","line":359,"range":{"start_line":358,"start_character":8,"end_line":359,"end_character":27},"in_reply_to":"1aa78d24_4d42be3f","updated":"2016-07-05 20:18:33.000000000","message":"right. changed","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06ad1081613f672220764e4fc0e5b92bb88837fb","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    @property"},{"line_number":365,"context_line":"    def supported_qos_rule_types_per_port_type(self):"},{"line_number":366,"context_line":"        if not self.ordered_mech_drivers:"},{"line_number":367,"context_line":"            return {}"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        supported_rules \u003d {}"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_d2312b0d","line":367,"range":{"start_line":366,"start_character":8,"end_line":367,"end_character":21},"updated":"2016-07-05 11:53:26.000000000","message":"nit: This is redundant: if self.ordered_mech_drivers is an empty iterable, then line 374 will never occur and supported_rules will remain an empty dict. In other words: this can be removed and the code will still work as intended.","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a2756e8578d039aa07f6573f915e361faed26445","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    @property"},{"line_number":365,"context_line":"    def supported_qos_rule_types_per_port_type(self):"},{"line_number":366,"context_line":"        if not self.ordered_mech_drivers:"},{"line_number":367,"context_line":"            return {}"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        supported_rules \u003d {}"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_f877ca37","line":367,"range":{"start_line":366,"start_character":8,"end_line":367,"end_character":21},"in_reply_to":"1aa78d24_d2312b0d","updated":"2016-07-05 20:18:33.000000000","message":"this method is now removed :)","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06ad1081613f672220764e4fc0e5b92bb88837fb","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        # Recalculate on every call to allow drivers determine supported rule"},{"line_number":372,"context_line":"        # types dynamically"},{"line_number":373,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":374,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":375,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":376,"context_line":"                if (hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_8d91469c","line":373,"range":{"start_line":373,"start_character":8,"end_line":373,"end_character":48},"updated":"2016-07-05 11:53:26.000000000","message":"The main part of this for loop is a code duplication of lines 342-346. With some effort I\u0027m sure we can find a way to generalize it to avoid the dup - mayhaps use a generator to return all driver_obj with \u0027supported_qos_rule_types\u0027?","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a2756e8578d039aa07f6573f915e361faed26445","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        # Recalculate on every call to allow drivers determine supported rule"},{"line_number":372,"context_line":"        # types dynamically"},{"line_number":373,"context_line":"        for driver in self.ordered_mech_drivers:"},{"line_number":374,"context_line":"            driver_obj \u003d driver.obj"},{"line_number":375,"context_line":"            if driver_obj._supports_port_binding:"},{"line_number":376,"context_line":"                if (hasattr(driver_obj, \u0027supported_qos_rule_types\u0027) and"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_989fa64f","line":373,"range":{"start_line":373,"start_character":8,"end_line":373,"end_character":48},"in_reply_to":"1aa78d24_8d91469c","updated":"2016-07-05 20:18:33.000000000","message":"this method is now removed :)","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        return self.mechanism_manager.supported_qos_rule_types"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    @property"},{"line_number":223,"context_line":"    def supported_qos_rule_types_per_driver(self):"},{"line_number":224,"context_line":"        return self.mechanism_manager.supported_qos_rule_types_per_driver"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_b7b1d591","line":223,"updated":"2016-05-31 08:16:50.000000000","message":"we may want to translate to per-port type here. So this interface is agnostic to the ML2 details.","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        return self.mechanism_manager.supported_qos_rule_types"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    @property"},{"line_number":223,"context_line":"    def supported_qos_rule_types_per_driver(self):"},{"line_number":224,"context_line":"        return self.mechanism_manager.supported_qos_rule_types_per_driver"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_27dc6972","line":223,"in_reply_to":"9abb7d3a_b7b1d591","updated":"2016-05-31 20:15:15.000000000","message":"Yes, I changed it here also","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":759,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":760,"context_line":"            )"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"            need_network_update_notify \u003d False"},{"line_number":763,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":764,"context_line":"            if (qos_consts.QOS_POLICY_ID in net_data and"},{"line_number":765,"context_line":"                original_network[qos_consts.QOS_POLICY_ID] !\u003d"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_d74a99ab","line":762,"updated":"2016-05-31 08:16:50.000000000","message":"we don\u0027t need that ^we\u0027re not using it.","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":759,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":760,"context_line":"            )"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"            need_network_update_notify \u003d False"},{"line_number":763,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":764,"context_line":"            if (qos_consts.QOS_POLICY_ID in net_data and"},{"line_number":765,"context_line":"                original_network[qos_consts.QOS_POLICY_ID] !\u003d"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_c738fda2","line":762,"in_reply_to":"9abb7d3a_d74a99ab","updated":"2016-05-31 20:15:15.000000000","message":"I reverted it to state before this patch. This flag is used in L779 still","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            if (qos_consts.QOS_POLICY_ID in net_data and"},{"line_number":765,"context_line":"                original_network[qos_consts.QOS_POLICY_ID] !\u003d"},{"line_number":766,"context_line":"                updated_network[qos_consts.QOS_POLICY_ID]):"},{"line_number":767,"context_line":"                need_network_update_notify \u003d True"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"            mech_context \u003d driver_context.NetworkContext("},{"line_number":770,"context_line":"                self, context, updated_network,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_37c84522","line":767,"updated":"2016-05-31 08:16:50.000000000","message":"neither this  ^\n\nWe have it for ports because we send notifications to the agent on important (agent needs to know) port changes.","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":764,"context_line":"            if (qos_consts.QOS_POLICY_ID in net_data and"},{"line_number":765,"context_line":"                original_network[qos_consts.QOS_POLICY_ID] !\u003d"},{"line_number":766,"context_line":"                updated_network[qos_consts.QOS_POLICY_ID]):"},{"line_number":767,"context_line":"                need_network_update_notify \u003d True"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"            mech_context \u003d driver_context.NetworkContext("},{"line_number":770,"context_line":"                self, context, updated_network,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_c75f5de3","line":767,"in_reply_to":"9abb7d3a_37c84522","updated":"2016-05-31 20:15:15.000000000","message":"As I said in previous comment, it is used in L779","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2463e21fca4435eee808fe642b7cb99b5a0fa635","unresolved":false,"context_lines":[{"line_number":735,"context_line":"        objects \u003d self._create_bulk_ml2(attributes.NETWORK, context, networks)"},{"line_number":736,"context_line":"        return [obj[\u0027result\u0027] for obj in objects]"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"    def update_network(self, context, id, network):"},{"line_number":739,"context_line":"        net_data \u003d network[attributes.NETWORK]"},{"line_number":740,"context_line":"        provider._raise_if_updates_provider_attributes(net_data)"},{"line_number":741,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_0c9885bf","line":738,"updated":"2016-06-13 09:00:46.000000000","message":"may be we will need some sort of decorator on the functions, to extract the inner exception out of the callback exception, specially when the inner exception is HTTP translatable.","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":735,"context_line":"        objects \u003d self._create_bulk_ml2(attributes.NETWORK, context, networks)"},{"line_number":736,"context_line":"        return [obj[\u0027result\u0027] for obj in objects]"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"    def update_network(self, context, id, network):"},{"line_number":739,"context_line":"        net_data \u003d network[attributes.NETWORK]"},{"line_number":740,"context_line":"        provider._raise_if_updates_provider_attributes(net_data)"},{"line_number":741,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_d3743f9d","line":738,"in_reply_to":"7aa08908_0c9885bf","updated":"2016-06-13 20:57:13.000000000","message":"but should we do it in this patch? or maybe in new one and report it as \"bug\" now? I don\u0027t think that this patch is best place to do that :)","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8850a0f537e251658a06f759de33dd75861fbf5f","unresolved":false,"context_lines":[{"line_number":735,"context_line":"        objects \u003d self._create_bulk_ml2(attributes.NETWORK, context, networks)"},{"line_number":736,"context_line":"        return [obj[\u0027result\u0027] for obj in objects]"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"    def update_network(self, context, id, network):"},{"line_number":739,"context_line":"        net_data \u003d network[attributes.NETWORK]"},{"line_number":740,"context_line":"        provider._raise_if_updates_provider_attributes(net_data)"},{"line_number":741,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_7f9d3bbb","line":738,"in_reply_to":"7aa08908_d3743f9d","updated":"2016-06-14 08:22:54.000000000","message":"Yes, probably a second patch is better.","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06ad1081613f672220764e4fc0e5b92bb88837fb","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        return self.mechanism_manager.supported_qos_rule_types"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    @property"},{"line_number":225,"context_line":"    def supported_qos_rule_types_per_port_type(self):"},{"line_number":226,"context_line":"        return self.mechanism_manager.supported_qos_rule_types_per_port_type"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_0dcb96a6","line":225,"range":{"start_line":225,"start_character":8,"end_line":225,"end_character":46},"updated":"2016-07-05 11:53:26.000000000","message":"I haven\u0027t focused on ml2 in a while, but I\u0027ve been wondering - who uses this new functionality? I\u0027ve grepped the code but found no one who calls this function (or the manager\u0027s function of the same name).","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a2756e8578d039aa07f6573f915e361faed26445","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        return self.mechanism_manager.supported_qos_rule_types"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    @property"},{"line_number":225,"context_line":"    def supported_qos_rule_types_per_port_type(self):"},{"line_number":226,"context_line":"        return self.mechanism_manager.supported_qos_rule_types_per_port_type"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @log_helpers.log_method_call"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_7842ba11","line":225,"range":{"start_line":225,"start_character":8,"end_line":225,"end_character":46},"in_reply_to":"1aa78d24_0dcb96a6","updated":"2016-07-05 20:18:33.000000000","message":"You\u0027re right. I forgot to remove it when I drop new API call to show users such rule types. I removed it now. Thx.","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"76601d126b554cbad319be686f12a71802a60272","unresolved":false,"context_lines":[{"line_number":759,"context_line":"            self.type_manager.extend_network_dict_provider(context,"},{"line_number":760,"context_line":"                                                           updated_network)"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"            kwargs \u003d {"},{"line_number":763,"context_line":"                \u0027context\u0027: context,"},{"line_number":764,"context_line":"                \u0027updated_network\u0027: updated_network,"},{"line_number":765,"context_line":"                \u0027original_network\u0027: original_network"}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_c9c61b99","line":762,"updated":"2016-07-27 13:25:18.000000000","message":"Have a look at this:\n\nhttps://review.openstack.org/#/c/341212/15/neutron/services/trunk/callbacks.py\n\nIt seems that we have an effort to define the payload of callbacks in classes.","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"634c8a27b0d2071da987ce4ebd6ba6176cf21261","unresolved":false,"context_lines":[{"line_number":759,"context_line":"            self.type_manager.extend_network_dict_provider(context,"},{"line_number":760,"context_line":"                                                           updated_network)"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"            kwargs \u003d {"},{"line_number":763,"context_line":"                \u0027context\u0027: context,"},{"line_number":764,"context_line":"                \u0027updated_network\u0027: updated_network,"},{"line_number":765,"context_line":"                \u0027original_network\u0027: original_network"}],"source_content_type":"text/x-python","patch_set":23,"id":"bacf61ea_2f76d83d","line":762,"in_reply_to":"bacf61ea_803f9c24","updated":"2016-08-01 18:52:44.000000000","message":"I made something like that but I\u0027m not sure if it is what You want exactly :)","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a9e4c9942e598480328c3d1ed2d1cb15153437ab","unresolved":false,"context_lines":[{"line_number":759,"context_line":"            self.type_manager.extend_network_dict_provider(context,"},{"line_number":760,"context_line":"                                                           updated_network)"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"            kwargs \u003d {"},{"line_number":763,"context_line":"                \u0027context\u0027: context,"},{"line_number":764,"context_line":"                \u0027updated_network\u0027: updated_network,"},{"line_number":765,"context_line":"                \u0027original_network\u0027: original_network"}],"source_content_type":"text/x-python","patch_set":23,"id":"bacf61ea_803f9c24","line":762,"in_reply_to":"dada55a8_c9c61b99","updated":"2016-07-27 19:45:53.000000000","message":"Ok. I will change it","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"081e2a0e1590a64b332aa8d00dafd518eb3d847c","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            }"},{"line_number":767,"context_line":"            registry.notify("},{"line_number":768,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":769,"context_line":"            )"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":772,"context_line":"            need_network_update_notify \u003d ("}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_d85cf9ef","line":769,"updated":"2016-07-17 19:57:46.000000000","message":"why is this called in the transaction? is there anyway of knowing that the callback is under a transaction? this could cause timeout issues if the app binding to the callback is not aware that it is under a transaction\n\nIn addition to this this callback is invoked via neutron/services/auto_allocate/db.py. Could that cause a problem?","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"634c8a27b0d2071da987ce4ebd6ba6176cf21261","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            }"},{"line_number":767,"context_line":"            registry.notify("},{"line_number":768,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":769,"context_line":"            )"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":772,"context_line":"            need_network_update_notify \u003d ("}],"source_content_type":"text/x-python","patch_set":23,"id":"bacf61ea_12b4d732","line":769,"in_reply_to":"bacf61ea_a090e0ed","updated":"2016-08-01 18:52:44.000000000","message":"I don\u0027t know if it is possible to translate Callbackfailure exception in same way like they did it. They are passing simple new exception class and raise it when callbackfailure was catched. We have 4 different classes of exceptions and those exceptions are already translated to Callbackfailure so I don\u0027t know how to \"retranslate\" it again :/\najo: maybe You will have some idea how to do it.","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a9e4c9942e598480328c3d1ed2d1cb15153437ab","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            }"},{"line_number":767,"context_line":"            registry.notify("},{"line_number":768,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":769,"context_line":"            )"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":772,"context_line":"            need_network_update_notify \u003d ("}],"source_content_type":"text/x-python","patch_set":23,"id":"bacf61ea_a090e0ed","line":769,"in_reply_to":"dada55a8_8958a38b","updated":"2016-07-27 19:45:53.000000000","message":"I will try to use similar mechanism to translate Callbackfailure exception for something else.\nFor event, I can change it for PRECOMMIT_UPDATE if it is better for You :)","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"76601d126b554cbad319be686f12a71802a60272","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            }"},{"line_number":767,"context_line":"            registry.notify("},{"line_number":768,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":769,"context_line":"            )"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":772,"context_line":"            need_network_update_notify \u003d ("}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_8958a38b","line":769,"in_reply_to":"dada55a8_c04b2058","updated":"2016-07-27 13:25:18.000000000","message":"About only doing QoS checks; this is a callback mechanism, and any other validation could hook into this and do other stuff.\n\nBtw, callers of this function should already capture exceptions like in L748. \n\n@slawek: We should probably be ready to translate exceptions.Callbackfailure into a more meaningful exception for the upper layers (See neutron.db.securitygroups_db.py / SecurityGroupsDbMiin._registry_notify)\n\nI start to suspect this is more a PRECOMMIT_UPDATE event which is expected to happen within a transaction.\n\nAn alternative could be a BEFORE_UPDATE outside of the transaction, but that doesn\u0027t catch the case where you check the network, and before updating the policy a new incompatible port is added.","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fe46f89eff8beef1630339a868afb91a5789690a","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            }"},{"line_number":767,"context_line":"            registry.notify("},{"line_number":768,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":769,"context_line":"            )"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":772,"context_line":"            need_network_update_notify \u003d ("}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_c04b2058","line":769,"in_reply_to":"dada55a8_d85cf9ef","updated":"2016-07-24 16:26:40.000000000","message":"I made it in transaction because I think that such check should be done before updated network is saved in db and also I need original and updated network. If You think it can be done outside transaction somehow, I can change it of course.\n\nCalling it by neutron/services/auto_allocate/db.py shouldn\u0027t cause problems because it will not do any check in QoS validation in fact (qos policy is not changed then)","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"76601d126b554cbad319be686f12a71802a60272","unresolved":false,"context_lines":[{"line_number":1312,"context_line":"                \u0027original_port\u0027: original_port"},{"line_number":1313,"context_line":"            }"},{"line_number":1314,"context_line":"            registry.notify("},{"line_number":1315,"context_line":"                resources.PORT, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":1316,"context_line":"            )"},{"line_number":1317,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."},{"line_number":1318,"context_line":"            # Follow https://review.openstack.org/#/c/169223 for a solution."}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_24c1dee4","line":1315,"updated":"2016-07-27 13:25:18.000000000","message":"This probably shall also be PRECOMMIT_UPDATE","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":798,"context_line":"                \u0027original_network\u0027: original_network"},{"line_number":799,"context_line":"            }"},{"line_number":800,"context_line":"            registry.notify("},{"line_number":801,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":802,"context_line":"            )"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_fb1f7058","line":801,"updated":"2016-08-01 14:56:55.000000000","message":"weren\u0027t we talking of PRECOMMIT_UPDATE ?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":798,"context_line":"                \u0027original_network\u0027: original_network"},{"line_number":799,"context_line":"            }"},{"line_number":800,"context_line":"            registry.notify("},{"line_number":801,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":802,"context_line":"            )"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_b2c98bae","line":801,"in_reply_to":"bacf61ea_111fc308","updated":"2016-08-01 21:28:34.000000000","message":"Please check my last comments in PS23 for that","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"931e673f56a770c0a159fa771df0ecaf6820af29","unresolved":false,"context_lines":[{"line_number":798,"context_line":"                \u0027original_network\u0027: original_network"},{"line_number":799,"context_line":"            }"},{"line_number":800,"context_line":"            registry.notify("},{"line_number":801,"context_line":"                attributes.NETWORK, events.BEFORE_UPDATE, self, **kwargs"},{"line_number":802,"context_line":"            )"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"            # TODO(QoS): Move out to the extension framework somehow."}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_111fc308","line":801,"in_reply_to":"bacf61ea_fb1f7058","updated":"2016-08-01 14:57:44.000000000","message":"Sorry, I forgot about the PS23 \u0026 PS24 thing :D ignore this line.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/services/qos/notification_drivers/manager.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        ports_ids \u003d qos_policy.get_bound_ports()"},{"line_number":51,"context_line":"        for port_id in ports_ids:"},{"line_number":52,"context_line":"            port \u003d core_plugin.get_port(context, port_id)"},{"line_number":53,"context_line":"            for driver in self.notification_drivers:"},{"line_number":54,"context_line":"                driver.validate_policy_for_port("},{"line_number":55,"context_line":"                    context, qos_policy, port)"},{"line_number":56,"context_line":"        networks_ids \u003d qos_policy.get_bound_networks()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_e5aeb82c","line":53,"updated":"2016-06-08 13:12:01.000000000","message":"oh nice :)","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":50,"context_line":"        ports_ids \u003d qos_policy.get_bound_ports()"},{"line_number":51,"context_line":"        for port_id in ports_ids:"},{"line_number":52,"context_line":"            port \u003d core_plugin.get_port(context, port_id)"},{"line_number":53,"context_line":"            for driver in self.notification_drivers:"},{"line_number":54,"context_line":"                driver.validate_policy_for_port("},{"line_number":55,"context_line":"                    context, qos_policy, port)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_3b3953a5","line":52,"updated":"2016-07-29 15:43:02.000000000","message":"Can\u0027t we pull all ports with get_ports? I think filters support multiple values per filter, in which case we apply \u0027in\u0027 operator. So you would pass:\n\nfilters\u003d{\u0027id\u0027: ports_ids}\n\nThat should be better for performance.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":50,"context_line":"        ports_ids \u003d qos_policy.get_bound_ports()"},{"line_number":51,"context_line":"        for port_id in ports_ids:"},{"line_number":52,"context_line":"            port \u003d core_plugin.get_port(context, port_id)"},{"line_number":53,"context_line":"            for driver in self.notification_drivers:"},{"line_number":54,"context_line":"                driver.validate_policy_for_port("},{"line_number":55,"context_line":"                    context, qos_policy, port)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_dba70c09","line":52,"in_reply_to":"bacf61ea_3b3953a5","updated":"2016-08-01 14:56:55.000000000","message":"Good idea :)","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":50,"context_line":"        ports_ids \u003d qos_policy.get_bound_ports()"},{"line_number":51,"context_line":"        for port_id in ports_ids:"},{"line_number":52,"context_line":"            port \u003d core_plugin.get_port(context, port_id)"},{"line_number":53,"context_line":"            for driver in self.notification_drivers:"},{"line_number":54,"context_line":"                driver.validate_policy_for_port("},{"line_number":55,"context_line":"                    context, qos_policy, port)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_71ef43e9","line":52,"in_reply_to":"bacf61ea_3b3953a5","updated":"2016-08-01 21:28:34.000000000","message":"I changed it according to all Your 3 comments here. Should be better now.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                    context, qos_policy, port)"},{"line_number":56,"context_line":"        networks_ids \u003d qos_policy.get_bound_networks()"},{"line_number":57,"context_line":"        for network_id in networks_ids:"},{"line_number":58,"context_line":"            network \u003d core_plugin.get_network(context, network_id)"},{"line_number":59,"context_line":"            for driver in self.notification_drivers:"},{"line_number":60,"context_line":"                driver.validate_policy_for_network("},{"line_number":61,"context_line":"                    context, qos_policy, network)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_1bda8f4c","line":58,"updated":"2016-07-29 15:43:02.000000000","message":"ditto for get_networks","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                    context, qos_policy, port)"},{"line_number":56,"context_line":"        networks_ids \u003d qos_policy.get_bound_networks()"},{"line_number":57,"context_line":"        for network_id in networks_ids:"},{"line_number":58,"context_line":"            network \u003d core_plugin.get_network(context, network_id)"},{"line_number":59,"context_line":"            for driver in self.notification_drivers:"},{"line_number":60,"context_line":"                driver.validate_policy_for_network("},{"line_number":61,"context_line":"                    context, qos_policy, network)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_51ecbff2","line":58,"in_reply_to":"bacf61ea_1bda8f4c","updated":"2016-08-01 21:28:34.000000000","message":"same here","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        for network_id in networks_ids:"},{"line_number":58,"context_line":"            network \u003d core_plugin.get_network(context, network_id)"},{"line_number":59,"context_line":"            for driver in self.notification_drivers:"},{"line_number":60,"context_line":"                driver.validate_policy_for_network("},{"line_number":61,"context_line":"                    context, qos_policy, network)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _load_drivers(self, notification_drivers):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_7bb2ab07","line":60,"updated":"2016-07-29 15:43:02.000000000","message":"shouldn\u0027t you avoid handling ports that were already handled in lines 51-55? Otherwise you burn cpu with duplicate validations.\n\nI believe there should be no validate_policy_for_network at all, and this method should prepare the list of ports and call just validate_policy_for_port for each port found (those attached to qos policy directly or thru a network)","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        for network_id in networks_ids:"},{"line_number":58,"context_line":"            network \u003d core_plugin.get_network(context, network_id)"},{"line_number":59,"context_line":"            for driver in self.notification_drivers:"},{"line_number":60,"context_line":"                driver.validate_policy_for_network("},{"line_number":61,"context_line":"                    context, qos_policy, network)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _load_drivers(self, notification_drivers):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_bbe058ce","line":60,"in_reply_to":"bacf61ea_7bb2ab07","updated":"2016-08-01 14:56:55.000000000","message":"Hmm, not only because that checks vs network and port policy burning CPU, the policies could be different, and the one really being applied is the one on the port.\n\nSo, we should consider that, and remove the validate_policy_for_network, let\u0027s make it a little bit simpler.\n\nThanks Ihar!","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        for network_id in networks_ids:"},{"line_number":58,"context_line":"            network \u003d core_plugin.get_network(context, network_id)"},{"line_number":59,"context_line":"            for driver in self.notification_drivers:"},{"line_number":60,"context_line":"                driver.validate_policy_for_network("},{"line_number":61,"context_line":"                    context, qos_policy, network)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _load_drivers(self, notification_drivers):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_91a757bc","line":60,"in_reply_to":"bacf61ea_7bb2ab07","updated":"2016-08-01 21:28:34.000000000","message":"You\u0027re right. I changed it.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        for network_id in networks_ids:"},{"line_number":58,"context_line":"            network \u003d core_plugin.get_network(context, network_id)"},{"line_number":59,"context_line":"            for driver in self.notification_drivers:"},{"line_number":60,"context_line":"                driver.validate_policy_for_network("},{"line_number":61,"context_line":"                    context, qos_policy, network)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _load_drivers(self, notification_drivers):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_8d11cc06","line":60,"in_reply_to":"bacf61ea_bbe058ce","updated":"2016-08-01 21:28:34.000000000","message":"Please check how it is done now","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/services/qos/notification_drivers/message_queue.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if vif_type and vif_type !\u003d portbindings.VIF_TYPE_UNBOUND:"},{"line_number":81,"context_line":"            mechdrivers \u003d VIF_TYPE_TO_MECH_DRIVERS.get(vif_type)"},{"line_number":82,"context_line":"            check_by_vnic_type \u003d False"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            mechdrivers \u003d VNIC_TYPE_TO_MECH_DRIVERS.get(vnic_type)"},{"line_number":85,"context_line":"            check_by_vnic_type \u003d True"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_72a65b11","line":82,"updated":"2016-05-31 08:16:50.000000000","message":"ahaa! :)","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if vif_type and vif_type !\u003d portbindings.VIF_TYPE_UNBOUND:"},{"line_number":81,"context_line":"            mechdrivers \u003d VIF_TYPE_TO_MECH_DRIVERS.get(vif_type)"},{"line_number":82,"context_line":"            check_by_vnic_type \u003d False"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            mechdrivers \u003d VNIC_TYPE_TO_MECH_DRIVERS.get(vnic_type)"},{"line_number":85,"context_line":"            check_by_vnic_type \u003d True"}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_e7df0138","line":82,"in_reply_to":"9abb7d3a_72a65b11","updated":"2016-05-31 20:15:15.000000000","message":"?","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"class RpcQosServiceNotificationDriver("},{"line_number":179,"context_line":"    Ml2QoSServiceNotificationDriver,"},{"line_number":180,"context_line":"    qos_base.QosServiceNotificationDriverBase):"},{"line_number":181,"context_line":"    \"\"\"RPC message queue service notification driver for QoS.\"\"\""},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_12038f0e","line":179,"updated":"2016-05-31 08:16:50.000000000","message":"IMHO it shall be the other way around, Ml2QoSServiceNotification driver subclasses the other.\n\nAlso, out of POC we may want to move this implementation under the ml2 plugin tree.","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"class RpcQosServiceNotificationDriver("},{"line_number":179,"context_line":"    Ml2QoSServiceNotificationDriver,"},{"line_number":180,"context_line":"    qos_base.QosServiceNotificationDriverBase):"},{"line_number":181,"context_line":"    \"\"\"RPC message queue service notification driver for QoS.\"\"\""},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_277bc929","line":179,"in_reply_to":"9abb7d3a_12038f0e","updated":"2016-05-31 20:15:15.000000000","message":"So You want to move Ml2QoSServiceNotificationDriver somewhere to plugins/ml2 directory? And it should inherits from RpcQoSServiceNotificationDriver then, yes?","commit_id":"277eb59592bb4437a0d30e98603a2876a691a498"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"dc013143cbf069ec5073a5dea4a6554a3f12e7f7","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.notification_api.push(context, policy, events.DELETED)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":62,"context_line":"        #No validataion of rules in message_queue driver"},{"line_number":63,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"fad55976_f4d585b9","line":62,"range":{"start_line":62,"start_character":12,"end_line":62,"end_character":23},"updated":"2016-07-15 17:01:28.000000000","message":"s/validataion/validation","commit_id":"553b8c28eedb52ee732610b64a780379a88c526a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b69fdd39802d6a57261e41d3680d61b4f4a8a1d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.notification_api.push(context, policy, events.DELETED)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":62,"context_line":"        #No validataion of rules in message_queue driver"},{"line_number":63,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"dada55a8_8903590d","line":62,"range":{"start_line":62,"start_character":12,"end_line":62,"end_character":23},"in_reply_to":"fad55976_f4d585b9","updated":"2016-07-17 08:45:23.000000000","message":"Done","commit_id":"553b8c28eedb52ee732610b64a780379a88c526a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def delete_policy(self, context, policy):"},{"line_number":59,"context_line":"        self.notification_api.push(context, policy, events.DELETED)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":62,"context_line":"        #No validation of rules in message_queue driver"},{"line_number":63,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_74a0ff43","line":61,"updated":"2016-07-29 15:43:02.000000000","message":"the fact that you need to define it here suggests that it\u0027s misplaced. notification drivers are not to be used as a catch-all entry point for everything you may want to trigger during service plugin workflow.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def delete_policy(self, context, policy):"},{"line_number":59,"context_line":"        self.notification_api.push(context, policy, events.DELETED)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":62,"context_line":"        #No validation of rules in message_queue driver"},{"line_number":63,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_db5c2c7f","line":61,"in_reply_to":"bacf61ea_74a0ff43","updated":"2016-08-01 14:56:55.000000000","message":"I disagree with this.\n\nThis \"Notification driver thing\" is our interface from the QoSPlugin to the Plugin backend. We were intending to avoid people re-writing the QoSPlugin every time, and sucking from DB themselves. (It should probably be renamed to QoSDriver or QoSBackendDriver, or something more reasonable within the neutron context.\n\nIf we move this validation to the core plugin itself, we\u0027re re-coupling the implementation, and moving a lot of logic back to the core plugin.\n\nI\u0027d say, let\u0027s rename this notification driver thing to QoSDriver, and let\u0027s put any plugin-related logic here on isolation.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def delete_policy(self, context, policy):"},{"line_number":59,"context_line":"        self.notification_api.push(context, policy, events.DELETED)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":62,"context_line":"        #No validation of rules in message_queue driver"},{"line_number":63,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_bb2d1c48","line":61,"in_reply_to":"bacf61ea_74a0ff43","updated":"2016-08-01 21:28:34.000000000","message":"So You think it should be removed from QosServiceNotificationDriverBase abstract class and only implemented in some notification drivers (like this one for ML2)?\nOr I don\u0027t understand something? can You give me some example where it could be placed?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1a27658ec0e12d741bf39cdf24a2869f15a50efe","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def delete_policy(self, context, policy):"},{"line_number":59,"context_line":"        self.notification_api.push(context, policy, events.DELETED)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":62,"context_line":"        #No validation of rules in message_queue driver"},{"line_number":63,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_fdd29dcf","line":61,"in_reply_to":"bacf61ea_bb2d1c48","updated":"2016-08-02 09:06:46.000000000","message":"Yeah, Ihar, I see your point. Although one of the goals during QoS service development was to avoid adding mixins to the core plugin (adding methods manually it\u0027s another way of \"mixin\" stuff in).\n\nOn the other hand, we\u0027ve got to a model where we need to configure also more knobs in config. May be we could have a function in core plugin to say \"this is/those are my qos-driver(s) if you want to enable the qos service\"\n\n\nI\u0027m in doubt now.\n\nI\u0027m going to pull a diagraming tool and see how the whole QoS architecture looks now, and would look in both cases.\n\nSlawek, let\u0027s pause for a second and look at the diagrams, I will ping you here today with the results, and we can look at them.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"96a28aa45156de230585d2e6ae0c2e71929114d8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    def delete_policy(self, context, policy):"},{"line_number":59,"context_line":"        self.notification_api.push(context, policy, events.DELETED)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":62,"context_line":"        #No validation of rules in message_queue driver"},{"line_number":63,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_7caec52e","line":61,"in_reply_to":"bacf61ea_db5c2c7f","updated":"2016-08-01 21:22:59.000000000","message":"Well, let\u0027s rename notification driver then.\n\nIrrespective to above, I still believe that there is no reason to decouple validation from the core plugin here, because it\u0027s actually very core plugin specific. For ml2, it\u0027s especially visible: how you rely on port bindings and types and manager etc. \u0027Notification driver\u0027 or \u0027qos service plugin\u0027 may have some layer to drive validation, but it\u0027s the plugin that should answer the question whether a specific port/policy relation makes sense.\n\nOne of hints that there is no real decoupling is the fact that you name the \u0027notification\u0027 driver ml2_*, and that you require configuration file change just to enable validation that should be enabled out of the box.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/services/qos/notification_drivers/ml2_notification_driver.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":39,"context_line":"# TODO(slaweq/ajo): make this extensible in the class, so out-of-tree mechanism"},{"line_number":40,"context_line":"#                   drivers could add more mappings here (midonet, ovn, etc...)"},{"line_number":41,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":42,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":43,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":44,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_708e082f","line":42,"updated":"2016-06-08 13:12:01.000000000","message":"I start to think that we must provide a list of VNICs each mechanism driver handles (in the mechanism driver itself, as we do for supported rule types). This way we decouple it from here.","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7075dc116a89b9d44233070851427ceee8e2effe","unresolved":false,"context_lines":[{"line_number":39,"context_line":"# TODO(slaweq/ajo): make this extensible in the class, so out-of-tree mechanism"},{"line_number":40,"context_line":"#                   drivers could add more mappings here (midonet, ovn, etc...)"},{"line_number":41,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":42,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":43,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":44,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_910bb3d5","line":42,"in_reply_to":"7aa08908_708e082f","updated":"2016-06-08 14:16:21.000000000","message":"Ok, but should it be in this patch (which is already huge) or maybe should I propose it as different patch and then rebase this one?","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9c435247eaab2da10a3fa1c2bafafaeb1f514137","unresolved":false,"context_lines":[{"line_number":39,"context_line":"# TODO(slaweq/ajo): make this extensible in the class, so out-of-tree mechanism"},{"line_number":40,"context_line":"#                   drivers could add more mappings here (midonet, ovn, etc...)"},{"line_number":41,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":42,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":43,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":44,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_cefd7fb2","line":42,"in_reply_to":"7aa08908_90b55b7f","updated":"2016-06-11 20:15:13.000000000","message":"Ok, todo added","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2d9be01ee0c7f571cf9799795ad7175eaf28dbea","unresolved":false,"context_lines":[{"line_number":39,"context_line":"# TODO(slaweq/ajo): make this extensible in the class, so out-of-tree mechanism"},{"line_number":40,"context_line":"#                   drivers could add more mappings here (midonet, ovn, etc...)"},{"line_number":41,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":42,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":43,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":44,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_90b55b7f","line":42,"in_reply_to":"7aa08908_910bb3d5","updated":"2016-06-08 18:45:30.000000000","message":"it can be reasonable to add a TODO here with the plan/explanation.","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# TODO(slaweq): find mapping for other vif_types to mech_drivers also:"},{"line_number":47,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":48,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_BRIDGE: ["},{"line_number":50,"context_line":"        mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":51,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_30712045","line":48,"updated":"2016-06-08 13:12:01.000000000","message":"Same for this. If we don\u0027t have it already.","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7075dc116a89b9d44233070851427ceee8e2effe","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# TODO(slaweq): find mapping for other vif_types to mech_drivers also:"},{"line_number":47,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":48,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_BRIDGE: ["},{"line_number":50,"context_line":"        mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":51,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_31247f5c","line":48,"in_reply_to":"7aa08908_30712045","updated":"2016-06-08 14:16:21.000000000","message":"AFAIK there is no anything like that. Same question as above here :)","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2d9be01ee0c7f571cf9799795ad7175eaf28dbea","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# TODO(slaweq): find mapping for other vif_types to mech_drivers also:"},{"line_number":47,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":48,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_BRIDGE: ["},{"line_number":50,"context_line":"        mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":51,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_501bf380","line":48,"in_reply_to":"7aa08908_31247f5c","updated":"2016-06-08 18:45:30.000000000","message":"Same reply :D","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9c435247eaab2da10a3fa1c2bafafaeb1f514137","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# TODO(slaweq): find mapping for other vif_types to mech_drivers also:"},{"line_number":47,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":48,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_BRIDGE: ["},{"line_number":50,"context_line":"        mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":51,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_0e32e7a6","line":48,"in_reply_to":"7aa08908_501bf380","updated":"2016-06-11 20:15:13.000000000","message":"added","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                callbacks_events.BEFORE_UPDATE)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":76,"context_line":"        LOG.debug(\"validate_policy_for_port(context\u003d%(context)s, \""},{"line_number":77,"context_line":"                  \"policy\u003d%(policy)s, %(port)s)\", {\u0027context\u0027: context,"},{"line_number":78,"context_line":"                                                   \u0027policy\u0027: policy,"},{"line_number":79,"context_line":"                                                   \u0027port\u0027: port})"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_d4528966","line":76,"updated":"2016-06-13 07:47:09.000000000","message":"why are we logging the context? what value doe this have?\nif you want to log parameter then please us the oslo log decorator log_method_call","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                callbacks_events.BEFORE_UPDATE)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":76,"context_line":"        LOG.debug(\"validate_policy_for_port(context\u003d%(context)s, \""},{"line_number":77,"context_line":"                  \"policy\u003d%(policy)s, %(port)s)\", {\u0027context\u0027: context,"},{"line_number":78,"context_line":"                                                   \u0027policy\u0027: policy,"},{"line_number":79,"context_line":"                                                   \u0027port\u0027: port})"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_b3d53344","line":76,"in_reply_to":"7aa08908_aa415465","updated":"2016-06-13 20:57:13.000000000","message":"changed to oslo decorator","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"46bcde99358e2ac05953b89268859bd48782113d","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                callbacks_events.BEFORE_UPDATE)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":76,"context_line":"        LOG.debug(\"validate_policy_for_port(context\u003d%(context)s, \""},{"line_number":77,"context_line":"                  \"policy\u003d%(policy)s, %(port)s)\", {\u0027context\u0027: context,"},{"line_number":78,"context_line":"                                                   \u0027policy\u0027: policy,"},{"line_number":79,"context_line":"                                                   \u0027port\u0027: port})"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_aa415465","line":76,"in_reply_to":"7aa08908_d4528966","updated":"2016-06-13 08:56:54.000000000","message":"I guess we can remove this at the end, as it\u0027s mostly for debug now. Or as garyk says, use the oslo decorator if we want to keep it for a while.","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"c33841e284551bb32426afb63095f04e67866e51","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Ml2QoSServiceNotificationDriver("},{"line_number":56,"context_line":"    message_queue.RpcQosServiceNotificationDriver):"},{"line_number":57,"context_line":"    \"\"\"RPC message queue service notification driver with policy valudation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This is service notification driver for QoS with support for validate if"},{"line_number":60,"context_line":"    policy can be applied on port(s) based on vif_type and/or vnic_type of"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_c98e5626","line":57,"range":{"start_line":57,"start_character":65,"end_line":57,"end_character":75},"updated":"2016-06-18 00:35:59.000000000","message":"typo validation","commit_id":"1d5553083a03b3875f553361ba9be8745048bcb7"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"0ec1feb8bf5b1d8c93477c16ae87c683abfbe805","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Ml2QoSServiceNotificationDriver("},{"line_number":56,"context_line":"    message_queue.RpcQosServiceNotificationDriver):"},{"line_number":57,"context_line":"    \"\"\"RPC message queue service notification driver with policy valudation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This is service notification driver for QoS with support for validate if"},{"line_number":60,"context_line":"    policy can be applied on port(s) based on vif_type and/or vnic_type of"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a9d85d2_114e276f","line":57,"range":{"start_line":57,"start_character":65,"end_line":57,"end_character":75},"in_reply_to":"7aa08908_c98e5626","updated":"2016-06-21 20:05:05.000000000","message":"Done","commit_id":"1d5553083a03b3875f553361ba9be8745048bcb7"}],"neutron/services/qos/notification_drivers/ml2_qos_driver.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06ad1081613f672220764e4fc0e5b92bb88837fb","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        #                      \u0027direction\u0027: [\u0027egress\u0027]}}"},{"line_number":165,"context_line":"        # in this example, BANDWIDTH_LIMIT does not support max_burst_kbps and"},{"line_number":166,"context_line":"        # directions others than egress"},{"line_number":167,"context_line":"        port_id \u003d port.get(\"id\")"},{"line_number":168,"context_line":"        for rule in rules:"},{"line_number":169,"context_line":"            if rule.rule_type not in supported_rules.keys():"},{"line_number":170,"context_line":"                raise qos_base.PolicyRuleNotSupportedForPort("}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_08f424f0","line":167,"range":{"start_line":167,"start_character":8,"end_line":167,"end_character":32},"updated":"2016-07-05 11:53:26.000000000","message":"No reason to define a \u0027port_id\u0027 if it is only used once throughout this function.","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a2756e8578d039aa07f6573f915e361faed26445","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        #                      \u0027direction\u0027: [\u0027egress\u0027]}}"},{"line_number":165,"context_line":"        # in this example, BANDWIDTH_LIMIT does not support max_burst_kbps and"},{"line_number":166,"context_line":"        # directions others than egress"},{"line_number":167,"context_line":"        port_id \u003d port.get(\"id\")"},{"line_number":168,"context_line":"        for rule in rules:"},{"line_number":169,"context_line":"            if rule.rule_type not in supported_rules.keys():"},{"line_number":170,"context_line":"                raise qos_base.PolicyRuleNotSupportedForPort("}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_d8680e8a","line":167,"range":{"start_line":167,"start_character":8,"end_line":167,"end_character":32},"in_reply_to":"1aa78d24_08f424f0","updated":"2016-07-05 20:18:33.000000000","message":"changed","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06ad1081613f672220764e4fc0e5b92bb88837fb","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                            parameter\u003dparameter,"},{"line_number":188,"context_line":"                            value\u003dvalue,"},{"line_number":189,"context_line":"                            port_id\u003dport[\u0027id\u0027])"},{"line_number":190,"context_line":"            except KeyError:"},{"line_number":191,"context_line":"                # The parameter is not supported by the mech driver"},{"line_number":192,"context_line":"                raise qos_base.PolicyRuleParameterNotSupportedForPort("},{"line_number":193,"context_line":"                        rule_type\u003drule.rule_type,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_c8821c52","line":190,"range":{"start_line":190,"start_character":19,"end_line":190,"end_character":27},"updated":"2016-07-05 11:53:26.000000000","message":"nit: This can only be thrown by line 183, so I suggest we surround only that line with the try-except block. It\u0027s the nittiest of nits though so I wouldn\u0027t hold it against you if this would not be fixed.","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a2756e8578d039aa07f6573f915e361faed26445","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                            parameter\u003dparameter,"},{"line_number":188,"context_line":"                            value\u003dvalue,"},{"line_number":189,"context_line":"                            port_id\u003dport[\u0027id\u0027])"},{"line_number":190,"context_line":"            except KeyError:"},{"line_number":191,"context_line":"                # The parameter is not supported by the mech driver"},{"line_number":192,"context_line":"                raise qos_base.PolicyRuleParameterNotSupportedForPort("},{"line_number":193,"context_line":"                        rule_type\u003drule.rule_type,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_98916655","line":190,"range":{"start_line":190,"start_character":19,"end_line":190,"end_character":27},"in_reply_to":"1aa78d24_c8821c52","updated":"2016-07-05 20:18:33.000000000","message":"I changed it littlebit, hope it will be better for You now","commit_id":"bce248e0eaf0e4f99d31d0c1376c0508423a39af"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"76601d126b554cbad319be686f12a71802a60272","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if policy_id is None or policy_id \u003d\u003d original_policy_id:"},{"line_number":120,"context_line":"            return"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":123,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":124,"context_line":"        self.validate_policy_for_port(context, policy, updated_port)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_b86cd2d0","line":122,"updated":"2016-07-27 13:25:18.000000000","message":"policy \u003d policy_object.QosPolicy.get_object(context, id\u003dpolicy_id)","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a9e4c9942e598480328c3d1ed2d1cb15153437ab","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if policy_id is None or policy_id \u003d\u003d original_policy_id:"},{"line_number":120,"context_line":"            return"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":123,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":124,"context_line":"        self.validate_policy_for_port(context, policy, updated_port)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"bacf61ea_80b03c8d","line":122,"in_reply_to":"dada55a8_b86cd2d0","updated":"2016-07-27 19:45:53.000000000","message":"I will change it","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"76601d126b554cbad319be686f12a71802a60272","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if policy_id is None or policy_id \u003d\u003d original_policy_id:"},{"line_number":135,"context_line":"            return"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":138,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":139,"context_line":"        self.validate_policy_for_network(context, policy, updated_network)"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_185cfe17","line":137,"updated":"2016-07-27 13:25:18.000000000","message":"policy \u003d policy_object.QosPolicy.get_object(context, id\u003dpolicy_id)","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a9e4c9942e598480328c3d1ed2d1cb15153437ab","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if policy_id is None or policy_id \u003d\u003d original_policy_id:"},{"line_number":135,"context_line":"            return"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":138,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":139,"context_line":"        self.validate_policy_for_network(context, policy, updated_network)"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"bacf61ea_c0aa3419","line":137,"in_reply_to":"dada55a8_185cfe17","updated":"2016-07-27 19:45:53.000000000","message":"I will change it","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"RULE_VALIDATION_IGNORED_FIELDS \u003d [\u0027qos_policy_id\u0027, \u0027id\u0027, \u0027type\u0027]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# TODO(slaweq/ajo): list of all mech_drivers and what VNIC/VIF type are"},{"line_number":41,"context_line":"# supported by each of them should be provided by ml2 plugin in similar way"},{"line_number":42,"context_line":"# like it is done for supported_qos_rule_types for example"},{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_6f278c64","line":40,"updated":"2016-07-29 15:43:02.000000000","message":"Yes. Please move that into the ml2 plugin. The whole code belongs to the plugin, it should not be a notification driver in the first place.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"RULE_VALIDATION_IGNORED_FIELDS \u003d [\u0027qos_policy_id\u0027, \u0027id\u0027, \u0027type\u0027]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# TODO(slaweq/ajo): list of all mech_drivers and what VNIC/VIF type are"},{"line_number":41,"context_line":"# supported by each of them should be provided by ml2 plugin in similar way"},{"line_number":42,"context_line":"# like it is done for supported_qos_rule_types for example"},{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_dbd38cd3","line":40,"in_reply_to":"bacf61ea_6f278c64","updated":"2016-08-01 14:56:55.000000000","message":"See my previous comments.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"RULE_VALIDATION_IGNORED_FIELDS \u003d [\u0027qos_policy_id\u0027, \u0027id\u0027, \u0027type\u0027]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# TODO(slaweq/ajo): list of all mech_drivers and what VNIC/VIF type are"},{"line_number":41,"context_line":"# supported by each of them should be provided by ml2 plugin in similar way"},{"line_number":42,"context_line":"# like it is done for supported_qos_rule_types for example"},{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_ad25b05c","line":40,"in_reply_to":"bacf61ea_dbd38cd3","updated":"2016-08-01 21:28:34.000000000","message":"which comment exactly? :)","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":44,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":46,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_2f13d4b9","line":46,"updated":"2016-07-29 15:43:02.000000000","message":"what about other types? supported_vnic_types in sriov driver is:\n\nportbindings.VNIC_DIRECT,\nportbindings.VNIC_MACVTAP,\nportbindings.VNIC_DIRECT_PHYSICAL","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":44,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":46,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_fb9e5005","line":46,"in_reply_to":"bacf61ea_2f13d4b9","updated":"2016-08-01 14:56:55.000000000","message":"We don\u0027t seem to have any QoS support for macvtap, and DirectPhysical is un-doable, unless we hijacked the Top of Rack Switch.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"96a28aa45156de230585d2e6ae0c2e71929114d8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":44,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":46,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_fc68f5f6","line":46,"in_reply_to":"bacf61ea_fb9e5005","updated":"2016-08-01 21:22:59.000000000","message":"Yeah, but you should have a way for drivers to register their supported types.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1a27658ec0e12d741bf39cdf24a2869f15a50efe","unresolved":false,"context_lines":[{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":44,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":46,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_5d05a943","line":46,"in_reply_to":"bacf61ea_fc68f5f6","updated":"2016-08-02 09:06:46.000000000","message":"That\u0027s correct.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":46,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"},{"line_number":50,"context_line":"    portbindings.VIF_TYPE_BRIDGE: ["},{"line_number":51,"context_line":"        mech_linuxbridge.LinuxbridgeMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_4f9d6858","line":48,"updated":"2016-07-29 15:43:02.000000000","message":"what about other types? VIF_TYPE_DISTRIBUTED anyone? VIF_TYPE_MACVTAP? What are we going to do with VIF_TYPE_OTHER? etc.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":46,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"},{"line_number":50,"context_line":"    portbindings.VIF_TYPE_BRIDGE: ["},{"line_number":51,"context_line":"        mech_linuxbridge.LinuxbridgeMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_fbb5b07d","line":48,"in_reply_to":"bacf61ea_4f9d6858","updated":"2016-08-01 14:56:55.000000000","message":"We need to check anything missing.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"},{"line_number":46,"context_line":"    portbindings.VNIC_DIRECT: [mech_sriov.SriovNicSwitchMechanismDriver]}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"VIF_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":49,"context_line":"    portbindings.VIF_TYPE_OVS: [mech_openvswitch.OpenvswitchMechanismDriver],"},{"line_number":50,"context_line":"    portbindings.VIF_TYPE_BRIDGE: ["},{"line_number":51,"context_line":"        mech_linuxbridge.LinuxbridgeMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_6da458b9","line":48,"in_reply_to":"bacf61ea_fbb5b07d","updated":"2016-08-01 21:28:34.000000000","message":"For now I checked VIF_TYPES which can be used with mech_drivers supporting QoS. Where VIF_TYPE_DISTRIBUTED can be used exactly?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Ml2QoSServiceNotificationDriver("},{"line_number":56,"context_line":"    message_queue.RpcQosServiceNotificationDriver):"},{"line_number":57,"context_line":"    \"\"\"RPC message queue service notification driver with policy validation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This is service notification driver for QoS with support for validate if"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_1b33afac","line":56,"updated":"2016-07-29 15:43:02.000000000","message":"So what will happen when you have two drivers enabled, message_queue and this one? Do you send two updates per qos policy update? That\u0027s ridiculous.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Ml2QoSServiceNotificationDriver("},{"line_number":56,"context_line":"    message_queue.RpcQosServiceNotificationDriver):"},{"line_number":57,"context_line":"    \"\"\"RPC message queue service notification driver with policy validation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This is service notification driver for QoS with support for validate if"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_3b7bc8c2","line":56,"in_reply_to":"bacf61ea_1b33afac","updated":"2016-08-01 14:56:55.000000000","message":"It\u0027s not ridiculous, it was the original intent.\n\nImagine that for some reason you have OVN and OVS all together in one deployment (if that\u0027s even possible), \n\nYou send the policy and updates to both to take care.\n\nAnd same thing for the port checks may happen (good reason again to keep it on the \"notification\" driver).","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"96a28aa45156de230585d2e6ae0c2e71929114d8","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Ml2QoSServiceNotificationDriver("},{"line_number":56,"context_line":"    message_queue.RpcQosServiceNotificationDriver):"},{"line_number":57,"context_line":"    \"\"\"RPC message queue service notification driver with policy validation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This is service notification driver for QoS with support for validate if"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_fc1d9573","line":56,"in_reply_to":"bacf61ea_3b7bc8c2","updated":"2016-08-01 21:22:59.000000000","message":"I don\u0027t talk about OVN and OVS. I talk about message_queue + this driver. What\u0027s the use case for that? Why don\u0027t we replace the existing one with the one with validations?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Ml2QoSServiceNotificationDriver("},{"line_number":56,"context_line":"    message_queue.RpcQosServiceNotificationDriver):"},{"line_number":57,"context_line":"    \"\"\"RPC message queue service notification driver with policy validation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This is service notification driver for QoS with support for validate if"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_6fec502a","line":56,"in_reply_to":"bacf61ea_3b7bc8c2","updated":"2016-08-01 21:28:34.000000000","message":"ajo: maybe we should change it to add new notification driver only with validate methods?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1a27658ec0e12d741bf39cdf24a2869f15a50efe","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Ml2QoSServiceNotificationDriver("},{"line_number":56,"context_line":"    message_queue.RpcQosServiceNotificationDriver):"},{"line_number":57,"context_line":"    \"\"\"RPC message queue service notification driver with policy validation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This is service notification driver for QoS with support for validate if"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_bd366500","line":56,"in_reply_to":"bacf61ea_6fec502a","updated":"2016-08-02 09:06:46.000000000","message":"No, I really believe we should come with a proper backend QoSServiceDriver interface with all the methods we need in one place, instead making an sparse implementation that is hard to understand.\n\nBut let\u0027s diagram, and then think, may be what I\u0027m proposing makes no sense and we should change perspective.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                api_v2_attributes.NETWORK,"},{"line_number":78,"context_line":"                callbacks_events.BEFORE_UPDATE)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @log_helpers.log_method_call"},{"line_number":81,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":82,"context_line":"        vnic_type \u003d port.get(portbindings.VNIC_TYPE)"},{"line_number":83,"context_line":"        vif_type \u003d port.get(portbindings.VIF_TYPE)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_cf5e7811","line":80,"updated":"2016-07-29 15:43:02.000000000","message":"Why the logger?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                api_v2_attributes.NETWORK,"},{"line_number":78,"context_line":"                callbacks_events.BEFORE_UPDATE)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @log_helpers.log_method_call"},{"line_number":81,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":82,"context_line":"        vnic_type \u003d port.get(portbindings.VNIC_TYPE)"},{"line_number":83,"context_line":"        vif_type \u003d port.get(portbindings.VIF_TYPE)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_3415b93f","line":80,"in_reply_to":"bacf61ea_cf5e7811","updated":"2016-08-01 21:28:34.000000000","message":"I just wanted to log calls to this method. Is it wrong? should I remove it?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            mechdrivers \u003d VNIC_TYPE_TO_MECH_DRIVERS.get(vnic_type)"},{"line_number":90,"context_line":"            check_by_vnic_type \u003d True"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not mechdrivers:"},{"line_number":93,"context_line":"            raise qos_base.PolicyPortConflict("},{"line_number":94,"context_line":"                policy_id\u003dpolicy[\u0027id\u0027], port_id\u003dport[\u0027id\u0027])"},{"line_number":95,"context_line":"        self._validate_port_rules_for_mech_drivers("}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_4ae1d6fd","line":92,"updated":"2016-07-29 15:43:02.000000000","message":"let\u0027s say there is a driver that does use a custom vif type. How is it supposed to keep qos working? They don\u0027t have access to register custom types in your dictionaries.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            mechdrivers \u003d VNIC_TYPE_TO_MECH_DRIVERS.get(vnic_type)"},{"line_number":90,"context_line":"            check_by_vnic_type \u003d True"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not mechdrivers:"},{"line_number":93,"context_line":"            raise qos_base.PolicyPortConflict("},{"line_number":94,"context_line":"                policy_id\u003dpolicy[\u0027id\u0027], port_id\u003dport[\u0027id\u0027])"},{"line_number":95,"context_line":"        self._validate_port_rules_for_mech_drivers("}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_54182d75","line":92,"in_reply_to":"bacf61ea_4ae1d6fd","updated":"2016-08-01 21:28:34.000000000","message":"ajo: should we add some method to register new vif_types?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            check_by_vnic_type \u003d True"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not mechdrivers:"},{"line_number":93,"context_line":"            raise qos_base.PolicyPortConflict("},{"line_number":94,"context_line":"                policy_id\u003dpolicy[\u0027id\u0027], port_id\u003dport[\u0027id\u0027])"},{"line_number":95,"context_line":"        self._validate_port_rules_for_mech_drivers("},{"line_number":96,"context_line":"            port, policy.rules, mechdrivers, check_by_vnic_type)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_f8ab4173","line":93,"range":{"start_line":93,"start_character":27,"end_line":93,"end_character":45},"updated":"2016-07-29 15:43:02.000000000","message":"Should the exception say that it\u0027s not supported \"by any enabled driver\" instead of just claiming there is a general conflict?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            check_by_vnic_type \u003d True"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not mechdrivers:"},{"line_number":93,"context_line":"            raise qos_base.PolicyPortConflict("},{"line_number":94,"context_line":"                policy_id\u003dpolicy[\u0027id\u0027], port_id\u003dport[\u0027id\u0027])"},{"line_number":95,"context_line":"        self._validate_port_rules_for_mech_drivers("},{"line_number":96,"context_line":"            port, policy.rules, mechdrivers, check_by_vnic_type)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_d4225da2","line":93,"range":{"start_line":93,"start_character":27,"end_line":93,"end_character":45},"in_reply_to":"bacf61ea_f8ab4173","updated":"2016-08-01 21:28:34.000000000","message":"ajo: whould we add new exception or change message of this one only?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _validate_create_port_callback(self, resource, event, trigger,"},{"line_number":99,"context_line":"                                       **kwargs):"},{"line_number":100,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":101,"context_line":"        port \u003d kwargs.get(\u0027port\u0027)"},{"line_number":102,"context_line":"        policy_id \u003d port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_aa27b210","line":100,"range":{"start_line":100,"start_character":24,"end_line":100,"end_character":28},"updated":"2016-07-29 15:43:02.000000000","message":"you assume here the argument may not be present? If so, why do you pass None (the result of .get) into validate_policy_for_port? Same for port. At least for port it will crash when lines 82-83 will attempt to call .get on None object.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _validate_create_port_callback(self, resource, event, trigger,"},{"line_number":99,"context_line":"                                       **kwargs):"},{"line_number":100,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":101,"context_line":"        port \u003d kwargs.get(\u0027port\u0027)"},{"line_number":102,"context_line":"        policy_id \u003d port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_ade650e5","line":100,"range":{"start_line":100,"start_character":24,"end_line":100,"end_character":28},"in_reply_to":"bacf61ea_aa27b210","updated":"2016-08-01 21:28:34.000000000","message":"Fixed","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if policy_id is None:"},{"line_number":105,"context_line":"            return"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":108,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":109,"context_line":"        self.validate_policy_for_port(context, policy, port)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_aa8a12bd","line":107,"range":{"start_line":107,"start_character":31,"end_line":107,"end_character":49},"updated":"2016-07-29 15:43:02.000000000","message":"I see the _cb function handles missing context; apart from that, it\u0027s the same old get_object. Since you always pass context, what\u0027s the point? Why not using get_object directly?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if policy_id is None:"},{"line_number":105,"context_line":"            return"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":108,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":109,"context_line":"        self.validate_policy_for_port(context, policy, port)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_8d0eec89","line":107,"range":{"start_line":107,"start_character":31,"end_line":107,"end_character":49},"in_reply_to":"bacf61ea_aa8a12bd","updated":"2016-08-01 21:28:34.000000000","message":"Changed","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    def _validate_update_port_callback(self, resource, event, trigger,"},{"line_number":112,"context_line":"                                       **kwargs):"},{"line_number":113,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":114,"context_line":"        original_port \u003d kwargs.get(\u0027original_port\u0027)"},{"line_number":115,"context_line":"        updated_port \u003d kwargs.get(\u0027updated_port\u0027)"},{"line_number":116,"context_line":"        original_policy_id \u003d original_port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":117,"context_line":"        policy_id \u003d updated_port.get(qos_consts.QOS_POLICY_ID)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_6a6e5a02","line":114,"updated":"2016-07-29 15:43:02.000000000","message":"again, why .get()? do you expect None? It will crash later.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    def _validate_update_port_callback(self, resource, event, trigger,"},{"line_number":112,"context_line":"                                       **kwargs):"},{"line_number":113,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":114,"context_line":"        original_port \u003d kwargs.get(\u0027original_port\u0027)"},{"line_number":115,"context_line":"        updated_port \u003d kwargs.get(\u0027updated_port\u0027)"},{"line_number":116,"context_line":"        original_policy_id \u003d original_port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":117,"context_line":"        policy_id \u003d updated_port.get(qos_consts.QOS_POLICY_ID)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_cdf6248e","line":114,"in_reply_to":"bacf61ea_6a6e5a02","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                                       **kwargs):"},{"line_number":113,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":114,"context_line":"        original_port \u003d kwargs.get(\u0027original_port\u0027)"},{"line_number":115,"context_line":"        updated_port \u003d kwargs.get(\u0027updated_port\u0027)"},{"line_number":116,"context_line":"        original_policy_id \u003d original_port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":117,"context_line":"        policy_id \u003d updated_port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_8a73cee6","line":115,"updated":"2016-07-29 15:43:02.000000000","message":"ditto","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                                       **kwargs):"},{"line_number":113,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":114,"context_line":"        original_port \u003d kwargs.get(\u0027original_port\u0027)"},{"line_number":115,"context_line":"        updated_port \u003d kwargs.get(\u0027updated_port\u0027)"},{"line_number":116,"context_line":"        original_policy_id \u003d original_port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":117,"context_line":"        policy_id \u003d updated_port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_2df2609a","line":115,"in_reply_to":"bacf61ea_8a73cee6","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if policy_id is None or policy_id \u003d\u003d original_policy_id:"},{"line_number":120,"context_line":"            return"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":123,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":124,"context_line":"        self.validate_policy_for_port(context, policy, updated_port)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_0a4ebe95","line":122,"updated":"2016-07-29 15:43:02.000000000","message":"ditto","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if policy_id is None or policy_id \u003d\u003d original_policy_id:"},{"line_number":120,"context_line":"            return"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        policy \u003d message_queue._get_qos_policy_cb("},{"line_number":123,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":124,"context_line":"        self.validate_policy_for_port(context, policy, updated_port)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_2d20a0f6","line":122,"in_reply_to":"bacf61ea_0a4ebe95","updated":"2016-08-01 21:28:34.000000000","message":"changed","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _validate_update_network_callback(self, resource, event, trigger,"},{"line_number":127,"context_line":"                                          **kwargs):"},{"line_number":128,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":129,"context_line":"        original_network \u003d kwargs.get(\u0027original_network\u0027)"},{"line_number":130,"context_line":"        updated_network \u003d kwargs.get(\u0027updated_network\u0027)"},{"line_number":131,"context_line":"        original_policy_id \u003d original_network.get(qos_consts.QOS_POLICY_ID)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_aa5fb23f","line":128,"updated":"2016-07-29 15:43:02.000000000","message":"ditto on .get","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _validate_update_network_callback(self, resource, event, trigger,"},{"line_number":127,"context_line":"                                          **kwargs):"},{"line_number":128,"context_line":"        context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":129,"context_line":"        original_network \u003d kwargs.get(\u0027original_network\u0027)"},{"line_number":130,"context_line":"        updated_network \u003d kwargs.get(\u0027updated_network\u0027)"},{"line_number":131,"context_line":"        original_policy_id \u003d original_network.get(qos_consts.QOS_POLICY_ID)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_0deddcb6","line":128,"in_reply_to":"bacf61ea_aa5fb23f","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":139,"context_line":"        self.validate_policy_for_network(context, policy, updated_network)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _validate_port_rules_for_mech_drivers(self, port, rules, mechdrivers,"},{"line_number":142,"context_line":"                                              check_by_vnic_type):"},{"line_number":143,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":144,"context_line":"        validated_with_one_mech_driver \u003d False"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_4a2436ae","line":141,"range":{"start_line":141,"start_character":65,"end_line":141,"end_character":76},"updated":"2016-07-29 15:43:02.000000000","message":"may we rename the argument to eg. mechdriver_classes so that it\u0027s more clear what it is?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            resources.QOS_POLICY, policy_id, context\u003dcontext)"},{"line_number":139,"context_line":"        self.validate_policy_for_network(context, policy, updated_network)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _validate_port_rules_for_mech_drivers(self, port, rules, mechdrivers,"},{"line_number":142,"context_line":"                                              check_by_vnic_type):"},{"line_number":143,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":144,"context_line":"        validated_with_one_mech_driver \u003d False"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_6dca981c","line":141,"range":{"start_line":141,"start_character":65,"end_line":141,"end_character":76},"in_reply_to":"bacf61ea_4a2436ae","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":144,"context_line":"        validated_with_one_mech_driver \u003d False"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        for driver in core_plugin.mechanism_manager.ordered_mech_drivers:"},{"line_number":147,"context_line":"            for mechdriver in mechdrivers:"},{"line_number":148,"context_line":"                if (isinstance(driver.obj, mechdriver) and"},{"line_number":149,"context_line":"                    driver.obj._supports_port_binding):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_0f99b01f","line":146,"range":{"start_line":146,"start_character":52,"end_line":146,"end_character":72},"updated":"2016-07-29 15:43:02.000000000","message":"why do you care about the order?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":144,"context_line":"        validated_with_one_mech_driver \u003d False"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        for driver in core_plugin.mechanism_manager.ordered_mech_drivers:"},{"line_number":147,"context_line":"            for mechdriver in mechdrivers:"},{"line_number":148,"context_line":"                if (isinstance(driver.obj, mechdriver) and"},{"line_number":149,"context_line":"                    driver.obj._supports_port_binding):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_0df79c59","line":146,"range":{"start_line":146,"start_character":52,"end_line":146,"end_character":72},"in_reply_to":"bacf61ea_0f99b01f","updated":"2016-08-01 21:28:34.000000000","message":"I don\u0027t. Changed to mechanism_manager.mech_drivers","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        validated_with_one_mech_driver \u003d False"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        for driver in core_plugin.mechanism_manager.ordered_mech_drivers:"},{"line_number":147,"context_line":"            for mechdriver in mechdrivers:"},{"line_number":148,"context_line":"                if (isinstance(driver.obj, mechdriver) and"},{"line_number":149,"context_line":"                    driver.obj._supports_port_binding):"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_0a787e8e","line":147,"range":{"start_line":147,"start_character":13,"end_line":147,"end_character":14},"updated":"2016-07-29 15:43:02.000000000","message":"nit: you could sav driver.obj in line 147 so that you don\u0027t repeat the access three times in a cycle.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        validated_with_one_mech_driver \u003d False"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        for driver in core_plugin.mechanism_manager.ordered_mech_drivers:"},{"line_number":147,"context_line":"            for mechdriver in mechdrivers:"},{"line_number":148,"context_line":"                if (isinstance(driver.obj, mechdriver) and"},{"line_number":149,"context_line":"                    driver.obj._supports_port_binding):"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_4d507432","line":147,"range":{"start_line":147,"start_character":13,"end_line":147,"end_character":14},"in_reply_to":"bacf61ea_0a787e8e","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"                    self._validate_port_rules_supported("},{"line_number":152,"context_line":"                        port, rules, driver.obj.supported_qos_rule_types)"},{"line_number":153,"context_line":"                    validated_with_one_mech_driver \u003d True"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        if not validated_with_one_mech_driver and check_by_vnic_type:"},{"line_number":156,"context_line":"            for mechdriver in mechdrivers:"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_6a7dba6d","line":153,"updated":"2016-07-29 15:43:02.000000000","message":"shouldn\u0027t you bail out of the whole section here?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"                    self._validate_port_rules_supported("},{"line_number":152,"context_line":"                        port, rules, driver.obj.supported_qos_rule_types)"},{"line_number":153,"context_line":"                    validated_with_one_mech_driver \u003d True"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        if not validated_with_one_mech_driver and check_by_vnic_type:"},{"line_number":156,"context_line":"            for mechdriver in mechdrivers:"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_a8563e03","line":153,"in_reply_to":"bacf61ea_6a7dba6d","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    port, rules, mechdriver.supported_qos_rule_types)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _validate_port_rules_supported(self, port, rules, supported_rules):"},{"line_number":161,"context_line":"        # we expect the mechanism supportd_qos_rule_types to look like this"},{"line_number":162,"context_line":"        # {\u0027DSCP_MARK\u0027: {\u0027dscp_mark\u0027: None},"},{"line_number":163,"context_line":"        #  \u0027BANDWIDTH_LIMIT\u0027: {\u0027max_kbps\u0027 : qos_consts.ANY_VALUE,"},{"line_number":164,"context_line":"        #                      \u0027direction\u0027: [\u0027egress\u0027]}}"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_749abf64","line":161,"range":{"start_line":161,"start_character":34,"end_line":161,"end_character":57},"updated":"2016-07-29 15:43:02.000000000","message":"supported_qos_rule_types","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    port, rules, mechdriver.supported_qos_rule_types)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _validate_port_rules_supported(self, port, rules, supported_rules):"},{"line_number":161,"context_line":"        # we expect the mechanism supportd_qos_rule_types to look like this"},{"line_number":162,"context_line":"        # {\u0027DSCP_MARK\u0027: {\u0027dscp_mark\u0027: None},"},{"line_number":163,"context_line":"        #  \u0027BANDWIDTH_LIMIT\u0027: {\u0027max_kbps\u0027 : qos_consts.ANY_VALUE,"},{"line_number":164,"context_line":"        #                      \u0027direction\u0027: [\u0027egress\u0027]}}"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_88ad3a9d","line":161,"range":{"start_line":161,"start_character":34,"end_line":161,"end_character":57},"in_reply_to":"bacf61ea_749abf64","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    port, rules, mechdriver.supported_qos_rule_types)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _validate_port_rules_supported(self, port, rules, supported_rules):"},{"line_number":161,"context_line":"        # we expect the mechanism supportd_qos_rule_types to look like this"},{"line_number":162,"context_line":"        # {\u0027DSCP_MARK\u0027: {\u0027dscp_mark\u0027: None},"},{"line_number":163,"context_line":"        #  \u0027BANDWIDTH_LIMIT\u0027: {\u0027max_kbps\u0027 : qos_consts.ANY_VALUE,"},{"line_number":164,"context_line":"        #                      \u0027direction\u0027: [\u0027egress\u0027]}}"},{"line_number":165,"context_line":"        # in this example, BANDWIDTH_LIMIT does not support max_burst_kbps and"},{"line_number":166,"context_line":"        # directions others than egress"},{"line_number":167,"context_line":"        for rule in rules:"},{"line_number":168,"context_line":"            if rule.rule_type not in supported_rules.keys():"},{"line_number":169,"context_line":"                raise qos_base.PolicyRuleNotSupportedForPort("}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_f4aeaf83","line":166,"range":{"start_line":161,"start_character":8,"end_line":166,"end_character":39},"updated":"2016-07-29 15:43:02.000000000","message":"This is material for devref.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    port, rules, mechdriver.supported_qos_rule_types)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _validate_port_rules_supported(self, port, rules, supported_rules):"},{"line_number":161,"context_line":"        # we expect the mechanism supportd_qos_rule_types to look like this"},{"line_number":162,"context_line":"        # {\u0027DSCP_MARK\u0027: {\u0027dscp_mark\u0027: None},"},{"line_number":163,"context_line":"        #  \u0027BANDWIDTH_LIMIT\u0027: {\u0027max_kbps\u0027 : qos_consts.ANY_VALUE,"},{"line_number":164,"context_line":"        #                      \u0027direction\u0027: [\u0027egress\u0027]}}"},{"line_number":165,"context_line":"        # in this example, BANDWIDTH_LIMIT does not support max_burst_kbps and"},{"line_number":166,"context_line":"        # directions others than egress"},{"line_number":167,"context_line":"        for rule in rules:"},{"line_number":168,"context_line":"            if rule.rule_type not in supported_rules.keys():"},{"line_number":169,"context_line":"                raise qos_base.PolicyRuleNotSupportedForPort("}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_28c88e73","line":166,"range":{"start_line":161,"start_character":8,"end_line":166,"end_character":39},"in_reply_to":"bacf61ea_f4aeaf83","updated":"2016-08-01 21:28:34.000000000","message":"I moved it to devref file","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                        parameter\u003dparameter,"},{"line_number":187,"context_line":"                        port_id\u003dport[\u0027id\u0027])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            if (supported_values !\u003d qos_consts.ANY_VALUE and"},{"line_number":190,"context_line":"                value not in supported_values):"},{"line_number":191,"context_line":"                raise qos_base.PolicyRuleParameterValueNotSupportedForPort("},{"line_number":192,"context_line":"                        rule_type\u003drule.rule_type,"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_5801ad69","line":189,"updated":"2016-07-29 15:43:02.000000000","message":"the spec suggested that there will be support for custom validator classes that could be used in place of value lists. I don\u0027t see the code here.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                        parameter\u003dparameter,"},{"line_number":187,"context_line":"                        port_id\u003dport[\u0027id\u0027])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            if (supported_values !\u003d qos_consts.ANY_VALUE and"},{"line_number":190,"context_line":"                value not in supported_values):"},{"line_number":191,"context_line":"                raise qos_base.PolicyRuleParameterValueNotSupportedForPort("},{"line_number":192,"context_line":"                        rule_type\u003drule.rule_type,"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_a8aabe82","line":189,"in_reply_to":"bacf61ea_5801ad69","updated":"2016-08-01 21:28:34.000000000","message":"There is not code for that yet. I have to do it and will do it asap","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"098cfb80f14049ee48e444818fff3310eea003ad","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# TODO(slaweq/ajo): list of all mech_drivers and what VNIC/VIF type are"},{"line_number":41,"context_line":"# supported by each of them should be provided by ml2 plugin in similar way"},{"line_number":42,"context_line":"# like it is done for supported_qos_rule_types for example"},{"line_number":43,"context_line":"VNIC_TYPE_TO_MECH_DRIVERS \u003d {"},{"line_number":44,"context_line":"    portbindings.VNIC_NORMAL: [mech_openvswitch.OpenvswitchMechanismDriver,"},{"line_number":45,"context_line":"                               mech_linuxbridge.LinuxbridgeMechanismDriver],"}],"source_content_type":"text/x-python","patch_set":27,"id":"fa6399be_781036a9","line":42,"updated":"2016-10-12 10:28:01.000000000","message":"i agree this should be fixed.","commit_id":"80e2e6c4ed271ab214fbeb5865e80ceb37244d68"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"098cfb80f14049ee48e444818fff3310eea003ad","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        for driver in core_plugin.mechanism_manager.mech_drivers.values():"},{"line_number":148,"context_line":"            for mechdriver_class in mechdriver_classes:"},{"line_number":149,"context_line":"                driver_obj \u003d driver.obj"},{"line_number":150,"context_line":"                if (isinstance(driver_obj, mechdriver_class) and"},{"line_number":151,"context_line":"                    driver_obj._supports_port_binding):"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"                    self._validate_port_rules_supported("}],"source_content_type":"text/x-python","patch_set":27,"id":"fa6399be_f8728648","line":150,"range":{"start_line":150,"start_character":20,"end_line":150,"end_character":60},"updated":"2016-10-12 10:28:01.000000000","message":"isn\u0027t this always true?","commit_id":"80e2e6c4ed271ab214fbeb5865e80ceb37244d68"}],"neutron/services/qos/notification_drivers/qos_base.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1777e84840aeb5366117828ecad4d26391715756","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":"import abc"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import six"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_122a6f7e","side":"PARENT","line":13,"updated":"2016-05-31 08:16:50.000000000","message":"unrelated. :)","commit_id":"d320df540d652ad3241a4b69581bb59ab88fe5a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d533828d87624ec01ca326196483410373bb8ea0","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":"import abc"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import six"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9abb7d3a_c790fd45","side":"PARENT","line":13,"in_reply_to":"9abb7d3a_122a6f7e","updated":"2016-05-31 20:15:15.000000000","message":"Done","commit_id":"d320df540d652ad3241a4b69581bb59ab88fe5a0"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class PolicyRulePortConflict(exceptions.Conflict):"},{"line_number":23,"context_line":"    message \u003d _(\"QoS rule conflicts with port %(port_id)s\")"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class PolicyRuleNotSupportedForPort(PolicyRulePortConflict):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_f0c83857","line":23,"updated":"2016-06-08 13:12:01.000000000","message":"may be we should be more detailed in this case (rule id?)","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9c435247eaab2da10a3fa1c2bafafaeb1f514137","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class PolicyRulePortConflict(exceptions.Conflict):"},{"line_number":23,"context_line":"    message \u003d _(\"QoS rule conflicts with port %(port_id)s\")"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class PolicyRuleNotSupportedForPort(PolicyRulePortConflict):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_6e43ab6c","line":23,"in_reply_to":"7aa08908_f0c83857","updated":"2016-06-11 20:15:13.000000000","message":"I added policy_id here and changed name to PolicyPortConflict because in fact it is raised when policy is in conflict with port (any of rules from policy).\nIs it ok for You?","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":20363,"name":"Adit Sarfaty","email":"asarfaty@vmware.com","username":"asarfaty"},"change_message_id":"8b00db23290b2c46632a8e7202e250417d268503","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":69,"context_line":"        \"\"\"Validate policy for port."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Takes a policy and a port, and validates if the policy policy"},{"line_number":72,"context_line":"        rules are supported by the port."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        This method should throw a PolicyRuleNotSupportedForPort if the port"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a9d85d2_e1b4aed2","line":71,"range":{"start_line":71,"start_character":56,"end_line":71,"end_character":69},"updated":"2016-06-19 07:04:44.000000000","message":"nit: only one policy :)","commit_id":"1d5553083a03b3875f553361ba9be8745048bcb7"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"0ec1feb8bf5b1d8c93477c16ae87c683abfbe805","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":69,"context_line":"        \"\"\"Validate policy for port."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Takes a policy and a port, and validates if the policy policy"},{"line_number":72,"context_line":"        rules are supported by the port."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        This method should throw a PolicyRuleNotSupportedForPort if the port"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a9d85d2_11758797","line":71,"range":{"start_line":71,"start_character":56,"end_line":71,"end_character":69},"in_reply_to":"5a9d85d2_e1b4aed2","updated":"2016-06-21 20:05:05.000000000","message":"Done","commit_id":"1d5553083a03b3875f553361ba9be8745048bcb7"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class PolicyRuleNotSupportedForPort(PolicyPortConflict):"},{"line_number":27,"context_line":"    message \u003d _(\"Rule type %(rule_type)s is not supported by port %(port_id)s\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class PolicyRuleParameterNotSupportedForPort(PolicyPortConflict):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_38a319b4","line":27,"range":{"start_line":27,"start_character":17,"end_line":27,"end_character":40},"updated":"2016-07-29 15:43:02.000000000","message":"Rules of %(rule_type)s type are not supported ...","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class PolicyRuleNotSupportedForPort(PolicyPortConflict):"},{"line_number":27,"context_line":"    message \u003d _(\"Rule type %(rule_type)s is not supported by port %(port_id)s\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class PolicyRuleParameterNotSupportedForPort(PolicyPortConflict):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_8837fa4b","line":27,"range":{"start_line":27,"start_character":17,"end_line":27,"end_character":40},"in_reply_to":"bacf61ea_38a319b4","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class PolicyRuleParameterNotSupportedForPort(PolicyPortConflict):"},{"line_number":31,"context_line":"    message \u003d _(\"Rule type %(rule_type)s parameter %(parameter)s \""},{"line_number":32,"context_line":"                \"is not supported by port %(port_id)s\")"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class PolicyRuleParameterValueNotSupportedForPort(PolicyPortConflict):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_78b2b107","line":32,"range":{"start_line":31,"start_character":17,"end_line":32,"end_character":53},"updated":"2016-07-29 15:43:02.000000000","message":"This will end like:\n\n\"Rule type bandwidth_limit parameter max_burst_kbps is not supported by port XXX\"\n\nwhich is not ideal in terms of grammar. A better version:\n\n\"The max_burst_kbps parameter of bandwidth_limit rule [type] is not supported by port XXX\"","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class PolicyRuleParameterNotSupportedForPort(PolicyPortConflict):"},{"line_number":31,"context_line":"    message \u003d _(\"Rule type %(rule_type)s parameter %(parameter)s \""},{"line_number":32,"context_line":"                \"is not supported by port %(port_id)s\")"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class PolicyRuleParameterValueNotSupportedForPort(PolicyPortConflict):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_a8347e49","line":32,"range":{"start_line":31,"start_character":17,"end_line":32,"end_character":53},"in_reply_to":"bacf61ea_78b2b107","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class PolicyRuleParameterValueNotSupportedForPort(PolicyPortConflict):"},{"line_number":36,"context_line":"    message \u003d _(\"Rule type %(rule_type)s parameter %(parameter)s value \""},{"line_number":37,"context_line":"                \"%(value)s is not supported by port %(port_id)s\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_b828a9e3","line":36,"updated":"2016-07-29 15:43:02.000000000","message":"ditto","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class PolicyRuleParameterValueNotSupportedForPort(PolicyPortConflict):"},{"line_number":36,"context_line":"    message \u003d _(\"Rule type %(rule_type)s parameter %(parameter)s value \""},{"line_number":37,"context_line":"                \"%(value)s is not supported by port %(port_id)s\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_e842f6ac","line":36,"in_reply_to":"bacf61ea_b828a9e3","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":69,"context_line":"        \"\"\"Validate policy for port."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Takes a policy and a port, and validates if the policy rules are"},{"line_number":72,"context_line":"        supported by the port."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        This method should throw a PolicyRuleNotSupportedForPort if the port"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_98da05e7","line":71,"updated":"2016-07-29 15:43:02.000000000","message":"Please define parameters with sphinx friendly syntax (:param).","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":69,"context_line":"        \"\"\"Validate policy for port."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Takes a policy and a port, and validates if the policy rules are"},{"line_number":72,"context_line":"        supported by the port."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        This method should throw a PolicyRuleNotSupportedForPort if the port"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_c8d9f2f4","line":71,"in_reply_to":"bacf61ea_98da05e7","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        supported by the port."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        This method should throw a PolicyRuleNotSupportedForPort if the port"},{"line_number":75,"context_line":"        can\u0027t support any of the rules or rule parameters."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def validate_policy_for_network(self, context, policy, network):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_d8491db9","line":75,"updated":"2016-07-29 15:43:02.000000000","message":"there is a standard syntax to define exceptions (:raises). Please use it.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        supported by the port."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        This method should throw a PolicyRuleNotSupportedForPort if the port"},{"line_number":75,"context_line":"        can\u0027t support any of the rules or rule parameters."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def validate_policy_for_network(self, context, policy, network):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_08e02a95","line":75,"in_reply_to":"bacf61ea_d8491db9","updated":"2016-08-01 21:28:34.000000000","message":"Done","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def validate_policy_for_network(self, context, policy, network):"},{"line_number":79,"context_line":"        \"\"\"Validate policy for networks."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        This is a default implementation, that could be overriden for a more"},{"line_number":82,"context_line":"        performant one if necessary."},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_b804294a","line":81,"range":{"start_line":81,"start_character":56,"end_line":81,"end_character":65},"updated":"2016-07-29 15:43:02.000000000","message":"overridden","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def validate_policy_for_network(self, context, policy, network):"},{"line_number":79,"context_line":"        \"\"\"Validate policy for networks."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        This is a default implementation, that could be overriden for a more"},{"line_number":82,"context_line":"        performant one if necessary."},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_f8e341a2","line":81,"range":{"start_line":81,"start_character":15,"end_line":81,"end_character":17},"updated":"2016-07-29 15:43:02.000000000","message":"the","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def validate_policy_for_network(self, context, policy, network):"},{"line_number":79,"context_line":"        \"\"\"Validate policy for networks."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        This is a default implementation, that could be overriden for a more"},{"line_number":82,"context_line":"        performant one if necessary."},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":85,"context_line":"        network_ports \u003d core_plugin.get_ports("}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_f89181f2","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":36},"updated":"2016-07-29 15:43:02.000000000","message":"I find this sentence redundant. It\u0027s obvious that drivers can override public methods.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def validate_policy_for_network(self, context, policy, network):"},{"line_number":79,"context_line":"        \"\"\"Validate policy for networks."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        This is a default implementation, that could be overriden for a more"},{"line_number":82,"context_line":"        performant one if necessary."},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        core_plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":85,"context_line":"        network_ports \u003d core_plugin.get_ports("}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_c88732b3","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":36},"in_reply_to":"bacf61ea_f89181f2","updated":"2016-08-01 21:28:34.000000000","message":"I removed it.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/services/qos/qos_consts.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"QOS_POLICY_ID \u003d \u0027qos_policy_id\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"ANY_VALUE \u003d \u0027*\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# NOTE(slaweq): Value used to calculate burst value for egress bandwidth limit"},{"line_number":25,"context_line":"# if burst is not given by user. In such case burst value will be calculated"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_dba8f779","line":22,"updated":"2016-07-29 15:43:02.000000000","message":"atm this seems specific to ml2, there is no place where you expose it. So it\u0027s misplaced.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"QOS_POLICY_ID \u003d \u0027qos_policy_id\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"ANY_VALUE \u003d \u0027*\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# NOTE(slaweq): Value used to calculate burst value for egress bandwidth limit"},{"line_number":25,"context_line":"# if burst is not given by user. In such case burst value will be calculated"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_bbd4fc1f","line":22,"in_reply_to":"bacf61ea_dba8f779","updated":"2016-08-01 21:28:34.000000000","message":"but it is related to QoS validation mechanism and can be used by other plugins or drivers also.\nDo You want to move it to ml2 constants? or where in Your opinion would be better place?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/services/qos/qos_plugin.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"081e2a0e1590a64b332aa8d00dafd518eb3d847c","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_b804a5c6","line":178,"updated":"2016-07-17 19:57:46.000000000","message":"why is this done in a transaction?","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fe46f89eff8beef1630339a868afb91a5789690a","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_0074189a","line":178,"in_reply_to":"dada55a8_b804a5c6","updated":"2016-07-24 16:26:40.000000000","message":"it is similar case like e.g. for network_update in neutron/plugins/ml2/plugin.py","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"081e2a0e1590a64b332aa8d00dafd518eb3d847c","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            policy.reload_rules()"},{"line_number":212,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":213,"context_line":"            # policy"},{"line_number":214,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":215,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":216,"context_line":"        return rule"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_9809e1e0","line":214,"updated":"2016-07-17 19:57:46.000000000","message":"ditto?","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fe46f89eff8beef1630339a868afb91a5789690a","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            policy.reload_rules()"},{"line_number":212,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":213,"context_line":"            # policy"},{"line_number":214,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":215,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":216,"context_line":"        return rule"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dada55a8_e07624a2","line":214,"in_reply_to":"dada55a8_9809e1e0","updated":"2016-07-24 16:26:40.000000000","message":"see my comment above","commit_id":"f88eccc562c8ff7679f3bfd854ee6eb834e1cb75"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_1b0baf8f","line":178,"updated":"2016-07-29 15:43:02.000000000","message":"as said in other comments, there is no reason to bundle notification drivers with validations. You actually make things more complicated to maintain by doing it, you also open door for incorrect configuration setup.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"2e8d7d5c0677a6476b91f81dd6f30cdc33e71d04","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_b16197ab","line":178,"in_reply_to":"bacf61ea_1b0baf8f","updated":"2016-08-01 14:56:55.000000000","message":"Look at my previous comments too. I\u0027m definitely going to send a patch to rename that and deprecate the old setting.\n\nI will also release a diagram of the QoS service / backend integration.\n\nHow would that line look if you se\n\nself.qos_driver.validate_policy(context, policy) ? \n\nThen, the detail of using notifications is only relevant to ML2, but other plugins could use other stuff to talk to the backend and update policies,validate policies, validate ports in policies, etc etc..","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f75eaf121fa57b754d7b4dcca0aec7f940577fb2","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_a38f6673","line":178,"in_reply_to":"bacf61ea_2825155b","updated":"2016-08-02 09:20:23.000000000","message":"I think it could be reasonable to introduce a get_qos_driver() in the base core plugin class, so that the code is decoupled, and at the same time is defined by the plugin, not config file.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1a27658ec0e12d741bf39cdf24a2869f15a50efe","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_2825155b","line":178,"in_reply_to":"bacf61ea_6866062b","updated":"2016-08-02 09:06:46.000000000","message":"@ihar, yeah, I understand what you mean.\n\nLet me give it some thought and let\u0027s try to address all the points.\n\nI agree that forcing operators to change their \"qos driver\" to have validation doesn\u0027t make sense.\n\nEven, making it necessary to setup a config entry... that should be automatic and the QoSDriver interface exposed by the core plugin, may be in the form of an attribute core_plugin.qos_driver ...","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c502def352b5d8da2e5779c7cd256e3b54e72b8f","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_03f86148","line":178,"in_reply_to":"bacf61ea_a38f6673","updated":"2016-08-10 12:31:33.000000000","message":"@ihar, you asked: https://review.openstack.org/#/c/351858/\n\ncan you folks have a look at that?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"96a28aa45156de230585d2e6ae0c2e71929114d8","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_ff3c6794","line":178,"in_reply_to":"bacf61ea_b16197ab","updated":"2016-08-01 21:22:59.000000000","message":"Rename is due irrelevant to the discussion. Please send the patch for that.\n\nIt\u0027s ok-ish to have it bundled in a separate \u0027qos driver\u0027, but the question that remains is: what\u0027s the use case to have ml2 not validating port/policy relation (as you leave possible thru configuration files); to have the driver, old or new, to be used out of ml2 scope.\n\nIf I redesign the thing today, I would probably have core plugins define behaviour for notifications and other things; in case of ml2, notifications could be implemented thru a manager calling to notification drivers registered by ml2 drivers; in case of other core plugins, that would be eg. direct call to a single notification driver, because in that case backend is the same for all nodes. And same approach would be applied to validations.\n\nThe benefit of ^ is that you don\u0027t force users to configure their notification drivers; instead, you leave it to core plugin to define the intended behaviour.\n\nIt\u0027s even more relevant with validations, that you probably should enable for all ml2 based installations, and not just for those that happen to reconfigure their neutron to use the new driver you add. What next? Asking users to configure neutron to fix a race condition bug?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            policy.reload_rules()"},{"line_number":176,"context_line":"            # Ensure that rule can be applied by all ports/networks bound to"},{"line_number":177,"context_line":"            # policy"},{"line_number":178,"context_line":"            self.notification_driver_manager.validate_policy(context, policy)"},{"line_number":179,"context_line":"        self.notification_driver_manager.update_policy(context, policy)"},{"line_number":180,"context_line":"        return rule"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_6866062b","line":178,"in_reply_to":"bacf61ea_b16197ab","updated":"2016-08-01 21:28:34.000000000","message":"so should I rewrite it somehow (how)? or it will be fine? :)","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/tests/tempest/api/test_qos.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d003efed744e0b5e1b96d49d8f390a8c46ee7322","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def _test_list_rule_types_per_port_type(self, client):"},{"line_number":134,"context_line":"        # TODO(slaweq): I need to find way how to do this new call in API"},{"line_number":135,"context_line":"        # extension because now I have 404 all time"},{"line_number":136,"context_line":"        pass"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_b0a19048","line":135,"updated":"2016-06-08 13:12:01.000000000","message":"check comment I left at the extension file :)","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9c435247eaab2da10a3fa1c2bafafaeb1f514137","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def _test_list_rule_types_per_port_type(self, client):"},{"line_number":134,"context_line":"        # TODO(slaweq): I need to find way how to do this new call in API"},{"line_number":135,"context_line":"        # extension because now I have 404 all time"},{"line_number":136,"context_line":"        pass"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_8e5c174c","line":135,"in_reply_to":"7aa08908_b0a19048","updated":"2016-06-11 20:15:13.000000000","message":"ok :)","commit_id":"f50f91c37fb4fb66623f343ec994410c8177abcd"}],"neutron/tests/unit/plugins/ml2/test_plugin.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            mock_.return_value \u003d {"},{"line_number":178,"context_line":"                qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":179,"context_line":"                    \u0027max_kbps\u0027: [],"},{"line_number":180,"context_line":"                    \u0027max_burst_kbps\u0027: []"},{"line_number":181,"context_line":"                },"},{"line_number":182,"context_line":"                qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":183,"context_line":"                    \u0027dscp_mark\u0027: []"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_94d3e1d4","line":180,"updated":"2016-06-13 07:47:09.000000000","message":"same comments as before","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            mock_.return_value \u003d {"},{"line_number":178,"context_line":"                qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":179,"context_line":"                    \u0027max_kbps\u0027: [],"},{"line_number":180,"context_line":"                    \u0027max_burst_kbps\u0027: []"},{"line_number":181,"context_line":"                },"},{"line_number":182,"context_line":"                qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":183,"context_line":"                    \u0027dscp_mark\u0027: []"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_13236759","line":180,"in_reply_to":"7aa08908_94d3e1d4","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":180,"context_line":"                    \u0027max_burst_kbps\u0027: []"},{"line_number":181,"context_line":"                },"},{"line_number":182,"context_line":"                qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":183,"context_line":"                    \u0027dscp_mark\u0027: []"},{"line_number":184,"context_line":"                }"},{"line_number":185,"context_line":"            }"},{"line_number":186,"context_line":"        for rule in [qos_consts.RULE_TYPE_BANDWIDTH_LIMIT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_d4d9e9f4","line":183,"updated":"2016-06-13 07:47:09.000000000","message":"ditto","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":180,"context_line":"                    \u0027max_burst_kbps\u0027: []"},{"line_number":181,"context_line":"                },"},{"line_number":182,"context_line":"                qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":183,"context_line":"                    \u0027dscp_mark\u0027: []"},{"line_number":184,"context_line":"                }"},{"line_number":185,"context_line":"            }"},{"line_number":186,"context_line":"        for rule in [qos_consts.RULE_TYPE_BANDWIDTH_LIMIT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_f327bb60","line":183,"in_reply_to":"7aa08908_d4d9e9f4","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        mocks[1].return_value \u003d {"},{"line_number":203,"context_line":"            qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":204,"context_line":"                \u0027max_kbps\u0027: [],"},{"line_number":205,"context_line":"                \u0027max_burst_kbps\u0027: []"},{"line_number":206,"context_line":"            },"},{"line_number":207,"context_line":"            qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":208,"context_line":"                \u0027dscp_mark\u0027: []"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_34e30da6","line":205,"updated":"2016-06-13 07:47:09.000000000","message":"ditto","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        mocks[1].return_value \u003d {"},{"line_number":203,"context_line":"            qos_consts.RULE_TYPE_BANDWIDTH_LIMIT: {"},{"line_number":204,"context_line":"                \u0027max_kbps\u0027: [],"},{"line_number":205,"context_line":"                \u0027max_burst_kbps\u0027: []"},{"line_number":206,"context_line":"            },"},{"line_number":207,"context_line":"            qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":208,"context_line":"                \u0027dscp_mark\u0027: []"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_53216f4c","line":205,"in_reply_to":"7aa08908_34e30da6","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                \u0027max_burst_kbps\u0027: []"},{"line_number":206,"context_line":"            },"},{"line_number":207,"context_line":"            qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":208,"context_line":"                \u0027dscp_mark\u0027: []"},{"line_number":209,"context_line":"            }"},{"line_number":210,"context_line":"        }"},{"line_number":211,"context_line":"        for rule in [qos_consts.RULE_TYPE_BANDWIDTH_LIMIT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_14e09195","line":208,"updated":"2016-06-13 07:47:09.000000000","message":"ditto","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                \u0027max_burst_kbps\u0027: []"},{"line_number":206,"context_line":"            },"},{"line_number":207,"context_line":"            qos_consts.RULE_TYPE_DSCP_MARK: {"},{"line_number":208,"context_line":"                \u0027dscp_mark\u0027: []"},{"line_number":209,"context_line":"            }"},{"line_number":210,"context_line":"        }"},{"line_number":211,"context_line":"        for rule in [qos_consts.RULE_TYPE_BANDWIDTH_LIMIT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_331e630c","line":208,"in_reply_to":"7aa08908_14e09195","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"46bcde99358e2ac05953b89268859bd48782113d","unresolved":false,"context_lines":[{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"            plugin.update_port(self.context, port_id, mock.MagicMock())"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"            before_upgrade_kwargs \u003d {"},{"line_number":2212,"context_line":"                \u0027context\u0027: self.context,"},{"line_number":2213,"context_line":"                \u0027updated_port\u0027: updated_port,"},{"line_number":2214,"context_line":"                \u0027original_port\u0027: original_port,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_4a1ef070","line":2211,"updated":"2016-06-13 08:56:54.000000000","message":"I guess those belong to a separate test. (not within test_create_port_rpc_outside_transaction).","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"81ad438cd40c43bb684183fef9f14b9a195035f9","unresolved":false,"context_lines":[{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"            plugin.update_port(self.context, port_id, mock.MagicMock())"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"            before_upgrade_kwargs \u003d {"},{"line_number":2212,"context_line":"                \u0027context\u0027: self.context,"},{"line_number":2213,"context_line":"                \u0027updated_port\u0027: updated_port,"},{"line_number":2214,"context_line":"                \u0027original_port\u0027: original_port,"}],"source_content_type":"text/x-python","patch_set":15,"id":"5a9d85d2_87cf757e","line":2211,"in_reply_to":"7aa08908_1fb87710","updated":"2016-06-21 20:04:56.000000000","message":"I changed name of this test. IMHO there is no point to make another test and only difference between them would be call of \"assert_called_with()\" with different parameters.","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"            plugin.update_port(self.context, port_id, mock.MagicMock())"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"            before_upgrade_kwargs \u003d {"},{"line_number":2212,"context_line":"                \u0027context\u0027: self.context,"},{"line_number":2213,"context_line":"                \u0027updated_port\u0027: updated_port,"},{"line_number":2214,"context_line":"                \u0027original_port\u0027: original_port,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_f3e85bb5","line":2211,"in_reply_to":"7aa08908_4a1ef070","updated":"2016-06-13 20:57:13.000000000","message":"sorry, I\u0027m not sure how it should looks like then. AFAIU this test checks rpc calls so I added to check call to our rule validation also. Should I do separate test for it maybe?","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8850a0f537e251658a06f759de33dd75861fbf5f","unresolved":false,"context_lines":[{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"            plugin.update_port(self.context, port_id, mock.MagicMock())"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"            before_upgrade_kwargs \u003d {"},{"line_number":2212,"context_line":"                \u0027context\u0027: self.context,"},{"line_number":2213,"context_line":"                \u0027updated_port\u0027: updated_port,"},{"line_number":2214,"context_line":"                \u0027original_port\u0027: original_port,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_1fb87710","line":2211,"in_reply_to":"7aa08908_f3e85bb5","updated":"2016-06-14 08:22:54.000000000","message":"May be a similar test, with different name, but \"test_create_port_callbacks\" , \n\nI\u0027d try to refactor all common parts.","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"}],"neutron/tests/unit/services/qos/notification_drivers/dummy.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def delete_policy(self, policy):"},{"line_number":30,"context_line":"        pass"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":33,"context_line":"        pass"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def validate_policy_for_network(self, context, policy, network):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_5b0fe787","line":32,"updated":"2016-07-29 15:43:02.000000000","message":"no notification drivers should need to define anything. If it\u0027s the case, you introduce a breaking change. Don\u0027t do it.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def delete_policy(self, policy):"},{"line_number":30,"context_line":"        pass"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def validate_policy_for_port(self, context, policy, port):"},{"line_number":33,"context_line":"        pass"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def validate_policy_for_network(self, context, policy, network):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bacf61ea_c85c524d","line":32,"in_reply_to":"bacf61ea_5b0fe787","updated":"2016-08-01 21:28:34.000000000","message":"For now validate_policy_for_port is abstract method and that\u0027s why it is neccessary here. Should I change it to not be abstract? or maybe we will move validate methods to other driver as I asked in other comments?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}],"neutron/tests/unit/services/qos/notification_drivers/test_manager.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"46bcde99358e2ac05953b89268859bd48782113d","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            self.driver_manager.validate_policy(self.context, self.policy)"},{"line_number":105,"context_line":"            self.rpc_api.push.assert_not_called()"},{"line_number":106,"context_line":"            notification_driver_mock.validate_policy_for_port.\\"},{"line_number":107,"context_line":"                assert_called_with(self.context, self.policy, \"port_1_info\")"},{"line_number":108,"context_line":"            notification_driver_mock.validate_policy_for_network.\\"},{"line_number":109,"context_line":"                assert_called_with(self.context, self.policy, \"network_1_info\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_2a044416","line":106,"updated":"2016-06-13 08:56:54.000000000","message":"we avoid the \\ by the end, not sure if there\u0027s a way in this case, may be a shorter name for the mock?","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"81ad438cd40c43bb684183fef9f14b9a195035f9","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            self.driver_manager.validate_policy(self.context, self.policy)"},{"line_number":105,"context_line":"            self.rpc_api.push.assert_not_called()"},{"line_number":106,"context_line":"            notification_driver_mock.validate_policy_for_port.\\"},{"line_number":107,"context_line":"                assert_called_with(self.context, self.policy, \"port_1_info\")"},{"line_number":108,"context_line":"            notification_driver_mock.validate_policy_for_network.\\"},{"line_number":109,"context_line":"                assert_called_with(self.context, self.policy, \"network_1_info\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"5a9d85d2_479aad64","line":106,"in_reply_to":"7aa08908_1f4fd734","updated":"2016-06-21 20:04:56.000000000","message":"So, should I put it in brackets or left as it is now? :)","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            self.driver_manager.validate_policy(self.context, self.policy)"},{"line_number":105,"context_line":"            self.rpc_api.push.assert_not_called()"},{"line_number":106,"context_line":"            notification_driver_mock.validate_policy_for_port.\\"},{"line_number":107,"context_line":"                assert_called_with(self.context, self.policy, \"port_1_info\")"},{"line_number":108,"context_line":"            notification_driver_mock.validate_policy_for_network.\\"},{"line_number":109,"context_line":"                assert_called_with(self.context, self.policy, \"network_1_info\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_73f62b5e","line":106,"in_reply_to":"7aa08908_2a044416","updated":"2016-06-13 20:57:13.000000000","message":"I\u0027m not sure what other name could I use here. I can place it in brackets but I\u0027m not sure if it will be better solution. What You think?","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8850a0f537e251658a06f759de33dd75861fbf5f","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            self.driver_manager.validate_policy(self.context, self.policy)"},{"line_number":105,"context_line":"            self.rpc_api.push.assert_not_called()"},{"line_number":106,"context_line":"            notification_driver_mock.validate_policy_for_port.\\"},{"line_number":107,"context_line":"                assert_called_with(self.context, self.policy, \"port_1_info\")"},{"line_number":108,"context_line":"            notification_driver_mock.validate_policy_for_network.\\"},{"line_number":109,"context_line":"                assert_called_with(self.context, self.policy, \"network_1_info\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_1f4fd734","line":106,"in_reply_to":"7aa08908_73f62b5e","updated":"2016-06-14 08:22:54.000000000","message":"I\u0027m not sure what\u0027s our logic behind not using \\ , I just know it\u0027s like that. I could probably provide a better answer if I knew.","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"}],"neutron/tests/unit/services/qos/notification_drivers/test_ml2_notification_driver.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"64d55085b8e6a6edb3bd3a2791d7e1b32f7f9759","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import copy"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":"from oslo_utils import uuidutils"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_54f4d959","line":16,"updated":"2016-06-13 07:47:09.000000000","message":"this should not be in the 3rd party section. copy is a standard library","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"46bcde99358e2ac05953b89268859bd48782113d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import copy"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":"from oslo_utils import uuidutils"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_ac0b3123","line":16,"in_reply_to":"7aa08908_54f4d959","updated":"2016-06-13 08:56:54.000000000","message":"add blank line :)","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import copy"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":"from oslo_utils import uuidutils"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7aa08908_738d8bd2","line":16,"in_reply_to":"7aa08908_ac0b3123","updated":"2016-06-13 20:57:13.000000000","message":"Done","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"}],"setup.cfg":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"46bcde99358e2ac05953b89268859bd48782113d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    timestamp_core \u003d neutron.services.timestamp.timestamp_plugin:TimeStampPlugin"},{"line_number":85,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":86,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":87,"context_line":"    ml2_notification_driver \u003d neutron.services.qos.notification_drivers.ml2_notification_driver:Ml2QoSServiceNotificationDriver"},{"line_number":88,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":89,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":90,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":15,"id":"7aa08908_ac2211a1","line":87,"updated":"2016-06-13 08:56:54.000000000","message":"may be it\u0027s better if we start shifting away from \"notification driver\" , may be ml2_qos_driver ?","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"81ad438cd40c43bb684183fef9f14b9a195035f9","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    timestamp_core \u003d neutron.services.timestamp.timestamp_plugin:TimeStampPlugin"},{"line_number":85,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":86,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":87,"context_line":"    ml2_notification_driver \u003d neutron.services.qos.notification_drivers.ml2_notification_driver:Ml2QoSServiceNotificationDriver"},{"line_number":88,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":89,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":90,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":15,"id":"5a9d85d2_27a4b8a4","line":87,"in_reply_to":"7aa08908_6b8d7930","updated":"2016-06-21 20:04:56.000000000","message":"File renamed to ml2_qos_driver.py also. Is it better now?","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8850a0f537e251658a06f759de33dd75861fbf5f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    timestamp_core \u003d neutron.services.timestamp.timestamp_plugin:TimeStampPlugin"},{"line_number":85,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":86,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":87,"context_line":"    ml2_notification_driver \u003d neutron.services.qos.notification_drivers.ml2_notification_driver:Ml2QoSServiceNotificationDriver"},{"line_number":88,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":89,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":90,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":15,"id":"7aa08908_bf0de3e9","line":87,"in_reply_to":"7aa08908_7352ab36","updated":"2016-06-14 08:22:54.000000000","message":"May be ml2_qos_driver is ok :)","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d790cd3b43f8a812ed2df5cd6f8276a6e95556f6","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    timestamp_core \u003d neutron.services.timestamp.timestamp_plugin:TimeStampPlugin"},{"line_number":85,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":86,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":87,"context_line":"    ml2_notification_driver \u003d neutron.services.qos.notification_drivers.ml2_notification_driver:Ml2QoSServiceNotificationDriver"},{"line_number":88,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":89,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":90,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":15,"id":"7aa08908_7352ab36","line":87,"in_reply_to":"7aa08908_ac2211a1","updated":"2016-06-13 20:57:13.000000000","message":"name changed. Should I also change file and class name from ml2_notification_driver to ml2_qos_driver (or ml2_driver)?","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1842b1d101b7dcaf0ab6a7c2e93ff7f2d63ee488","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    timestamp_core \u003d neutron.services.timestamp.timestamp_plugin:TimeStampPlugin"},{"line_number":85,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":86,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":87,"context_line":"    ml2_notification_driver \u003d neutron.services.qos.notification_drivers.ml2_notification_driver:Ml2QoSServiceNotificationDriver"},{"line_number":88,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":89,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":90,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":15,"id":"7aa08908_6b8d7930","line":87,"in_reply_to":"7aa08908_bf0de3e9","updated":"2016-06-14 09:34:21.000000000","message":"Ok. I will rename this class today. Thx","commit_id":"b01a56608ad2c9d7635402353f6a226c256710ec"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a7014131cf0cd9c8c79d1b7eed8adb1bc74885d3","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    trunk \u003d neutron.services.trunk.plugin:TrunkPlugin"},{"line_number":86,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":87,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":88,"context_line":"    ml2_qos_driver \u003d neutron.services.qos.notification_drivers.ml2_qos_driver:Ml2QoSServiceNotificationDriver"},{"line_number":89,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":90,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":91,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":24,"id":"bacf61ea_d4ed6bf0","line":88,"updated":"2016-07-29 15:43:02.000000000","message":"I don\u0027t think you should hijack notification drivers like that. Please introduce a separate mechanism to achieve that, probably to be defined on core plugin. With default implementation doing nothing.\n\nAnother problem with the approach is that you would leave existing ml2 setups without validation unless they explicitly configure this new driver.\n\nI think plugins should be self aware about how they want to validate qos resources.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7354ee65388441aff96f7bfc455aa4312027c6a9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    trunk \u003d neutron.services.trunk.plugin:TrunkPlugin"},{"line_number":86,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":87,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":88,"context_line":"    ml2_qos_driver \u003d neutron.services.qos.notification_drivers.ml2_qos_driver:Ml2QoSServiceNotificationDriver"},{"line_number":89,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":90,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":91,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":24,"id":"bacf61ea_fff3c770","line":88,"in_reply_to":"bacf61ea_6302a70b","updated":"2016-08-01 21:37:44.000000000","message":"I think there are two takes on where the code belongs. If we can\u0027t resolve the issue in group, we may need to reach to the community for advice. Let\u0027s spin on the issue the next several days and see if we can come up with agreement.\n\nWhat I am completely sure about is that message_queue must not exist separate from ml2_qos_driver. If we go the notification driver road, we should at least 1) rename the conf option 2) replace, not extend, message_queue with ml2_qos_driver.\n\nI personally think that core plugins should own the answer to the question whether a port/policy relation makes sense. No external entity should be required to be configured for validations to work out of the box. Ideally, even notification drivers should not be configured, it should be a matter of core plugin to enable the right one(s). But since we are already in place where the configuration option is exposed, we can\u0027t get there immediately. It\u0027s still a question whether we should rename the option or just start deprecation process for that, moving the decision on what to enable to core plugins. This, I hope, we\u0027ll be able to clear up as part of discussion here.","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"484b0e37b2d9c1b332137ff497da9066ca9f09d8","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    trunk \u003d neutron.services.trunk.plugin:TrunkPlugin"},{"line_number":86,"context_line":"neutron.qos.notification_drivers \u003d"},{"line_number":87,"context_line":"    message_queue \u003d neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver"},{"line_number":88,"context_line":"    ml2_qos_driver \u003d neutron.services.qos.notification_drivers.ml2_qos_driver:Ml2QoSServiceNotificationDriver"},{"line_number":89,"context_line":"neutron.ml2.type_drivers \u003d"},{"line_number":90,"context_line":"    flat \u003d neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver"},{"line_number":91,"context_line":"    local \u003d neutron.plugins.ml2.drivers.type_local:LocalTypeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":24,"id":"bacf61ea_6302a70b","line":88,"in_reply_to":"bacf61ea_d4ed6bf0","updated":"2016-08-01 21:28:34.000000000","message":"I don\u0027t understand it exactly. Should we introduce new mechanism instead of using notification driver to do such validation?","commit_id":"a5235e309dd662ea7e28b99ef4d024c9b65357f9"}]}
