)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Generalize agent extension mechanism"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change generalizes agent extension code so that all agents can take"},{"line_number":10,"context_line":"advantage of a common mechanism."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Margaret Frances \u003cmargaret_frances@cable.comcast.com\u003e"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_b7994322","line":10,"updated":"2016-07-02 10:41:37.000000000","message":"We need to document the new public interface in devref.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Generalize agent extension mechanism"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change generalizes agent extension code so that all agents can take"},{"line_number":10,"context_line":"advantage of a common mechanism."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Margaret Frances \u003cmargaret_frances@cable.comcast.com\u003e"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_31b436f1","line":10,"in_reply_to":"1aa78d24_b7994322","updated":"2016-07-03 12:57:47.000000000","message":"Will do.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Margaret Frances \u003cmargaret_frances@cable.comcast.com\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I9380343c09d28eec67077c9e6d77c33a195e516b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_77f99b4d","line":14,"updated":"2016-07-02 10:41:37.000000000","message":"Please mention blueprint in the commit message.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Margaret Frances \u003cmargaret_frances@cable.comcast.com\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I9380343c09d28eec67077c9e6d77c33a195e516b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_f1b90eee","line":14,"in_reply_to":"1aa78d24_77f99b4d","updated":"2016-07-03 12:57:47.000000000","message":"Will do.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"078895510bbfb64b2f8c3eb7d7f9550e69d31c81","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Margaret Frances \u003cmargaret_frances@cable.comcast.com\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint l3-agent-extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I9380343c09d28eec67077c9e6d77c33a195e516b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1aa78d24_13e28b2f","line":14,"updated":"2016-07-15 14:19:12.000000000","message":"I guess only Partially-Implements.","commit_id":"2c4f9e7fb2f40d0388e7832b500811db34ee011c"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f2a63cbf24964a07cdf3ace1fcea5a9a46152b75","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Margaret Frances \u003cmargaret_frances@cable.comcast.com\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint l3-agent-extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I9380343c09d28eec67077c9e6d77c33a195e516b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"fad55976_adb589d1","line":14,"in_reply_to":"1aa78d24_13e28b2f","updated":"2016-07-15 14:42:05.000000000","message":"True!  Fixed.","commit_id":"2c4f9e7fb2f40d0388e7832b500811db34ee011c"}],"doc/source/devref/agent_extensions.rst":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_1defe887","line":1,"updated":"2016-07-12 16:07:28.000000000","message":"I think you missed attaching the new page to contents.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_89971a8f","line":1,"in_reply_to":"1aa78d24_1defe887","updated":"2016-07-12 16:38:24.000000000","message":"Will fix.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_19d533e4","line":1,"in_reply_to":"1aa78d24_89971a8f","updated":"2016-07-14 20:23:06.000000000","message":"Done","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Agent extensions"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"All reference agents utilize a common extension mechanism that allows for the"},{"line_number":28,"context_line":"introduction and enabling of a core resource extension without needing to"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_fdcc9c36","line":25,"updated":"2016-07-12 16:07:28.000000000","message":"remove trailing \u003d\u003d\u003d","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Agent extensions"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"All reference agents utilize a common extension mechanism that allows for the"},{"line_number":28,"context_line":"introduction and enabling of a core resource extension without needing to"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_59097b94","line":25,"in_reply_to":"1aa78d24_69946e8a","updated":"2016-07-14 20:23:06.000000000","message":"Done","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Agent extensions"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"All reference agents utilize a common extension mechanism that allows for the"},{"line_number":28,"context_line":"introduction and enabling of a core resource extension without needing to"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_69946e8a","line":25,"in_reply_to":"1aa78d24_fdcc9c36","updated":"2016-07-12 16:38:24.000000000","message":"Will do.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"All reference agents utilize a common extension mechanism that allows for the"},{"line_number":28,"context_line":"introduction and enabling of a core resource extension without needing to"},{"line_number":29,"context_line":"change agent code. This mechanism also allows multiple agents to be run"},{"line_number":30,"context_line":"simultaneously. The mechanism may be especially interesting to third parties"},{"line_number":31,"context_line":"whose extensions lie outside the neutron tree."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Under this framework, an agent may expose its API to each of its extensions"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_1ddec810","line":30,"range":{"start_line":29,"start_character":19,"end_line":30,"end_character":14},"updated":"2016-07-12 16:07:28.000000000","message":"Not sure I follow that sentence. You probably want to say that multiple SERVICES can be run by a single AGENT simultaneously.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"9c771f6f7d57c1f18f4feb97e49a5a9d4be78824","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"All reference agents utilize a common extension mechanism that allows for the"},{"line_number":28,"context_line":"introduction and enabling of a core resource extension without needing to"},{"line_number":29,"context_line":"change agent code. This mechanism also allows multiple agents to be run"},{"line_number":30,"context_line":"simultaneously. The mechanism may be especially interesting to third parties"},{"line_number":31,"context_line":"whose extensions lie outside the neutron tree."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Under this framework, an agent may expose its API to each of its extensions"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_44b3599a","line":30,"range":{"start_line":29,"start_character":19,"end_line":30,"end_character":14},"in_reply_to":"1aa78d24_1ddec810","updated":"2016-07-12 16:58:30.000000000","message":"This mechanism allows multiple agent extensions to be run by a single agent simultaneously.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"aff3069d857daf96fc8699eafae659b9037f6d86","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"All reference agents utilize a common extension mechanism that allows for the"},{"line_number":28,"context_line":"introduction and enabling of a core resource extension without needing to"},{"line_number":29,"context_line":"change agent code. This mechanism also allows multiple agents to be run"},{"line_number":30,"context_line":"simultaneously. The mechanism may be especially interesting to third parties"},{"line_number":31,"context_line":"whose extensions lie outside the neutron tree."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Under this framework, an agent may expose its API to each of its extensions"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_dff39071","line":30,"range":{"start_line":29,"start_character":19,"end_line":30,"end_character":14},"in_reply_to":"1aa78d24_44b3599a","updated":"2016-07-12 17:27:42.000000000","message":"Right. Not what is said here right now.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"All reference agents utilize a common extension mechanism that allows for the"},{"line_number":28,"context_line":"introduction and enabling of a core resource extension without needing to"},{"line_number":29,"context_line":"change agent code. This mechanism also allows multiple agents to be run"},{"line_number":30,"context_line":"simultaneously. The mechanism may be especially interesting to third parties"},{"line_number":31,"context_line":"whose extensions lie outside the neutron tree."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Under this framework, an agent may expose its API to each of its extensions"}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_792d57fd","line":30,"range":{"start_line":29,"start_character":19,"end_line":30,"end_character":14},"in_reply_to":"1aa78d24_dff39071","updated":"2016-07-14 20:23:06.000000000","message":"Done","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"Every agent can pass an \"agent API object\" into its extensions in order to"},{"line_number":67,"context_line":"expose its internals to them in a controlled way. To accommodate different"},{"line_number":68,"context_line":"agents, each extension must define a consume_api() method that will receive"},{"line_number":69,"context_line":"this object."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"This agent API object is part of neutron\u0027s public interface for third parties."},{"line_number":72,"context_line":"All changes to the interface will be managed in a backwards-compatible way."}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_bd71740e","line":69,"range":{"start_line":68,"start_character":8,"end_line":69,"end_character":11},"updated":"2016-07-12 16:07:28.000000000","message":"I think it\u0027s not MUST, because extensions may not need it.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"Every agent can pass an \"agent API object\" into its extensions in order to"},{"line_number":67,"context_line":"expose its internals to them in a controlled way. To accommodate different"},{"line_number":68,"context_line":"agents, each extension must define a consume_api() method that will receive"},{"line_number":69,"context_line":"this object."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"This agent API object is part of neutron\u0027s public interface for third parties."},{"line_number":72,"context_line":"All changes to the interface will be managed in a backwards-compatible way."}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_5917bba2","line":69,"range":{"start_line":68,"start_character":8,"end_line":69,"end_character":11},"in_reply_to":"1aa78d24_49a252fd","updated":"2016-07-14 20:23:06.000000000","message":"Done","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"Every agent can pass an \"agent API object\" into its extensions in order to"},{"line_number":67,"context_line":"expose its internals to them in a controlled way. To accommodate different"},{"line_number":68,"context_line":"agents, each extension must define a consume_api() method that will receive"},{"line_number":69,"context_line":"this object."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"This agent API object is part of neutron\u0027s public interface for third parties."},{"line_number":72,"context_line":"All changes to the interface will be managed in a backwards-compatible way."}],"source_content_type":"text/x-rst","patch_set":14,"id":"1aa78d24_49a252fd","line":69,"range":{"start_line":68,"start_character":8,"end_line":69,"end_character":11},"in_reply_to":"1aa78d24_bd71740e","updated":"2016-07-12 16:38:24.000000000","message":"Yes, I will fix this.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"}],"neutron/agent/agent_extension.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2615f4c1dde9fe3a3cb1d5917627f2ba1f7d0b8b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def consume_api(self, agent_api):"},{"line_number":41,"context_line":"        \"\"\"Consume the AgentAPI instance from the AgentExtensionsManager"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        This allows extensions to gain access to resources limited to the"},{"line_number":44,"context_line":"        NeutronAgent."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        :param agent_api: An instance of an agent specific API"},{"line_number":47,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_6f91849a","line":44,"range":{"start_line":43,"start_character":8,"end_line":44,"end_character":21},"updated":"2016-07-09 08:12:02.000000000","message":"I\u0027ll add more detail about why extensions need to implement this method.","commit_id":"4af2a5a7538afbfd82fa4662ccfc464576774fa8"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"3fb1af2741b0228606acca19b0b6f2f6f88e1151","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        this method."},{"line_number":38,"context_line":"        \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def consume_api(self, agent_api):"},{"line_number":41,"context_line":"        \"\"\"Consume the AgentAPI instance from the AgentExtensionsManager"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        This allows extensions to gain access to resources limited to the"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_2cddcf42","line":40,"range":{"start_line":40,"start_character":4,"end_line":40,"end_character":37},"updated":"2016-07-09 00:47:10.000000000","message":"I\u0027ve gone back and forth on whether this should be marked an abc.abstractmethod.  I hope someone will put me out of my misery.\n\nNo agent_api may be provided by a given agent, but the extension manager calls consume_api on its extensions with no try/except.","commit_id":"be29aa83cb505e191d34ec21c89d7ee35e2958ed"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9ac9b56a3ecdda7e8e8c24b43b59fb990fc38d98","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        this method."},{"line_number":38,"context_line":"        \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def consume_api(self, agent_api):"},{"line_number":41,"context_line":"        \"\"\"Consume the AgentAPI instance from the AgentExtensionsManager"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        This allows extensions to gain access to resources limited to the"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_ef1454a0","line":40,"range":{"start_line":40,"start_character":4,"end_line":40,"end_character":37},"in_reply_to":"1aa78d24_2cddcf42","updated":"2016-07-09 09:04:12.000000000","message":"I realize: consume_api must be implemented by all extensions because in principle an extension must accommodate multiple agents, any one of which may send in its agent_api.  So i\u0027ll designate consume_api an abc.abstractmethod, and we\u0027ll see how that code change fares in the community.","commit_id":"be29aa83cb505e191d34ec21c89d7ee35e2958ed"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"36ab58ac12d2d71060d2365d24e672b42584366f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        this method."},{"line_number":38,"context_line":"        \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @abc.abstractmethod"},{"line_number":41,"context_line":"    def consume_api(self, agent_api):"},{"line_number":42,"context_line":"        \"\"\"Consume the AgentAPI instance from the AgentExtensionsManager."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_517079dc","line":40,"range":{"start_line":40,"start_character":4,"end_line":40,"end_character":23},"updated":"2016-07-11 16:12:22.000000000","message":"consume_api can\u0027t be an abstract method, the reason it isn\u0027t abstract is so it won\u0027t need to be overloaded to not use it.\n\nIt means calling consume_api on an agent that hasn\u0027t overloaded it won\u0027t break the extension agent.","commit_id":"5c8afd2359ffabf89980d7154872aa9a546b9877"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2a876656001cee0b875673ce12721e87b0092902","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        this method."},{"line_number":38,"context_line":"        \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @abc.abstractmethod"},{"line_number":41,"context_line":"    def consume_api(self, agent_api):"},{"line_number":42,"context_line":"        \"\"\"Consume the AgentAPI instance from the AgentExtensionsManager."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1aa78d24_c78b0b67","line":40,"range":{"start_line":40,"start_character":4,"end_line":40,"end_character":23},"in_reply_to":"1aa78d24_517079dc","updated":"2016-07-11 16:31:46.000000000","message":"i get it (finally!).  removing now.  thank you david.","commit_id":"5c8afd2359ffabf89980d7154872aa9a546b9877"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8ae7c8faaf06308fa52838627a2dc47d73f53d03","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":19,"context_line":"class AgentCoreResourceExtension(object):"},{"line_number":20,"context_line":"    \"\"\"Define stable abstract interface for agent extensions."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_d3e45ae1","line":19,"updated":"2016-07-12 01:44:04.000000000","message":"The old L2 extensions would be still importing this, and working, although they wouldn\u0027t be having the abstract method check for handle_port or delete_port.\n\nThey\u0027d be not hard-broken.\n\nI was considering to ask for a rename of this class to make sure the change into the new L2 extension... but probably that\u0027s not necessary, may be we should just notice it in the release notes, and ping anyone we know it\u0027s creating an L2 extension.","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fd51280371f208640866accb0859d0ecd940bede","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":19,"context_line":"class AgentCoreResourceExtension(object):"},{"line_number":20,"context_line":"    \"\"\"Define stable abstract interface for agent extensions."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_7432905f","line":19,"in_reply_to":"1aa78d24_d3e45ae1","updated":"2016-07-12 13:31:55.000000000","message":"Actually, the L2 extensions should be inheriting from L2AgentCoreResourceExtension, which is a descendant of this but provides those methods.  \n\nhttps://review.openstack.org/#/c/329701/13/neutron/agent/l2/l2_agent_extension.py@21\n\nI think that means there is no impact for L2 extensions.","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8ae7c8faaf06308fa52838627a2dc47d73f53d03","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        Allows an extension to gain access to core resources internal to the"},{"line_number":44,"context_line":"        neutron agent and otherwise unavailable to the extension.  Examples of"},{"line_number":45,"context_line":"        such resources include ports and routers."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        :param agent_api: An instance of an agent-specific API."},{"line_number":48,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_339afe6e","line":45,"updated":"2016-07-12 01:44:04.000000000","message":"nit: bridges, ports and routers...","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"25bc63f385416ee06684bd0a6ec36d2635d85f28","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        Allows an extension to gain access to core resources internal to the"},{"line_number":44,"context_line":"        neutron agent and otherwise unavailable to the extension.  Examples of"},{"line_number":45,"context_line":"        such resources include ports and routers."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        :param agent_api: An instance of an agent-specific API."},{"line_number":48,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_61c2f0ea","line":45,"in_reply_to":"1aa78d24_339afe6e","updated":"2016-07-12 02:48:23.000000000","message":"Done","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":19,"context_line":"class AgentCoreResourceExtension(object):"},{"line_number":20,"context_line":"    \"\"\"Define stable abstract interface for agent extensions."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_b07b5bbd","line":19,"updated":"2016-07-12 16:07:28.000000000","message":"You rename the file, I don\u0027t see how it is going to work for existing users of the file from other repos. Please provide a shim layer.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":19,"context_line":"class AgentCoreResourceExtension(object):"},{"line_number":20,"context_line":"    \"\"\"Define stable abstract interface for agent extensions."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_f6460020","line":19,"in_reply_to":"1aa78d24_29cc26ba","updated":"2016-07-14 20:23:06.000000000","message":"Done","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":19,"context_line":"class AgentCoreResourceExtension(object):"},{"line_number":20,"context_line":"    \"\"\"Define stable abstract interface for agent extensions."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_29cc26ba","line":19,"in_reply_to":"1aa78d24_b07b5bbd","updated":"2016-07-12 16:38:24.000000000","message":"Nate and I are working on this now. :)","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."},{"line_number":23,"context_line":"    \"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @abc.abstractmethod"},{"line_number":26,"context_line":"    def initialize(self, connection, driver_type):"},{"line_number":27,"context_line":"        \"\"\"Perform agent core resource extension initialization."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_7094538a","line":25,"updated":"2016-07-12 16:07:28.000000000","message":"Before, we were not enforcing implementation for the method from extensions. That said, I think it will be fair to trigger a deprecation warning here asking to inherit from another L2 specific class. After a while, we\u0027ll enforce abstractmethod here.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."},{"line_number":23,"context_line":"    \"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @abc.abstractmethod"},{"line_number":26,"context_line":"    def initialize(self, connection, driver_type):"},{"line_number":27,"context_line":"        \"\"\"Perform agent core resource extension initialization."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_cc61ab3a","line":25,"in_reply_to":"1aa78d24_7094538a","updated":"2016-07-14 20:23:06.000000000","message":"Given that there is no code that is actually executed here, what is the best method for catsing the deprecation warning to get triggered?","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    An agent extension extends the agent core functionality."},{"line_number":23,"context_line":"    \"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @abc.abstractmethod"},{"line_number":26,"context_line":"    def initialize(self, connection, driver_type):"},{"line_number":27,"context_line":"        \"\"\"Perform agent core resource extension initialization."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_69c2ae86","line":25,"in_reply_to":"1aa78d24_7094538a","updated":"2016-07-12 16:38:24.000000000","message":"Will do.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"}],"neutron/agent/agent_extensions_manager.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"95286f1bc53ba93982eb19d2f4b7a8d015beb387","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3aaa91ec_3e0a9879","side":"PARENT","line":26,"range":{"start_line":25,"start_character":0,"end_line":26,"end_character":29},"updated":"2016-06-24 15:13:10.000000000","message":"would duplicates for l3 be better than a generalized version for both?","commit_id":"5d3a6e6aaa577ad002afa7aed260fd7025badd56"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"95286f1bc53ba93982eb19d2f4b7a8d015beb387","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":""},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log"},{"line_number":19,"context_line":"import stevedore"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_5ec96458","line":16,"updated":"2016-06-24 15:13:10.000000000","message":"Added by mistake?","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"0fa043a2818a7fd38d432b80e2810d8ab9b08f5e","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":""},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log"},{"line_number":19,"context_line":"import stevedore"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_1715fee3","line":16,"in_reply_to":"3aaa91ec_5ec96458","updated":"2016-06-24 15:26:26.000000000","message":"Yup!  I\u0027ll fix in next PS.","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":62,"context_line":"            extension.obj.initialize(connection, driver_type)"},{"line_number":63,"context_line":"            for resource_type, notification_handler in \\"},{"line_number":64,"context_line":"                    extension.obj.get_resource_handlers():"},{"line_number":65,"context_line":"                registry.subscribe(notification_handler, resource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_375b9356","line":64,"range":{"start_line":64,"start_character":34,"end_line":64,"end_character":55},"updated":"2016-07-02 10:41:37.000000000","message":"should we add that new symbol to the abstract interface for extensions?","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"6d9ffe8bbe3eb1f91365d2671534d7befcbc8c42","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":62,"context_line":"            extension.obj.initialize(connection, driver_type)"},{"line_number":63,"context_line":"            for resource_type, notification_handler in \\"},{"line_number":64,"context_line":"                    extension.obj.get_resource_handlers():"},{"line_number":65,"context_line":"                registry.subscribe(notification_handler, resource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_20f52fec","line":64,"range":{"start_line":64,"start_character":34,"end_line":64,"end_character":55},"in_reply_to":"1aa78d24_11b93aea","updated":"2016-07-07 14:23:03.000000000","message":"I think Extension\u0027s registering themselves might be a good idea given the path to neutron-lib","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":62,"context_line":"            extension.obj.initialize(connection, driver_type)"},{"line_number":63,"context_line":"            for resource_type, notification_handler in \\"},{"line_number":64,"context_line":"                    extension.obj.get_resource_handlers():"},{"line_number":65,"context_line":"                registry.subscribe(notification_handler, resource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_11b93aea","line":64,"range":{"start_line":64,"start_character":34,"end_line":64,"end_character":55},"in_reply_to":"1aa78d24_375b9356","updated":"2016-07-03 12:57:47.000000000","message":"Unless we decide that the extensions register themselves, yes.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            extension.obj.initialize(connection, driver_type)"},{"line_number":63,"context_line":"            for resource_type, notification_handler in \\"},{"line_number":64,"context_line":"                    extension.obj.get_resource_handlers():"},{"line_number":65,"context_line":"                registry.subscribe(notification_handler, resource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_772cfbab","line":65,"updated":"2016-07-02 10:41:37.000000000","message":"Why can\u0027t extensions just register themselves in initialize()?","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            extension.obj.initialize(connection, driver_type)"},{"line_number":63,"context_line":"            for resource_type, notification_handler in \\"},{"line_number":64,"context_line":"                    extension.obj.get_resource_handlers():"},{"line_number":65,"context_line":"                registry.subscribe(notification_handler, resource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_f1110eb1","line":65,"in_reply_to":"1aa78d24_772cfbab","updated":"2016-07-03 12:57:47.000000000","message":"I like the idea of moving this behavior up the abstraction chain in order to enforce the behavior across all agent extensions.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5df99ef67841e101b79883bf0c2a22277381730b","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            extension.obj.initialize(connection, driver_type)"},{"line_number":63,"context_line":"            for resource_type, notification_handler in \\"},{"line_number":64,"context_line":"                    extension.obj.get_resource_handlers():"},{"line_number":65,"context_line":"                registry.subscribe(notification_handler, resource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_0f0e578b","line":65,"in_reply_to":"1aa78d24_d74d18c5","updated":"2016-07-07 17:01:25.000000000","message":"You\u0027ve persuaded me. :)","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9385b6c86b26fb083ca750214852a9c02bd545e4","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            extension.obj.initialize(connection, driver_type)"},{"line_number":63,"context_line":"            for resource_type, notification_handler in \\"},{"line_number":64,"context_line":"                    extension.obj.get_resource_handlers():"},{"line_number":65,"context_line":"                registry.subscribe(notification_handler, resource_type)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_d74d18c5","line":65,"in_reply_to":"1aa78d24_f1110eb1","updated":"2016-07-07 12:34:17.000000000","message":"But extensions are not necessarily relying on rpc callbacks. Those should stay decoupled.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2615f4c1dde9fe3a3cb1d5917627f2ba1f7d0b8b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            # be consumed by any interested extension before the extension\u0027s"},{"line_number":59,"context_line":"            # intialization() method is called."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"            # Extensions must implement the consume_api method even if the"},{"line_number":62,"context_line":"            # incoming_api is set to none."},{"line_number":63,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":64,"context_line":"            extension.obj.initialize(connection, driver_type)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_8f967092","line":62,"range":{"start_line":61,"start_character":14,"end_line":62,"end_character":26},"updated":"2016-07-09 08:12:02.000000000","message":"I\u0027ll change this comment to say why extensions need to implement consume_api and to remove the  suggestion here that there\u0027s a single agent that needs to be accommodated.","commit_id":"4af2a5a7538afbfd82fa4662ccfc464576774fa8"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"3fb1af2741b0228606acca19b0b6f2f6f88e1151","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # intialization() method is called."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"            # Extensions must implement the consume_api method even if the"},{"line_number":62,"context_line":"            # incoming_api is set to none."},{"line_number":63,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":64,"context_line":"            extension.obj.initialize(connection, driver_type)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_2c266f68","line":62,"range":{"start_line":62,"start_character":14,"end_line":62,"end_character":26},"updated":"2016-07-09 00:47:10.000000000","message":"I should have said: \"incoming agent_api\".  Will fix.","commit_id":"be29aa83cb505e191d34ec21c89d7ee35e2958ed"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            # If the agent has provided an agent_api object, this object will"},{"line_number":58,"context_line":"            # be passed to all interested extensions.  This object must be"},{"line_number":59,"context_line":"            # consumed by each such extension before the extension\u0027s"},{"line_number":60,"context_line":"            # intialization() method is called, as the initilization step"},{"line_number":61,"context_line":"            # relies on the agent_api already being available."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            extension.obj.consume_api(agent_api)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_7d238cbd","line":60,"updated":"2016-07-12 16:07:28.000000000","message":"The method name is different.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            # If the agent has provided an agent_api object, this object will"},{"line_number":58,"context_line":"            # be passed to all interested extensions.  This object must be"},{"line_number":59,"context_line":"            # consumed by each such extension before the extension\u0027s"},{"line_number":60,"context_line":"            # intialization() method is called, as the initilization step"},{"line_number":61,"context_line":"            # relies on the agent_api already being available."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            extension.obj.consume_api(agent_api)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_39762f06","line":60,"in_reply_to":"1aa78d24_7d238cbd","updated":"2016-07-14 20:23:06.000000000","message":"Done","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # consumed by each such extension before the extension\u0027s"},{"line_number":60,"context_line":"            # intialization() method is called, as the initilization step"},{"line_number":61,"context_line":"            # relies on the agent_api already being available."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":64,"context_line":"            extension.obj.initialize(connection, driver_type)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_109cefbe","line":62,"updated":"2016-07-12 16:07:28.000000000","message":"redundant line","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # consumed by each such extension before the extension\u0027s"},{"line_number":60,"context_line":"            # intialization() method is called, as the initilization step"},{"line_number":61,"context_line":"            # relies on the agent_api already being available."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":64,"context_line":"            extension.obj.initialize(connection, driver_type)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_490c12ec","line":62,"in_reply_to":"1aa78d24_109cefbe","updated":"2016-07-12 16:38:24.000000000","message":"Will remove.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # consumed by each such extension before the extension\u0027s"},{"line_number":60,"context_line":"            # intialization() method is called, as the initilization step"},{"line_number":61,"context_line":"            # relies on the agent_api already being available."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            extension.obj.consume_api(agent_api)"},{"line_number":64,"context_line":"            extension.obj.initialize(connection, driver_type)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_79c9d725","line":62,"in_reply_to":"1aa78d24_490c12ec","updated":"2016-07-14 20:23:06.000000000","message":"Which line is redundant?","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"}],"neutron/agent/l2/agent_extension.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"b353f3558450731e701376417d24924d13fafb01","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":21,"context_line":"class AgentCoreResourceExtension(l2_agent_extension.L2AgentExtension):"},{"line_number":22,"context_line":"    \"\"\"This is a shim around L2AgentExtension class.  It is intended for use by"},{"line_number":23,"context_line":"    out of tree extensions that were inheriting AgentCoreResourceExtension."},{"line_number":24,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_d6fca474","line":21,"range":{"start_line":21,"start_character":6,"end_line":21,"end_character":32},"updated":"2016-07-15 14:21:23.000000000","message":"nit, I\u0027d put a deprecation warning on this class as well.\nThat way it can be removed by the end of Ocata and L2AgentExtension will be the only one used.","commit_id":"2c4f9e7fb2f40d0388e7832b500811db34ee011c"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f2a63cbf24964a07cdf3ace1fcea5a9a46152b75","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":21,"context_line":"class AgentCoreResourceExtension(l2_agent_extension.L2AgentExtension):"},{"line_number":22,"context_line":"    \"\"\"This is a shim around L2AgentExtension class.  It is intended for use by"},{"line_number":23,"context_line":"    out of tree extensions that were inheriting AgentCoreResourceExtension."},{"line_number":24,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fad55976_ad03c975","line":21,"range":{"start_line":21,"start_character":6,"end_line":21,"end_character":32},"in_reply_to":"1aa78d24_d6fca474","updated":"2016-07-15 14:42:05.000000000","message":"I would definitely like to do that.  Can you suggest how?  I see how to mark options or methods with deprecation warnings, but not an abstract class.","commit_id":"2c4f9e7fb2f40d0388e7832b500811db34ee011c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4daf1e286fd6e0be604f0db5e1feadb3a860cfca","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":21,"context_line":"class AgentCoreResourceExtension(l2_agent_extension.L2AgentExtension):"},{"line_number":22,"context_line":"    \"\"\"This is a shim around L2AgentExtension class.  It is intended for use by"},{"line_number":23,"context_line":"    out of tree extensions that were inheriting AgentCoreResourceExtension."},{"line_number":24,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fad55976_b4e14dd3","line":21,"range":{"start_line":21,"start_character":6,"end_line":21,"end_character":32},"in_reply_to":"fad55976_ad03c975","updated":"2016-07-15 16:56:37.000000000","message":"Yeah, there is a bit of a metaclass related issue with using removed_class decorator from debtcollector on ABCs. I agree that deprecation would be a good step, but not necessary for the patch. If someone comes up with a patch that makes it deprecated, I will be glad to provision it to merge.","commit_id":"2c4f9e7fb2f40d0388e7832b500811db34ee011c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"beabea05a423f96d9cf8a40c192de84ff57878c2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_7455de4e","side":"PARENT","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":47},"updated":"2016-07-19 03:34:29.000000000","message":"I\u0027m not sure there are any circumstances where we remove a copyright notice except when completely removing the file.\n\nhttps://wiki.openstack.org/wiki/LegalIssuesFAQ\nhttps://wiki.openstack.org/wiki/Documentation/Copyright","commit_id":"681d64026b11ea993ffc47a4f4e3c39a9dd408fc"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b4cafdc7713bfcf8ae50cb2b3ee9b3bc712eaa25","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_7e47624b","side":"PARENT","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":47},"in_reply_to":"dada55a8_7455de4e","updated":"2016-07-19 13:01:03.000000000","message":"I think it\u0027s a result of moving files back and forth in previous patchsets. I agree it\u0027s better to restore it.","commit_id":"681d64026b11ea993ffc47a4f4e3c39a9dd408fc"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"35f20af7929a734bc48037e5c118e61ebe834cff","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_7747854b","side":"PARENT","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":47},"in_reply_to":"dada55a8_7e47624b","updated":"2016-07-19 13:41:36.000000000","message":"Done","commit_id":"681d64026b11ea993ffc47a4f4e3c39a9dd408fc"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9aa8592311711a6e461088d66230abb2311072c6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_17b569ed","side":"PARENT","line":2,"updated":"2016-07-19 13:43:38.000000000","message":"you probably also want to restore that.","commit_id":"681d64026b11ea993ffc47a4f4e3c39a9dd408fc"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"c9bad9b2464bdd241a25c63c5041857537621e8f","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class AgentCoreResourceExtension(l2_agent_extension.L2AgentExtension):"},{"line_number":25,"context_line":"    \"\"\"This is a shim around L2AgentExtension class.  It is intended for use by"},{"line_number":26,"context_line":"    out of tree extensions that were inheriting AgentCoreResourceExtension."},{"line_number":27,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"dada55a8_725153d8","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":70},"updated":"2016-07-19 16:07:16.000000000","message":"nit, here is how to deprecate a class, but this is good for a follow up patch:\nhttp://docs.openstack.org/developer/debtcollector/examples.html#removing-a-class-classmethod-method-function","commit_id":"01a6c9c42637705a6d403a0de9ddd2507795ee4d"}],"neutron/agent/l2/extensions/fdb_population.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"3fb1af2741b0228606acca19b0b6f2f6f88e1151","unresolved":false,"context_lines":[{"line_number":41,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class FdbPopulationAgentExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":45,"context_line":"    \"\"\"The FDB population is an agent extension to OVS or linux bridge"},{"line_number":46,"context_line":"    who\u0027s objective is to update the FDB table for existing instance"},{"line_number":47,"context_line":"    using normal port, thus enabling communication between SR-IOV instances"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_ac9fff5d","line":44,"range":{"start_line":44,"start_character":34,"end_line":44,"end_character":49},"updated":"2016-07-09 00:47:10.000000000","message":"This should be l2_agent_extension. :) This rogue module!","commit_id":"be29aa83cb505e191d34ec21c89d7ee35e2958ed"}],"neutron/agent/l2/extensions/qos.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class QosAgentExtension(l2_agent_extension.L2AgentCoreResourceExtension):"},{"line_number":188,"context_line":"    SUPPORTED_RESOURCE_TYPES \u003d [resources.QOS_POLICY]"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def initialize(self, connection, driver_type):"},{"line_number":191,"context_line":"        \"\"\"Perform Agent Extension initialization."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_0a090e2d","line":188,"updated":"2016-07-02 10:41:37.000000000","message":"strictly speaking, this rename is not required. but I am fine.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"7876a8da2d9f0150f880ff57d16e12674403bec5","unresolved":false,"context_lines":[{"line_number":212,"context_line":"            topic \u003d resources_rpc.resource_type_versioned_topic(resource_type)"},{"line_number":213,"context_line":"            connection.create_consumer(topic, endpoints, fanout\u003dTrue)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def get_resource_handlers(self):"},{"line_number":216,"context_line":"        return [(resource_type, self._handle_notification) for resource_type"},{"line_number":217,"context_line":"                in self.SUPPORTED_RESOURCE_TYPES]"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_c5ac55a1","line":215,"range":{"start_line":215,"start_character":8,"end_line":215,"end_character":29},"updated":"2016-06-30 16:40:09.000000000","message":"Presumably l3 agent extensions should use the same RPC callback library used here.  ??","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2615f4c1dde9fe3a3cb1d5917627f2ba1f7d0b8b","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    SUPPORTED_RESOURCE_TYPES \u003d [resources.QOS_POLICY]"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def initialize(self, connection, driver_type):"},{"line_number":189,"context_line":"        \"\"\"Initialize agent extension.\"\"\""},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        self.resource_rpc \u003d resources_rpc.ResourcesPullRpcApi()"},{"line_number":192,"context_line":"        self.qos_driver \u003d manager.NeutronManager.load_class_for_provider("}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_0fd0c052","line":189,"range":{"start_line":189,"start_character":0,"end_line":189,"end_character":41},"updated":"2016-07-09 08:12:02.000000000","message":"I\u0027ll add more detail to this docstring.","commit_id":"4af2a5a7538afbfd82fa4662ccfc464576774fa8"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2615f4c1dde9fe3a3cb1d5917627f2ba1f7d0b8b","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        self._register_rpc_consumers(connection)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def consume_api(self, agent_api):"},{"line_number":202,"context_line":"        self.agent_api \u003d agent_api"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _register_rpc_consumers(self, connection):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_8fddd072","line":201,"range":{"start_line":201,"start_character":8,"end_line":201,"end_character":11},"updated":"2016-07-09 08:12:02.000000000","message":"I\u0027ll add a docstring about this.","commit_id":"4af2a5a7538afbfd82fa4662ccfc464576774fa8"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"2615f4c1dde9fe3a3cb1d5917627f2ba1f7d0b8b","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    def consume_api(self, agent_api):"},{"line_number":202,"context_line":"        self.agent_api \u003d agent_api"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _register_rpc_consumers(self, connection):"},{"line_number":205,"context_line":"        endpoints \u003d [resources_rpc.ResourcesPushRpcCallback()]"},{"line_number":206,"context_line":"        for resource_type in self.SUPPORTED_RESOURCE_TYPES:"},{"line_number":207,"context_line":"            # We assume that the neutron server always broadcasts the latest"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_afe24c2d","line":204,"range":{"start_line":204,"start_character":4,"end_line":204,"end_character":8},"updated":"2016-07-09 08:12:02.000000000","message":"I\u0027ll add a docstring about this too.","commit_id":"4af2a5a7538afbfd82fa4662ccfc464576774fa8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8ae7c8faaf06308fa52838627a2dc47d73f53d03","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        \"\"\"Allows an extension to receive notifications of updates made to"},{"line_number":209,"context_line":"           items of interest."},{"line_number":210,"context_line":"        \"\"\""},{"line_number":211,"context_line":"        endpoints \u003d [resources_rpc.ResourcesPushRpcCallback()]"},{"line_number":212,"context_line":"        for resource_type in self.SUPPORTED_RESOURCE_TYPES:"},{"line_number":213,"context_line":"            # We assume that the neutron server always broadcasts the latest"},{"line_number":214,"context_line":"            # version known to the agent"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_f3aeb62c","line":211,"updated":"2016-07-12 01:44:04.000000000","message":"I was thinking that probably we could refactor this to:\n\n1) Have a function in \"registry\" to accept a connection, and create all the consumers for for the differently subscribed topics (by all extensions).\n\n2) The extensions when initialized, they just call registry.subscribe(x, resource_type1), registry.subscribe(y, resource_type2) .. \n\n3) We call that (1) from the extension manager, when we know we have already loaded all the extensions.\n    \n\nHow does that sound?","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"8373f091221ede13321ee2ad2e59e4eb16d02fd5","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        \"\"\"Allows an extension to receive notifications of updates made to"},{"line_number":209,"context_line":"           items of interest."},{"line_number":210,"context_line":"        \"\"\""},{"line_number":211,"context_line":"        endpoints \u003d [resources_rpc.ResourcesPushRpcCallback()]"},{"line_number":212,"context_line":"        for resource_type in self.SUPPORTED_RESOURCE_TYPES:"},{"line_number":213,"context_line":"            # We assume that the neutron server always broadcasts the latest"},{"line_number":214,"context_line":"            # version known to the agent"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_ebefbbae","line":211,"in_reply_to":"1aa78d24_0b3de78e","updated":"2016-07-12 14:49:27.000000000","message":"You\u0027ll notice that i moved line 203 in the base patch down to line 215 in the change.  I think it\u0027s the right move to turn 203 (base) into a for-loop. But i hesitated for a long time to put the registry.subscribe business in with the create_consumer business.  I think the creation of consumer changes that Ajo proposes should be a separate change not so much because it\u0027s complicated (which i think it probably will be) but because it doesn\u0027t have to do with generalizing the L2 code (at least i don\u0027t think it does--does it?).","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d2f1dfc77cb2cd95e4dda555379c0225b3cc6a0e","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        \"\"\"Allows an extension to receive notifications of updates made to"},{"line_number":209,"context_line":"           items of interest."},{"line_number":210,"context_line":"        \"\"\""},{"line_number":211,"context_line":"        endpoints \u003d [resources_rpc.ResourcesPushRpcCallback()]"},{"line_number":212,"context_line":"        for resource_type in self.SUPPORTED_RESOURCE_TYPES:"},{"line_number":213,"context_line":"            # We assume that the neutron server always broadcasts the latest"},{"line_number":214,"context_line":"            # version known to the agent"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_997da36f","line":211,"in_reply_to":"1aa78d24_ebefbbae","updated":"2016-07-12 18:03:00.000000000","message":"I think it\u0027s good in it\u0027s current form for this patch. Since what I\u0027m proposing is not specifically relevant to this patch.\n\nI will follow up refactoring that part, and let\u0027s discuss over the patch when it\u0027s online.\n\nThank you :)","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"c1f9115eaa7217ba66c43e712f38abceaa2af951","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        \"\"\"Allows an extension to receive notifications of updates made to"},{"line_number":209,"context_line":"           items of interest."},{"line_number":210,"context_line":"        \"\"\""},{"line_number":211,"context_line":"        endpoints \u003d [resources_rpc.ResourcesPushRpcCallback()]"},{"line_number":212,"context_line":"        for resource_type in self.SUPPORTED_RESOURCE_TYPES:"},{"line_number":213,"context_line":"            # We assume that the neutron server always broadcasts the latest"},{"line_number":214,"context_line":"            # version known to the agent"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aa78d24_0b3de78e","line":211,"in_reply_to":"1aa78d24_f3aeb62c","updated":"2016-07-12 14:44:28.000000000","message":"My impulse is to make this a separate change, since it really complicates this patch, because we are (if I read you correctly) changing the behavior of registry.subscribe().  Before we do that we need to look hard to make sure we are not screwing up rpc subscriptions in the 71 places registry.subscribe() is used.","commit_id":"db91c8072722d89b3268caf3dfc43f182a3573c6"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"beabea05a423f96d9cf8a40c192de84ff57878c2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_34d246d3","side":"PARENT","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":47},"updated":"2016-07-19 03:34:29.000000000","message":"ditto","commit_id":"681d64026b11ea993ffc47a4f4e3c39a9dd408fc"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"35f20af7929a734bc48037e5c118e61ebe834cff","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_177d696e","side":"PARENT","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":47},"in_reply_to":"dada55a8_34d246d3","updated":"2016-07-19 13:41:36.000000000","message":"Done.  I don\u0027t know why these got removed.","commit_id":"681d64026b11ea993ffc47a4f4e3c39a9dd408fc"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9aa8592311711a6e461088d66230abb2311072c6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_57cfe17e","side":"PARENT","line":2,"updated":"2016-07-19 13:43:38.000000000","message":"probably restore for good.","commit_id":"681d64026b11ea993ffc47a4f4e3c39a9dd408fc"}],"neutron/agent/l2/l2_agent_extension.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_2a37aae4","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"updated":"2016-07-02 10:41:37.000000000","message":"By renaming the class from what was its original name, you break existing consumers of it. Specifically, bagpipe and bgpvpn use the ABC.\n\nWe should have some shim layer here. Better, just stick to the original name.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"7876a8da2d9f0150f880ff57d16e12674403bec5","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_ca13c463","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"updated":"2016-06-30 16:40:09.000000000","message":"What do people think of collapsing this class with its L3 analogue? (https://review.openstack.org/#/c/329701/7/neutron/agent/l3/l3_agent_extension.py@24)","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_51a0e290","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"in_reply_to":"1aa78d24_2a37aae4","updated":"2016-07-03 12:57:47.000000000","message":"Will add a shim layer if the rename is decided on.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"6d9ffe8bbe3eb1f91365d2671534d7befcbc8c42","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_40aafb85","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"in_reply_to":"1aa78d24_37b8dc74","updated":"2016-07-07 14:23:03.000000000","message":"From an FWaaS perspective we could have the same extension for both since we would translate it to similar iptables rules but that shouldn\u0027t inform our design here","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5df99ef67841e101b79883bf0c2a22277381730b","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_72754062","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"in_reply_to":"1aa78d24_40aafb85","updated":"2016-07-07 17:01:25.000000000","message":"With FWaaS we\u0027re seeing that L3 cares about ports.  I agree that FWaaS alone shouldn\u0027t inform our decision on this, but I guess my question is whether the L2/L3 agent distinction hurts us in this portion of the codebase more than helps us.  Nate and I just agreed not to pursue this issue for this PS, but--very diffidently--I think that this is something that might bear further consideration at some point.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9385b6c86b26fb083ca750214852a9c02bd545e4","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_37b8dc74","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"in_reply_to":"1aa78d24_71a35e9f","updated":"2016-07-07 12:34:17.000000000","message":"I think l2 extensions are for ports, l3 extensions are for routers, and that\u0027s how they are meant to stay separate. If for some reason an l2 agent wants to implement router based events, fine, let them inherit from the corresponding ABC too, and in essence stop being a pure l2 agent but a consolidated l2/l3 agent.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_71a35e9f","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"in_reply_to":"1aa78d24_8a1dfe68","updated":"2016-07-03 12:57:47.000000000","message":"Are there resource types that some but not all L2 agent extensions will support?  Same question, but for L3 agent extensions?  Are there resource types that both L2 and L3 agent extensions will support?\n\nMy questions maybe aren\u0027t so much an argument for doing this as a request for information so that I can understand this domain better, especially as I move to re-work FWaaS\u0027s L3 agent extension.  I\u0027m actually pretty sure I wouldn\u0027t make the argument for collapsing the L2 and L3 variants of this class, because there are methods such as handle_router that should be abc for L3 and only L3.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":24,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":25,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_8a1dfe68","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":34},"in_reply_to":"3aaa91ec_ca13c463","updated":"2016-07-02 10:41:37.000000000","message":"Why would we collapse them? They serve distinct agents and distinct resources.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"a6fbfd9a6fe36278fd3560c730cbfcf2abadf853","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":21,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":22,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_57431613","line":21,"range":{"start_line":21,"start_character":6,"end_line":21,"end_character":34},"updated":"2016-07-12 13:40:29.000000000","message":"Just from the response to Ajo\u0027s comment, what happens to out of tree extensions that were inheriting AgentCoreResourceExtension from here?\nWill they break and need to be changed when this patch merges or has the shim layer mentioned in patch set 7 been implemented?","commit_id":"19dd0ae68454784086faecb45080d67929af8d39"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"f98e339df358ce6ff3d753c96c9c573406b656cb","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":21,"context_line":"class L2AgentCoreResourceExtension(agent_extension.AgentCoreResourceExtension):"},{"line_number":22,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_c9d80221","line":21,"range":{"start_line":21,"start_character":6,"end_line":21,"end_character":34},"in_reply_to":"1aa78d24_57431613","updated":"2016-07-12 16:38:37.000000000","message":"Thank you David.  The shim got away from me.  We\u0027re putting it in now.","commit_id":"19dd0ae68454784086faecb45080d67929af8d39"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    An agent extension extends the agent core functionality."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @abc.abstractmethod"},{"line_number":28,"context_line":"    def handle_port(self, context, data):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_b35c051a","line":25,"updated":"2016-07-12 16:07:28.000000000","message":"We may want to continue providing a shallow initialize() implementation here so that extensions are not forced to override it.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    An agent extension extends the agent core functionality."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @abc.abstractmethod"},{"line_number":28,"context_line":"    def handle_port(self, context, data):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_c7e626af","line":25,"in_reply_to":"1aa78d24_a91496e8","updated":"2016-07-14 20:23:06.000000000","message":"Done.  I am not terribly familiar with \u0027shallow\u0027 as a term of programming art, but I put in a stub here.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    An agent extension extends the agent core functionality."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @abc.abstractmethod"},{"line_number":28,"context_line":"    def handle_port(self, context, data):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_a91496e8","line":25,"in_reply_to":"1aa78d24_b35c051a","updated":"2016-07-12 16:38:24.000000000","message":"Nice.  Will do.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"}],"neutron/agent/l2/l2_agent_extensions_manager.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"95286f1bc53ba93982eb19d2f4b7a8d015beb387","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron._i18n import _, _LE, _LI"},{"line_number":21,"context_line":"from neutron.agent import agent_extensions_manager"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"L2_AGENT_EXT_MANAGER_NAMESPACE \u003d \u0027neutron.agent.l2.extensions\u0027"},{"line_number":26,"context_line":"L2_AGENT_EXT_MANAGER_OPTS \u003d ["}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_f46b10b5","line":23,"range":{"start_line":23,"start_character":29,"end_line":23,"end_character":29},"updated":"2016-06-24 15:13:10.000000000","message":"Accidentally deleted?","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"0fa043a2818a7fd38d432b80e2810d8ab9b08f5e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron._i18n import _, _LE, _LI"},{"line_number":21,"context_line":"from neutron.agent import agent_extensions_manager"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"L2_AGENT_EXT_MANAGER_NAMESPACE \u003d \u0027neutron.agent.l2.extensions\u0027"},{"line_number":26,"context_line":"L2_AGENT_EXT_MANAGER_OPTS \u003d ["}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_b7250a5d","line":23,"range":{"start_line":23,"start_character":29,"end_line":23,"end_character":29},"in_reply_to":"3aaa91ec_f46b10b5","updated":"2016-06-24 15:26:26.000000000","message":"Yup!  I\u0027ll fix.","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"7876a8da2d9f0150f880ff57d16e12674403bec5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    agent_ext_manager.register_opts(conf)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class L2AgentExtensionsManager(agent_ext_manager.AgentExtensionsManager):"},{"line_number":32,"context_line":"    \"\"\"Manage l2 agent extensions.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_c521f59f","line":31,"updated":"2016-06-30 16:40:09.000000000","message":"What do people think of the idea of having a single AgentExtensionsManager to handle both L2 and L3 activity?","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5df99ef67841e101b79883bf0c2a22277381730b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    agent_ext_manager.register_opts(conf)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class L2AgentExtensionsManager(agent_ext_manager.AgentExtensionsManager):"},{"line_number":32,"context_line":"    \"\"\"Manage l2 agent extensions.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_3211f85d","line":31,"in_reply_to":"1aa78d24_00075382","updated":"2016-07-07 17:01:25.000000000","message":"I\u0027ll do it and people can see if they like.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5762c6e5b8eac29be35b55eecb89a9e10392466e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    agent_ext_manager.register_opts(conf)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class L2AgentExtensionsManager(agent_ext_manager.AgentExtensionsManager):"},{"line_number":32,"context_line":"    \"\"\"Manage l2 agent extensions.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_77950e87","line":31,"in_reply_to":"1aa78d24_3211f85d","updated":"2016-07-08 15:22:19.000000000","message":"Nope, not going to do it, because of the namespace issue.  \n\nThe spec for this change made the claim that a steverdore is a singleton--see https://specs.openstack.org/openstack/neutron-specs/specs/newton/l3-agent-extension.html#proposed-change.  If this is true, we would be prevented from running L3 and L2 agents simultaneously (right?).  But I now think that that claim is wrong (nb, I wrote that claim :) ), per http://docs.openstack.org/developer/stevedore/patterns_loading.html#extensions-many-names-many-entry-points","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"6d9ffe8bbe3eb1f91365d2671534d7befcbc8c42","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    agent_ext_manager.register_opts(conf)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class L2AgentExtensionsManager(agent_ext_manager.AgentExtensionsManager):"},{"line_number":32,"context_line":"    \"\"\"Manage l2 agent extensions.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_00075382","line":31,"in_reply_to":"3aaa91ec_c521f59f","updated":"2016-07-07 14:23:03.000000000","message":"I like the idea if it can be abstracted enough though now as we keep them similar I don\u0027t think people couldn\u0027t implement both if needed","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(L2AgentExtensionsManager, self).__init__(conf,"},{"line_number":36,"context_line":"                L2_AGENT_EXT_MANAGER_NAMESPACE)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def handle_port(self, context, data):"},{"line_number":39,"context_line":"        \"\"\"Notify all agent extensions to handle port.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_ca4c2679","line":36,"updated":"2016-07-02 10:41:37.000000000","message":"(No action required) you could replace that argument with a class attribute, and then access that attribute from the parent class.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for extension in self:"},{"line_number":41,"context_line":"            try:"},{"line_number":42,"context_line":"                extension.obj.handle_port(context, data)"},{"line_number":43,"context_line":"            except AttributeError:"},{"line_number":44,"context_line":"                LOG.exception("},{"line_number":45,"context_line":"                    _LE(\"Agent Extension \u0027%(name)s\u0027 failed \""},{"line_number":46,"context_line":"                        \"while handling port update\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_71899eca","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":18},"updated":"2016-07-03 12:57:47.000000000","message":"If the abstract class methods are kept as abc, then this error can\u0027t happen, right?","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5df99ef67841e101b79883bf0c2a22277381730b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for extension in self:"},{"line_number":41,"context_line":"            try:"},{"line_number":42,"context_line":"                extension.obj.handle_port(context, data)"},{"line_number":43,"context_line":"            except AttributeError:"},{"line_number":44,"context_line":"                LOG.exception("},{"line_number":45,"context_line":"                    _LE(\"Agent Extension \u0027%(name)s\u0027 failed \""},{"line_number":46,"context_line":"                        \"while handling port update\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_f22db0fe","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":18},"in_reply_to":"1aa78d24_376f3cfd","updated":"2016-07-07 17:01:25.000000000","message":"Okay, makes sense.  And this catch needs to stay for sure if we collapse this class into agent_ext_manager.AgentExtensionsManager, which I\u0027ll do in the next PS and we\u0027ll see if it sticks.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9385b6c86b26fb083ca750214852a9c02bd545e4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for extension in self:"},{"line_number":41,"context_line":"            try:"},{"line_number":42,"context_line":"                extension.obj.handle_port(context, data)"},{"line_number":43,"context_line":"            except AttributeError:"},{"line_number":44,"context_line":"                LOG.exception("},{"line_number":45,"context_line":"                    _LE(\"Agent Extension \u0027%(name)s\u0027 failed \""},{"line_number":46,"context_line":"                        \"while handling port update\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_376f3cfd","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":18},"in_reply_to":"1aa78d24_71899eca","updated":"2016-07-07 12:34:17.000000000","message":"If they follow the ABC. I don\u0027t know whether we enforce that in any way.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"134a3e58566b7c43c6bdd6bca4fe32020dc3a995","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for extension in self:"},{"line_number":41,"context_line":"            try:"},{"line_number":42,"context_line":"                extension.obj.handle_port(context, data)"},{"line_number":43,"context_line":"            except AttributeError:"},{"line_number":44,"context_line":"                LOG.exception("},{"line_number":45,"context_line":"                    _LE(\"Agent Extension \u0027%(name)s\u0027 failed \""},{"line_number":46,"context_line":"                        \"while handling port update\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_a58b8d67","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":18},"in_reply_to":"1aa78d24_f22db0fe","updated":"2016-07-09 12:00:54.000000000","message":"We\u0027re not going to collapse this class into its parent, and handle_port and delete_port are abc.abstractmethod methods, so i\u0027ll remove this catch and the analogous one below.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def handle_port(self, context, data):"},{"line_number":38,"context_line":"        \"\"\"Notify all agent extensions to handle port.\"\"\""},{"line_number":39,"context_line":"        for extension in self:"},{"line_number":40,"context_line":"            extension.obj.handle_port(context, data)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def delete_port(self, context, data):"},{"line_number":43,"context_line":"        \"\"\"Notify all agent extensions to delete port.\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_93c5898f","line":40,"updated":"2016-07-12 16:07:28.000000000","message":"Note that before, we caught AttributeError here. Now we don\u0027t. But I think it\u0027s fine since the change would break extensions that are not inheriting from the base abstraction class for extensions, and don\u0027t provide handle_port implementation. That\u0027s very corner case-y.\n\nI would probably keep it as is, and try to remove in a follow up.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5c2952cc5430ed94096b844cb7c356bce86adcd8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def handle_port(self, context, data):"},{"line_number":38,"context_line":"        \"\"\"Notify all agent extensions to handle port.\"\"\""},{"line_number":39,"context_line":"        for extension in self:"},{"line_number":40,"context_line":"            extension.obj.handle_port(context, data)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def delete_port(self, context, data):"},{"line_number":43,"context_line":"        \"\"\"Notify all agent extensions to delete port.\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_e98dfe31","line":40,"in_reply_to":"1aa78d24_93c5898f","updated":"2016-07-12 16:38:24.000000000","message":"Will reinstate the catch, here and below.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"df6ad1bb875da9674fd0ccc05a8b88bf73ead464","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                    _LE(\"Agent Extension \u0027%(name)s\u0027 failed \""},{"line_number":46,"context_line":"                        \"while handling port update\"),"},{"line_number":47,"context_line":"                    {\u0027name\u0027: extension.name}"},{"line_number":48,"context_line":"                )"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def delete_port(self, context, data):"},{"line_number":51,"context_line":"        \"\"\"Notify all agent extensions to delete port.\"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_3ad22dd3","line":48,"updated":"2016-07-19 04:54:09.000000000","message":"why is this exception not being raised?","commit_id":"121a36d42d1506c78cc5b13228a048c5e6f05bf8"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"d6a7a79ed66d1a177db350d5adfd1101523ff297","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                    _LE(\"Agent Extension \u0027%(name)s\u0027 failed \""},{"line_number":46,"context_line":"                        \"while handling port update\"),"},{"line_number":47,"context_line":"                    {\u0027name\u0027: extension.name}"},{"line_number":48,"context_line":"                )"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def delete_port(self, context, data):"},{"line_number":51,"context_line":"        \"\"\"Notify all agent extensions to delete port.\"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_9e35f6db","line":48,"in_reply_to":"dada55a8_3ad22dd3","updated":"2016-07-19 13:00:11.000000000","message":"That is the original behaviour. If you think it\u0027s worth a change, we should tackle it separately.","commit_id":"121a36d42d1506c78cc5b13228a048c5e6f05bf8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"df6ad1bb875da9674fd0ccc05a8b88bf73ead464","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        for extension in self:"},{"line_number":53,"context_line":"            try:"},{"line_number":54,"context_line":"                extension.obj.delete_port(context, data)"},{"line_number":55,"context_line":"            except AttributeError:"},{"line_number":56,"context_line":"                LOG.exception("},{"line_number":57,"context_line":"                    _LE(\"Agent Extension \u0027%(name)s\u0027 failed \""},{"line_number":58,"context_line":"                        \"while handling port deletion\"),"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_7adca5e4","line":55,"updated":"2016-07-19 04:54:09.000000000","message":"ditto","commit_id":"121a36d42d1506c78cc5b13228a048c5e6f05bf8"}],"neutron/agent/l3/l3_agent_extension.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"75f9ab54c91a755356d5884c8f41600243e0eac2","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":22,"context_line":"class L2AgentCoreResourceExtension(AgentCoreResourceExtension):"},{"line_number":23,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_0fb850c7","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":34},"updated":"2016-06-24 14:01:52.000000000","message":"I\u0027ll fix this module in next PS to make it L3 throughout.  Copy/paste goof.","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2703ca588d6b296786319da7032277a1e059a858","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":22,"context_line":"class L2AgentCoreResourceExtension(AgentCoreResourceExtension):"},{"line_number":23,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_7b1ecf0c","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":34},"in_reply_to":"3aaa91ec_0fb850c7","updated":"2016-06-25 19:12:38.000000000","message":"Are you sure that this code can exist in the neutron repository? We should stop importing neutron in peripheral projects (like fwaas where this is needed) but rather import neutron-lib. If we do the former we perpetuate the bad coupling we\u0027re trying to move away from, though this is clearly a step in the right direction.","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5564c8066b45f3383c5efd7835e6d3033d319b1e","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":22,"context_line":"class L2AgentCoreResourceExtension(AgentCoreResourceExtension):"},{"line_number":23,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_724be587","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":34},"in_reply_to":"3aaa91ec_1b2eabfa","updated":"2016-06-29 15:29:02.000000000","message":"The tie with Neutron must be broken eventually and we need to be careful to what \u0027debt\u0027 we\u0027re adding. Now I appreciate that you guys are working around the clock to get FWaaS v2 off the ground and I do not intend to stifle progress. Making the dust settle in Neutron first is a sensible path forward. However, we need to be conscious of what is needed ahead. I am simply warning that one of the criteria for inclusion is the very adoption of neutron-lib, and not in some lame fashion.","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"6fc6bf1f9cf058f60e71dc7d16f71efa8e3376a4","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":22,"context_line":"class L2AgentCoreResourceExtension(AgentCoreResourceExtension):"},{"line_number":23,"context_line":"    \"\"\"Define stable abstract interface for l2 agent extensions."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    An agent extension extends the agent core functionality."}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_1b2eabfa","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":34},"in_reply_to":"3aaa91ec_7b1ecf0c","updated":"2016-06-25 19:53:51.000000000","message":"@armax: While I can see the case for moving parts of this interface to neutron-lib, that gets to be a slippery slope because now we need to integrate three things instead of two.  And it seems like moving parts of the agent internals to neutron-lib could be a large project with indeterminate boundaries.  Keeping firmly in mind that the stadium ejection of FWaaS is the looming consequence for failing to deliver, I am not trying to bite off more than I can chew.  So with that in mind, I reviewed https://etherpad.openstack.org/p/newton-neutron-lib-next-steps - lines 36-42 - and in keeping with that I felt that the strongest approach from a timeline-management point of view is to provide the functionality first, and then as a separate action afterwords perform the separation of the right parts of this code into neutron-lib.  I\u0027ll make sure we put in a TODO to that effect.","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_2a3e8ab8","line":1,"updated":"2016-07-02 10:41:37.000000000","message":"Seems like the copyright does not apply here.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_7126be17","line":1,"in_reply_to":"1aa78d24_2a3e8ab8","updated":"2016-07-03 12:57:47.000000000","message":":) Will remove, here and elsewhere.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5df99ef67841e101b79883bf0c2a22277381730b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Mellanox Technologies, Ltd"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_cf8d6f32","line":1,"in_reply_to":"1aa78d24_7126be17","updated":"2016-07-07 17:01:25.000000000","message":"Nate and I just discussed this module; he will be moving it into a separate PS that handles the L3 agent\u0027s instantiation of its extension manager.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"}],"neutron/opts.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f4588da5763f548c11966536ee175ed106e43695","unresolved":false,"context_lines":[{"line_number":288,"context_line":"         neutron.plugins.ml2.drivers.mech_sriov.agent.common.config."},{"line_number":289,"context_line":"         sriov_nic_opts),"},{"line_number":290,"context_line":"        (\u0027agent\u0027,"},{"line_number":291,"context_line":"         neutron.agent.agent_extensions_manager.AGENT_EXT_MANAGER_OPTS)"},{"line_number":292,"context_line":"    ]"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_536a01ee","line":291,"updated":"2016-07-12 16:07:28.000000000","message":"(No action required) The fact that the patch needed only the change for SR-IOV agent but not other agents (LB and OVS) suggests that we miss the extensions option from their sample config files.\n\nWe should solve it as a separate bug.","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f59355c635454b639e6b51b5edf604dc769586ca","unresolved":false,"context_lines":[{"line_number":288,"context_line":"         neutron.plugins.ml2.drivers.mech_sriov.agent.common.config."},{"line_number":289,"context_line":"         sriov_nic_opts),"},{"line_number":290,"context_line":"        (\u0027agent\u0027,"},{"line_number":291,"context_line":"         neutron.agent.agent_extensions_manager.AGENT_EXT_MANAGER_OPTS)"},{"line_number":292,"context_line":"    ]"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_2799ea79","line":291,"in_reply_to":"1aa78d24_530afcd2","updated":"2016-07-14 20:23:06.000000000","message":"Cool, thanks!","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"aff3069d857daf96fc8699eafae659b9037f6d86","unresolved":false,"context_lines":[{"line_number":288,"context_line":"         neutron.plugins.ml2.drivers.mech_sriov.agent.common.config."},{"line_number":289,"context_line":"         sriov_nic_opts),"},{"line_number":290,"context_line":"        (\u0027agent\u0027,"},{"line_number":291,"context_line":"         neutron.agent.agent_extensions_manager.AGENT_EXT_MANAGER_OPTS)"},{"line_number":292,"context_line":"    ]"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_530afcd2","line":291,"in_reply_to":"1aa78d24_536a01ee","updated":"2016-07-12 17:27:42.000000000","message":"The patch to fix that: https://review.openstack.org/341103","commit_id":"bde7c29832a7703085044654faa6982c9b5e126f"}],"neutron/plugins/ml2/drivers/agent/_common_agent.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def init_extension_manager(self, connection):"},{"line_number":168,"context_line":"        l2_ext_manager.register_opts(cfg.CONF)"},{"line_number":169,"context_line":"        self.l2_ext_manager \u003d ("},{"line_number":170,"context_line":"            l2_ext_manager.L2AgentExtensionsManager(cfg.CONF))"},{"line_number":171,"context_line":"        self.l2_ext_manager.initialize("},{"line_number":172,"context_line":"            connection, self.mgr.get_extension_driver_type())"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_4a6836bb","line":169,"updated":"2016-07-02 10:41:37.000000000","message":"strictly speaking, there is no need to touch that name here. It\u0027s ML2 common agent, which implies it\u0027s L2.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def init_extension_manager(self, connection):"},{"line_number":168,"context_line":"        l2_ext_manager.register_opts(cfg.CONF)"},{"line_number":169,"context_line":"        self.l2_ext_manager \u003d ("},{"line_number":170,"context_line":"            l2_ext_manager.L2AgentExtensionsManager(cfg.CONF))"},{"line_number":171,"context_line":"        self.l2_ext_manager.initialize("},{"line_number":172,"context_line":"            connection, self.mgr.get_extension_driver_type())"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_f178eefa","line":169,"in_reply_to":"1aa78d24_4a6836bb","updated":"2016-07-03 12:57:47.000000000","message":"Yeah, I\u0027ll undo these changes.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"}],"neutron/plugins/ml2/drivers/mech_sriov/agent/sriov_nic_agent.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.sg_agent \u003d sg_rpc.SecurityGroupAgentRpc(self.context,"},{"line_number":126,"context_line":"                self.sg_plugin_rpc)"},{"line_number":127,"context_line":"        self._setup_rpc()"},{"line_number":128,"context_line":"        self.l2_ext_manager \u003d self._create_agent_extension_manager("},{"line_number":129,"context_line":"            self.connection)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        configurations \u003d {\u0027device_mappings\u0027: physical_devices_mappings,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_8a621ed7","line":128,"updated":"2016-07-02 10:41:37.000000000","message":"I would stick to the original name.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.sg_agent \u003d sg_rpc.SecurityGroupAgentRpc(self.context,"},{"line_number":126,"context_line":"                self.sg_plugin_rpc)"},{"line_number":127,"context_line":"        self._setup_rpc()"},{"line_number":128,"context_line":"        self.l2_ext_manager \u003d self._create_agent_extension_manager("},{"line_number":129,"context_line":"            self.connection)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        configurations \u003d {\u0027device_mappings\u0027: physical_devices_mappings,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_11881ae7","line":128,"in_reply_to":"1aa78d24_8a621ed7","updated":"2016-07-03 12:57:47.000000000","message":"Yes, I agree this was a mistake.  Will revert here and in the other related files.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"7876a8da2d9f0150f880ff57d16e12674403bec5","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        # RPC network init"},{"line_number":378,"context_line":"        self.context \u003d context.get_admin_context_without_session()"},{"line_number":379,"context_line":"        # Define the listening consumers for the agent"},{"line_number":380,"context_line":"        consumers \u003d [[topics.PORT, topics.UPDATE],"},{"line_number":381,"context_line":"                     [topics.PORT, topics.DELETE],"},{"line_number":382,"context_line":"                     [constants.TUNNEL, topics.UPDATE],"},{"line_number":383,"context_line":"                     [constants.TUNNEL, topics.DELETE],"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_65192122","line":380,"range":{"start_line":380,"start_character":8,"end_line":380,"end_character":17},"updated":"2016-06-30 16:40:09.000000000","message":"Does/should the l3 agent use the same RPC library used here? (We couldn\u0027t see that it did--maybe my newness to neutron.agent.rpc versus neutron.api.rpc, among other stuff, lies at the root of this question.)","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        # RPC network init"},{"line_number":378,"context_line":"        self.context \u003d context.get_admin_context_without_session()"},{"line_number":379,"context_line":"        # Define the listening consumers for the agent"},{"line_number":380,"context_line":"        consumers \u003d [[topics.PORT, topics.UPDATE],"},{"line_number":381,"context_line":"                     [topics.PORT, topics.DELETE],"},{"line_number":382,"context_line":"                     [constants.TUNNEL, topics.UPDATE],"},{"line_number":383,"context_line":"                     [constants.TUNNEL, topics.DELETE],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_f130ee09","line":380,"range":{"start_line":380,"start_character":8,"end_line":380,"end_character":17},"in_reply_to":"1aa78d24_ca9a66c5","updated":"2016-07-03 12:57:47.000000000","message":"Yes, I agree.   I was fishing for information here, but a conversation I had Friday with Sridar cleared it up.  :)","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        # RPC network init"},{"line_number":378,"context_line":"        self.context \u003d context.get_admin_context_without_session()"},{"line_number":379,"context_line":"        # Define the listening consumers for the agent"},{"line_number":380,"context_line":"        consumers \u003d [[topics.PORT, topics.UPDATE],"},{"line_number":381,"context_line":"                     [topics.PORT, topics.DELETE],"},{"line_number":382,"context_line":"                     [constants.TUNNEL, topics.UPDATE],"},{"line_number":383,"context_line":"                     [constants.TUNNEL, topics.DELETE],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_ca9a66c5","line":380,"range":{"start_line":380,"start_character":8,"end_line":380,"end_character":17},"in_reply_to":"3aaa91ec_65192122","updated":"2016-07-02 10:41:37.000000000","message":"Touching RPC interface is out of scope for this feature.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def init_extension_manager(self, connection):"},{"line_number":395,"context_line":"        l2_ext_manager.register_opts(self.conf)"},{"line_number":396,"context_line":"        self.l2_ext_manager \u003d ("},{"line_number":397,"context_line":"            l2_ext_manager.L2AgentExtensionsManager(self.conf))"},{"line_number":398,"context_line":"        self.agent_api \u003d ovs_ext_api.OVSAgentExtensionAPI(self.int_br,"},{"line_number":399,"context_line":"                                                          self.tun_br)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_aa9f1ab3","line":396,"updated":"2016-07-02 10:41:37.000000000","message":"same comment as in other places: no real need to rename.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def init_extension_manager(self, connection):"},{"line_number":395,"context_line":"        l2_ext_manager.register_opts(self.conf)"},{"line_number":396,"context_line":"        self.l2_ext_manager \u003d ("},{"line_number":397,"context_line":"            l2_ext_manager.L2AgentExtensionsManager(self.conf))"},{"line_number":398,"context_line":"        self.agent_api \u003d ovs_ext_api.OVSAgentExtensionAPI(self.int_br,"},{"line_number":399,"context_line":"                                                          self.tun_br)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_716d1e32","line":396,"in_reply_to":"1aa78d24_aa9f1ab3","updated":"2016-07-03 12:57:47.000000000","message":"Will fix.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"}],"neutron/tests/functional/agent/l2/base.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"95286f1bc53ba93982eb19d2f4b7a8d015beb387","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from neutron.agent.common import config as agent_config"},{"line_number":26,"context_line":"from neutron.agent.common import ovs_lib"},{"line_number":27,"context_line":"from neutron.agent.l2 import l2_agent_extensions_manager as l2_ext_manager"},{"line_number":28,"context_line":"from neutron.agent.linux import interface"},{"line_number":29,"context_line":"from neutron.agent.linux import polling"},{"line_number":30,"context_line":"from neutron.agent.linux import utils as agent_utils"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_f47f9012","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":74},"updated":"2016-06-24 15:13:10.000000000","message":"There are no other changes in this file, is this a mistake?","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"0fa043a2818a7fd38d432b80e2810d8ab9b08f5e","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from neutron.agent.common import config as agent_config"},{"line_number":26,"context_line":"from neutron.agent.common import ovs_lib"},{"line_number":27,"context_line":"from neutron.agent.l2 import l2_agent_extensions_manager as l2_ext_manager"},{"line_number":28,"context_line":"from neutron.agent.linux import interface"},{"line_number":29,"context_line":"from neutron.agent.linux import polling"},{"line_number":30,"context_line":"from neutron.agent.linux import utils as agent_utils"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_573dc68d","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":74},"in_reply_to":"3aaa91ec_f47f9012","updated":"2016-06-24 15:26:26.000000000","message":"Yes, mistake, because line 79 should have been updated too.  :)  I\u0027ll fix in next PS.","commit_id":"1085875abd504667caba20ebe07de9eb7b959f52"}],"neutron/tests/unit/agent/l2/extensions/test_qos.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"95286f1bc53ba93982eb19d2f4b7a8d015beb387","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @mock.patch.object(registry, \u0027subscribe\u0027)"},{"line_number":298,"context_line":"    @mock.patch.object(resources_rpc, \u0027ResourcesPushRpcCallback\u0027)"},{"line_number":299,"context_line":"    def test_initialize_subscribed_to_rpc(self, rpc_mock, subscribe_mock):"},{"line_number":300,"context_line":"        self.qos_ext.initialize("},{"line_number":301,"context_line":"            self.connection, constants.EXTENSION_DRIVER_TYPE)"},{"line_number":302,"context_line":"        self.connection.create_consumer.assert_has_calls("},{"line_number":303,"context_line":"            [mock.call("},{"line_number":304,"context_line":"                 resources_rpc.resource_type_versioned_topic(resource_type),"},{"line_number":305,"context_line":"                 [rpc_mock()],"},{"line_number":306,"context_line":"                 fanout\u003dTrue)"},{"line_number":307,"context_line":"             for resource_type in self.qos_ext.SUPPORTED_RESOURCES]"},{"line_number":308,"context_line":"        )"},{"line_number":309,"context_line":"        subscribe_mock.assert_called_with(mock.ANY, resources.QOS_POLICY)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"class QosExtensionReflushRulesTestCase(QosExtensionBaseTestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_b4afc87b","side":"PARENT","line":309,"range":{"start_line":299,"start_character":0,"end_line":309,"end_character":73},"updated":"2016-06-24 15:13:10.000000000","message":"Should this be updated rather than the class be removed?","commit_id":"5d3a6e6aaa577ad002afa7aed260fd7025badd56"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"0fa043a2818a7fd38d432b80e2810d8ab9b08f5e","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @mock.patch.object(registry, \u0027subscribe\u0027)"},{"line_number":298,"context_line":"    @mock.patch.object(resources_rpc, \u0027ResourcesPushRpcCallback\u0027)"},{"line_number":299,"context_line":"    def test_initialize_subscribed_to_rpc(self, rpc_mock, subscribe_mock):"},{"line_number":300,"context_line":"        self.qos_ext.initialize("},{"line_number":301,"context_line":"            self.connection, constants.EXTENSION_DRIVER_TYPE)"},{"line_number":302,"context_line":"        self.connection.create_consumer.assert_has_calls("},{"line_number":303,"context_line":"            [mock.call("},{"line_number":304,"context_line":"                 resources_rpc.resource_type_versioned_topic(resource_type),"},{"line_number":305,"context_line":"                 [rpc_mock()],"},{"line_number":306,"context_line":"                 fanout\u003dTrue)"},{"line_number":307,"context_line":"             for resource_type in self.qos_ext.SUPPORTED_RESOURCES]"},{"line_number":308,"context_line":"        )"},{"line_number":309,"context_line":"        subscribe_mock.assert_called_with(mock.ANY, resources.QOS_POLICY)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"class QosExtensionReflushRulesTestCase(QosExtensionBaseTestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_376c7a9b","side":"PARENT","line":309,"range":{"start_line":299,"start_character":0,"end_line":309,"end_character":73},"in_reply_to":"3aaa91ec_b4afc87b","updated":"2016-06-24 15:26:26.000000000","message":"Yes, this test needs to be updated and moved.  I decided not to do those things in this PS because I wanted to see whether reviewers would agree with the general approach.","commit_id":"5d3a6e6aaa577ad002afa7aed260fd7025badd56"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        self.assertIsNone(self.qos_ext.policy_map.get_port_policy(port2))"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"class QosExtensionInitializeTestCase(QosExtensionBaseTestCase):"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @mock.patch.object(registry, \u0027subscribe\u0027)"},{"line_number":298,"context_line":"    @mock.patch.object(resources_rpc, \u0027ResourcesPushRpcCallback\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_4aaf96e3","side":"PARENT","line":295,"updated":"2016-07-02 10:41:37.000000000","message":"why the test being removed?","commit_id":"e8c97686d9a934b12bd7bbf044495ad521342c4b"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5df99ef67841e101b79883bf0c2a22277381730b","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        self.assertIsNone(self.qos_ext.policy_map.get_port_policy(port2))"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"class QosExtensionInitializeTestCase(QosExtensionBaseTestCase):"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @mock.patch.object(registry, \u0027subscribe\u0027)"},{"line_number":298,"context_line":"    @mock.patch.object(resources_rpc, \u0027ResourcesPushRpcCallback\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_fd21019f","side":"PARENT","line":295,"in_reply_to":"1aa78d24_1734c0f9","updated":"2016-07-07 17:01:25.000000000","message":"I\u0027ll reinstate this test since agent extensions will continue to register their own RPC callbacks.  :)","commit_id":"e8c97686d9a934b12bd7bbf044495ad521342c4b"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        self.assertIsNone(self.qos_ext.policy_map.get_port_policy(port2))"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"class QosExtensionInitializeTestCase(QosExtensionBaseTestCase):"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @mock.patch.object(registry, \u0027subscribe\u0027)"},{"line_number":298,"context_line":"    @mock.patch.object(resources_rpc, \u0027ResourcesPushRpcCallback\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_d164d24a","side":"PARENT","line":295,"in_reply_to":"1aa78d24_4aaf96e3","updated":"2016-07-03 12:57:47.000000000","message":"If registry subscription is moved from the extension to AgentExtensionsManager then this test would be replaced with one at the abstracted layer, right?","commit_id":"e8c97686d9a934b12bd7bbf044495ad521342c4b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9385b6c86b26fb083ca750214852a9c02bd545e4","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        self.assertIsNone(self.qos_ext.policy_map.get_port_policy(port2))"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"class QosExtensionInitializeTestCase(QosExtensionBaseTestCase):"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @mock.patch.object(registry, \u0027subscribe\u0027)"},{"line_number":298,"context_line":"    @mock.patch.object(resources_rpc, \u0027ResourcesPushRpcCallback\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_1734c0f9","side":"PARENT","line":295,"in_reply_to":"1aa78d24_6ca3859f","updated":"2016-07-07 12:34:17.000000000","message":"Right.","commit_id":"e8c97686d9a934b12bd7bbf044495ad521342c4b"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"63d385734bdaf5a5dae23e5bce05e82301d76c29","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        self.assertIsNone(self.qos_ext.policy_map.get_port_policy(port2))"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"class QosExtensionInitializeTestCase(QosExtensionBaseTestCase):"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @mock.patch.object(registry, \u0027subscribe\u0027)"},{"line_number":298,"context_line":"    @mock.patch.object(resources_rpc, \u0027ResourcesPushRpcCallback\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_6ca3859f","side":"PARENT","line":295,"in_reply_to":"1aa78d24_d164d24a","updated":"2016-07-03 13:53:36.000000000","message":"Oh, and I would need to write that other test.  I guess I\u0027m a DDT kind of person.","commit_id":"e8c97686d9a934b12bd7bbf044495ad521342c4b"}],"neutron/tests/unit/agent/test_agent_extensions_manager.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7128436229d72942296441c5b091c2101ed68ff8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                   autospec\u003dTrue).start()"},{"line_number":26,"context_line":"        conf \u003d cfg.CONF"},{"line_number":27,"context_line":"        ext_manager.register_opts(conf)"},{"line_number":28,"context_line":"        cfg.CONF.set_override(\u0027extensions\u0027, [\u0027qos\u0027], \u0027agent\u0027)"},{"line_number":29,"context_line":"        namespace \u003d \u0027neutron.agent.l2.extensions\u0027"},{"line_number":30,"context_line":"        self.manager \u003d ext_manager.AgentExtensionsManager(conf, namespace)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_6ab6d23e","line":28,"updated":"2016-07-02 10:41:37.000000000","message":"(No action required): it\u0027s not clear to me why we require qos here in the first place.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"9f79b0a72140614649e18f541f69898714d26583","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                   autospec\u003dTrue).start()"},{"line_number":26,"context_line":"        conf \u003d cfg.CONF"},{"line_number":27,"context_line":"        ext_manager.register_opts(conf)"},{"line_number":28,"context_line":"        cfg.CONF.set_override(\u0027extensions\u0027, [\u0027qos\u0027], \u0027agent\u0027)"},{"line_number":29,"context_line":"        namespace \u003d \u0027neutron.agent.l2.extensions\u0027"},{"line_number":30,"context_line":"        self.manager \u003d ext_manager.AgentExtensionsManager(conf, namespace)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_d11cd279","line":28,"in_reply_to":"1aa78d24_6ab6d23e","updated":"2016-07-03 12:57:47.000000000","message":"Yeah, and I think this is now more confusing with the increased abstraction of the tested class. I\u0027ll change this.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":17711,"name":"Margaret Frances","email":"margaret_frances@cable.comcast.com","username":"margaret-frances"},"change_message_id":"5762c6e5b8eac29be35b55eecb89a9e10392466e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                   autospec\u003dTrue).start()"},{"line_number":26,"context_line":"        conf \u003d cfg.CONF"},{"line_number":27,"context_line":"        ext_manager.register_opts(conf)"},{"line_number":28,"context_line":"        cfg.CONF.set_override(\u0027extensions\u0027, [\u0027qos\u0027], \u0027agent\u0027)"},{"line_number":29,"context_line":"        namespace \u003d \u0027neutron.agent.l2.extensions\u0027"},{"line_number":30,"context_line":"        self.manager \u003d ext_manager.AgentExtensionsManager(conf, namespace)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_4ef78af5","line":28,"in_reply_to":"1aa78d24_d11cd279","updated":"2016-07-08 15:22:19.000000000","message":"I realize that this line loads an extension for the ExtensionManager and so needs to be kept.  WIth it absent, self.manager.extensions[0].obj returns an IndexError.","commit_id":"645edd3d9a520c3e2972c46e6d1bf1a6afff26da"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"8ae7c8faaf06308fa52838627a2dc47d73f53d03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"1aa78d24_d338daf0","side":"PARENT","line":40,"updated":"2016-07-12 01:44:04.000000000","message":"We probably have to move that to a separate test class (for the L2 agent extension alone) instead of deleting them :)","commit_id":"fb88d07bd15dce7192ef55ce01f6b7edaf8bb059"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d2f1dfc77cb2cd95e4dda555379c0225b3cc6a0e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"1aa78d24_99ac83a0","side":"PARENT","line":40,"in_reply_to":"1aa78d24_b45fd83f","updated":"2016-07-12 18:03:00.000000000","message":"Oh right, sorry, the change it\u0027s confusing, since we reuse the file,and move the l2 to the other one :)","commit_id":"fb88d07bd15dce7192ef55ce01f6b7edaf8bb059"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fd51280371f208640866accb0859d0ecd940bede","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"1aa78d24_b45fd83f","side":"PARENT","line":40,"in_reply_to":"1aa78d24_d338daf0","updated":"2016-07-12 13:31:55.000000000","message":"These were moved to the test class for L2 agent extensions manager already I believe:\n\nhttps://review.openstack.org/#/c/329701/12/neutron/tests/unit/agent/l2/test_l2_agent_extensions_manager.py@40","commit_id":"fb88d07bd15dce7192ef55ce01f6b7edaf8bb059"}]}
