)]}'
{"neutron/tests/base.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"da717851a927924c36c85b154c1881f14d8a5672","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        for k, v in kw.iteritems():"},{"line_number":177,"context_line":"            CONF.set_override(k, v, group)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def transform_context_into_cleanup(self, context):"},{"line_number":180,"context_line":"        \"\"\"Transform a with context in a cleanup."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        This method guarantees that if the context.__enter__() returns without"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_489ea655","line":179,"updated":"2015-03-02 17:23:29.000000000","message":"Perhaps i should define a ContextFixture instead but i don\u0027t really like the fact that useFixture returns the fixture not the \"fixtured\" thing","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4fa8ec6af9727d3dbdb948b99eb47e3e0908d5c5","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        for k, v in kw.iteritems():"},{"line_number":177,"context_line":"            CONF.set_override(k, v, group)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def transform_context_into_cleanup(self, context):"},{"line_number":180,"context_line":"        \"\"\"Transform a with context in a cleanup."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        This method guarantees that if the context.__enter__() returns without"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_5ead4e83","line":179,"in_reply_to":"ba7be1f8_489ea655","updated":"2015-03-03 14:35:31.000000000","message":"If by \u0027ContextFixture\u0027 you mean \u0027Remove this function and change the functions in net_helpers to inherit from fixtures.Fixture themselves\u0027, I much like that option. This approach has too many levels of indirections and isn\u0027t trivial at all.\n\nRegarding getting the \u0027fixtured\u0027 thing - you can have the setUp() function of the fixtures schedule the cleanUp of the resource, and also returned the \u0027fixtured\u0027 thing. Then, instead of using \u0027self.useFixture\u0027, use \u0027resource \u003d fixture.setUp()\u0027. cleanUp will be scheduled and you\u0027ll have the \u0027fixtured\u0027 thing in hand.\n\nWhat do you think?","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4fa8ec6af9727d3dbdb948b99eb47e3e0908d5c5","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        This method guarantees that if the context.__enter__() returns without"},{"line_number":183,"context_line":"        an error, then context.__exit__ will always be called during cleanup ("},{"line_number":184,"context_line":"        after tearDown) and returns context.__enter__() result."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        Be careful, context.__exit__ will be called with None, None, None even"},{"line_number":187,"context_line":"        if the test fails! Typically contexts with following patterns will not"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_1b612839","line":184,"updated":"2015-03-03 14:35:31.000000000","message":"s/and returns/and will return/g","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4fa8ec6af9727d3dbdb948b99eb47e3e0908d5c5","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        Be careful, context.__exit__ will be called with None, None, None even"},{"line_number":187,"context_line":"        if the test fails! Typically contexts with following patterns will not"},{"line_number":188,"context_line":"        behave as you can expected."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        @contextlib.contextmanager"},{"line_number":191,"context_line":"        def create_context():"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_9bdb58ec","line":188,"updated":"2015-03-03 14:35:31.000000000","message":"s/can expected/can expect/g","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4fa8ec6af9727d3dbdb948b99eb47e3e0908d5c5","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            try:"},{"line_number":193,"context_line":"                yield"},{"line_number":194,"context_line":"            except:"},{"line_number":195,"context_line":"                # Never called if event if the test fails"},{"line_number":196,"context_line":"            else:"},{"line_number":197,"context_line":"                # Always Called if even if the test fails"},{"line_number":198,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_eedad776","line":195,"updated":"2015-03-03 14:35:31.000000000","message":"These 2 comments \"...if event if...\" don\u0027t make sense to me.","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"}],"neutron/tests/common/base.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"c2ebb650c2f6cb4d575b0ce0368c12258b869827","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Thales Services SAS"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_0aabf71e","line":1,"updated":"2015-02-28 04:59:13.000000000","message":"I don\u0027t know if you can claim copyright on code you cut/pasted. Same as other files. One solution would be to just remove the copyright altogether.","commit_id":"e74ac6e110a93d648abd29d4e970bc11ca7cc8ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"0ac56a667a721a5ddb18eac39ff2ef54bca92139","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Thales Services SAS"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_dc852208","line":1,"in_reply_to":"ba7be1f8_0aabf71e","updated":"2015-02-28 21:20:49.000000000","message":"Indeed, i \"own\" nothing in this module.","commit_id":"e74ac6e110a93d648abd29d4e970bc11ca7cc8ce"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    :param prefix: The prefix for a randomly generated name"},{"line_number":22,"context_line":"    :param creation_func: A function taking the name of the resource"},{"line_number":23,"context_line":"           to be created as it\u0027s first argument.  An error is assumed"},{"line_number":24,"context_line":"           to indicate a name collision."},{"line_number":25,"context_line":"    :param *args *kwargs: These will be passed to the create function."},{"line_number":26,"context_line":"    \"\"\""},{"line_number":27,"context_line":"    while True:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_cc59f6ff","line":24,"updated":"2015-03-05 14:32:50.000000000","message":"(No action required)\n\nI know that\u0027s the same code as before the patch, but it just seems to me a bit scary that we may get into infinite loop if creation_func raises RuntimeError for some reason other than name colision.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"0be0639472e7b8973f98db1b38a17731cf30a091","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    :param prefix: The prefix for a randomly generated name"},{"line_number":22,"context_line":"    :param creation_func: A function taking the name of the resource"},{"line_number":23,"context_line":"           to be created as it\u0027s first argument.  An error is assumed"},{"line_number":24,"context_line":"           to indicate a name collision."},{"line_number":25,"context_line":"    :param *args *kwargs: These will be passed to the create function."},{"line_number":26,"context_line":"    \"\"\""},{"line_number":27,"context_line":"    while True:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_be8936cc","line":24,"in_reply_to":"9a80dd14_44095adc","updated":"2015-03-05 20:05:35.000000000","message":"\u003d\u003d\u003e https://review.openstack.org/161808","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    :param prefix: The prefix for a randomly generated name"},{"line_number":22,"context_line":"    :param creation_func: A function taking the name of the resource"},{"line_number":23,"context_line":"           to be created as it\u0027s first argument.  An error is assumed"},{"line_number":24,"context_line":"           to indicate a name collision."},{"line_number":25,"context_line":"    :param *args *kwargs: These will be passed to the create function."},{"line_number":26,"context_line":"    \"\"\""},{"line_number":27,"context_line":"    while True:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_44095adc","line":24,"in_reply_to":"9a80dd14_cc59f6ff","updated":"2015-03-05 15:26:27.000000000","message":"I will replace it by a finite (n\u003d100) loop in a daughter change ...","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"}],"neutron/tests/common/net_helpers.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"c2ebb650c2f6cb4d575b0ce0368c12258b869827","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    finally:"},{"line_number":85,"context_line":"        bridge.destroy()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"@contextlib.contextmanager"},{"line_number":89,"context_line":"def create_ovs_port_in_ns(bridge, ns_ip_wrapper):"},{"line_number":90,"context_line":"    def create_port(name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_4aa5ef45","line":87,"updated":"2015-02-28 04:59:13.000000000","message":"The module name is kind of generic... It mixes OVS-only helpers with generic ip helpers.","commit_id":"e74ac6e110a93d648abd29d4e970bc11ca7cc8ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"0ac56a667a721a5ddb18eac39ff2ef54bca92139","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    finally:"},{"line_number":85,"context_line":"        bridge.destroy()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"@contextlib.contextmanager"},{"line_number":89,"context_line":"def create_ovs_port_in_ns(bridge, ns_ip_wrapper):"},{"line_number":90,"context_line":"    def create_port(name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_dcb362e7","line":87,"in_reply_to":"ba7be1f8_4aa5ef45","updated":"2015-02-28 21:20:49.000000000","message":"Yes but i didn\u0027t split the module in 2 because of its current (small) size ... but it is the first version as i would like to define some L2Helper with OVS/veth/brctl backends but i am not satisfied by the current draft :\u0027(","commit_id":"e74ac6e110a93d648abd29d4e970bc11ca7cc8ce"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"894976715f36b56303fd89f3eb919d384edd207a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"VETH1_PREFIX \u003d \u0027test-veth1\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def shift_ip_cidr(ip_cidr, offset\u003d1):"},{"line_number":35,"context_line":"    \"\"\"Shift ip_cidr offset times."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    example: shift_ip_cidr(\"1.2.3.4/24\", 2) \u003d\u003d\u003e \"1.2.3.6/24\""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_872099b1","line":34,"updated":"2015-03-04 03:29:46.000000000","message":"shift -\u003e increment\n\n(Shift means multiply by powers of two.)","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"6fe17a78ac8da902694eb7a31af19dce6823f337","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Thales Services SAS"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_7671acdf","line":1,"updated":"2015-03-05 16:28:21.000000000","message":"To follow in next patch","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.tests.common import base"},{"line_number":25,"context_line":"from neutron.tests import tools"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"NS_PREFIX \u003d \u0027func-\u0027"},{"line_number":28,"context_line":"BR_PREFIX \u003d \u0027test-br\u0027"},{"line_number":29,"context_line":"PORT_PREFIX \u003d \u0027test-port\u0027"},{"line_number":30,"context_line":"VETH0_PREFIX \u003d \u0027test-veth0\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_47308101","line":27,"updated":"2015-03-05 14:32:50.000000000","message":"Just wondering, why this is the only prefix with the trailing dash.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.tests.common import base"},{"line_number":25,"context_line":"from neutron.tests import tools"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"NS_PREFIX \u003d \u0027func-\u0027"},{"line_number":28,"context_line":"BR_PREFIX \u003d \u0027test-br\u0027"},{"line_number":29,"context_line":"PORT_PREFIX \u003d \u0027test-port\u0027"},{"line_number":30,"context_line":"VETH0_PREFIX \u003d \u0027test-veth0\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_842a722a","line":27,"in_reply_to":"9a80dd14_47308101","updated":"2015-03-05 15:26:27.000000000","message":"not sure to know why, perhaps to match the qdhcp/qrouter-... format?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def get_rand_port_name():"},{"line_number":35,"context_line":"    return base.create_resource(PORT_PREFIX, lambda x: x)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def increment_ip_cidr(ip_cidr, offset\u003d1):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_2ccd325e","line":35,"updated":"2015-03-05 14:32:50.000000000","message":"It seems weird that we call create_resource() just to generate a name. Why not calling to get_rand_name() directly?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def get_rand_port_name():"},{"line_number":35,"context_line":"    return base.create_resource(PORT_PREFIX, lambda x: x)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def increment_ip_cidr(ip_cidr, offset\u003d1):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_24d4661f","line":35,"in_reply_to":"9a80dd14_2ccd325e","updated":"2015-03-05 15:26:27.000000000","message":"Done","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4f7288843a9566fb3ff4374d81ef861c3c93688b","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    \"\"\"Create a bridge.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @abc.abstractmethod"},{"line_number":74,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"},{"line_number":75,"context_line":"        \"\"\"Returns a NamespacePortFixture instance.\"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_4df8b27c","line":74,"updated":"2015-03-05 08:41:23.000000000","message":"The fact that the port is created in a namespace *fixture* is irrelevant for the calling code (as it trusts that this implementation will clean up after itself, and doesn\u0027t care how this is done), so I suggest renaming this to \u0027create_port_in_namespace\u0027 instead.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"81452b6d44a668a5ca5e00183cb348d13ddb707d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    \"\"\"Create a bridge.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @abc.abstractmethod"},{"line_number":74,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"},{"line_number":75,"context_line":"        \"\"\"Returns a NamespacePortFixture instance.\"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_5154bf20","line":74,"in_reply_to":"9a80dd14_08f4e8f0","updated":"2015-03-05 13:33:53.000000000","message":"Agreed.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    \"\"\"Create a bridge.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @abc.abstractmethod"},{"line_number":74,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"},{"line_number":75,"context_line":"        \"\"\"Returns a NamespacePortFixture instance.\"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_84b432d2","line":74,"in_reply_to":"9a80dd14_223b7b39","updated":"2015-03-05 15:26:27.000000000","message":"In daughter change, FakeMachine[1] uses NamespacePortFixture to bind its namespace to the bridge so we should be able to clean up the port during the fake machine clean up?\n\n[1] https://review.openstack.org/#/c/143412/13/neutron/tests/common/helpers.py","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c40e422fb98d8aa9904f787b6e71b87b0350591a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    \"\"\"Create a bridge.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @abc.abstractmethod"},{"line_number":74,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"},{"line_number":75,"context_line":"        \"\"\"Returns a NamespacePortFixture instance.\"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_08f4e8f0","line":74,"in_reply_to":"9a80dd14_4df8b27c","updated":"2015-03-05 09:13:32.000000000","message":"currently create_port_in_ns_fixture implementations return a fixture so you have to call:\n\n  self.useFixture(...create_port_in_ns_fixture(...))\n\nand NamespacePortFixture handles port setup/cleanup.\n\nIMO, If you replace it by create_port_in_ns, then BridgeFixture becomes responsible for bridge and ports setup/cleanup on BridgeFixture.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    \"\"\"Create a bridge.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @abc.abstractmethod"},{"line_number":74,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"},{"line_number":75,"context_line":"        \"\"\"Returns a NamespacePortFixture instance.\"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_223b7b39","line":74,"in_reply_to":"9a80dd14_5154bf20","updated":"2015-03-05 14:32:50.000000000","message":"Actually, that looks like a valid thing - BridgeFixture cleaning up bridge and its ports, no?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        port_name \u003d base.create_resource(PORT_PREFIX, self.create_port)"},{"line_number":118,"context_line":"        self.addCleanup(self.bridge.delete_port, port_name)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":121,"context_line":"        self.port \u003d ip_wrapper.device(port_name)"},{"line_number":122,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"},{"line_number":123,"context_line":"        self.port.link.set_up()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_ddb8bee7","line":120,"updated":"2015-03-05 14:32:50.000000000","message":"is there a reason to instantiate a new wrapper while we already have self.ns_ip_wrapper?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"27780ffa24ac636094693170c3f8f9facfbae710","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        port_name \u003d base.create_resource(PORT_PREFIX, self.create_port)"},{"line_number":118,"context_line":"        self.addCleanup(self.bridge.delete_port, port_name)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":121,"context_line":"        self.port \u003d ip_wrapper.device(port_name)"},{"line_number":122,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"},{"line_number":123,"context_line":"        self.port.link.set_up()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_5472d6e5","line":120,"in_reply_to":"9a80dd14_2a38ad9f","updated":"2015-03-05 20:07:12.000000000","message":"self.ns_ip_wrapper.device creates a Device in ns_ip_wrapper.namespace namespace","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        port_name \u003d base.create_resource(PORT_PREFIX, self.create_port)"},{"line_number":118,"context_line":"        self.addCleanup(self.bridge.delete_port, port_name)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":121,"context_line":"        self.port \u003d ip_wrapper.device(port_name)"},{"line_number":122,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"},{"line_number":123,"context_line":"        self.port.link.set_up()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_2a38ad9f","line":120,"in_reply_to":"9a80dd14_ddb8bee7","updated":"2015-03-05 15:26:27.000000000","message":"Done","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4f7288843a9566fb3ff4374d81ef861c3c93688b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        return name"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class VethBridgeFixture(BridgeFixture):"},{"line_number":131,"context_line":"    \"\"\"Simulate a bridge by creating a veth."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    :ivar veths: \"bridge\" veth devices"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_ad9cce6a","line":130,"updated":"2015-03-05 08:41:23.000000000","message":"Correct me if I\u0027m wrong (might be a terminology problem on my part), but Bridge to me refers to some \u0027larger\u0027 entity that can be connected to various ports. The resource returned by this class isn\u0027t a bridge IMO, but rather 2 veth interfaces interconnected to eachother. So I think that the \u0027Bridge\u0027 part here is misleading.\n\nAlso, I think that combining this class with VethNamespacePortFixture might make for a clearer implementation. This is enforced by the fact that VethNamespacePortFixture.setUp() doesn\u0027t schedule anything for cleanUp, so it really doesn\u0027t \u0027deserve\u0027 to be a fixture on its own (unlike this class, which actually creates the resource and should delete it afterwards).\n\nIn conclusion, VethNamespacePortFixture can be merged into this class, and that setUp can be renamed \u0027bind_veth_to_namespace\u0027 or something similar in this class.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"81452b6d44a668a5ca5e00183cb348d13ddb707d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        return name"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class VethBridgeFixture(BridgeFixture):"},{"line_number":131,"context_line":"    \"\"\"Simulate a bridge by creating a veth."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    :ivar veths: \"bridge\" veth devices"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_ac9f62b3","line":130,"in_reply_to":"9a80dd14_48418038","updated":"2015-03-05 13:33:53.000000000","message":"That will be a very helpful feature for fullstack, but it\u0027s still not really a bridge - more like a patch-panel connection [1]. In my eyes, if it\u0027s restricted to exactly 2 ports - it\u0027s definitely not a bridge.\n\n[1]: http://the-depths-of-hell.com/images/Wiring/100_0287.jpg","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        return name"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class VethBridgeFixture(BridgeFixture):"},{"line_number":131,"context_line":"    \"\"\"Simulate a bridge by creating a veth."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    :ivar veths: \"bridge\" veth devices"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_bdff8a66","line":130,"in_reply_to":"9a80dd14_ac9f62b3","updated":"2015-03-05 14:32:50.000000000","message":"Well, it\u0027s still a bridge with one external port.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c40e422fb98d8aa9904f787b6e71b87b0350591a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        return name"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class VethBridgeFixture(BridgeFixture):"},{"line_number":131,"context_line":"    \"\"\"Simulate a bridge by creating a veth."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    :ivar veths: \"bridge\" veth devices"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_48418038","line":130,"in_reply_to":"9a80dd14_ad9cce6a","updated":"2015-03-05 09:13:32.000000000","message":"VethBridgeFixture is not a bridge but can simulate a bridge with 2- ports. It allows to create fake machines interconnected by a veth (maru proposal)","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        return name"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class VethBridgeFixture(BridgeFixture):"},{"line_number":131,"context_line":"    \"\"\"Simulate a bridge by creating a veth."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    :ivar veths: \"bridge\" veth devices"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_0a5e8912","line":130,"in_reply_to":"9a80dd14_bdff8a66","updated":"2015-03-05 15:26:27.000000000","message":"It\u0027s not a bridge but it behaves like a bridge with at most 2 ports and allows veth based fake machines for iptables/ipset tests (at least).\n\nIf you prefer, i can change its name to VethFakeBridgeFixture (i prefer it ends with BridgeFixture to highlight that it implements BridgeFixture interface).","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        super(VethBridgeFixture, self).setUp()"},{"line_number":139,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        def _create_veth(name0):"},{"line_number":142,"context_line":"            name1 \u003d name0.replace(VETH0_PREFIX, VETH1_PREFIX)"},{"line_number":143,"context_line":"            return ip_wrapper.add_veth(name0, name1)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_5de12e99","line":141,"updated":"2015-03-05 14:32:50.000000000","message":"Neat implementation!","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        self.veths \u003d base.create_resource(VETH0_PREFIX, _create_veth)"},{"line_number":146,"context_line":"        self.addCleanup(self.destroy)"},{"line_number":147,"context_line":"        self.unallocateds \u003d set(self.veths)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def destroy(self):"},{"line_number":150,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_01b59430","line":147,"updated":"2015-03-05 14:32:50.000000000","message":"not used outside create_port_in_ns_fixture, so probably can be moved there? Also, the name is unclear to me.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        self.veths \u003d base.create_resource(VETH0_PREFIX, _create_veth)"},{"line_number":146,"context_line":"        self.addCleanup(self.destroy)"},{"line_number":147,"context_line":"        self.unallocateds \u003d set(self.veths)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def destroy(self):"},{"line_number":150,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_4a16c1a8","line":147,"in_reply_to":"9a80dd14_01b59430","updated":"2015-03-05 15:26:27.000000000","message":"unallocateds is shared by all VethNamespacePortFixture on the same VethBridgeFixture to ensure a veth endpoint is allocated once.\n\nveth endpoint choice is done by VethNamespacePortFixture on setUp but could be done by VethBridgeFixture.create_port_in_ns_feature ... imo, the 1st is more correct as it seems the fixture spirit is to allocate things in fixture setUp not in fixture __init__","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":151,"context_line":"        try:"},{"line_number":152,"context_line":"            ip_wrapper.del_veth(self.veths[0].name)"},{"line_number":153,"context_line":"        except RuntimeError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_3d071a1e","line":153,"updated":"2015-03-05 14:32:50.000000000","message":"Why would we catch RuntimeError here?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":151,"context_line":"        try:"},{"line_number":152,"context_line":"            ip_wrapper.del_veth(self.veths[0].name)"},{"line_number":153,"context_line":"        except RuntimeError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_a7f8587d","line":153,"in_reply_to":"9a80dd14_3d071a1e","updated":"2015-03-05 15:26:27.000000000","message":"It seems a veth is automagically deleted when a namespace owning a veth endpoint is deleted.  I don\u0027t understand the why but would like to.\n\nTypically:\n\n* create veth bridge fixture \u003d\u003d\u003e a veth is created\n* create a fake machine\n* delete the fake machine \u003d\u003d\u003e the veth is deleted also!?!\n\nI should document it","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"6fe17a78ac8da902694eb7a31af19dce6823f337","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":151,"context_line":"        try:"},{"line_number":152,"context_line":"            ip_wrapper.del_veth(self.veths[0].name)"},{"line_number":153,"context_line":"        except RuntimeError:"},{"line_number":154,"context_line":"            pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def create_port_in_ns_fixture(self, ns_ip_wrapper):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_96a3809d","line":153,"in_reply_to":"9a80dd14_a7f8587d","updated":"2015-03-05 16:28:21.000000000","message":"Done","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4f7288843a9566fb3ff4374d81ef861c3c93688b","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def setUp(self):"},{"line_number":167,"context_line":"        super(VethNamespacePortFixture, self).setUp()"},{"line_number":168,"context_line":"        self.port \u003d self.unallocateds.pop()"},{"line_number":169,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"},{"line_number":170,"context_line":"        self.port.link.set_up()"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_2db61eda","line":168,"updated":"2015-03-05 08:41:23.000000000","message":"I might be wrong, but I think this class is created only once (and not twice, once for each veth pair endpoint)?\n\nAlso, \u0027pop\u0027 can throw an exception we might want to catch (but can decide to forgo it - i don\u0027t mind).","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"81452b6d44a668a5ca5e00183cb348d13ddb707d","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def setUp(self):"},{"line_number":167,"context_line":"        super(VethNamespacePortFixture, self).setUp()"},{"line_number":168,"context_line":"        self.port \u003d self.unallocateds.pop()"},{"line_number":169,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"},{"line_number":170,"context_line":"        self.port.link.set_up()"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_2c6e1297","line":168,"in_reply_to":"9a80dd14_282c4c47","updated":"2015-03-05 13:33:53.000000000","message":"I think I\u0027m missing something here - isn\u0027t the point of a veth pair that I can connect one end to \u0027bridge a\u0027 and the second end to \u0027bridge b\u0027 and then they\u0027ll have connectivity? Also I can assign each veth endpoint a different IP and different gateway IP?\n\nIf so, I can\u0027t see how I can handle a \u0027port\u0027 (which represent a veth pair) but not an \u0027interface\u0027 (which represent a veth air endpoint)?\n\nAlso - where\u0027s that tools.fail(msg) happen?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def setUp(self):"},{"line_number":167,"context_line":"        super(VethNamespacePortFixture, self).setUp()"},{"line_number":168,"context_line":"        self.port \u003d self.unallocateds.pop()"},{"line_number":169,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"},{"line_number":170,"context_line":"        self.port.link.set_up()"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_c7070c1c","line":168,"in_reply_to":"9a80dd14_2c6e1297","updated":"2015-03-05 15:26:27.000000000","message":"self.port references an IPDevice (a veth endpoint) not a veth.\n\nThe code would become:\n\n  try:\n    self.unallocateds.pop()\n  except KeyError:\n    # appends after 2 VethNamespacePortFixture.setUp on the same VethBridgeFixture\n    tools.fail(msg)","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c40e422fb98d8aa9904f787b6e71b87b0350591a","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def setUp(self):"},{"line_number":167,"context_line":"        super(VethNamespacePortFixture, self).setUp()"},{"line_number":168,"context_line":"        self.port \u003d self.unallocateds.pop()"},{"line_number":169,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"},{"line_number":170,"context_line":"        self.port.link.set_up()"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_282c4c47","line":168,"in_reply_to":"9a80dd14_2db61eda","updated":"2015-03-05 09:13:32.000000000","message":"This class handles a port on a VethBridgeFixture so one instance per port (not per veth) ... we cannot use the same instance for a bridge because of self.port attribute.\n\nIt\u0027s the expected behavior, ie: raise an error when you try to bind a 3rd port on the VethBridgeFixture but we improve current implementation by calling tools.fail(msg) instead of raising a KeyError.","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e8ae1cc2cb0e925edf9fd62b57baf60b9fbc0b8a","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.veths \u003d base.create_resource(VETH0_PREFIX, _create_veth)"},{"line_number":149,"context_line":"        self.addCleanup(self.destroy)"},{"line_number":150,"context_line":"        self.unallocateds \u003d set(self.veths)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def destroy(self):"},{"line_number":153,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_493f73d6","line":150,"updated":"2015-03-06 15:46:12.000000000","message":"Still, the name is unclear. Can we rename it?","commit_id":"1a4001a02855a1c35a12d69c52c786d9f6b83b87"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f0379efaf24424b3d605dd6c9742dfaa4d49c066","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.veths \u003d base.create_resource(VETH0_PREFIX, _create_veth)"},{"line_number":149,"context_line":"        self.addCleanup(self.destroy)"},{"line_number":150,"context_line":"        self.unallocateds \u003d set(self.veths)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def destroy(self):"},{"line_number":153,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_911952d3","line":150,"in_reply_to":"9a80dd14_493f73d6","updated":"2015-03-16 12:06:32.000000000","message":"Done","commit_id":"1a4001a02855a1c35a12d69c52c786d9f6b83b87"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4faa2ffe326404e88c702929fed61410e6b7819f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    \"\"\"Create a veth."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    :ivar ports: created veth ports"},{"line_number":77,"context_line":"    :type ports: IPDevice 2-uplet"},{"line_number":78,"context_line":"    \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_f279ecfc","line":77,"updated":"2015-03-19 09:01:53.000000000","message":"s/uplet/tuple/g?","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d24e0fad1c71d43c14367932fd443c18ef12a5a7","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    \"\"\"Create a veth."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    :ivar ports: created veth ports"},{"line_number":77,"context_line":"    :type ports: IPDevice 2-uplet"},{"line_number":78,"context_line":"    \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_b56af917","line":77,"in_reply_to":"9a80dd14_f279ecfc","updated":"2015-03-19 10:51:49.000000000","message":"yep, tuple is the french version :s\n\nDone","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4faa2ffe326404e88c702929fed61410e6b7819f","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self.unallocated_ports \u003d unallocated_ports"},{"line_number":235,"context_line":"        self.ns_ip_wrapper \u003d ns_ip_wrapper"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def setUp(self):"},{"line_number":238,"context_line":"        super(VethNamespacePortFixture, self).setUp()"},{"line_number":239,"context_line":"        self.port \u003d self.unallocated_ports.pop()"},{"line_number":240,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_32e544a4","line":237,"updated":"2015-03-19 09:01:53.000000000","message":"I like this implementation better than what existed in the last patchset I reviewed. I think though that there should be a comment/docstring indicating that this setUp may throw KeyError (I believe) if \u0027unallocated_ports\u0027 is empty, and to pair it with improper use of this fixture.","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d24e0fad1c71d43c14367932fd443c18ef12a5a7","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self.unallocated_ports \u003d unallocated_ports"},{"line_number":235,"context_line":"        self.ns_ip_wrapper \u003d ns_ip_wrapper"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def setUp(self):"},{"line_number":238,"context_line":"        super(VethNamespacePortFixture, self).setUp()"},{"line_number":239,"context_line":"        self.port \u003d self.unallocated_ports.pop()"},{"line_number":240,"context_line":"        self.ns_ip_wrapper.add_device_to_namespace(self.port)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_d2eea3b4","line":237,"in_reply_to":"9a80dd14_32e544a4","updated":"2015-03-19 10:51:49.000000000","message":"Done","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4faa2ffe326404e88c702929fed61410e6b7819f","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        self.port.link.set_up()"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"def get_bridge_fixture(bridge):"},{"line_number":245,"context_line":"    if isinstance(bridge, BridgeFixture):"},{"line_number":246,"context_line":"        return bridge"},{"line_number":247,"context_line":"    return OVSBridgeFixture(bridge)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_f2ff2cff","line":244,"updated":"2015-03-19 09:01:53.000000000","message":"Wondering if maybe this should be a classmethod of BridgeFixture itself (somewhat of a factory function)?\n\nAt a minimum it should be placed before the \u0027class\u0027 declarations (first functions, then classes).","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4faa2ffe326404e88c702929fed61410e6b7819f","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    return OVSBridgeFixture(bridge)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class CidrBoundNamespaceFixture(fixtures.Fixture):"},{"line_number":251,"context_line":"    \"\"\"Bind namespace to cidr (on layer 2 and 3)."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    Create a port on the bridge in the namespace and set an ip on the port."}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_1d1db162","line":250,"updated":"2015-03-19 09:01:53.000000000","message":"I have an issue with the naming here (a namespace can\u0027t be \u0027CIDR bound\u0027 - it can have multiple ports with multiple CIDRs), but I guess that\u0027s out of scope of your patch so I\u0027m not gonna push this.","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d24e0fad1c71d43c14367932fd443c18ef12a5a7","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    return OVSBridgeFixture(bridge)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class CidrBoundNamespaceFixture(fixtures.Fixture):"},{"line_number":251,"context_line":"    \"\"\"Bind namespace to cidr (on layer 2 and 3)."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    Create a port on the bridge in the namespace and set an ip on the port."}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_5280f3be","line":250,"in_reply_to":"9a80dd14_1d1db162","updated":"2015-03-19 10:51:49.000000000","message":"I am open to name proposals :) ... currently it\u0027s the best i found :s","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"4faa2ffe326404e88c702929fed61410e6b7819f","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        self.port.addr.add(self.ip_cidr)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"def get_ovs_bridge(br_name):"},{"line_number":272,"context_line":"    return ovs_lib.OVSBridge(br_name)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_72689cba","line":271,"updated":"2015-03-19 09:01:53.000000000","message":"I\u0027m not entirely sure why this function is needed. It isn\u0027t used by any of the new code presented here (nor is it used by the follow up patch), so I suggest reverting the changes in test_l3_agent.py and removing this function.","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d24e0fad1c71d43c14367932fd443c18ef12a5a7","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        self.port.addr.add(self.ip_cidr)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"def get_ovs_bridge(br_name):"},{"line_number":272,"context_line":"    return ovs_lib.OVSBridge(br_name)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a80dd14_75b6c1fa","line":271,"in_reply_to":"9a80dd14_72689cba","updated":"2015-03-19 10:51:49.000000000","message":"Done","commit_id":"8b2af24f4736f28b42cb7e6d524b355a7dfcb538"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8425aad2107d9010f3a7af78e4e98feeae440427","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"1a6ced46_57415c0a","updated":"2015-03-22 07:22:51.000000000","message":"Most methods and classes are related only to functional tests. Do we place functional related code under test/common?","commit_id":"70f09ebe35f943e42c9da477fae2d83df32ead4b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"589dafe38d4c8ea6ab8b42cd014369ee476a9da4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"1a6ced46_fd54e722","in_reply_to":"1a6ced46_57415c0a","updated":"2015-03-22 15:03:08.000000000","message":"These helpers are currently used by functional tests, but will be also used by fullstack tests (discussed with John Schwarz \u0026 Maru)","commit_id":"70f09ebe35f943e42c9da477fae2d83df32ead4b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0675a6d373caa75980bf2af37fdc393f76a863c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"1a6ced46_389a0d15","in_reply_to":"1a6ced46_fd54e722","updated":"2015-03-22 16:22:05.000000000","message":"Thanks. I believe you all take into account the future direction well :-)  I have no objection on the direction.","commit_id":"70f09ebe35f943e42c9da477fae2d83df32ead4b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8425aad2107d9010f3a7af78e4e98feeae440427","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.ports \u003d base.create_resource(VETH0_PREFIX, _create_veth)"},{"line_number":94,"context_line":"        self.addCleanup(self.destroy)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def destroy(self):"},{"line_number":97,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            ip_wrapper.del_veth(self.ports[0].name)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1a6ced46_b747f01c","line":96,"updated":"2015-03-22 07:22:51.000000000","message":"Nit: Is there any naming policy? Namepace fixture uses \"_cleanup\" and VethFixture uses \"destroy\". It is better to be consistent.","commit_id":"70f09ebe35f943e42c9da477fae2d83df32ead4b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"589dafe38d4c8ea6ab8b42cd014369ee476a9da4","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.ports \u003d base.create_resource(VETH0_PREFIX, _create_veth)"},{"line_number":94,"context_line":"        self.addCleanup(self.destroy)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def destroy(self):"},{"line_number":97,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            ip_wrapper.del_veth(self.ports[0].name)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1a6ced46_382bed83","line":96,"in_reply_to":"1a6ced46_b747f01c","updated":"2015-03-22 15:03:08.000000000","message":"Done","commit_id":"70f09ebe35f943e42c9da477fae2d83df32ead4b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8425aad2107d9010f3a7af78e4e98feeae440427","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            ip_wrapper.del_veth(self.ports[0].name)"},{"line_number":100,"context_line":"        except RuntimeError:"},{"line_number":101,"context_line":"            # NOTE(cbrandily): It seems a veth is automagically deleted when a"},{"line_number":102,"context_line":"            # namespace owning a veth endpoint is deleted."},{"line_number":103,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"1a6ced46_57587cfa","line":102,"updated":"2015-03-22 07:22:51.000000000","message":"If one endpoint of veth device paris is deleted, the peer endpoint will be deleted, so it is true to some extent.\n\nHowever it assumes that ports[0] is kept in a root namespace.\nIt does not work if ports[0] is moved to a netns and ports[1] is kept in a root netns.\n\nThere are several approaches:\n\n- Try ports[1] if RuntimeError is raised for ports[0]\n- Keep the current code and add the help to the docstring:\n  if we move either of veth pair the second one should be moved to a network namespace.\n\nI prefer the first one because it is more fail-safe.","commit_id":"70f09ebe35f943e42c9da477fae2d83df32ead4b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"589dafe38d4c8ea6ab8b42cd014369ee476a9da4","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            ip_wrapper.del_veth(self.ports[0].name)"},{"line_number":100,"context_line":"        except RuntimeError:"},{"line_number":101,"context_line":"            # NOTE(cbrandily): It seems a veth is automagically deleted when a"},{"line_number":102,"context_line":"            # namespace owning a veth endpoint is deleted."},{"line_number":103,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"1a6ced46_182631bb","line":102,"in_reply_to":"1a6ced46_57587cfa","updated":"2015-03-22 15:03:08.000000000","message":"Done","commit_id":"70f09ebe35f943e42c9da477fae2d83df32ead4b"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Thales Services SAS"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_84b0a044","line":1,"updated":"2015-03-24 21:16:21.000000000","message":"(No action required) Consider separating helpers from fixtures at the module level.","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    net0 \u003d netaddr.IPNetwork(ip_cidr)"},{"line_number":44,"context_line":"    net \u003d netaddr.IPNetwork(ip_cidr)"},{"line_number":45,"context_line":"    net.value +\u003d offset"},{"line_number":46,"context_line":"    if not net0.network \u003c net.ip \u003c net0.broadcast:"},{"line_number":47,"context_line":"        tools.fail("},{"line_number":48,"context_line":"            \u0027Incorrect ip_cidr,offset tuple (%s,%s): \"incremented\" ip_cidr is \u0027"},{"line_number":49,"context_line":"            \u0027outside ip_cidr\u0027 % (ip_cidr, offset))"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_a422fcfe","line":46,"updated":"2015-03-24 21:16:21.000000000","message":"(No action required) Checks like this suggest unit testing to me, but that\u0027s probably overkill.","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":60,"context_line":"class NamespaceFixture(fixtures.Fixture):"},{"line_number":61,"context_line":"    \"\"\"Create a namespace."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :ivar ip_wrapper: created namespace"},{"line_number":64,"context_line":"    :type ip_wrapper: IPWrapper"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_1837b04f","line":63,"updated":"2015-03-24 21:16:21.000000000","message":"(No action required) This is the first time I\u0027m seeing this style of documentation.  It looks like useful to be able to easily determine what a fixture exposes post-setup.","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\"Create a namespace."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :ivar ip_wrapper: created namespace"},{"line_number":64,"context_line":"    :type ip_wrapper: IPWrapper"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, prefix\u003dNS_PREFIX):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_b845bcb4","line":64,"updated":"2015-03-24 21:16:21.000000000","message":"(No action required) I\u0027m less sure about the value of type declarations, but I\u0027ll see how useful it turns out to before judging.","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, prefix\u003dNS_PREFIX):"},{"line_number":68,"context_line":"        super(NamespaceFixture, self).__init__()"},{"line_number":69,"context_line":"        self.prefix \u003d prefix"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_04067086","line":68,"updated":"2015-03-24 21:16:21.000000000","message":"(No action required) Fixture doesn\u0027t define __init__ and descends from object - which has a no-op init - so this isn\u0027t strictly necessary.","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    \"\"\"Create a veth."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    :ivar ports: created veth ports"},{"line_number":87,"context_line":"    :type ports: IPDevice 2-uplet"},{"line_number":88,"context_line":"    \"\"\""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_d87a78f0","line":87,"updated":"2015-03-24 21:16:21.000000000","message":"(No action required) 2-uplet -\u003e 2-item tuple","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        def _create_veth(name0):"},{"line_number":95,"context_line":"            name1 \u003d name0.replace(VETH0_PREFIX, VETH1_PREFIX)"},{"line_number":96,"context_line":"            return ip_wrapper.add_veth(name0, name1)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        self.ports \u003d base.create_resource(VETH0_PREFIX, _create_veth)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_b8f85c4a","line":95,"updated":"2015-03-24 21:16:21.000000000","message":"(No action required) Given that these constants are only used in this fixture, consider adding them as class variables.","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"}],"neutron/tests/functional/agent/linux/base.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"1fa9292dbd56cc63f2561536d1a13ec5154eee63","unresolved":false,"context_lines":[{"line_number":35,"context_line":"get_rand_name \u003d sub_base.get_rand_name"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def get_rand_port_name():"},{"line_number":39,"context_line":"    return get_rand_name(prefix\u003dnet_helpers.PORT_PREFIX,"},{"line_number":40,"context_line":"                         max_length\u003dn_const.DEVICE_NAME_MAX_LEN)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_e07d7bb3","line":38,"updated":"2015-03-03 16:07:02.000000000","message":"This could also move to neutron/tests/common/base.py IMO. I could do this as part of the fullstack patches if you prefer.","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7961174ffd8498a89582750ffb98b0f07e0aca48","unresolved":false,"context_lines":[{"line_number":35,"context_line":"get_rand_name \u003d sub_base.get_rand_name"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def get_rand_port_name():"},{"line_number":39,"context_line":"    return get_rand_name(prefix\u003dnet_helpers.PORT_PREFIX,"},{"line_number":40,"context_line":"                         max_length\u003dn_const.DEVICE_NAME_MAX_LEN)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_5817b2ed","line":38,"in_reply_to":"ba7be1f8_26940c8a","updated":"2015-03-04 16:48:11.000000000","message":"AFAIK circular imports are bad only if you execute code on import.","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1488150150ae7332b684fc9d61af09382d433582","unresolved":false,"context_lines":[{"line_number":35,"context_line":"get_rand_name \u003d sub_base.get_rand_name"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def get_rand_port_name():"},{"line_number":39,"context_line":"    return get_rand_name(prefix\u003dnet_helpers.PORT_PREFIX,"},{"line_number":40,"context_line":"                         max_length\u003dn_const.DEVICE_NAME_MAX_LEN)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_26940c8a","line":38,"in_reply_to":"ba7be1f8_e07d7bb3","updated":"2015-03-03 16:11:18.000000000","message":"(For me) if we should move it to neutron.tests.common, then it should be in net_helpers not base otherwise each module will import the other one (crash!)","commit_id":"75ca3d85e6859df0e55ecbeabb7a976f49be1341"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1dc363eb629bfa38b0803858f7bdf3c173f5b07a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"ICMP_BLOCK_RULE \u003d \u0027-p icmp -j DROP\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"#TODO(jschwarz): Move these two functions to neutron/tests/common/"},{"line_number":33,"context_line":"get_rand_name \u003d sub_base.get_rand_name"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_ece15aff","line":32,"updated":"2015-03-05 14:32:50.000000000","message":"Should we kill the comment (and get_rand_name) too?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f6cdf76a24b79943f2d510d1d6a3b2dbc2dcda0f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"ICMP_BLOCK_RULE \u003d \u0027-p icmp -j DROP\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"#TODO(jschwarz): Move these two functions to neutron/tests/common/"},{"line_number":33,"context_line":"get_rand_name \u003d sub_base.get_rand_name"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_279628f1","line":32,"in_reply_to":"9a80dd14_ece15aff","updated":"2015-03-05 15:26:27.000000000","message":"get_rand_name users can use directly sub_base.get_rand_name but i remember a remark (maru?) that we should not use sub_base i prefer not to (re)move it in this change but it will be done in the future by john or myself ?","commit_id":"d56758370e78de446d7cb255058749fad1afacf3"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"6f981dea05d57c2256fc524c9b0c8936b70460fe","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"BR_PREFIX \u003d \u0027test-br\u0027"},{"line_number":29,"context_line":"PORT_PREFIX \u003d \u0027test-port\u0027"},{"line_number":30,"context_line":"MARK_VALUE \u003d \u00270x1\u0027"},{"line_number":31,"context_line":"MARK_MASK \u003d \u00270xffffffff\u0027"},{"line_number":32,"context_line":"ICMP_MARK_RULE \u003d (\u0027-j MARK --set-xmark %(value)s/%(mask)s\u0027"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a6ced46_788504ac","line":29,"updated":"2015-03-24 21:16:21.000000000","message":"These 2 constants can be sourced from net_helpers","commit_id":"1c4d0f125cc8652f07fad6b042dcef2716f3acf9"}]}
