)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"3fc4a58d9f947d6d0e34b854bb989d893c45573d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"  namespace\u0027s name."},{"line_number":21,"context_line":"* Created neutron-l3-test-agent executeable to be used by future"},{"line_number":22,"context_line":"  integration tests"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: Id5a8852d38543590b90e4bbed261a7a458071a9a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da9df570_e20b6629","line":23,"updated":"2014-09-21 22:50:58.000000000","message":"Missing bug/spec reference. I think it should be linked to l3 HA blueprint","commit_id":"34a7e453cb984de1dcd4899948165bba4fb66e3c"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f97e9f2d89893e0d118172d4f66fe83738598f30","unresolved":false,"context_lines":[{"line_number":20,"context_line":"  namespace\u0027s name."},{"line_number":21,"context_line":"* Created neutron-l3-test-agent executeable to be used by future"},{"line_number":22,"context_line":"  integration tests"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: Id5a8852d38543590b90e4bbed261a7a458071a9a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da9df570_0125bfc1","line":23,"in_reply_to":"da9df570_e20b6629","updated":"2014-09-23 13:39:25.000000000","message":"Done","commit_id":"34a7e453cb984de1dcd4899948165bba4fb66e3c"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To better check HA, full-stack tests (where actual processes are used"},{"line_number":10,"context_line":"together with one another, as opposed to functional tests which only"},{"line_number":11,"context_line":"check functions) are needed. This sets the ground-works of such tests:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"* Define different qr/qg device names, based on the last 3 letters of"},{"line_number":14,"context_line":"  the \u0027host\u0027 defined for the agent. This is done because if we have"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3a961159_2c906442","line":11,"updated":"2014-12-21 06:14:44.000000000","message":"This sets the ground-works of -\u003e This change lays the groundwork for","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To better check HA, full-stack tests (where actual processes are used"},{"line_number":10,"context_line":"together with one another, as opposed to functional tests which only"},{"line_number":11,"context_line":"check functions) are needed. This sets the ground-works of such tests:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"* Define different qr/qg device names, based on the last 3 letters of"},{"line_number":14,"context_line":"  the \u0027host\u0027 defined for the agent. This is done because if we have"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3a961159_2b528e68","line":11,"in_reply_to":"3a961159_2c906442","updated":"2014-12-29 16:32:14.000000000","message":"Done","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9142cce5a74678c69efc492f55965ab252e89831","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-10-14 14:12:35 +0300"},{"line_number":4,"context_line":"Commit:     John Schwarz \u003cjschwarz@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-31 11:04:05 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add HA full-stack test"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To better check HA, full-stack tests (where actual processes are used"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"3a961159_1c49738e","line":6,"updated":"2014-12-31 15:00:29.000000000","message":"Here\u0027s some issues I ran into before I was able to successfully run the test:\n\n1) I have a VM with Postgres setup, but MySQL is hard coded in:\ntemplates/neutron.conf\nbase.py:BaseIntegrationTestCase.create_database\n\nI understand \u0027gate_hook.sh\u0027 is supposed to take care of configuring MySQL that but it did not run properly on my system.\n\n2) /opt/stack/logs is assumed to exist, it did not on my system. I see it\u0027s supposed to be created by the 2nd script: post_test_hook.sh.\n\nThese tests are supposed to be able to run on machines that aren\u0027t necessarily configured exactly like the gate. We have to document the necessary steps to run these tests, and make sure we strike a good balance on relying on one-time host configuration that the gate hooks supply, VS setting up things before each test run.\n\n3) I got the same error as the latest gate failure: The expected number of process fixtures are not up. Once I killed all of the services started by devstack in the background, it resolved itself. Once issue I\u0027m aware of is the Neutron server port, it must be randomized in our case, and the client endpoint updated accordingly. Honestly though, we\u0027ll end up with other issues like the L3 agent deleting namespaces of the other agent when it starts and whatnot. I don\u0027t think we can run these tests with anything running in the background.","commit_id":"ee6f30db6a73867d4af6df4e1fbc55a6e6dbbabf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9c4e37a3d0f6882ca3134371bef5bf69787de7c9","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-10-14 14:12:35 +0300"},{"line_number":4,"context_line":"Commit:     John Schwarz \u003cjschwarz@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-31 11:04:05 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add HA full-stack test"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To better check HA, full-stack tests (where actual processes are used"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"3a961159_cf654b1e","line":6,"in_reply_to":"3a961159_1c49738e","updated":"2015-01-05 13:15:38.000000000","message":"1) Currently (in the first stage), only MySQL is supported. Once these actually merges, adding Postgres will be easy since the infra is already there.\n\n2) You are correct. I will work on creating some sort of script that provides the needed environment and some documentation, once we figure out what\u0027s the correct way to actually run this.\n\n3) Yep.","commit_id":"ee6f30db6a73867d4af6df4e1fbc55a6e6dbbabf"}],"neutron/agent/linux/daemon.py":[{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"13d3eb89b590385f8518419e3d555fc0cde1bd7e","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        self.pidfile.write(os.getpid())"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def delete_pid(self):"},{"line_number":142,"context_line":"        if os.path.exists(self.pidfile):"},{"line_number":143,"context_line":"            os.remove(str(self.pidfile))"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def handle_sigterm(self, signum, frame):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_40405035","line":142,"updated":"2015-01-05 08:24:33.000000000","message":"self.pidfile should be enclosed in str() as it is a Pidfile object.","commit_id":"91a7718ff7dbe3df487948f973ab1d3d0570a00b"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4f5302fe78661df91bba4d70e57f35ada3e11652","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        self.pidfile.write(os.getpid())"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def delete_pid(self):"},{"line_number":142,"context_line":"        if os.path.exists(self.pidfile):"},{"line_number":143,"context_line":"            os.remove(str(self.pidfile))"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def handle_sigterm(self, signum, frame):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_80da3815","line":142,"in_reply_to":"3a961159_40405035","updated":"2015-01-05 08:36:57.000000000","message":"Thanks :) Fixed for the next revision!","commit_id":"91a7718ff7dbe3df487948f973ab1d3d0570a00b"}],"neutron/tests/agents/l3_agent.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"67bdc898693f7347017a18fcd4a4e5a0eb0c7437","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_router_info(self, *args, **kwargs):"},{"line_number":54,"context_line":"        return TestRouterInfo(self.host, *args, **kwargs)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _cleanup_namespaces(self, router_namespaces, router_ids):"},{"line_number":57,"context_line":"        ns_to_ignore \u003d set(\"%s%s@%s\" % (l3_agent.NS_PREFIX, id, self.host)"},{"line_number":58,"context_line":"                           for id in router_ids)"},{"line_number":59,"context_line":"        ns_to_ignore.update(namespace for namespace in router_namespaces"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9df570_c25f4271","line":56,"updated":"2014-09-21 21:51:53.000000000","message":"Maybe refactor the original method to use GetRouterInfo on each router_id and generating the namespaces that way? Then you don\u0027t have to override _cleanup_namespaces in the test agent.","commit_id":"34a7e453cb984de1dcd4899948165bba4fb66e3c"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f97e9f2d89893e0d118172d4f66fe83738598f30","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_router_info(self, *args, **kwargs):"},{"line_number":54,"context_line":"        return TestRouterInfo(self.host, *args, **kwargs)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _cleanup_namespaces(self, router_namespaces, router_ids):"},{"line_number":57,"context_line":"        ns_to_ignore \u003d set(\"%s%s@%s\" % (l3_agent.NS_PREFIX, id, self.host)"},{"line_number":58,"context_line":"                           for id in router_ids)"},{"line_number":59,"context_line":"        ns_to_ignore.update(namespace for namespace in router_namespaces"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9df570_5eeec6ed","line":56,"in_reply_to":"da9df570_c25f4271","updated":"2014-09-23 13:39:25.000000000","message":"Done - added 2 patches to the chain which do the required refactoring...","commit_id":"34a7e453cb984de1dcd4899948165bba4fb66e3c"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ca9b872a9ef88de1df3d37e6aff64766ab3b4b8b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def _get_namespaces_to_ignore(self, router_namespaces, router_ids):"},{"line_number":64,"context_line":"        router_info \u003d self.get_router_info()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        ns_to_ignore \u003d set("},{"line_number":67,"context_line":"            router_info.get_ns_name(id, use_namespaces\u003dTrue, host\u003dself.host)"},{"line_number":68,"context_line":"            for id in router_ids)"},{"line_number":69,"context_line":"        ns_to_ignore.update(namespace for namespace in router_namespaces"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9df570_1cfe616b","line":66,"updated":"2014-09-28 16:28:41.000000000","message":"We can add a helper method to the agent called get_ns_name (Another one, yay!) that calls get_router_info and passes the correct parameters to it. We can override that method in the test agent to pass in self.host as well.\n\nWe can also consider splitting out the initialization of iptables_manager out of __init__. That way you can just call build_router_info and it\u0027ll know to generate its own namespace name correctly. An init function shouldn\u0027t be performing costly host interaction anyway.","commit_id":"492c25c42e4db5d328a5e79415259a69d82a0e6c"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7d4860383d686ea2187b6697066099280de002d0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def _get_namespaces_to_ignore(self, router_namespaces, router_ids):"},{"line_number":64,"context_line":"        router_info \u003d self.get_router_info()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        ns_to_ignore \u003d set("},{"line_number":67,"context_line":"            router_info.get_ns_name(id, use_namespaces\u003dTrue, host\u003dself.host)"},{"line_number":68,"context_line":"            for id in router_ids)"},{"line_number":69,"context_line":"        ns_to_ignore.update(namespace for namespace in router_namespaces"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_c6af5b2a","line":66,"in_reply_to":"da9df570_1cfe616b","updated":"2014-09-29 14:13:09.000000000","message":"Done","commit_id":"492c25c42e4db5d328a5e79415259a69d82a0e6c"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ca9b872a9ef88de1df3d37e6aff64766ab3b4b8b","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        ns_to_ignore \u003d set("},{"line_number":67,"context_line":"            router_info.get_ns_name(id, use_namespaces\u003dTrue, host\u003dself.host)"},{"line_number":68,"context_line":"            for id in router_ids)"},{"line_number":69,"context_line":"        ns_to_ignore.update(namespace for namespace in router_namespaces"},{"line_number":70,"context_line":"                            if not namespace.endswith(self.host))"},{"line_number":71,"context_line":"        ns_to_ignore.update(self.get_snat_ns_name(id) for id in router_ids)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9df570_9cda5115","line":68,"updated":"2014-09-28 16:28:41.000000000","message":"Implementing the above change would allow us to override _get_namespaces_to_ignore by calling super, and chaining the \u0027if not namespace.endswith...\u0027 .update to its result.","commit_id":"492c25c42e4db5d328a5e79415259a69d82a0e6c"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7d4860383d686ea2187b6697066099280de002d0","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        ns_to_ignore \u003d set("},{"line_number":67,"context_line":"            router_info.get_ns_name(id, use_namespaces\u003dTrue, host\u003dself.host)"},{"line_number":68,"context_line":"            for id in router_ids)"},{"line_number":69,"context_line":"        ns_to_ignore.update(namespace for namespace in router_namespaces"},{"line_number":70,"context_line":"                            if not namespace.endswith(self.host))"},{"line_number":71,"context_line":"        ns_to_ignore.update(self.get_snat_ns_name(id) for id in router_ids)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_a6bb3771","line":68,"in_reply_to":"da9df570_9cda5115","updated":"2014-09-29 14:13:09.000000000","message":"Done","commit_id":"492c25c42e4db5d328a5e79415259a69d82a0e6c"}],"neutron/tests/common/agents/l3_agent.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"bf4c4f5e97ee8accc4d7482f772c21472c6891e7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            try:"},{"line_number":66,"context_line":"                self._destroy_namespace(ns)"},{"line_number":67,"context_line":"            except RuntimeError:"},{"line_number":68,"context_line":"                LOG.exception(_LE(\u0027Failed to destroy stale router namespace \u0027"},{"line_number":69,"context_line":"                                  \u0027%s\u0027), ns)"},{"line_number":70,"context_line":"        self._clean_stale_namespaces \u003d False"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"9a80dd14_f951f60e","line":68,"updated":"2015-03-06 00:25:49.000000000","message":"do we need i18n in tests?","commit_id":"71ac110cea21d3f463d1f55bb1935747dd5236be"}],"neutron/tests/common/net_helpers.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8e03cb757d8d64cbe8d8a38f97058ccc3e76d5c3","unresolved":false,"context_lines":[{"line_number":144,"context_line":"class OVSBridgeFixture(fixtures.Fixture):"},{"line_number":145,"context_line":"    \"\"\"Create an OVS bridge."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    :ivar prefix: the prefix to use for new bridges."},{"line_number":148,"context_line":"    :type prefix: str"},{"line_number":149,"context_line":"    :ivar bridge: created bridge"},{"line_number":150,"context_line":"    :type bridge: OVSBridge"}],"source_content_type":"text/x-python","patch_set":41,"id":"baa041b7_59ee6023","line":147,"updated":"2015-04-02 12:14:57.000000000","message":"why not \"bridge name prefix\"?","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7c90bc5fb40aacd9d5d6c2ba9f7b819e181ac94f","unresolved":false,"context_lines":[{"line_number":144,"context_line":"class OVSBridgeFixture(fixtures.Fixture):"},{"line_number":145,"context_line":"    \"\"\"Create an OVS bridge."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    :ivar prefix: the prefix to use for new bridges."},{"line_number":148,"context_line":"    :type prefix: str"},{"line_number":149,"context_line":"    :ivar bridge: created bridge"},{"line_number":150,"context_line":"    :type bridge: OVSBridge"}],"source_content_type":"text/x-python","patch_set":41,"id":"9aa53dc9_1fa7c350","line":147,"in_reply_to":"baa041b7_59ee6023","updated":"2015-04-06 12:25:20.000000000","message":"Done","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8e03cb757d8d64cbe8d8a38f97058ccc3e76d5c3","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def __init__(self, prefix\u003dBR_PREFIX):"},{"line_number":154,"context_line":"        super(OVSBridgeFixture, self).__init__()"},{"line_number":155,"context_line":"        self.prefix \u003d prefix"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":41,"id":"baa041b7_d9da7078","line":154,"updated":"2015-04-02 12:14:57.000000000","message":"super.__init__ not required","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7c90bc5fb40aacd9d5d6c2ba9f7b819e181ac94f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def __init__(self, prefix\u003dBR_PREFIX):"},{"line_number":154,"context_line":"        super(OVSBridgeFixture, self).__init__()"},{"line_number":155,"context_line":"        self.prefix \u003d prefix"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":41,"id":"9aa53dc9_ffbbff73","line":154,"in_reply_to":"baa041b7_d9da7078","updated":"2015-04-06 12:25:20.000000000","message":"Done","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"}],"neutron/tests/fullstack/base.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import model_base"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":26,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":27,"context_line":"    \"\"\"Base test class for full-stack tests.\"\"\""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_08927e9e","line":25,"updated":"2015-03-31 22:49:51.000000000","message":"If abstract test cases aren\u0027t an anti-pattern, I think they should be.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import model_base"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":26,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":27,"context_line":"    \"\"\"Base test class for full-stack tests.\"\"\""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_e5e7d03e","line":25,"in_reply_to":"da9b358b_08927e9e","updated":"2015-04-02 12:03:14.000000000","message":"Done","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"45d584b2b3b661ec39da629f6c516477dabba45c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.client \u003d self.environment.neutron_server.client"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abc.abstractmethod"},{"line_number":37,"context_line":"    def init_environment_fixture(self):"},{"line_number":38,"context_line":"        \"\"\"Initialize an instance of f_fixtures.EnvironmentFixture.\"\"\""},{"line_number":39,"context_line":"        return None"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_38f6c1d7","line":37,"updated":"2015-03-31 16:44:00.000000000","message":"Maru, I hope this is the design you had in mind when we discussed this as discussed this last week.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.client \u003d self.environment.neutron_server.client"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abc.abstractmethod"},{"line_number":37,"context_line":"    def init_environment_fixture(self):"},{"line_number":38,"context_line":"        \"\"\"Initialize an instance of f_fixtures.EnvironmentFixture.\"\"\""},{"line_number":39,"context_line":"        return None"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_6880ea46","line":37,"in_reply_to":"da9b358b_38f6c1d7","updated":"2015-03-31 22:49:51.000000000","message":"I don\u0027t think we should be imposing implementation requirements on subclasses.  Preferable, I think, to accept an argument to setup or init.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.client \u003d self.environment.neutron_server.client"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abc.abstractmethod"},{"line_number":37,"context_line":"    def init_environment_fixture(self):"},{"line_number":38,"context_line":"        \"\"\"Initialize an instance of f_fixtures.EnvironmentFixture.\"\"\""},{"line_number":39,"context_line":"        return None"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_05c2b485","line":37,"in_reply_to":"da9b358b_6880ea46","updated":"2015-04-02 12:03:14.000000000","message":"Done","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8e03cb757d8d64cbe8d8a38f97058ccc3e76d5c3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":24,"context_line":"    \"\"\"Base test class for full-stack tests.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def setUp(self, environment\u003dNone):"},{"line_number":27,"context_line":"        super(BaseFullStackTestCase, self).setUp()"},{"line_number":28,"context_line":"        self.create_db_tables()"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"baa041b7_d9f6f0d6","line":26,"updated":"2015-04-02 12:14:57.000000000","message":"IMO, It\u0027s strange to change setUp signature.\n\nI would prefer we provide environment to __init__","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7c90bc5fb40aacd9d5d6c2ba9f7b819e181ac94f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":24,"context_line":"    \"\"\"Base test class for full-stack tests.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def setUp(self, environment\u003dNone):"},{"line_number":27,"context_line":"        super(BaseFullStackTestCase, self).setUp()"},{"line_number":28,"context_line":"        self.create_db_tables()"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"9aa53dc9_9f163354","line":26,"in_reply_to":"baa041b7_d9f6f0d6","updated":"2015-04-06 12:25:20.000000000","message":"Done","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8e03cb757d8d64cbe8d8a38f97058ccc3e76d5c3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.environment \u003d (environment if environment"},{"line_number":31,"context_line":"                            else f_fixtures.EnvironmentFixture())"},{"line_number":32,"context_line":"        if self.environment:"},{"line_number":33,"context_line":"            self.useFixture(self.environment)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.client \u003d self.environment.neutron_server.client"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"baa041b7_79d36439","line":33,"updated":"2015-04-02 12:14:57.000000000","message":"as said previously, it seems to setUp a fixture not created by the fixture (append if environment is not None)","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"030f441bf69bb634e936dd9ae8829a0933a48286","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.environment \u003d (environment if environment"},{"line_number":31,"context_line":"                            else f_fixtures.EnvironmentFixture())"},{"line_number":32,"context_line":"        if self.environment:"},{"line_number":33,"context_line":"            self.useFixture(self.environment)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.client \u003d self.environment.neutron_server.client"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"baa041b7_b94e8cbf","line":33,"in_reply_to":"baa041b7_79d36439","updated":"2015-04-02 12:18:34.000000000","message":"oups,\n\nAs said previously, imo, a fixture should setUp only fixtures it creates: we should not setUp self.environment if environment !\u003d None. The following seems cleaner:\n\n  if not environment:\n    self.environment \u003d self.useFixture(....)\n  self.client \u003d self.environment....","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7c90bc5fb40aacd9d5d6c2ba9f7b819e181ac94f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.environment \u003d (environment if environment"},{"line_number":31,"context_line":"                            else f_fixtures.EnvironmentFixture())"},{"line_number":32,"context_line":"        if self.environment:"},{"line_number":33,"context_line":"            self.useFixture(self.environment)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.client \u003d self.environment.neutron_server.client"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"9aa53dc9_228dd07b","line":33,"in_reply_to":"baa041b7_b94e8cbf","updated":"2015-04-06 12:25:20.000000000","message":"This implicitly imposes a strict API on the inheriting class (forcing it to define self.environment). Moreover, it breaks a few things (specifically \u0027self.environment\u0027 must be used after create_db_tables and before \u0027self.client\u0027 is declared).\n\nInstead, I\u0027d go for a non-optional environment parameter in the __init__, and then this code will always use that fixture (no \u0027if\u0027). Is that OK?","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"5430521f6cbed78b98c78e72805f8db33783f9b6","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests.fullstack import fullstack_fixtures as f_fixtures"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":24,"context_line":"    \"\"\"Base test class for full-stack tests.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, environment\u003dNone, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":50,"id":"9aa53dc9_c815cc49","line":23,"updated":"2015-04-08 09:42:57.000000000","message":"I would prefer you implement a fixture inheriting from/depending on MySQLOpportunisticFixture.\n\n\nAnd use:\n\n   self.useFixture($FullstackDbFixture())\n   self.useFixture(EnvironmentFixture())\n\nor:\n   db_fixture \u003d self.useFixture($FullstackDbFixture())\n   self.useFixture(EnvironmentFixture(db_fixture))\n\nIt allows to define testscenarios for multiple db backends","commit_id":"ca46a18207134cab5327839bc80876b93d29fbed"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"b39b5103720a8efcd75c628819de3de4f52745ae","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests.fullstack import fullstack_fixtures as f_fixtures"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase):"},{"line_number":24,"context_line":"    \"\"\"Base test class for full-stack tests.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, environment\u003dNone, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":50,"id":"7aaa499b_0b1cd475","line":23,"in_reply_to":"9aa53dc9_c815cc49","updated":"2015-04-14 13:54:39.000000000","message":"This is currently something I wish to avoid. I initially tried this but lately the oslo.db guys switched into some weird and hackish testresources code which makes it difficult to use MySQLOpportunisticFixture without the relevant test case. As part of earlier revisions of the initial framework patch I tried this but to no success :(","commit_id":"ca46a18207134cab5327839bc80876b93d29fbed"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"2add5280df1d4303e68203b8f3ff9f64a62dfa1f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Base test class for full-stack tests.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, environment\u003dNone, *args, **kwargs):"},{"line_number":27,"context_line":"        super(BaseFullStackTestCase, self).__init__(*args, **kwargs)"},{"line_number":28,"context_line":"        self.environment \u003d (environment if environment"},{"line_number":29,"context_line":"                            else f_fixtures.EnvironmentFixture())"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"3ab451fb_91962693","line":27,"updated":"2015-04-16 23:54:23.000000000","message":"(No action required) If the only purpose of passing the environment fixture is to useFixture and set the client, maybe it\u0027s better done in the implementing class for now?  Especially given the goal of moving to using fixture-managed db, maybe the need for a base class can be removed in favor of helper methods?","commit_id":"304d68d9741fd15c14263d978e5b0bae43cde58e"}],"neutron/tests/fullstack/config_fixtures.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"45d584b2b3b661ec39da629f6c516477dabba45c","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                \u0027api_paste_config\u0027: self._generate_api_paste(),"},{"line_number":110,"context_line":"                \u0027policy_file\u0027: self._generate_policy_json(),"},{"line_number":111,"context_line":"                \u0027core_plugin\u0027: \u0027neutron.plugins.ml2.plugin.Ml2Plugin\u0027,"},{"line_number":112,"context_line":"                \u0027service_plugins\u0027: \u0027neutron.services.l3_router.l3_router_plugin.L3RouterPlugin\u0027,  # noqa"},{"line_number":113,"context_line":"                \u0027rabbit_userid\u0027: \u0027stackrabbit\u0027,"},{"line_number":114,"context_line":"                \u0027rabbit_password\u0027: \u0027secretrabbit\u0027,"},{"line_number":115,"context_line":"                \u0027rabbit_hosts\u0027: \u0027127.0.0.1\u0027,"}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_98594d01","line":112,"updated":"2015-03-31 16:44:00.000000000","message":"Some extra long lines... Any advice on how I can get rid of them without making dummy functions/constants?","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                \u0027api_paste_config\u0027: self._generate_api_paste(),"},{"line_number":110,"context_line":"                \u0027policy_file\u0027: self._generate_policy_json(),"},{"line_number":111,"context_line":"                \u0027core_plugin\u0027: \u0027neutron.plugins.ml2.plugin.Ml2Plugin\u0027,"},{"line_number":112,"context_line":"                \u0027service_plugins\u0027: \u0027neutron.services.l3_router.l3_router_plugin.L3RouterPlugin\u0027,  # noqa"},{"line_number":113,"context_line":"                \u0027rabbit_userid\u0027: \u0027stackrabbit\u0027,"},{"line_number":114,"context_line":"                \u0027rabbit_password\u0027: \u0027secretrabbit\u0027,"},{"line_number":115,"context_line":"                \u0027rabbit_hosts\u0027: \u0027127.0.0.1\u0027,"}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_162308bf","line":112,"in_reply_to":"da9b358b_3eb10448","updated":"2015-04-02 12:03:14.000000000","message":"Done, thanks.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"4c64444e43fbae1793440f2f440492c5d6bd0d3c","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                \u0027api_paste_config\u0027: self._generate_api_paste(),"},{"line_number":110,"context_line":"                \u0027policy_file\u0027: self._generate_policy_json(),"},{"line_number":111,"context_line":"                \u0027core_plugin\u0027: \u0027neutron.plugins.ml2.plugin.Ml2Plugin\u0027,"},{"line_number":112,"context_line":"                \u0027service_plugins\u0027: \u0027neutron.services.l3_router.l3_router_plugin.L3RouterPlugin\u0027,  # noqa"},{"line_number":113,"context_line":"                \u0027rabbit_userid\u0027: \u0027stackrabbit\u0027,"},{"line_number":114,"context_line":"                \u0027rabbit_password\u0027: \u0027secretrabbit\u0027,"},{"line_number":115,"context_line":"                \u0027rabbit_hosts\u0027: \u0027127.0.0.1\u0027,"}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_3eb10448","line":112,"in_reply_to":"da9b358b_98594d01","updated":"2015-03-31 19:38:20.000000000","message":"use parenthesis:\n\n  \u0027service_plugins\u0027 : (\u0027lorem \u0027\n                       \u0027ipsum\u0027)","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"015235e4824ec8f2b0f306d8bc1f7ebf44972e31","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _generate_policy_json(self):"},{"line_number":145,"context_line":"        return c_helpers.find_sample_file(\u0027policy.json\u0027)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"class ML2ConfigFixture(ConfigFixture):"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_38792130","line":146,"updated":"2015-03-31 16:52:19.000000000","message":"I think this patch should split this config fixture out to ml2 server side configuration, and OVS agent configuration.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"19682c05a12d5055e205b684c427beb91611bc92","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _generate_policy_json(self):"},{"line_number":145,"context_line":"        return c_helpers.find_sample_file(\u0027policy.json\u0027)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"class ML2ConfigFixture(ConfigFixture):"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_3bf59b82","line":146,"in_reply_to":"da9b358b_38792130","updated":"2015-03-31 17:13:13.000000000","message":"Are you referring to the \"ml2*\" and \"securitygroup\" vs the \"ovs\" group?","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"015235e4824ec8f2b0f306d8bc1f7ebf44972e31","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            temp_dir, base_filename\u003d\u0027l3_agent.ini\u0027)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        self.config.update({"},{"line_number":197,"context_line":"            \u0027DEFAULT\u0027: {"},{"line_number":198,"context_line":"                \u0027l3_agent_manager\u0027: \u0027neutron.agent.l3_agent.L3NATAgentWithStateReport\u0027,  # noqa"},{"line_number":199,"context_line":"                \u0027interface_driver\u0027: \u0027neutron.agent.linux.interface.OVSInterfaceDriver\u0027,  # noqa"},{"line_number":200,"context_line":"                \u0027ovs_integration_bridge\u0027: integration_bridge,"}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_d896b5ef","line":197,"updated":"2015-03-31 16:52:19.000000000","message":"Please add:\n\n    router_delete_namespaces \u003d True\n\nOr successful runs won\u0027t delete router namespaces.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            temp_dir, base_filename\u003d\u0027l3_agent.ini\u0027)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        self.config.update({"},{"line_number":197,"context_line":"            \u0027DEFAULT\u0027: {"},{"line_number":198,"context_line":"                \u0027l3_agent_manager\u0027: \u0027neutron.agent.l3_agent.L3NATAgentWithStateReport\u0027,  # noqa"},{"line_number":199,"context_line":"                \u0027interface_driver\u0027: \u0027neutron.agent.linux.interface.OVSInterfaceDriver\u0027,  # noqa"},{"line_number":200,"context_line":"                \u0027ovs_integration_bridge\u0027: integration_bridge,"}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_b618dc85","line":197,"in_reply_to":"da9b358b_d896b5ef","updated":"2015-04-02 12:03:14.000000000","message":"Done","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"2add5280df1d4303e68203b8f3ff9f64a62dfa1f","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                \u0027service_plugins\u0027: (\u0027neutron.services.l3_router.\u0027"},{"line_number":114,"context_line":"                                    \u0027l3_router_plugin.L3RouterPlugin\u0027),"},{"line_number":115,"context_line":"                \u0027rabbit_userid\u0027: \u0027stackrabbit\u0027,"},{"line_number":116,"context_line":"                \u0027rabbit_password\u0027: \u0027127.0.0.1\u0027,"},{"line_number":117,"context_line":"                \u0027rabbit_hosts\u0027: \u0027127.0.0.1\u0027,"},{"line_number":118,"context_line":"                \u0027auth_strategy\u0027: \u0027noauth\u0027,"},{"line_number":119,"context_line":"                \u0027verbose\u0027: \u0027True\u0027,"}],"source_content_type":"text/x-python","patch_set":52,"id":"3ab451fb_51e77e40","line":116,"updated":"2015-04-16 23:54:23.000000000","message":"I didn\u0027t realize this was the rabbit password, but the tests are passing...","commit_id":"304d68d9741fd15c14263d978e5b0bae43cde58e"}],"neutron/tests/fullstack/fullstack_fixtures.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":34,"context_line":"# This should correspond the directory from which infra retrieves log files"},{"line_number":35,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"NEUTRON_SERVER \u003d \"neutron-server\""},{"line_number":38,"context_line":"NEUTRON_OVS_AGENT \u003d \"neutron-openvswitch-agent\""},{"line_number":39,"context_line":"NEUTRON_L3_AGENT \u003d \"neutron-l3-agent\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_08c03e7a","line":37,"updated":"2015-03-31 22:49:51.000000000","message":"Given that these constants aren\u0027t used outside of this module, why are they defined at the module level instead of local to their use?","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"# This should correspond the directory from which infra retrieves log files"},{"line_number":35,"context_line":"DEFAULT_LOG_DIR \u003d \u0027/opt/stack/logs\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"NEUTRON_SERVER \u003d \"neutron-server\""},{"line_number":38,"context_line":"NEUTRON_OVS_AGENT \u003d \"neutron-openvswitch-agent\""},{"line_number":39,"context_line":"NEUTRON_L3_AGENT \u003d \"neutron-l3-agent\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_160ae826","line":37,"in_reply_to":"da9b358b_08c03e7a","updated":"2015-04-02 12:03:14.000000000","message":"No particular reason. Moved.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"45d584b2b3b661ec39da629f6c516477dabba45c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"NEUTRON_L3_AGENT \u003d \"neutron-l3-agent\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class BridgeFixture(fixtures.Fixture):"},{"line_number":43,"context_line":"    def __init__(self, name):"},{"line_number":44,"context_line":"        super(BridgeFixture, self).__init__()"},{"line_number":45,"context_line":"        self.name \u003d name"}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_3848012d","line":42,"updated":"2015-03-31 16:44:00.000000000","message":"This can be replaced by code from https://review.openstack.org/#/c/165866/10/neutron/tests/common/net_helpers.py once that merged (or a rebase can be done for the next patchset - whichever comes first).","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"NEUTRON_L3_AGENT \u003d \"neutron-l3-agent\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class BridgeFixture(fixtures.Fixture):"},{"line_number":43,"context_line":"    def __init__(self, name):"},{"line_number":44,"context_line":"        super(BridgeFixture, self).__init__()"},{"line_number":45,"context_line":"        self.name \u003d name"}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_26113bad","line":42,"in_reply_to":"da9b358b_3848012d","updated":"2015-04-02 12:03:14.000000000","message":"Done","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        super(ProcessFixture, self, *args, **kwargs)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":86,"context_line":"class EnvironmentFixture(fixtures.Fixture):"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_e8e19a9b","line":85,"updated":"2015-03-31 22:49:51.000000000","message":"Ix-nay on the abstractclass-nay.  Especially making abstract methods out of things with implementations.  The fact that this fixture requires a neutron_fixture suggests that a neutron fixture should be passed to it (or be created if not passed), e.g.\n\n class FullStackFixture(fixtures.Fixture):\n\n  def __init__(self, server_fixture\u003dNone):\n    self.server_fixture \u003d server_fixture\n\n  def setUp(self):\n    if not self.server_fixture:\n      self.server_fixture \u003d NeutronServerFixture(...)\n    self.useFixture(self.serverFixture)","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        super(ProcessFixture, self, *args, **kwargs)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":86,"context_line":"class EnvironmentFixture(fixtures.Fixture):"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_d1312aee","line":85,"in_reply_to":"da9b358b_e8e19a9b","updated":"2015-04-02 12:03:14.000000000","message":"I\u0027ve removed the evil spawn from the code.\n\nAlso, I\u0027ve decided to always define a neutron_server in setUp(), and let inheriting environments to only define agents. If someone happen to require a different definition of neutron-server, they can worry about this :)","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    def __init__(self, temp_dir):"},{"line_number":109,"context_line":"        self.temp_dir \u003d temp_dir"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def init_neutron_config(self, fixture, use_fixture\u003dTrue):"},{"line_number":112,"context_line":"        self.neutron_cfg_fixture \u003d fixture"},{"line_number":113,"context_line":"        if use_fixture:"},{"line_number":114,"context_line":"            self.useFixture(fixture)"}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_43fbc9c1","line":111,"updated":"2015-03-31 22:49:51.000000000","message":"What is the value of these init methods?  I think it would be better for the fixtures to use the fixtures as necessary and pass config around as necessary, and it\u0027s trivial to retrieve filenames locally.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"0eff0df8ccc36e4095010d2c8360ca75c8c01dc7","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    def __init__(self, temp_dir):"},{"line_number":109,"context_line":"        self.temp_dir \u003d temp_dir"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def init_neutron_config(self, fixture, use_fixture\u003dTrue):"},{"line_number":112,"context_line":"        self.neutron_cfg_fixture \u003d fixture"},{"line_number":113,"context_line":"        if use_fixture:"},{"line_number":114,"context_line":"            self.useFixture(fixture)"}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_c00461c1","line":111,"in_reply_to":"da9b358b_43fbc9c1","updated":"2015-04-01 09:01:40.000000000","message":"imo, a fixture should setUp fixtures it defines but not the ones it only uses:\n\n  # Use\n  f1 \u003d self.useFixture(F1())\n  f2 \u003d self.useFixture(F2(f1))\n\n  # Define\n  class F3(...Fixture):\n\n    def setUp(self):\n       super.setUp(...)\n       self.f1 \u003d self.useFixture(F1())\n\notherwise it becomes difficult to understand who is responsible for fixture setUp","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    def __init__(self, temp_dir):"},{"line_number":109,"context_line":"        self.temp_dir \u003d temp_dir"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def init_neutron_config(self, fixture, use_fixture\u003dTrue):"},{"line_number":112,"context_line":"        self.neutron_cfg_fixture \u003d fixture"},{"line_number":113,"context_line":"        if use_fixture:"},{"line_number":114,"context_line":"            self.useFixture(fixture)"}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_316976bf","line":111,"in_reply_to":"da9b358b_c00461c1","updated":"2015-04-02 12:03:14.000000000","message":"The point was to conserve code duplicity at the cost of ambiguity. Guess the cost was too high so this class is removed from the code.\n\nThis might create some code duplication. I\u0027m open to ideas as to how to resolve those.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003durl)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class OVSProcessFixture(NeutronDaemonFixture):"},{"line_number":150,"context_line":"    def __init__(self, temp_dir, neutron_config, ml2_config):"},{"line_number":151,"context_line":"        super(OVSProcessFixture, self).__init__(temp_dir)"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_a87dd2e8","line":149,"updated":"2015-03-31 22:49:51.000000000","message":"I think this name is confusing.  OvsL2AgentFixture would make more sense.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        return client.Client(auth_strategy\u003d\"noauth\", endpoint_url\u003durl)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class OVSProcessFixture(NeutronDaemonFixture):"},{"line_number":150,"context_line":"    def __init__(self, temp_dir, neutron_config, ml2_config):"},{"line_number":151,"context_line":"        super(OVSProcessFixture, self).__init__(temp_dir)"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_71e81e7d","line":149,"in_reply_to":"da9b358b_a87dd2e8","updated":"2015-04-02 12:03:14.000000000","message":"Renamed to OVSAgentFixture","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        return self.plugin_config.ovs.bridge_mappings.split(\u0027:\u0027)[1]"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"class L3ProcessFixture(NeutronDaemonFixture):"},{"line_number":175,"context_line":"    def __init__(self, temp_dir, neutron_config, integration_bridge_name):"},{"line_number":176,"context_line":"        super(L3ProcessFixture, self).__init__(temp_dir)"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_3103b644","line":174,"updated":"2015-04-02 12:03:14.000000000","message":"Renamed to L3AgentFixture","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8e03cb757d8d64cbe8d8a38f97058ccc3e76d5c3","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            running_agents \u003d self.neutron_server.client.list_agents()[\u0027agents\u0027]"},{"line_number":82,"context_line":"            return len(running_agents) \u003d\u003d agents_count"},{"line_number":83,"context_line":"        except nc_exc.NeutronClientException:"},{"line_number":84,"context_line":"            LOG.debug(\"Processes aren\u0027t up yet.\")"},{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"baa041b7_999ce86a","line":84,"updated":"2015-04-02 12:14:57.000000000","message":"LOG.debug are not hidden in tests?","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7c90bc5fb40aacd9d5d6c2ba9f7b819e181ac94f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            running_agents \u003d self.neutron_server.client.list_agents()[\u0027agents\u0027]"},{"line_number":82,"context_line":"            return len(running_agents) \u003d\u003d agents_count"},{"line_number":83,"context_line":"        except nc_exc.NeutronClientException:"},{"line_number":84,"context_line":"            LOG.debug(\"Processes aren\u0027t up yet.\")"},{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"9aa53dc9_3f93a7fc","line":84,"in_reply_to":"baa041b7_999ce86a","updated":"2015-04-06 12:25:20.000000000","message":"Yes, and so are the other levels afaik. This is useful for local development/debug.","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8e03cb757d8d64cbe8d8a38f97058ccc3e76d5c3","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            exec_name\u003dself.NEUTRON_L3_AGENT,"},{"line_number":184,"context_line":"            config_filenames\u003dconfig_filenames))"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        self.useFixture(net_helpers.OVSBridgeFixture(self._get_br_ex_name()))"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def _get_br_ex_name(self):"},{"line_number":189,"context_line":"        return self.plugin_config.DEFAULT.external_network_bridge"}],"source_content_type":"text/x-python","patch_set":41,"id":"baa041b7_39b03cdd","line":186,"updated":"2015-04-02 12:14:57.000000000","message":"for coherence, it should be: get_br_ex/int/phys_name or _get_br_ex/int/phys_name","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"7c90bc5fb40aacd9d5d6c2ba9f7b819e181ac94f","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            exec_name\u003dself.NEUTRON_L3_AGENT,"},{"line_number":184,"context_line":"            config_filenames\u003dconfig_filenames))"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        self.useFixture(net_helpers.OVSBridgeFixture(self._get_br_ex_name()))"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def _get_br_ex_name(self):"},{"line_number":189,"context_line":"        return self.plugin_config.DEFAULT.external_network_bridge"}],"source_content_type":"text/x-python","patch_set":41,"id":"9aa53dc9_7fdb6fee","line":186,"in_reply_to":"baa041b7_39b03cdd","updated":"2015-04-06 12:25:20.000000000","message":"Done","commit_id":"d9cfb27c199d0cfd1f5bc294087710be59dab4a8"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"2add5280df1d4303e68203b8f3ff9f64a62dfa1f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        super(ProcessFixture, self, *args, **kwargs)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class EnvironmentFixture(fixtures.Fixture):"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def setUp(self):"},{"line_number":68,"context_line":"        super(EnvironmentFixture, self).setUp()"}],"source_content_type":"text/x-python","patch_set":52,"id":"3ab451fb_b12482af","line":65,"updated":"2015-04-16 23:54:23.000000000","message":"(No action required) I think I might be the one that suggested this name, but I hope we can revisit in the near future.  \u0027Environment\u0027 is pretty ambiguous.  Maybe \u0027Deployment\u0027 makes more sense?  Or maybe even \u0027FullStack\u0027?","commit_id":"304d68d9741fd15c14263d978e5b0bae43cde58e"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"2add5280df1d4303e68203b8f3ff9f64a62dfa1f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            return False"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class NeutronServerFixture(fixtures.Fixture):"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    NEUTRON_SERVER \u003d \"neutron-server\""},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"3ab451fb_51341edd","line":89,"updated":"2015-04-16 23:54:23.000000000","message":"(No action required) Consider adding docs as to what the fixture exposes (e.g. plugin_config, neutron_config, etc) like what Cedric proposed.","commit_id":"304d68d9741fd15c14263d978e5b0bae43cde58e"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"2add5280df1d4303e68203b8f3ff9f64a62dfa1f","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    NEUTRON_OVS_AGENT \u003d \"neutron-openvswitch-agent\""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def __init__(self, neutron_cfg_fixture, ml2_cfg_fixture):"},{"line_number":139,"context_line":"        self.neutron_cfg_fixture \u003d neutron_cfg_fixture"},{"line_number":140,"context_line":"        self.plugin_cfg_fixture \u003d ml2_cfg_fixture"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"3ab451fb_514bfe59","line":138,"updated":"2015-04-16 23:54:23.000000000","message":"ml2_cfg_fixture -\u003e plugin_cfg_fixture ?","commit_id":"304d68d9741fd15c14263d978e5b0bae43cde58e"}],"neutron/tests/fullstack/templates.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"bf4c4f5e97ee8accc4d7482f772c21472c6891e7","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        super(L3ConfTemplate, self).__init__(tempdir, filename)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _generate_external_bridge(self):"},{"line_number":138,"context_line":"        return sub_base.get_rand_name(prefix\u003d\u0027br-ex\u0027, max_length\u003d13)"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a80dd14_39aaaed4","line":138,"updated":"2015-03-06 00:25:49.000000000","message":"Where 13 comes from?","commit_id":"71ac110cea21d3f463d1f55bb1935747dd5236be"}],"neutron/tests/fullstack/test_l3_agent.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"bf4c4f5e97ee8accc4d7482f772c21472c6891e7","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestHAL3Agent(base.BaseFullStackTestCase):"},{"line_number":31,"context_line":"    def init_processes(self, connection):"},{"line_number":32,"context_line":"        meta_bridge_name \u003d sub_base.get_rand_name(prefix\u003d\u0027br-meta\u0027,"},{"line_number":33,"context_line":"                                                  max_length\u003d13)"},{"line_number":34,"context_line":"        self.useFixture(resources.BridgeFixture(meta_bridge_name))"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"9a80dd14_f9865664","line":32,"updated":"2015-03-06 00:25:49.000000000","message":"same remark","commit_id":"71ac110cea21d3f463d1f55bb1935747dd5236be"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"bf4c4f5e97ee8accc4d7482f772c21472c6891e7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # Create a temprary directory for this test in /tmp (so it\u0027s easy to"},{"line_number":37,"context_line":"        # find if we want to debug)."},{"line_number":38,"context_line":"        tempdir \u003d tempfile.mkdtemp(prefix\u003dself.name + \u0027_\u0027, dir\u003d\u0027/tmp/\u0027)"},{"line_number":39,"context_line":"        self.addCleanup(shutil.rmtree, tempdir)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        neutron_conf_1 \u003d templates.NeutronConfTemplate(tempdir, connection)"},{"line_number":42,"context_line":"        neutron_conf_2 \u003d templates.NeutronConfTemplate(tempdir, connection)"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a80dd14_79e34605","line":39,"updated":"2015-03-06 00:25:49.000000000","message":"TempDir fixture uses self.addCleanup(shutil.rmtree, tempdir, ignore_errors\u003dTrue) perhaps we should do the same","commit_id":"71ac110cea21d3f463d1f55bb1935747dd5236be"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"bf4c4f5e97ee8accc4d7482f772c21472c6891e7","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    def _get_host(self, agent):"},{"line_number":92,"context_line":"        return self.get_core_option(agent, \u0027DEFAULT\u0027, \u0027host\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _get_namespace(self, router_id, agent):"},{"line_number":95,"context_line":"        host \u003d self._get_host(agent)"},{"line_number":96,"context_line":"        return \"%s%s%s%s\" % ("},{"line_number":97,"context_line":"                l3_agent.NS_PREFIX,"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a80dd14_79918651","line":94,"updated":"2015-03-06 00:25:49.000000000","message":"is it duplicated from associated functional  l3 test?","commit_id":"71ac110cea21d3f463d1f55bb1935747dd5236be"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"bf4c4f5e97ee8accc4d7482f772c21472c6891e7","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        with open(ha_state_path, \u0027r\u0027) as f:"},{"line_number":110,"context_line":"            return f.read()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _assert_namespace_exists(self, ns_name):"},{"line_number":113,"context_line":"        ip \u003d ip_lib.IPWrapper(self.root_helper, ns_name)"},{"line_number":114,"context_line":"        helpers.wait_until_true(lambda: ip.netns.exists(ns_name))"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"9a80dd14_f9bad6be","line":112,"updated":"2015-03-06 00:25:49.000000000","message":"could be a helper method","commit_id":"71ac110cea21d3f463d1f55bb1935747dd5236be"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"bf4c4f5e97ee8accc4d7482f772c21472c6891e7","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        master \u003d None"},{"line_number":123,"context_line":"        slave \u003d None"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        while not master:"},{"line_number":126,"context_line":"            for agent in l3_agents:"},{"line_number":127,"context_line":"                is_master \u003d \u0027master\u0027 in self._get_ha_state(router_id, agent)"},{"line_number":128,"context_line":"                if is_master:"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a80dd14_39038e74","line":125,"updated":"2015-03-06 00:25:49.000000000","message":"between each while iteration we should sleep +a timeout check?\n\n\u003d\u003d\u003e we can use wait_until_True?","commit_id":"71ac110cea21d3f463d1f55bb1935747dd5236be"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        router \u003d self.client.create_router("},{"line_number":61,"context_line":"            body\u003d{\u0027router\u0027: {\u0027name\u0027: \u0027router-test\u0027,"},{"line_number":62,"context_line":"                             \u0027tenant_id\u0027: uuid}})"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        network \u003d self.client.create_network("}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_08f4be83","line":61,"updated":"2015-03-31 22:49:51.000000000","message":"(No action required) I\u0027ll hold my nose for now, but we definitely need an api client that isn\u0027t this terrible.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"015235e4824ec8f2b0f306d8bc1f7ebf44972e31","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            router\u003drouter[\u0027router\u0027][\u0027id\u0027],"},{"line_number":79,"context_line":"            body\u003d{\u0027subnet_id\u0027: subnet[\u0027subnet\u0027][\u0027id\u0027]})"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"},{"line_number":82,"context_line":"        self._assert_namespace_exists(self._get_namespace(router_id))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.client.remove_interface_router("}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_78eb29b1","line":81,"updated":"2015-03-31 16:52:19.000000000","message":"We need to think what clean up strategy we want to use here... If we want to delete all resources through the API then it should not be left up to the test writer (All resources should be tracked and cleaned up automatically like in Tempest). Here, for example, if line 82 fails, none of the lines afterwards will be executed.\n\nIs an alternative approach valid though? What if we don\u0027t clean up through the API, but by cleaning up the host directly? (ovs cleanup, netns cleanup).","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"96add70de1cebf16e6f3885bad920d3445e1848b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            router\u003drouter[\u0027router\u0027][\u0027id\u0027],"},{"line_number":79,"context_line":"            body\u003d{\u0027subnet_id\u0027: subnet[\u0027subnet\u0027][\u0027id\u0027]})"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"},{"line_number":82,"context_line":"        self._assert_namespace_exists(self._get_namespace(router_id))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.client.remove_interface_router("}],"source_content_type":"text/x-python","patch_set":39,"id":"baa041b7_86600737","line":81,"in_reply_to":"da9b358b_28c78246","updated":"2015-04-02 12:03:14.000000000","message":"it is needed for Neutron-created resources (qrouter namespaces, for example) which aren\u0027t created by the fullstack framework but by Neutron itself. For those I guess we\u0027ll wait for the retargetable stuff.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"19682c05a12d5055e205b684c427beb91611bc92","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            router\u003drouter[\u0027router\u0027][\u0027id\u0027],"},{"line_number":79,"context_line":"            body\u003d{\u0027subnet_id\u0027: subnet[\u0027subnet\u0027][\u0027id\u0027]})"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"},{"line_number":82,"context_line":"        self._assert_namespace_exists(self._get_namespace(router_id))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.client.remove_interface_router("}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_dbefcf85","line":81,"in_reply_to":"da9b358b_78eb29b1","updated":"2015-03-31 17:13:13.000000000","message":"So using ovs cleanup and netns cleanup will surely break concurrency, so those are out of the question.\n\nDB/API resources are cleaned up thanks to the DB wipe and processes restart between each test, so all that is left is actual OS resources (like interfaces, namespaces...)\n\nThere probably should be some kind of wrapping around the neutronclient used here, but that\u0027s bound to be quite a bit of work (creating a lot of fixtures for example). Maru, can the API framework mitigate this issue somehow?","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"3e5f2c6af7dc1a9f15e005387817ad0357e022be","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            router\u003drouter[\u0027router\u0027][\u0027id\u0027],"},{"line_number":79,"context_line":"            body\u003d{\u0027subnet_id\u0027: subnet[\u0027subnet\u0027][\u0027id\u0027]})"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"},{"line_number":82,"context_line":"        self._assert_namespace_exists(self._get_namespace(router_id))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        self.client.remove_interface_router("}],"source_content_type":"text/x-python","patch_set":39,"id":"da9b358b_28c78246","line":81,"in_reply_to":"da9b358b_dbefcf85","updated":"2015-03-31 22:49:51.000000000","message":"Why is ovs cleanup even necessary?  Aren\u0027t bridges managed by fixture and cleaned up on teardown?\n\nAs far as namespaces go, the names embed what should be a test-local uuid, so I\u0027m not sure why that would break concurrency either.\n\nIf necessary, it is possible to wrap the api to perform automatic cleanup, that\u0027s certainly the intent of the retargetable stuff.","commit_id":"82918d58c975e421fe548ae40a30fd27cf149865"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"2add5280df1d4303e68203b8f3ff9f64a62dfa1f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        super(TestLegacyL3Agent, self).__init__("},{"line_number":46,"context_line":"            SingleNodeEnvironment(), *args, **kwargs)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _get_namespace(self, router_id):"},{"line_number":49,"context_line":"        return \"%s%s\" % (l3_agent.NS_PREFIX, router_id)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _assert_namespace_exists(self, ns_name):"}],"source_content_type":"text/x-python","patch_set":52,"id":"3ab451fb_56589456","line":48,"updated":"2015-04-16 23:54:23.000000000","message":"(No action required) I\u0027d like to see us get out of the habit of making methods \u0027private\u0027, since test cases shouldn\u0027t be inherited from anyway.","commit_id":"304d68d9741fd15c14263d978e5b0bae43cde58e"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"2add5280df1d4303e68203b8f3ff9f64a62dfa1f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        ip \u003d ip_lib.IPWrapper(ns_name)"},{"line_number":53,"context_line":"        utils.wait_until_true(lambda: ip.netns.exists(ns_name))"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def test_namespace_exists(self):"},{"line_number":56,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        router \u003d self.client.create_router("}],"source_content_type":"text/x-python","patch_set":52,"id":"3ab451fb_76095031","line":55,"updated":"2015-04-16 23:54:23.000000000","message":"(No action required) This is a pretty complicated test to validate that a namespace gets added, something that is probably better handled in a functional test.  Consider validating the behavior of a router (e.g. traffic can flow between networks) instead.","commit_id":"304d68d9741fd15c14263d978e5b0bae43cde58e"}],"neutron/tests/integration/base.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class BaseIntegrationTestCase(BaseDBTest):"},{"line_number":89,"context_line":"    def setUp(self, neutron_conf_path):"},{"line_number":90,"context_line":"        self.root_helper \u003d os.environ.get(\u0027OS_ROOTWRAP_CMD\u0027,"},{"line_number":91,"context_line":"                                          functional_base.SUDO_CMD)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        #TODO(jschwarz): Do we want the name to be also randomly generated?"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_4c95b031","line":90,"updated":"2014-12-21 06:14:44.000000000","message":"Consider creating a common base class shared between the functional and integration trees that provides for this configuration (reflecting the fact that the functional and integration/fullstack/etc tests will share a test environment if not the same infra job).","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class BaseIntegrationTestCase(BaseDBTest):"},{"line_number":89,"context_line":"    def setUp(self, neutron_conf_path):"},{"line_number":90,"context_line":"        self.root_helper \u003d os.environ.get(\u0027OS_ROOTWRAP_CMD\u0027,"},{"line_number":91,"context_line":"                                          functional_base.SUDO_CMD)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        #TODO(jschwarz): Do we want the name to be also randomly generated?"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_cb074a80","line":90,"in_reply_to":"3a961159_4c95b031","updated":"2014-12-29 16:32:14.000000000","message":"I\u0027ll do it in the next few revision (left a TODO in the meantime). I want to do them all in one revision.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.root_helper \u003d os.environ.get(\u0027OS_ROOTWRAP_CMD\u0027,"},{"line_number":91,"context_line":"                                          functional_base.SUDO_CMD)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        #TODO(jschwarz): Do we want the name to be also randomly generated?"},{"line_number":94,"context_line":"        #TODO(jschwarz): Cleanup"},{"line_number":95,"context_line":"        bridge \u003d ovs_lib.OVSBridge(\u0027br-meta\u0027, self.root_helper)"},{"line_number":96,"context_line":"        bridge.create()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_6c96ec3f","line":93,"updated":"2014-12-21 06:14:44.000000000","message":"Yes, we do want the name to be randomly generated to ensure isolation in the face of failed cleanup.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.root_helper \u003d os.environ.get(\u0027OS_ROOTWRAP_CMD\u0027,"},{"line_number":91,"context_line":"                                          functional_base.SUDO_CMD)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        #TODO(jschwarz): Do we want the name to be also randomly generated?"},{"line_number":94,"context_line":"        #TODO(jschwarz): Cleanup"},{"line_number":95,"context_line":"        bridge \u003d ovs_lib.OVSBridge(\u0027br-meta\u0027, self.root_helper)"},{"line_number":96,"context_line":"        bridge.create()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_6bd9f621","line":93,"in_reply_to":"3a961159_6c96ec3f","updated":"2014-12-29 16:32:14.000000000","message":"That\u0027s why it\u0027s a TODO :)\n\nI\u0027ll get to it ASAP.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                return False"},{"line_number":120,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_core_option(self, agent, section, option):"},{"line_number":123,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":124,"context_line":"        return process.core_config.get(section, option)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_aca3749c","line":122,"updated":"2014-12-21 06:14:44.000000000","message":"(Suggestion only) get_core_option -\u003e get_agent_option (or get_agent_config_value)\n\nI\u0027m not really sure what \u0027core\u0027 means in this context.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                return False"},{"line_number":120,"context_line":"        helpers.wait_until_true(agent_list_returns)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_core_option(self, agent, section, option):"},{"line_number":123,"context_line":"        process \u003d self.process_fixtures.find(agent)"},{"line_number":124,"context_line":"        return process.core_config.get(section, option)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_ab103eac","line":122,"in_reply_to":"3a961159_aca3749c","updated":"2014-12-29 16:32:14.000000000","message":"core refers to neutron.conf, whereas plugin refers to l3_agent.ini/ml2_conf.ini...\n\nIf you have better naming scheme I\u0027ll be happy to hear :)","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"}],"neutron/tests/integration/l3_agent.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        self.process_fixtures \u003d resources.GroupFixture(["},{"line_number":39,"context_line":"            resources.ProcessFixture("},{"line_number":40,"context_line":"                name\u003d\u0027neutron-server\u0027,"},{"line_number":41,"context_line":"                module\u003d\u0027neutron.server\u0027,"},{"line_number":42,"context_line":"                core_config\u003dneutron_conf_1,"},{"line_number":43,"context_line":"                plugin_config\u003dml2_conf_1),"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_ccc7e043","line":40,"updated":"2014-12-21 06:14:44.000000000","message":"- Consider making the name optional and defaulted to something generated  (e.g. [module]-1) \n- The modules should probably be defined as constants","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        self.process_fixtures \u003d resources.GroupFixture(["},{"line_number":39,"context_line":"            resources.ProcessFixture("},{"line_number":40,"context_line":"                name\u003d\u0027neutron-server\u0027,"},{"line_number":41,"context_line":"                module\u003d\u0027neutron.server\u0027,"},{"line_number":42,"context_line":"                core_config\u003dneutron_conf_1,"},{"line_number":43,"context_line":"                plugin_config\u003dml2_conf_1),"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_eba96691","line":40,"in_reply_to":"3a961159_ccc7e043","updated":"2014-12-29 16:32:14.000000000","message":"* Maybe in the future, when there are more tests. Right now I want some deterministic names the person writing tests will know and relate to, not something that auto-generates and the user needs to look where it\u0027s created. In other words, I want it to be usable, not beautiful :)\n* Done.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    def _get_host(self, agent):"},{"line_number":70,"context_line":"        return self.get_core_option(agent, \u0027DEFAULT\u0027, \u0027host\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _get_namespace(self, router_id, agent):"},{"line_number":73,"context_line":"        host \u003d self._get_host(agent)"},{"line_number":74,"context_line":"        return \"%s%s%s%s\" % ("},{"line_number":75,"context_line":"                l3_agent.NS_PREFIX,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_6cad0c84","line":72,"updated":"2014-12-21 06:14:44.000000000","message":"(No action required) Everyone says \u0027namespace\u0027 when they really mean \u0027namespace name\u0027 or \u0027namespace id\u0027.  A namespace is some fancy os construct, ethereal, like a ghost, and not certainly not serializable!","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            state_path, \u0027ha_confs\u0027, router_id, \u0027state\u0027)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        helpers.wait_until_true(lambda: os.path.exists(ha_state_path))"},{"line_number":87,"context_line":"        return open(ha_state_path, \u0027r\u0027).read()"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _assert_namespace_exists(self, ns_name):"},{"line_number":90,"context_line":"        ip \u003d ip_lib.IPWrapper(self.root_helper, ns_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_2cb784d9","line":87,"updated":"2014-12-21 06:14:44.000000000","message":"Consider using a context manager here to ensure the file is closed properly, e.g.\n\nwith open(ha_state_path) as f:\n  return f.read()","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            state_path, \u0027ha_confs\u0027, router_id, \u0027state\u0027)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        helpers.wait_until_true(lambda: os.path.exists(ha_state_path))"},{"line_number":87,"context_line":"        return open(ha_state_path, \u0027r\u0027).read()"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _assert_namespace_exists(self, ns_name):"},{"line_number":90,"context_line":"        ip \u003d ip_lib.IPWrapper(self.root_helper, ns_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_6b749636","line":87,"in_reply_to":"3a961159_2cb784d9","updated":"2014-12-29 16:32:14.000000000","message":"Done","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        l3_agents \u003d [\u0027neutron-l3-1-agent\u0027, \u0027neutron-l3-2-agent\u0027]"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        router \u003d self.client.create_router("},{"line_number":119,"context_line":"            body\u003d{\u0027router\u0027: {\u0027name\u0027: \u0027router-test\u0027,"},{"line_number":120,"context_line":"                             \u0027tenant_id\u0027: uuidutils.generate_uuid(),"},{"line_number":121,"context_line":"                             \u0027ha\u0027: True}})"},{"line_number":122,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_eca9fc7c","line":119,"updated":"2014-12-21 06:14:44.000000000","message":"Ugh.  I think we\u0027re going to have to create wrappers around the client library to avoid having to embed serialization nonsense like this everywhere.  Tempest already does this - maybe we should appropriate that code?  Or fix the client? j/k, that\u0027s a herculean task.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        l3_agents \u003d [\u0027neutron-l3-1-agent\u0027, \u0027neutron-l3-2-agent\u0027]"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        router \u003d self.client.create_router("},{"line_number":119,"context_line":"            body\u003d{\u0027router\u0027: {\u0027name\u0027: \u0027router-test\u0027,"},{"line_number":120,"context_line":"                             \u0027tenant_id\u0027: uuidutils.generate_uuid(),"},{"line_number":121,"context_line":"                             \u0027ha\u0027: True}})"},{"line_number":122,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_ebaec680","line":119,"in_reply_to":"3a961159_eca9fc7c","updated":"2014-12-29 16:32:14.000000000","message":"Phew... :)\n\nThis will probably disappear when your api tests framework merges.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            body\u003d{\u0027router\u0027: {\u0027name\u0027: \u0027router-test\u0027,"},{"line_number":120,"context_line":"                             \u0027tenant_id\u0027: uuidutils.generate_uuid(),"},{"line_number":121,"context_line":"                             \u0027ha\u0027: True}})"},{"line_number":122,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        self._assert_namespaces_exists(router_id, l3_agents)"},{"line_number":125,"context_line":"        master, slave \u003d self._get_master_and_slave(router_id, l3_agents)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_0ca728a8","line":122,"updated":"2014-12-21 06:14:44.000000000","message":"The square brackets!  They burn my eyes!","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            body\u003d{\u0027router\u0027: {\u0027name\u0027: \u0027router-test\u0027,"},{"line_number":120,"context_line":"                             \u0027tenant_id\u0027: uuidutils.generate_uuid(),"},{"line_number":121,"context_line":"                             \u0027ha\u0027: True}})"},{"line_number":122,"context_line":"        router_id \u003d router[\u0027router\u0027][\u0027id\u0027]"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        self._assert_namespaces_exists(router_id, l3_agents)"},{"line_number":125,"context_line":"        master, slave \u003d self._get_master_and_slave(router_id, l3_agents)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_ebe5e6dc","line":122,"in_reply_to":"3a961159_0ca728a8","updated":"2014-12-29 16:32:14.000000000","message":"They, too, shall disappear in due time.\n\nIn the mean time, there are eye drops you can take to ease the eye burn :)","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"}],"setup.cfg":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"89936bbb04296f5b168f8c57b818060abe03dc3a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    neutron-hyperv-agent \u003d neutron.plugins.hyperv.agent.hyperv_neutron_agent:main"},{"line_number":105,"context_line":"    neutron-ibm-agent \u003d neutron.plugins.ibm.agent.sdnve_neutron_agent:main"},{"line_number":106,"context_line":"    neutron-l3-agent \u003d neutron.agent.l3.agent:main"},{"line_number":107,"context_line":"    neutron-l3-test-agent \u003d neutron.tests.agents.l3_agent:main"},{"line_number":108,"context_line":"    neutron-lbaas-agent \u003d neutron.services.loadbalancer.agent.agent:main"},{"line_number":109,"context_line":"    neutron-linuxbridge-agent \u003d neutron.plugins.linuxbridge.agent.linuxbridge_neutron_agent:main"},{"line_number":110,"context_line":"    neutron-metadata-agent \u003d neutron.agent.metadata.agent:main"}],"source_content_type":"text/x-ttcn-cfg","patch_set":11,"id":"3a961159_4ce3f0d8","line":107,"updated":"2014-12-21 06:14:44.000000000","message":"I don\u0027t think we should be adding test-only entrypoints.","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f81082c58aa947af8ec636d630fe5fb1b958f870","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    neutron-hyperv-agent \u003d neutron.plugins.hyperv.agent.hyperv_neutron_agent:main"},{"line_number":105,"context_line":"    neutron-ibm-agent \u003d neutron.plugins.ibm.agent.sdnve_neutron_agent:main"},{"line_number":106,"context_line":"    neutron-l3-agent \u003d neutron.agent.l3.agent:main"},{"line_number":107,"context_line":"    neutron-l3-test-agent \u003d neutron.tests.agents.l3_agent:main"},{"line_number":108,"context_line":"    neutron-lbaas-agent \u003d neutron.services.loadbalancer.agent.agent:main"},{"line_number":109,"context_line":"    neutron-linuxbridge-agent \u003d neutron.plugins.linuxbridge.agent.linuxbridge_neutron_agent:main"},{"line_number":110,"context_line":"    neutron-metadata-agent \u003d neutron.agent.metadata.agent:main"}],"source_content_type":"text/x-ttcn-cfg","patch_set":11,"id":"3a961159_abb83ee9","line":107,"in_reply_to":"3a961159_4ce3f0d8","updated":"2014-12-29 16:32:14.000000000","message":"Done","commit_id":"752befedb3c0687a79338b65470ba6bda60d42ce"}],"tools/pretty_tox.sh":[{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"85e470e61fc22ee4872a8a64eb9b03206f137d24","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    fi"},{"line_number":15,"context_line":"done"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"exit $failure"}],"source_content_type":"text/x-sh","patch_set":25,"id":"3a961159_881d4113","line":17,"updated":"2015-01-12 16:25:48.000000000","message":"John asked me to review the changes to this file.  These changes lgtm.","commit_id":"6efa0315cc3bc141a7fca527f3bfdbc3d9b4c283"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"97352ea9cf9a415664c95cc30e0a1591176759b4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    fi"},{"line_number":15,"context_line":"done"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"exit $failure"}],"source_content_type":"text/x-sh","patch_set":25,"id":"3a961159_cb364e51","line":17,"in_reply_to":"3a961159_881d4113","updated":"2015-01-13 06:28:18.000000000","message":"I added a new patch for review specifically for this change (no reason we should wait so long :) ). See: https://review.openstack.org/#/c/146771/\n\nStill leaving this code in so it can run on the gate. Will obviously merge them once the other merges.","commit_id":"6efa0315cc3bc141a7fca527f3bfdbc3d9b4c283"}]}
