)]}'
{"patrole_tempest_plugin/tests/api/network/test_floating_ips_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"8e91f0853efe4f47ecec155eacf07506998e3fd1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from patrole_tempest_plugin.rbac_utils import rbac_utils"},{"line_number":20,"context_line":"from patrole_tempest_plugin.tests.api.network import rbac_base as base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest import config"},{"line_number":23,"context_line":"from tempest.lib import decorators"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from tempest.lib.common.utils import data_utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_e7dc5175","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":26},"updated":"2017-02-23 00:51:57.000000000","message":"Unused.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"b0fe4d8bdcc30639779be200cbdabd9b59a2a044","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from patrole_tempest_plugin.rbac_utils import rbac_utils"},{"line_number":20,"context_line":"from patrole_tempest_plugin.tests.api.network import rbac_base as base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest import config"},{"line_number":23,"context_line":"from tempest.lib import decorators"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from tempest.lib.common.utils import data_utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_8c7630d5","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":26},"in_reply_to":"da36d5c6_dd537937","updated":"2017-02-23 22:52:22.000000000","message":"You\u0027re right, I missed that, sorry.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"3ef730afa3ad885fe7a453d5e338a6ae282117e9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from patrole_tempest_plugin.rbac_utils import rbac_utils"},{"line_number":20,"context_line":"from patrole_tempest_plugin.tests.api.network import rbac_base as base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest import config"},{"line_number":23,"context_line":"from tempest.lib import decorators"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from tempest.lib.common.utils import data_utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_dd537937","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":26},"in_reply_to":"da36d5c6_e7dc5175","updated":"2017-02-23 22:04:11.000000000","message":"This is used in line #28, 47.  However I am removing this because I don\u0027t think we should be using rbac_network_cidr.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"8e91f0853efe4f47ecec155eacf07506998e3fd1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from tempest.lib.common.utils import data_utils"},{"line_number":26,"context_line":"from tempest.lib.common.utils import test_utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"CONF \u003d config.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_a7f6d9f6","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":18},"updated":"2017-02-23 00:51:57.000000000","message":"Unused.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"3ef730afa3ad885fe7a453d5e338a6ae282117e9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from tempest.lib.common.utils import data_utils"},{"line_number":26,"context_line":"from tempest.lib.common.utils import test_utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"CONF \u003d config.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_bd2de5a9","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":18},"in_reply_to":"da36d5c6_a7f6d9f6","updated":"2017-02-23 22:04:11.000000000","message":"This is used in line #47.  However I am removing this because I don\u0027t think we should be using rbac_network_cidr. rbac_network_cidr is an attribute I added in mos-tempest config.py.  It specifies the subnet ipaddress/mask.  I am not sure if we want to push that upstream.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"b0fe4d8bdcc30639779be200cbdabd9b59a2a044","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from tempest.lib.common.utils import data_utils"},{"line_number":26,"context_line":"from tempest.lib.common.utils import test_utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"CONF \u003d config.CONF"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_ac7f74a9","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":18},"in_reply_to":"da36d5c6_bd2de5a9","updated":"2017-02-23 22:52:22.000000000","message":"You\u0027re right, I missed that, sorry.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"4647a4333425b81b5c780fa9c9340dc0bbd336b3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def resource_setup(cls):"},{"line_number":35,"context_line":"        super(RbacFloatingIpsTest, cls).resource_setup()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # Create an external network for floating ip creation"},{"line_number":38,"context_line":"        name \u003d data_utils.rand_name(\u0027rbac-fip-extnet\u0027)"},{"line_number":39,"context_line":"        post_body \u003d {\u0027name\u0027: name}"},{"line_number":40,"context_line":"        post_body[\u0027router:external\u0027] \u003d True"},{"line_number":41,"context_line":"        body \u003d cls.networks_client.create_network(**post_body)"},{"line_number":42,"context_line":"        cls.fip_extnet \u003d body[\u0027network\u0027]"},{"line_number":43,"context_line":"        cls.fip_extnet_id \u003d cls.fip_extnet[\u0027id\u0027]"},{"line_number":44,"context_line":"        cls.networks.append(cls.fip_extnet)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # Create a subnet for the external network"},{"line_number":47,"context_line":"        cls.cidr \u003d netaddr.IPNetwork(CONF.network.rbac_network_cidr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_875555fb","line":44,"range":{"start_line":37,"start_character":8,"end_line":44,"end_character":43},"updated":"2017-02-23 00:50:27.000000000","message":"Please use cls.create_network(**{\u0027router:external\u0027: True}) here; see create_network in tempest.api.network.base. It automatically generates a network name for you and appends it to cls.networks.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"3ef730afa3ad885fe7a453d5e338a6ae282117e9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def resource_setup(cls):"},{"line_number":35,"context_line":"        super(RbacFloatingIpsTest, cls).resource_setup()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # Create an external network for floating ip creation"},{"line_number":38,"context_line":"        name \u003d data_utils.rand_name(\u0027rbac-fip-extnet\u0027)"},{"line_number":39,"context_line":"        post_body \u003d {\u0027name\u0027: name}"},{"line_number":40,"context_line":"        post_body[\u0027router:external\u0027] \u003d True"},{"line_number":41,"context_line":"        body \u003d cls.networks_client.create_network(**post_body)"},{"line_number":42,"context_line":"        cls.fip_extnet \u003d body[\u0027network\u0027]"},{"line_number":43,"context_line":"        cls.fip_extnet_id \u003d cls.fip_extnet[\u0027id\u0027]"},{"line_number":44,"context_line":"        cls.networks.append(cls.fip_extnet)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # Create a subnet for the external network"},{"line_number":47,"context_line":"        cls.cidr \u003d netaddr.IPNetwork(CONF.network.rbac_network_cidr)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_fd191d89","line":44,"range":{"start_line":37,"start_character":8,"end_line":44,"end_character":43},"in_reply_to":"da36d5c6_875555fb","updated":"2017-02-23 22:04:11.000000000","message":"Will fix.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"4647a4333425b81b5c780fa9c9340dc0bbd336b3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        cls.create_router_interface(cls.router[\u0027id\u0027], cls.subnet[\u0027id\u0027])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # Create two ports one each for Creation and Updating of floating ip"},{"line_number":62,"context_line":"        cls.port \u003d list()"},{"line_number":63,"context_line":"        cls.create_port(cls.network)"},{"line_number":64,"context_line":"        cls.create_port(cls.network)"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_07b88529","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":25},"updated":"2017-02-23 00:50:27.000000000","message":"This is unused. You use self.ports elsewhere, not self.port.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"3ef730afa3ad885fe7a453d5e338a6ae282117e9","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        cls.create_router_interface(cls.router[\u0027id\u0027], cls.subnet[\u0027id\u0027])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # Create two ports one each for Creation and Updating of floating ip"},{"line_number":62,"context_line":"        cls.port \u003d list()"},{"line_number":63,"context_line":"        cls.create_port(cls.network)"},{"line_number":64,"context_line":"        cls.create_port(cls.network)"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_f875ab97","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":25},"in_reply_to":"da36d5c6_07b88529","updated":"2017-02-23 22:04:11.000000000","message":"Will remove anything relating to port(s).  Rbac is not for functional test, don\u0027t required a real port for floating ip testing.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"4647a4333425b81b5c780fa9c9340dc0bbd336b3","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @classmethod"},{"line_number":67,"context_line":"    def resource_cleanup(cls):"},{"line_number":68,"context_line":"        cls.routers_client.remove_router_interface("},{"line_number":69,"context_line":"            cls.router[\u0027id\u0027],"},{"line_number":70,"context_line":"            subnet_id\u003dcls.subnet[\u0027id\u0027])"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        super(RbacFloatingIpsTest, cls).resource_cleanup()"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_e740d136","line":70,"range":{"start_line":68,"start_character":8,"end_line":70,"end_character":39},"updated":"2017-02-23 00:50:27.000000000","message":"This is actually not needed. See delete_router in tempest.api.network.base. The function automatically removes router interfaces for you, as well as routers.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"3ef730afa3ad885fe7a453d5e338a6ae282117e9","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @classmethod"},{"line_number":67,"context_line":"    def resource_cleanup(cls):"},{"line_number":68,"context_line":"        cls.routers_client.remove_router_interface("},{"line_number":69,"context_line":"            cls.router[\u0027id\u0027],"},{"line_number":70,"context_line":"            subnet_id\u003dcls.subnet[\u0027id\u0027])"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        super(RbacFloatingIpsTest, cls).resource_cleanup()"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_187b5f8d","line":70,"range":{"start_line":68,"start_character":8,"end_line":70,"end_character":39},"in_reply_to":"da36d5c6_e740d136","updated":"2017-02-23 22:04:11.000000000","message":"Will remove anything relating to router interface.  Rbac is not for functional test, don\u0027t required a real interface and router for floating ip testing","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"4647a4333425b81b5c780fa9c9340dc0bbd336b3","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                port_id\u003dself.ports[0][\u0027id\u0027])"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        floating_ip \u003d body[\u0027floatingip\u0027]"},{"line_number":87,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":88,"context_line":"                        self.floating_ips_client.delete_floatingip,"},{"line_number":89,"context_line":"                        floating_ip[\u0027id\u0027])"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return floating_ip"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_a7a899dc","line":89,"range":{"start_line":87,"start_character":0,"end_line":89,"end_character":42},"updated":"2017-02-23 00:50:27.000000000","message":"You could probably add floating_ip to cls.floating_ips, which resource_cleanup in base automatically cleans up. Up to you.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"3ef730afa3ad885fe7a453d5e338a6ae282117e9","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                port_id\u003dself.ports[0][\u0027id\u0027])"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        floating_ip \u003d body[\u0027floatingip\u0027]"},{"line_number":87,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":88,"context_line":"                        self.floating_ips_client.delete_floatingip,"},{"line_number":89,"context_line":"                        floating_ip[\u0027id\u0027])"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return floating_ip"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_f883eb53","line":89,"range":{"start_line":87,"start_character":0,"end_line":89,"end_character":42},"in_reply_to":"da36d5c6_a7a899dc","updated":"2017-02-23 22:04:11.000000000","message":"Will leave it here.  Each _create should have a addCleanup instead of adding to the pool for cleaning later at class level.","commit_id":"0b60172d173994a3d03c8e40534b2d8be25669b0"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"8ae9363180888526dee52f40225bcd21549a3c5b","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from patrole_tempest_plugin.rbac_utils import rbac_utils"},{"line_number":20,"context_line":"from patrole_tempest_plugin.tests.api.network import rbac_base as base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest.lib import decorators"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from tempest.lib.common.utils import test_utils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_5701ce38","line":24,"range":{"start_line":22,"start_character":0,"end_line":24,"end_character":47},"updated":"2017-02-27 19:28:34.000000000","message":"There shouldn\u0027t be a space between these two","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"d6568151e7a5dedaa024f91e9acd4692cf0ae3e9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from patrole_tempest_plugin.rbac_utils import rbac_utils"},{"line_number":20,"context_line":"from patrole_tempest_plugin.tests.api.network import rbac_base as base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest.lib import decorators"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from tempest.lib.common.utils import test_utils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_ab68df88","line":24,"range":{"start_line":22,"start_character":0,"end_line":24,"end_character":47},"in_reply_to":"da36d5c6_5701ce38","updated":"2017-02-27 21:31:25.000000000","message":"Will fix.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e526fed5e15303390568ef7a258a1e25483b059b","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def resource_setup(cls):"},{"line_number":31,"context_line":"        super(RbacFloatingIpsTest, cls).resource_setup()"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_5174cd66","line":28,"updated":"2017-02-24 04:16:34.000000000","message":"include def skip_checks() that includes:\n\n\n    @classmethod\n    def skip_checks(cls):\n        super(FloatingIPTestJSON, cls).skip_checks()\n        if not test.is_extension_enabled(\u0027router\u0027, \u0027network\u0027):\n            msg \u003d \"router extension not enabled.\"\n            raise cls.skipException(msg)\n        if not CONF.network.public_network_id:\n            msg \u003d \"The public_network_id option must be specified.\"\n            raise cls.skipException(msg)\n\nSee test_floating_ips.py in tempest.api.network.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"d6568151e7a5dedaa024f91e9acd4692cf0ae3e9","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def resource_setup(cls):"},{"line_number":31,"context_line":"        super(RbacFloatingIpsTest, cls).resource_setup()"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_eb2f373c","line":28,"in_reply_to":"da36d5c6_2088d7c4","updated":"2017-02-27 21:31:25.000000000","message":"Per our discussion, skip_checks() will not be added since the resource_setup will create its own external network for RBAC testing.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"4eb2d829a8556f0f4c26badd8d1c13dbec460e69","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class RbacFloatingIpsTest(base.BaseNetworkRbacTest):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def resource_setup(cls):"},{"line_number":31,"context_line":"        super(RbacFloatingIpsTest, cls).resource_setup()"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_2088d7c4","line":28,"in_reply_to":"da36d5c6_5174cd66","updated":"2017-02-24 15:02:42.000000000","message":"Yes, I have seen this before.  I don\u0027t think the presence of public network is a pre-requisite for RBAC testing.  In these RBAC test cases, it is possible by creating its own public external network in resource_setup.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e526fed5e15303390568ef7a258a1e25483b059b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.fip_extnet_id \u003d cls.fip_extnet[\u0027id\u0027]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # Create a subnet for the external network"},{"line_number":38,"context_line":"        cls.cidr \u003d netaddr.IPNetwork(\"192.168.2.0/24\")"},{"line_number":39,"context_line":"        cls.create_subnet(cls.fip_extnet,"},{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_51984dc0","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":54},"updated":"2017-02-24 04:16:34.000000000","message":"This could be improved by changing it to:\n\ncls.cidr \u003d netaddr.IPNetwork(CONF.network.project_network_cidr)","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"24ce2af8d2346b79c39f728446f5366ef557bcce","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.fip_extnet_id \u003d cls.fip_extnet[\u0027id\u0027]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # Create a subnet for the external network"},{"line_number":38,"context_line":"        cls.cidr \u003d netaddr.IPNetwork(\"192.168.2.0/24\")"},{"line_number":39,"context_line":"        cls.create_subnet(cls.fip_extnet,"},{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_35f1f26b","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":54},"in_reply_to":"da36d5c6_033e7dc0","updated":"2017-02-24 17:32:55.000000000","message":"Please ignore my previous response.  I have a better understanding of your proposal.  It should work.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"d6568151e7a5dedaa024f91e9acd4692cf0ae3e9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.fip_extnet_id \u003d cls.fip_extnet[\u0027id\u0027]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # Create a subnet for the external network"},{"line_number":38,"context_line":"        cls.cidr \u003d netaddr.IPNetwork(\"192.168.2.0/24\")"},{"line_number":39,"context_line":"        cls.create_subnet(cls.fip_extnet,"},{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_ebd65726","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":54},"in_reply_to":"da36d5c6_35f1f26b","updated":"2017-02-27 21:31:25.000000000","message":"project_network_cidr will be used as previously proposed.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"4eb2d829a8556f0f4c26badd8d1c13dbec460e69","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.fip_extnet_id \u003d cls.fip_extnet[\u0027id\u0027]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # Create a subnet for the external network"},{"line_number":38,"context_line":"        cls.cidr \u003d netaddr.IPNetwork(\"192.168.2.0/24\")"},{"line_number":39,"context_line":"        cls.create_subnet(cls.fip_extnet,"},{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_033e7dc0","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":54},"in_reply_to":"da36d5c6_51984dc0","updated":"2017-02-24 15:02:42.000000000","message":"How is project_network_cidr relates to public_network above? How do we know project_network_cidr is a network with router:external attribute set to True which can be used to allocate floating IP?","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e526fed5e15303390568ef7a258a1e25483b059b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # External shared subnet can only be deleted implicitly as part of"},{"line_number":44,"context_line":"        # network resource cleanup"},{"line_number":45,"context_line":"        cls.subnets.pop()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _create_floatingip(self, floating_ip_address\u003dNone):"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_b167c9b5","line":45,"range":{"start_line":43,"start_character":8,"end_line":45,"end_character":25},"updated":"2017-02-24 04:16:34.000000000","message":"I don\u0027t understand why this is necessary. Also, by doing this, the subnet that is created above is never cleaned up.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c65ebfbd20dacb833e369eb85642dd66288dc027","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # External shared subnet can only be deleted implicitly as part of"},{"line_number":44,"context_line":"        # network resource cleanup"},{"line_number":45,"context_line":"        cls.subnets.pop()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _create_floatingip(self, floating_ip_address\u003dNone):"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_ce28e588","line":45,"range":{"start_line":43,"start_character":8,"end_line":45,"end_character":25},"in_reply_to":"da36d5c6_83bd0dda","updated":"2017-02-27 01:19:15.000000000","message":"I see, but the intention isn\u0027t very clear, unless you trace through the code in the base class. Is it possible to instead do:\n\n@classmethod\ndef resource_cleanup(cls):\n    cls.update_network(cls.fip_extnet[\u0027id\u0027],\n                       **{\u0027router:external\u0027: False})\n    super(...).resource_cleanup()\n\nhttps://developer.openstack.org/api-ref/networking/v2/?expanded\u003dupdate-network-detail","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"4eb2d829a8556f0f4c26badd8d1c13dbec460e69","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # External shared subnet can only be deleted implicitly as part of"},{"line_number":44,"context_line":"        # network resource cleanup"},{"line_number":45,"context_line":"        cls.subnets.pop()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _create_floatingip(self, floating_ip_address\u003dNone):"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_83bd0dda","line":45,"range":{"start_line":43,"start_character":8,"end_line":45,"end_character":25},"in_reply_to":"da36d5c6_b167c9b5","updated":"2017-02-24 15:02:42.000000000","message":"Subnet will be deleted when the Network resource is deleted. Without doing the above, the subnet resource deletion (from base.py cleanup) fails because it is not allowed for subnet which has a external shared network.  This happens in contrail networking implementation but not in neutron.  In mos-tempest, I changed the signature of create_subnet and add a flag to skip the cls.subnets.append().","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"d6568151e7a5dedaa024f91e9acd4692cf0ae3e9","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                          cidr\u003dcls.cidr,"},{"line_number":41,"context_line":"                          mask_bits\u003d24)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # External shared subnet can only be deleted implicitly as part of"},{"line_number":44,"context_line":"        # network resource cleanup"},{"line_number":45,"context_line":"        cls.subnets.pop()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _create_floatingip(self, floating_ip_address\u003dNone):"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_4b94c343","line":45,"range":{"start_line":43,"start_character":8,"end_line":45,"end_character":25},"in_reply_to":"da36d5c6_ce28e588","updated":"2017-02-27 21:31:25.000000000","message":"Line #45 will be removed.\ndef resource_cleanup(cls) will be implemented as suggested. It should be calling cls.networks_client.update_network instead of cls.update_network() since cls.update_network does not exist.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e526fed5e15303390568ef7a258a1e25483b059b","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        RBAC test for the neutron create_floatingip:floating_ip_address policy"},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        fip \u003d str(netaddr.IPAddress(self.cidr) + 10)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self._create_floatingip(floating_ip_address\u003dfip)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_51d04d1f","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":52},"updated":"2017-02-24 04:16:34.000000000","message":"Safer to do:\n\nnet \u003d netaddr.IPNetwork(CONF.network.project_network_cidr)\nfip \u003d str(netaddr.IPAddress(net.first + 1))\n\nSee tempest.api.network.test_networks or tempest.api.network.test_dhcp_ipv6 for examples.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"24ce2af8d2346b79c39f728446f5366ef557bcce","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        RBAC test for the neutron create_floatingip:floating_ip_address policy"},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        fip \u003d str(netaddr.IPAddress(self.cidr) + 10)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self._create_floatingip(floating_ip_address\u003dfip)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_d5f6d68d","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":52},"in_reply_to":"da36d5c6_23ae21e6","updated":"2017-02-24 17:32:55.000000000","message":"Just did some testing.  str(netaddr.IPAddress(net.first + 1)) returns the gateway IP address.  I think the original line str(netaddr.IPAddress(self.cidr) + 10) is fine since self.cidr has a wide range with subnet mask being 24.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"14b9a771aadff395e78847960b780919bcb26a24","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        RBAC test for the neutron create_floatingip:floating_ip_address policy"},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        fip \u003d str(netaddr.IPAddress(self.cidr) + 10)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self._create_floatingip(floating_ip_address\u003dfip)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_8400aa67","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":52},"in_reply_to":"da36d5c6_298b5720","updated":"2017-02-24 19:51:38.000000000","message":"The random.choice only returns an IP address from a list. But the returned IP address could actually be used or allocated already.\n\nThis would work only if in the resource setup we are creating our own subnet under the CONF.network.public_network_id.  In this approach, we will use the public_network_id and retrieve the network object since the cls.create_subnet() takes network object as a parameter.\n\nThis is not bullet proof if the CONF.network.project_network_cidr is the cidr of the existing subnet under the public_network.  In this case, we must add more code to make sure the returned ip address is not being used.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"4eb2d829a8556f0f4c26badd8d1c13dbec460e69","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        RBAC test for the neutron create_floatingip:floating_ip_address policy"},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        fip \u003d str(netaddr.IPAddress(self.cidr) + 10)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self._create_floatingip(floating_ip_address\u003dfip)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_23ae21e6","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":52},"in_reply_to":"da36d5c6_51d04d1f","updated":"2017-02-24 15:02:42.000000000","message":"Since project_network is being created ahead of time and is used by other test case or purpose, there is no guarantee that net.first+1 has not been used/allocated.  This test case will fail with Conflict exception when trying to use an already allocated floating IP address.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"d6568151e7a5dedaa024f91e9acd4692cf0ae3e9","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        RBAC test for the neutron create_floatingip:floating_ip_address policy"},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        fip \u003d str(netaddr.IPAddress(self.cidr) + 10)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self._create_floatingip(floating_ip_address\u003dfip)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_2bb4efcf","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":52},"in_reply_to":"da36d5c6_5892164d","updated":"2017-02-27 21:31:25.000000000","message":"The original line 87 will stay.  Since this test class is creating its own subnet, a +10 is guaranteed that it has not been used/allocated. The address range approach does not work since the start address is often used for dhcp port.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"321c490915bc572e2cf9746b2aa9bfe99f7324ef","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        RBAC test for the neutron create_floatingip:floating_ip_address policy"},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        fip \u003d str(netaddr.IPAddress(self.cidr) + 10)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self._create_floatingip(floating_ip_address\u003dfip)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_5892164d","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":52},"in_reply_to":"da36d5c6_8400aa67","updated":"2017-02-24 20:24:00.000000000","message":"I agree with your points, and this is also all the more reason to create a \"select_valid_ip_from_subnet\" or equivalent function in the base class, rather than having 3 different ways that each have their own flaws.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"b899a7f4259632ba13e047447afa082da833a278","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        RBAC test for the neutron create_floatingip:floating_ip_address policy"},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        fip \u003d str(netaddr.IPAddress(self.cidr) + 10)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self._create_floatingip(floating_ip_address\u003dfip)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da36d5c6_298b5720","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":52},"in_reply_to":"da36d5c6_d5f6d68d","updated":"2017-02-24 19:18:08.000000000","message":"If you check https://github.com/openstack/patrole/blob/master/patrole_tempest_plugin/tests/api/network/test_ports_rbac.py, there is some code there that is used for selecting a random IP address from a subnet\u0027s allocation pool.  If you need to do the same, it is probably worth moving that code into a helper function in the network base class and re-using it here as well.","commit_id":"4dd841185a47f8bcce3452bf389e493c7a28f9f4"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"409741f194afa17c5950095c0ec6ed3151fd12ea","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        super(RbacFloatingIpsTest, cls).resource_cleanup()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def _create_floatingip(self, floating_ip_address\u003dNone):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if floating_ip_address is not None:"},{"line_number":60,"context_line":"            body \u003d self.floating_ips_client.create_floatingip("},{"line_number":61,"context_line":"                floating_network_id\u003dself.fip_extnet_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_afc63a14","line":58,"updated":"2017-02-28 16:00:44.000000000","message":"nit: Remove empty line for consistency.","commit_id":"2ad97dac492184d1ea84323c1a28ff0f5bd2f24b"},{"author":{"_account_id":19391,"name":"Chi Lo","email":"cl566n@att.com","username":"cl566n"},"change_message_id":"7ff5fd1a19c359cb527ed7f483c6fc02fffcc4e7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        super(RbacFloatingIpsTest, cls).resource_cleanup()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def _create_floatingip(self, floating_ip_address\u003dNone):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if floating_ip_address is not None:"},{"line_number":60,"context_line":"            body \u003d self.floating_ips_client.create_floatingip("},{"line_number":61,"context_line":"                floating_network_id\u003dself.fip_extnet_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_fe6d3ecd","line":58,"in_reply_to":"ba2be162_afc63a14","updated":"2017-02-28 17:31:48.000000000","message":"will fix","commit_id":"2ad97dac492184d1ea84323c1a28ff0f5bd2f24b"}]}
