)]}'
{"tempest/api/network/test_networks.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"0fa0ac0233bf80ead3459366bd7bdbb062613af0","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        # Remove subnet from cleanup list"},{"line_number":422,"context_line":"        self.subnets.pop()"},{"line_number":423,"context_line":"        resp, body \u003d self.client.delete_network(net_id)"},{"line_number":424,"context_line":"        self.assertEqual(\u0027204\u0027, resp[\u0027status\u0027])"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"class NetworksTestXML(NetworksTestJSON):"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_ff30b39f","line":424,"updated":"2014-07-21 11:47:44.000000000","message":"There is a lot of duplication in this tests. It will be better if you create some help functions to reduce the same line of code in this tests.","commit_id":"36979e358ab82d1a7ae15c18cd6a8902289aefd5"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.subnets.pop()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":81,"context_line":"        for k,v in attrs.iteritems():"},{"line_number":82,"context_line":"            if \u0027dns_nameservers\u0027 in k:"},{"line_number":83,"context_line":"                self.assertEqual(sorted(resource[k]), sorted(v))"},{"line_number":84,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_8460fca5","line":81,"updated":"2014-07-22 14:30:51.000000000","message":"Whitespace missing","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":264,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"},{"line_number":265,"context_line":"        name \u003d data_utils.rand_name(\u0027network-\u0027)"},{"line_number":266,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"},{"line_number":267,"context_line":"        self.assertEqual(\u0027201\u0027, resp[\u0027status\u0027])"},{"line_number":268,"context_line":"        network \u003d body[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_7f2d31fd","line":265,"updated":"2014-07-22 14:30:51.000000000","message":"here and everywhere else \u0027-\u0027 is not needed","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        kwargs[\u0027gateway_ip\u0027] \u003d gateway"},{"line_number":392,"context_line":"        self._compare_resource_attrs(subnet, kwargs)"},{"line_number":393,"context_line":"        # Delete subnet and network"},{"line_number":394,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"},{"line_number":395,"context_line":"        self._delete_network(net_id)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_6485a809","line":394,"updated":"2014-07-22 14:30:51.000000000","message":"Use subnet_id here or just remove this variable","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":638,"context_line":"        host_routes \u003d [{\u0027destination\u0027: \u00272002::/64\u0027, \u0027nexthop\u0027: \u00272005::1\u0027}]"},{"line_number":639,"context_line":"        dns_nameservers \u003d [\u00272001:4860:4860::8844\u0027,"},{"line_number":640,"context_line":"                                  \u00272001:4860:4860::8888\u0027]"},{"line_number":641,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: host_routes,"},{"line_number":642,"context_line":"                  \u0027dns_nameservers\u0027: dns_nameservers}"},{"line_number":643,"context_line":"        subnet \u003d self.create_subnet(network, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_04cb0c4b","line":640,"updated":"2014-07-22 14:30:51.000000000","message":"The block is over-intended","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":671,"context_line":"        gateway \u003d \u00272002::1\u0027"},{"line_number":672,"context_line":"        host_routes \u003d [{\u0027destination\u0027: \u00272001::/64\u0027, \u0027nexthop\u0027: \u00272005::1\u0027}]"},{"line_number":673,"context_line":"        dns_nameservers \u003d [\u00272001:4860:4860::8888\u0027,"},{"line_number":674,"context_line":"                                  \u00272001:4860:4860::8844\u0027]"},{"line_number":675,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: host_routes,"},{"line_number":676,"context_line":"                  \u0027dns_nameservers\u0027: dns_nameservers}"},{"line_number":677,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_642848ef","line":674,"updated":"2014-07-22 14:30:51.000000000","message":"ditto","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":681,"context_line":"        new_gateway \u003d \u00272002::2\u0027"},{"line_number":682,"context_line":"        new_host_routes \u003d [{\u0027destination\u0027: \u00272001::/64\u0027, \u0027nexthop\u0027: \u00272003::1\u0027}]"},{"line_number":683,"context_line":"        new_dns_nameservers \u003d [\u00272001:4860:4860::7744\u0027,"},{"line_number":684,"context_line":"                                      \u00272001:4860:4860::7888\u0027]"},{"line_number":685,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: new_host_routes,"},{"line_number":686,"context_line":"                  \u0027dns_nameservers\u0027: new_dns_nameservers,"},{"line_number":687,"context_line":"                  \u0027gateway_ip\u0027: new_gateway, \u0027enable_dhcp\u0027: True}"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_244650c1","line":684,"updated":"2014-07-22 14:30:51.000000000","message":"ditto","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":708,"context_line":"        gateway \u003d \u00272002::1\u0027"},{"line_number":709,"context_line":"        host_routes \u003d [{\u0027destination\u0027: \u00272001::/64\u0027, \u0027nexthop\u0027: \u00272003::1\u0027}]"},{"line_number":710,"context_line":"        dns_nameservers \u003d [\u00272001:4860:4860::8888\u0027,"},{"line_number":711,"context_line":"                                  \u00272001:4860:4860::8844\u0027]"},{"line_number":712,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: host_routes,"},{"line_number":713,"context_line":"                  \u0027dns_nameservers\u0027: dns_nameservers,"},{"line_number":714,"context_line":"                  \u0027enable_dhcp\u0027: True}"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_e4229801","line":711,"updated":"2014-07-22 14:30:51.000000000","message":"ditto","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"af4e36eb81b2ec07cb1a584159dee92e8335d583","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        kwargs[\u0027gateway_ip\u0027] \u003d gateway"},{"line_number":720,"context_line":"        self._compare_resource_attrs(subnet, kwargs)"},{"line_number":721,"context_line":"        # Delete subnet and network"},{"line_number":722,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"},{"line_number":723,"context_line":"        self._delete_network(net_id)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_c45cb480","line":722,"updated":"2014-07-22 14:30:51.000000000","message":"same as line 394","commit_id":"166b813ad585859f1bb52383a650bfa20bc24aa7"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _delete_network(self, network_id):"},{"line_number":71,"context_line":"        resp, body \u003d self.client.delete_network(network_id)"},{"line_number":72,"context_line":"        self.assertEqual(\u0027204\u0027, resp[\u0027status\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _delete_subnet(self, subnet_id):"},{"line_number":75,"context_line":"        resp, body \u003d self.client.delete_subnet(subnet_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_d10e743c","line":72,"updated":"2014-07-29 06:47:13.000000000","message":"either this should have self.networks.pop() or \"_delete_subnet\" shouldn\u0027t.","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _delete_network(self, network_id):"},{"line_number":71,"context_line":"        resp, body \u003d self.client.delete_network(network_id)"},{"line_number":72,"context_line":"        self.assertEqual(\u0027204\u0027, resp[\u0027status\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _delete_subnet(self, subnet_id):"},{"line_number":75,"context_line":"        resp, body \u003d self.client.delete_subnet(subnet_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_000f588c","line":72,"in_reply_to":"baada198_d10e743c","updated":"2014-07-30 15:04:21.000000000","message":"added self.networks.pop()","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        resp, body \u003d self.client.delete_subnet(subnet_id)"},{"line_number":76,"context_line":"        self.assertEqual(\u0027204\u0027, resp[\u0027status\u0027])"},{"line_number":77,"context_line":"        # Remove subnet from cleanup list"},{"line_number":78,"context_line":"        self.subnets.pop()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":81,"context_line":"        for k, v in attrs.iteritems():"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_3107b01e","line":78,"updated":"2014-07-29 06:47:13.000000000","message":"see previous comment","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        resp, body \u003d self.client.delete_subnet(subnet_id)"},{"line_number":76,"context_line":"        self.assertEqual(\u0027204\u0027, resp[\u0027status\u0027])"},{"line_number":77,"context_line":"        # Remove subnet from cleanup list"},{"line_number":78,"context_line":"        self.subnets.pop()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":81,"context_line":"        for k, v in attrs.iteritems():"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_20145c9e","line":78,"in_reply_to":"baada198_3107b01e","updated":"2014-07-30 15:04:21.000000000","message":"Done","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # Remove subnet from cleanup list"},{"line_number":78,"context_line":"        self.subnets.pop()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":81,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":82,"context_line":"            if \u0027dns_nameservers\u0027 in k:"},{"line_number":83,"context_line":"                self.assertEqual(sorted(resource[k]), sorted(v))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_51e18499","line":80,"updated":"2014-07-29 06:47:13.000000000","message":"I suggest handling \"dns_nameservers\" specifically (and then removing it from both dicts using del) and later just use: \nself.assertDictContainsSubset()\n\nThough I\u0027m unclear why \"dns_nameservers\" should require a specific handler, especially since it\u0027s of length 2 at most. maybe you could define it more carefully (attention to order) in order to make sure you don\u0027t need this extra method?","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # Remove subnet from cleanup list"},{"line_number":78,"context_line":"        self.subnets.pop()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":81,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":82,"context_line":"            if \u0027dns_nameservers\u0027 in k:"},{"line_number":83,"context_line":"                self.assertEqual(sorted(resource[k]), sorted(v))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_a066ac53","line":80,"in_reply_to":"baada198_51e18499","updated":"2014-07-30 15:04:21.000000000","message":"I tried defining it in sorted order, but Neutron does not maintain that sorted order while querying back for the subnet. \n\nI will handle dns_nameservers specifically and remove it from both dicts.\n\nAlso assertDictContainsSubset() has been deprecated in py3.2 , i dont think we should use it now keeping in mind py3 compat\n\nhttps://docs.python.org/2/library/unittest.html#unittest.TestCase.assertDictContainsSubset","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        return body[\u0027network\u0027]"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _create_verify_delete_subnet(self, gateway\u003dNone, cidr\u003dNone,"},{"line_number":95,"context_line":"                                     mask_bits\u003dNone, subnet_kwargs\u003dNone,"},{"line_number":96,"context_line":"                                     compare_args\u003dNone):"},{"line_number":97,"context_line":"        network \u003d self._create_network()"},{"line_number":98,"context_line":"        net_id \u003d network[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_113f0c26","line":95,"updated":"2014-07-29 06:47:13.000000000","message":"s/subnet_kwargs\u003dNone/**subnet_kwargs \n\nPlease use the common way unless you have a reason not to\n\nThis way you won\u0027t need to create the kwargs dict before invoking the method. just load those keywords upon invocation","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        return body[\u0027network\u0027]"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _create_verify_delete_subnet(self, gateway\u003dNone, cidr\u003dNone,"},{"line_number":95,"context_line":"                                     mask_bits\u003dNone, subnet_kwargs\u003dNone,"},{"line_number":96,"context_line":"                                     compare_args\u003dNone):"},{"line_number":97,"context_line":"        network \u003d self._create_network()"},{"line_number":98,"context_line":"        net_id \u003d network[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_8d8f2076","line":95,"in_reply_to":"baada198_113f0c26","updated":"2014-07-30 15:04:21.000000000","message":"Done","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        network \u003d self._create_network()"},{"line_number":98,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":99,"context_line":"        subnet \u003d self.create_subnet(network, gateway, cidr, mask_bits,"},{"line_number":100,"context_line":"                                    **(subnet_kwargs or {}))"},{"line_number":101,"context_line":"        self._compare_resource_attrs(subnet, compare_args)"},{"line_number":102,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"},{"line_number":103,"context_line":"        self._delete_network(net_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_511c24c2","line":100,"updated":"2014-07-29 06:47:13.000000000","message":"if you follow my previous suggestion you won\u0027t need the \"or {})\" addition","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        network \u003d self._create_network()"},{"line_number":98,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":99,"context_line":"        subnet \u003d self.create_subnet(network, gateway, cidr, mask_bits,"},{"line_number":100,"context_line":"                                    **(subnet_kwargs or {}))"},{"line_number":101,"context_line":"        self._compare_resource_attrs(subnet, compare_args)"},{"line_number":102,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"},{"line_number":103,"context_line":"        self._delete_network(net_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_2d0ff43a","line":100,"in_reply_to":"baada198_511c24c2","updated":"2014-07-30 15:04:21.000000000","message":"Done","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":99,"context_line":"        subnet \u003d self.create_subnet(network, gateway, cidr, mask_bits,"},{"line_number":100,"context_line":"                                    **(subnet_kwargs or {}))"},{"line_number":101,"context_line":"        self._compare_resource_attrs(subnet, compare_args)"},{"line_number":102,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"},{"line_number":103,"context_line":"        self._delete_network(net_id)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_51542421","line":101,"updated":"2014-07-29 06:47:13.000000000","message":"compare_args is redundant as input. Notice that it almost always equals subnet_kwargs. maybe you could build it?\nif the names are the problem, please change them accordingly. ie s/gateway/gateway_ip\n\ncompare_args \u003d dict(network, gateway, cidr, mask_bits, subnet_kwargs)","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":99,"context_line":"        subnet \u003d self.create_subnet(network, gateway, cidr, mask_bits,"},{"line_number":100,"context_line":"                                    **(subnet_kwargs or {}))"},{"line_number":101,"context_line":"        self._compare_resource_attrs(subnet, compare_args)"},{"line_number":102,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"},{"line_number":103,"context_line":"        self._delete_network(net_id)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_8d056017","line":101,"in_reply_to":"baada198_51542421","updated":"2014-07-30 15:04:21.000000000","message":"Done","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        resp, body \u003d self.client.update_network(net_id, name\u003dnew_name)"},{"line_number":116,"context_line":"        self.assertEqual(\u0027200\u0027, resp[\u0027status\u0027])"},{"line_number":117,"context_line":"        updated_net \u003d body[\u0027network\u0027]"},{"line_number":118,"context_line":"        self._compare_resource_attrs(updated_net, {\u0027name\u0027: new_name})"},{"line_number":119,"context_line":"        # Find a cidr that is not in use yet and create a subnet with it"},{"line_number":120,"context_line":"        subnet \u003d self.create_subnet(network)"},{"line_number":121,"context_line":"        subnet_id \u003d subnet[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_fc08af28","line":118,"updated":"2014-07-29 06:47:13.000000000","message":"why this change?","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        resp, body \u003d self.client.update_network(net_id, name\u003dnew_name)"},{"line_number":116,"context_line":"        self.assertEqual(\u0027200\u0027, resp[\u0027status\u0027])"},{"line_number":117,"context_line":"        updated_net \u003d body[\u0027network\u0027]"},{"line_number":118,"context_line":"        self._compare_resource_attrs(updated_net, {\u0027name\u0027: new_name})"},{"line_number":119,"context_line":"        # Find a cidr that is not in use yet and create a subnet with it"},{"line_number":120,"context_line":"        subnet \u003d self.create_subnet(network)"},{"line_number":121,"context_line":"        subnet_id \u003d subnet[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_4685e5cd","line":118,"in_reply_to":"baada198_fc08af28","updated":"2014-07-30 15:04:21.000000000","message":"reverted","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        resp, body \u003d self.client.update_subnet(subnet_id, name\u003dnew_name)"},{"line_number":125,"context_line":"        self.assertEqual(\u0027200\u0027, resp[\u0027status\u0027])"},{"line_number":126,"context_line":"        updated_subnet \u003d body[\u0027subnet\u0027]"},{"line_number":127,"context_line":"        self._compare_resource_attrs(updated_subnet, {\u0027name\u0027: new_name})"},{"line_number":128,"context_line":"        # Delete subnet and network"},{"line_number":129,"context_line":"        self._delete_subnet(subnet_id)"},{"line_number":130,"context_line":"        self._delete_network(net_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_1c13a35c","line":127,"updated":"2014-07-29 06:47:13.000000000","message":"why this change?","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        resp, body \u003d self.client.update_subnet(subnet_id, name\u003dnew_name)"},{"line_number":125,"context_line":"        self.assertEqual(\u0027200\u0027, resp[\u0027status\u0027])"},{"line_number":126,"context_line":"        updated_subnet \u003d body[\u0027subnet\u0027]"},{"line_number":127,"context_line":"        self._compare_resource_attrs(updated_subnet, {\u0027name\u0027: new_name})"},{"line_number":128,"context_line":"        # Delete subnet and network"},{"line_number":129,"context_line":"        self._delete_subnet(subnet_id)"},{"line_number":130,"context_line":"        self._delete_network(net_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_86661d54","line":127,"in_reply_to":"baada198_1c13a35c","updated":"2014-07-30 15:04:21.000000000","message":"reverted","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"dadad39ecb666d6c7d12fa74f38913ca87d82b77","unresolved":false,"context_lines":[{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":263,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"},{"line_number":264,"context_line":"        start \u003d \u002710.100.0.3\u0027"},{"line_number":265,"context_line":"        end \u003d \u002710.100.0.4\u0027"},{"line_number":266,"context_line":"        allocation_pools \u003d [{\u0027start\u0027: start, \u0027end\u0027: end}]"},{"line_number":267,"context_line":"        kwargs \u003d {\u0027allocation_pools\u0027: allocation_pools}"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_692060b0","line":264,"updated":"2014-07-29 06:47:13.000000000","message":"could you set these addresses as a series of module constants? they are being copy-pasted all across this module","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"0a8f977266369e8256692c5f666bf5f83e058f3a","unresolved":false,"context_lines":[{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":263,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"},{"line_number":264,"context_line":"        start \u003d \u002710.100.0.3\u0027"},{"line_number":265,"context_line":"        end \u003d \u002710.100.0.4\u0027"},{"line_number":266,"context_line":"        allocation_pools \u003d [{\u0027start\u0027: start, \u0027end\u0027: end}]"},{"line_number":267,"context_line":"        kwargs \u003d {\u0027allocation_pools\u0027: allocation_pools}"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_4015c63b","line":264,"in_reply_to":"baada198_692060b0","updated":"2014-07-30 15:04:21.000000000","message":"Done","commit_id":"6b022557d024ffe6021c104de4e9780b09dac998"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d config.CONF"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"GATEWAY \u003d \u002710.100.0.13\u0027"},{"line_number":28,"context_line":"ALLOCATION_POOLS \u003d [{\u0027start\u0027: \u002710.100.0.3\u0027, \u0027end\u0027: \u002710.100.0.4\u0027}]"},{"line_number":29,"context_line":"DNS_NAMESERVERS \u003d [\u00278.8.4.4\u0027, \u00278.8.8.8\u0027]"},{"line_number":30,"context_line":"HOST_ROUTES \u003d [{\u0027destination\u0027: \u002710.20.0.0/32\u0027, \u0027nexthop\u0027: \u002710.100.1.1\u0027}]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2ec7aa47","line":27,"updated":"2014-08-03 06:20:04.000000000","message":"nit: I\u0027d make these into 2 nested dicts, should make the code more generic\n\nOnce you\u0027ve done that, simply add an matching key value to the class (like \"_ip_version\" and \"_interface\") and then  most of the overriding methods of NetworksIpV6TestJSON would not need to be implemented specifically, as they only differ in the value of the arguments passed to the helper methods","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        # Remove subnet from cleanup list"},{"line_number":89,"context_line":"        self.subnets.pop()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":92,"context_line":"        if \u0027dns_nameservers\u0027 in set(resource).intersection(attrs):"},{"line_number":93,"context_line":"            self.assertEqual(sorted(resource[\u0027dns_nameservers\u0027]),"},{"line_number":94,"context_line":"                          sorted(attrs[\u0027dns_nameservers\u0027]))"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_7fa5ca9d","line":91,"updated":"2014-08-03 06:20:04.000000000","message":"see comment on previous patch","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        # Remove subnet from cleanup list"},{"line_number":89,"context_line":"        self.subnets.pop()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":92,"context_line":"        if \u0027dns_nameservers\u0027 in set(resource).intersection(attrs):"},{"line_number":93,"context_line":"            self.assertEqual(sorted(resource[\u0027dns_nameservers\u0027]),"},{"line_number":94,"context_line":"                          sorted(attrs[\u0027dns_nameservers\u0027]))"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_cfdf88d5","line":91,"in_reply_to":"baada198_7fa5ca9d","updated":"2014-08-06 05:13:57.000000000","message":"I wont be able to assert for dns_nameservers in individual dns tests because we use a single method to _create_verify_delete_subnet, wherein i cannot access the subnet in individual tests due to that.\n\nhence i am putting the dns check in _create_verify_delete_subnet method","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"c82579fc005d9f026f80b86fc21cd5ec17eed1af","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _create_network(self, name\u003dNone):"},{"line_number":102,"context_line":"        if name is None:"},{"line_number":103,"context_line":"            name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":104,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_5a12b861","line":101,"updated":"2014-08-01 13:03:11.000000000","message":"There\u0027s already a method in api/network/base.py called create_network that does that.\n\nCould you use it instead ?","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _create_network(self, name\u003dNone):"},{"line_number":102,"context_line":"        if name is None:"},{"line_number":103,"context_line":"            name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":104,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_4fa618c1","line":101,"in_reply_to":"baada198_5a12b861","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":114,"context_line":"        subnet \u003d self.create_subnet(network, gateway_ip, cidr, mask_bits,"},{"line_number":115,"context_line":"                                    **kwargs)"},{"line_number":116,"context_line":"        compare_args \u003d dict(gateway_ip\u003dgateway_ip or subnet[\u0027gateway_ip\u0027],"},{"line_number":117,"context_line":"                            cidr\u003dcidr or subnet[\u0027cidr\u0027], **kwargs)"},{"line_number":118,"context_line":"        self._compare_resource_attrs(subnet, compare_args)"},{"line_number":119,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_7a1238fe","line":116,"updated":"2014-08-03 06:20:04.000000000","message":"I\u0027m not sure this is doing what you wanted. The \"or\" conditions here make this a little ambiguous to me, especially when used in argument assignment. besides - comparing \"subnet\" against values taken from subnet seems a little weird to me.\n\nI think compare_args should just be:\n\ncompare_args_full\u003ddict(gateway_ip\u003dgateway_ip, cidr\u003dcidr, mask_bits\u003dmask_bits, **kwargs)\ncompare_args \u003d {k:v for k,v in comare_args_full.iteritems() if v is not None}","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":114,"context_line":"        subnet \u003d self.create_subnet(network, gateway_ip, cidr, mask_bits,"},{"line_number":115,"context_line":"                                    **kwargs)"},{"line_number":116,"context_line":"        compare_args \u003d dict(gateway_ip\u003dgateway_ip or subnet[\u0027gateway_ip\u0027],"},{"line_number":117,"context_line":"                            cidr\u003dcidr or subnet[\u0027cidr\u0027], **kwargs)"},{"line_number":118,"context_line":"        self._compare_resource_attrs(subnet, compare_args)"},{"line_number":119,"context_line":"        self._delete_subnet(subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2ff00465","line":116,"in_reply_to":"baada198_7a1238fe","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"c82579fc005d9f026f80b86fc21cd5ec17eed1af","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":123,"context_line":"    def test_create_update_delete_network_subnet(self):"},{"line_number":124,"context_line":"        # Create a network"},{"line_number":125,"context_line":"        name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":126,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"},{"line_number":127,"context_line":"        self.assertEqual(\u0027201\u0027, resp[\u0027status\u0027])"},{"line_number":128,"context_line":"        network \u003d body[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_35527512","line":125,"updated":"2014-08-01 13:03:11.000000000","message":"This is taken care of here : https://review.openstack.org/#/c/100086/\n\nI\u0027d rather see a patch that fixes this once and for all everywhere.","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":123,"context_line":"    def test_create_update_delete_network_subnet(self):"},{"line_number":124,"context_line":"        # Create a network"},{"line_number":125,"context_line":"        name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":126,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"},{"line_number":127,"context_line":"        self.assertEqual(\u0027201\u0027, resp[\u0027status\u0027])"},{"line_number":128,"context_line":"        network \u003d body[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_ef760cd4","line":125,"in_reply_to":"baada198_35527512","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"c82579fc005d9f026f80b86fc21cd5ec17eed1af","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":242,"context_line":"    def test_delete_network_with_subnet(self):"},{"line_number":243,"context_line":"        # Creates a network"},{"line_number":244,"context_line":"        name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":245,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"},{"line_number":246,"context_line":"        self.assertEqual(\u0027201\u0027, resp[\u0027status\u0027])"},{"line_number":247,"context_line":"        network \u003d body[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_956341dc","line":244,"updated":"2014-08-01 13:03:11.000000000","message":"ditto","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":242,"context_line":"    def test_delete_network_with_subnet(self):"},{"line_number":243,"context_line":"        # Creates a network"},{"line_number":244,"context_line":"        name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":245,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"},{"line_number":246,"context_line":"        self.assertEqual(\u0027201\u0027, resp[\u0027status\u0027])"},{"line_number":247,"context_line":"        network \u003d body[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_ef4d2c94","line":244,"in_reply_to":"baada198_956341dc","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":273,"context_line":"    def test_create_delete_subnet_without_gw(self):"},{"line_number":274,"context_line":"        self._create_verify_delete_subnet()"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":277,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_fa0c8895","line":274,"updated":"2014-08-03 06:20:04.000000000","message":"what exactly are you checking here? I think this requires a docstring. maybe you should explicitly check that subnet[\u0027gateway\u0027] is empty? or set to some kind of default? what is the definition? right now your verify method isn\u0027t checking for arguments that are set to None, so you aren\u0027t verifying anything here except for return code.\n\n\nThe create_subnet method has a default GW, so unless you find a way to bypass it and force a None value to gateway and verify default behavior, I suggest you drop this method as it has no added value on the previous one. There is no difference between verifying your value, or the tempest default one.","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":273,"context_line":"    def test_create_delete_subnet_without_gw(self):"},{"line_number":274,"context_line":"        self._create_verify_delete_subnet()"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":277,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_cab3f64b","line":274,"in_reply_to":"baada198_fa0c8895","updated":"2014-08-06 05:13:57.000000000","message":"Removed the method.","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":277,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"},{"line_number":278,"context_line":"        kwargs \u003d {\u0027allocation_pools\u0027: ALLOCATION_POOLS}"},{"line_number":279,"context_line":"        self._create_verify_delete_subnet(**kwargs)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_ff355a45","line":278,"updated":"2014-08-03 06:20:04.000000000","message":"you don\u0027t need this line. see my next comment","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":276,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":277,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"},{"line_number":278,"context_line":"        kwargs \u003d {\u0027allocation_pools\u0027: ALLOCATION_POOLS}"},{"line_number":279,"context_line":"        self._create_verify_delete_subnet(**kwargs)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":282,"context_line":"    def test_create_delete_subnet_with_gw_and_allocation_pools(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_1f23ee06","line":279,"updated":"2014-08-03 06:20:04.000000000","message":"s/**kwargs/allocation_pools\u003dALLOCATION_POOLS","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":276,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":277,"context_line":"    def test_create_delete_subnet_with_allocation_pools(self):"},{"line_number":278,"context_line":"        kwargs \u003d {\u0027allocation_pools\u0027: ALLOCATION_POOLS}"},{"line_number":279,"context_line":"        self._create_verify_delete_subnet(**kwargs)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":282,"context_line":"    def test_create_delete_subnet_with_gw_and_allocation_pools(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_4a7d261d","line":279,"in_reply_to":"baada198_1f23ee06","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":282,"context_line":"    def test_create_delete_subnet_with_gw_and_allocation_pools(self):"},{"line_number":283,"context_line":"        kwargs \u003d {\u0027allocation_pools\u0027: ALLOCATION_POOLS}"},{"line_number":284,"context_line":"        self._create_verify_delete_subnet(gateway_ip\u003dGATEWAY, **kwargs)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":287,"context_line":"    def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_5f1d66bd","line":284,"updated":"2014-08-03 06:20:04.000000000","message":"same here","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":282,"context_line":"    def test_create_delete_subnet_with_gw_and_allocation_pools(self):"},{"line_number":283,"context_line":"        kwargs \u003d {\u0027allocation_pools\u0027: ALLOCATION_POOLS}"},{"line_number":284,"context_line":"        self._create_verify_delete_subnet(gateway_ip\u003dGATEWAY, **kwargs)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":287,"context_line":"    def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_8a7ade22","line":284,"in_reply_to":"baada198_5f1d66bd","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self):"},{"line_number":288,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: HOST_ROUTES,"},{"line_number":289,"context_line":"                  \u0027dns_nameservers\u0027: DNS_NAMESERVERS}"},{"line_number":290,"context_line":"        self._create_verify_delete_subnet(**kwargs)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":293,"context_line":"    def test_create_delete_subnet_with_dhcp_enabled(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_7ac0784a","line":290,"updated":"2014-08-03 06:20:04.000000000","message":"and here","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self):"},{"line_number":288,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: HOST_ROUTES,"},{"line_number":289,"context_line":"                  \u0027dns_nameservers\u0027: DNS_NAMESERVERS}"},{"line_number":290,"context_line":"        self._create_verify_delete_subnet(**kwargs)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":293,"context_line":"    def test_create_delete_subnet_with_dhcp_enabled(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_aa9c025c","line":290,"in_reply_to":"baada198_7ac0784a","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":293,"context_line":"    def test_create_delete_subnet_with_dhcp_enabled(self):"},{"line_number":294,"context_line":"        kwargs \u003d {\u0027enable_dhcp\u0027: True}"},{"line_number":295,"context_line":"        self._create_verify_delete_subnet(**kwargs)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":298,"context_line":"    def test_update_subnet_gw_dns_host_routes_dhcp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_faaba885","line":295,"updated":"2014-08-03 06:20:04.000000000","message":"and here","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":293,"context_line":"    def test_create_delete_subnet_with_dhcp_enabled(self):"},{"line_number":294,"context_line":"        kwargs \u003d {\u0027enable_dhcp\u0027: True}"},{"line_number":295,"context_line":"        self._create_verify_delete_subnet(**kwargs)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":298,"context_line":"    def test_update_subnet_gw_dns_host_routes_dhcp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_2ab8f2c5","line":295,"in_reply_to":"baada198_faaba885","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":298,"context_line":"    def test_update_subnet_gw_dns_host_routes_dhcp(self):"},{"line_number":299,"context_line":"        network \u003d self._create_network()"},{"line_number":300,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":301,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: HOST_ROUTES,"},{"line_number":302,"context_line":"                  \u0027dns_nameservers\u0027: DNS_NAMESERVERS}"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        subnet \u003d self.create_subnet(network, GATEWAY, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_5a9c946a","line":301,"updated":"2014-08-03 06:20:04.000000000","message":"and here","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":298,"context_line":"    def test_update_subnet_gw_dns_host_routes_dhcp(self):"},{"line_number":299,"context_line":"        network \u003d self._create_network()"},{"line_number":300,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":301,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: HOST_ROUTES,"},{"line_number":302,"context_line":"                  \u0027dns_nameservers\u0027: DNS_NAMESERVERS}"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        subnet \u003d self.create_subnet(network, GATEWAY, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_4aab6670","line":301,"in_reply_to":"baada198_5a9c946a","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        kwargs \u003d {\u0027host_routes\u0027: HOST_ROUTES,"},{"line_number":329,"context_line":"                  \u0027dns_nameservers\u0027: DNS_NAMESERVERS,"},{"line_number":330,"context_line":"                  \u0027enable_dhcp\u0027: True}"},{"line_number":331,"context_line":"        self._create_verify_delete_subnet(gateway_ip\u003dGATEWAY, **kwargs)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"class NetworksTestXML(NetworksTestJSON):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_da7fc415","line":331,"updated":"2014-08-03 06:20:04.000000000","message":"and here","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"c82579fc005d9f026f80b86fc21cd5ec17eed1af","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":391,"context_line":"    def test_bulk_create_delete_network(self):"},{"line_number":392,"context_line":"        # Creates 2 networks in one request"},{"line_number":393,"context_line":"        network_names \u003d [data_utils.rand_name(\u0027network\u0027),"},{"line_number":394,"context_line":"                         data_utils.rand_name(\u0027network\u0027)]"},{"line_number":395,"context_line":"        resp, body \u003d self.client.create_bulk_network(2, network_names)"},{"line_number":396,"context_line":"        created_networks \u003d body[\u0027networks\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_15ed7125","line":393,"updated":"2014-08-01 13:03:11.000000000","message":"ditto","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"4089e0e3916efae3f89224653b1d366ef277dfa6","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":391,"context_line":"    def test_bulk_create_delete_network(self):"},{"line_number":392,"context_line":"        # Creates 2 networks in one request"},{"line_number":393,"context_line":"        network_names \u003d [data_utils.rand_name(\u0027network\u0027),"},{"line_number":394,"context_line":"                         data_utils.rand_name(\u0027network\u0027)]"},{"line_number":395,"context_line":"        resp, body \u003d self.client.create_bulk_network(2, network_names)"},{"line_number":396,"context_line":"        created_networks \u003d body[\u0027networks\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_8a949e8c","line":393,"in_reply_to":"baada198_15ed7125","updated":"2014-08-06 05:13:57.000000000","message":"Done","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"9b10d09920a048d7fe87c575af704e0b7c21df75","unresolved":false,"context_lines":[{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":484,"context_line":"    def test_create_delete_subnet_without_gw(self):"},{"line_number":485,"context_line":"        self._create_verify_delete_subnet()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    @testtools.skipUnless(CONF.network_feature_enabled.ipv6_subnet_attributes,"},{"line_number":488,"context_line":"                          \"IPv6 extended attributes for subnets not \""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_da098485","line":485,"updated":"2014-08-03 06:20:04.000000000","message":"see my comment on the v4 method","commit_id":"9988255299b74c1b5417589b8648570d190977a9"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"7ac3d031d586dcfe0084dce0d8e2ac4dd3d96df0","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d config.CONF"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"SUBNET_DATA \u003d {6: {\u0027gateway\u0027: \u00272003::1\u0027,"},{"line_number":28,"context_line":"                   \u0027allocation_pools\u0027: [{\u0027start\u0027: \u00272003::7\u0027,"},{"line_number":29,"context_line":"                                         \u0027end\u0027: \u00272003::9\u0027}],"},{"line_number":30,"context_line":"                   \u0027dns_nameservers\u0027: [\u00272001:4860:4860::8844\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_ecec01f7","line":27,"updated":"2014-08-07 08:46:46.000000000","message":"so these addresses need to match CONF.network values.\nI suggest creating them dynamically as part fo setUpClass\n\nIn general, hard coding values is always bad practice","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"2a03b4752cce2997ca8ff922aa9932c0ab6a44fc","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d config.CONF"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"SUBNET_DATA \u003d {6: {\u0027gateway\u0027: \u00272003::1\u0027,"},{"line_number":28,"context_line":"                   \u0027allocation_pools\u0027: [{\u0027start\u0027: \u00272003::7\u0027,"},{"line_number":29,"context_line":"                                         \u0027end\u0027: \u00272003::9\u0027}],"},{"line_number":30,"context_line":"                   \u0027dns_nameservers\u0027: [\u00272001:4860:4860::8844\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_6e443b9f","line":27,"in_reply_to":"baada198_ecec01f7","updated":"2014-08-08 10:25:34.000000000","message":"Done","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"7ac3d031d586dcfe0084dce0d8e2ac4dd3d96df0","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        cls.name \u003d cls.network[\u0027name\u0027]"},{"line_number":81,"context_line":"        cls.subnet \u003d cls.create_subnet(cls.network)"},{"line_number":82,"context_line":"        cls.cidr \u003d cls.subnet[\u0027cidr\u0027]"},{"line_number":83,"context_line":"        cls.subnet_data \u003d SUBNET_DATA[cls._ip_version]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _delete_network(self, network_id):"},{"line_number":86,"context_line":"        resp, body \u003d self.client.delete_network(network_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_0ce855de","line":83,"updated":"2014-08-07 08:46:46.000000000","message":"this might be over complication, but since you are \"cherry picking\" values from this dict all across this module, I\u0027d suggest a method that accepts a list of keys and returns a subdict accordingly.\n\nthat way you could do:\nself.create_subnet(**self.subdict([\u0027gateway_ip\u0027,\u0027allocation_pool\u0027]))","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"2a03b4752cce2997ca8ff922aa9932c0ab6a44fc","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        cls.name \u003d cls.network[\u0027name\u0027]"},{"line_number":81,"context_line":"        cls.subnet \u003d cls.create_subnet(cls.network)"},{"line_number":82,"context_line":"        cls.cidr \u003d cls.subnet[\u0027cidr\u0027]"},{"line_number":83,"context_line":"        cls.subnet_data \u003d SUBNET_DATA[cls._ip_version]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _delete_network(self, network_id):"},{"line_number":86,"context_line":"        resp, body \u003d self.client.delete_network(network_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_6eb52231","line":83,"in_reply_to":"baada198_0ce855de","updated":"2014-08-08 10:25:34.000000000","message":"Done","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"7ac3d031d586dcfe0084dce0d8e2ac4dd3d96df0","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # Remove subnet from cleanup list"},{"line_number":94,"context_line":"        self.subnets.pop()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":97,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_ec724111","line":96,"updated":"2014-08-07 08:46:46.000000000","message":"how about this:\n\ntrimmed_resrouce \u003d dict((k,v) for k,v in resource.iteritems() if k in attrs)\nself.assertDict(trimmed_resrouce, attr)\n\nyou still compare 2 full dicts instead of failing on a single value","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"2a03b4752cce2997ca8ff922aa9932c0ab6a44fc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # Remove subnet from cleanup list"},{"line_number":94,"context_line":"        self.subnets.pop()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":97,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_dc67bdea","line":96,"in_reply_to":"baada198_ec724111","updated":"2014-08-08 10:25:34.000000000","message":"Done","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"7ac3d031d586dcfe0084dce0d8e2ac4dd3d96df0","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.subnets.pop()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":97,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_ac4f69be","line":97,"updated":"2014-08-07 08:46:46.000000000","message":"so now this is exactly subdict assertion. If it\u0027s being deprecated, isn\u0027t there a replacement? if not, would you care to implement this on common/custom_matchers, like done here? https://review.openstack.org/#/c/112115/4","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"2a03b4752cce2997ca8ff922aa9932c0ab6a44fc","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.subnets.pop()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":97,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_fc6c81d1","line":97,"in_reply_to":"baada198_ac4f69be","updated":"2014-08-08 10:25:34.000000000","message":"Done","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"7ac3d031d586dcfe0084dce0d8e2ac4dd3d96df0","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":97,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _create_verify_delete_subnet(self, gateway_ip\u003dNone, cidr\u003dNone,"},{"line_number":102,"context_line":"                                     mask_bits\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_4cd24d34","line":99,"updated":"2014-08-07 08:46:46.000000000","message":"I\u0027m worried about the log output of this fail because you are asserting each value alone.\nsee my suggestion above","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"2a03b4752cce2997ca8ff922aa9932c0ab6a44fc","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":97,"context_line":"        for k, v in attrs.iteritems():"},{"line_number":98,"context_line":"            if k in resource:"},{"line_number":99,"context_line":"                self.assertEqual(resource[k], v)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _create_verify_delete_subnet(self, gateway_ip\u003dNone, cidr\u003dNone,"},{"line_number":102,"context_line":"                                     mask_bits\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_1c65b5e1","line":99,"in_reply_to":"baada198_4cd24d34","updated":"2014-08-08 10:25:34.000000000","message":"Done","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"7ac3d031d586dcfe0084dce0d8e2ac4dd3d96df0","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                    **kwargs)"},{"line_number":107,"context_line":"        compare_args_full \u003d dict(gateway_ip\u003dgateway_ip, cidr\u003dcidr,"},{"line_number":108,"context_line":"                               mask_bits\u003dmask_bits, **kwargs)"},{"line_number":109,"context_line":"        compare_args \u003d {k: v for k, v in compare_args_full.iteritems()"},{"line_number":110,"context_line":"                        if v is not None}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if \u0027dns_nameservers\u0027 in set(subnet).intersection(compare_args):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_0c6db567","line":109,"updated":"2014-08-07 08:46:46.000000000","message":"I think I\u0027ve stirred you wrong. dict comprehension is only available on python 2.7 http://stackoverflow.com/questions/1747817/python-create-a-dictionary-with-list-comprehension\n\nthis should work for both:\n dict((k, v) for k, v in compare_args_full.iteritems() if v is not None)\n\n\napologies","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"2a03b4752cce2997ca8ff922aa9932c0ab6a44fc","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                    **kwargs)"},{"line_number":107,"context_line":"        compare_args_full \u003d dict(gateway_ip\u003dgateway_ip, cidr\u003dcidr,"},{"line_number":108,"context_line":"                               mask_bits\u003dmask_bits, **kwargs)"},{"line_number":109,"context_line":"        compare_args \u003d {k: v for k, v in compare_args_full.iteritems()"},{"line_number":110,"context_line":"                        if v is not None}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if \u0027dns_nameservers\u0027 in set(subnet).intersection(compare_args):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_aeebb310","line":109,"in_reply_to":"baada198_0c6db567","updated":"2014-08-08 10:25:34.000000000","message":"Done","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"7ac3d031d586dcfe0084dce0d8e2ac4dd3d96df0","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            network, self.subnet_data[\u0027gateway\u0027],"},{"line_number":300,"context_line":"            host_routes\u003dself.subnet_data[\u0027host_routes\u0027],"},{"line_number":301,"context_line":"            dns_nameservers\u003dself.subnet_data[\u0027dns_nameservers\u0027],"},{"line_number":302,"context_line":"            allocation_pools\u003dself.subnet_data[\u0027allocation_pools\u0027])"},{"line_number":303,"context_line":"        subnet_id \u003d subnet[\u0027id\u0027]"},{"line_number":304,"context_line":"        # Verify subnet update"},{"line_number":305,"context_line":"        if self._ip_version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_e7b41a38","line":302,"updated":"2014-08-07 08:46:46.000000000","message":"see comment on L83","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"2a03b4752cce2997ca8ff922aa9932c0ab6a44fc","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            network, self.subnet_data[\u0027gateway\u0027],"},{"line_number":300,"context_line":"            host_routes\u003dself.subnet_data[\u0027host_routes\u0027],"},{"line_number":301,"context_line":"            dns_nameservers\u003dself.subnet_data[\u0027dns_nameservers\u0027],"},{"line_number":302,"context_line":"            allocation_pools\u003dself.subnet_data[\u0027allocation_pools\u0027])"},{"line_number":303,"context_line":"        subnet_id \u003d subnet[\u0027id\u0027]"},{"line_number":304,"context_line":"        # Verify subnet update"},{"line_number":305,"context_line":"        if self._ip_version \u003d\u003d 4:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_ceec672b","line":302,"in_reply_to":"baada198_e7b41a38","updated":"2014-08-08 10:25:34.000000000","message":"Done","commit_id":"e93ce9dd465adc5dceaf750a841583dce4a4f3b3"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"86eec8548d231251a75e55899cab7ce7a45cd8db","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        subnet_id \u003d subnet[\u0027id\u0027]"},{"line_number":329,"context_line":"        # Verify subnet update"},{"line_number":330,"context_line":"        if self._ip_version \u003d\u003d 4:"},{"line_number":331,"context_line":"            new_gateway \u003d str(netaddr.IPAddress("},{"line_number":332,"context_line":"                              self._subnet_data[self._ip_version][\u0027gateway\u0027])"},{"line_number":333,"context_line":"                              + 1)"},{"line_number":334,"context_line":"            new_host_routes \u003d [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_7f33dc60","line":331,"updated":"2014-08-10 14:03:19.000000000","message":"this line is exactly the same as L339.\nplease take them outside the \"if\" blocks, to avoid code duplication","commit_id":"a47cd8f004c2a12625049c8926c974aabdcfaf6a"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"86eec8548d231251a75e55899cab7ce7a45cd8db","unresolved":false,"context_lines":[{"line_number":331,"context_line":"            new_gateway \u003d str(netaddr.IPAddress("},{"line_number":332,"context_line":"                              self._subnet_data[self._ip_version][\u0027gateway\u0027])"},{"line_number":333,"context_line":"                              + 1)"},{"line_number":334,"context_line":"            new_host_routes \u003d [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"},{"line_number":335,"context_line":"                                \u0027nexthop\u0027: \u002710.100.1.2\u0027}]"},{"line_number":336,"context_line":"            new_dns_nameservers \u003d [\u00277.8.8.8\u0027, \u00277.8.4.4\u0027]"},{"line_number":337,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_3f14049e","line":334,"updated":"2014-08-10 14:03:19.000000000","message":"why aren\u0027t these values in the self._subnet_data dict? Let\u0027s confine the hard coded values to a single place.","commit_id":"a47cd8f004c2a12625049c8926c974aabdcfaf6a"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1f56484cc64a36cee17037d654f378805b1ab8c9","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self.subnets.pop()"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":237,"context_line":"    def test_create_delete_subnet_without_gw(self):"},{"line_number":238,"context_line":"        net \u003d netaddr.IPNetwork(CONF.network.tenant_network_cidr)"},{"line_number":239,"context_line":"        gateway_ip \u003d str(netaddr.IPAddress(net.first + 1))"},{"line_number":240,"context_line":"        name \u003d data_utils.rand_name(\u0027network-\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_f31ee074","side":"PARENT","line":237,"updated":"2014-08-13 01:02:59.000000000","message":"We should have this test also by switching the gateway ip between IPv4 nd IPv6 (1 way is using class variable).","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"34e6d684892cc3f92e77bec36a7aa7efe8ee2956","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self.subnets.pop()"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":237,"context_line":"    def test_create_delete_subnet_without_gw(self):"},{"line_number":238,"context_line":"        net \u003d netaddr.IPNetwork(CONF.network.tenant_network_cidr)"},{"line_number":239,"context_line":"        gateway_ip \u003d str(netaddr.IPAddress(net.first + 1))"},{"line_number":240,"context_line":"        name \u003d data_utils.rand_name(\u0027network-\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_2573a750","side":"PARENT","line":237,"in_reply_to":"baada198_f31ee074","updated":"2014-08-13 06:41:42.000000000","message":"As discussed, base class add the default gateway even neutron does the same So no need to add this tests.","commit_id":"b99bcf2e88dc71ad00cd64fa197982525bccbbd7"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"73b7b1d51e5996f09d152b70e15b85241d3f904c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                                str(cls._get_gateway_from_tempest_conf(6)),"},{"line_number":72,"context_line":"                   \u0027allocation_pools\u0027:"},{"line_number":73,"context_line":"                                cls._get_allocation_pools_from_gateway(6),"},{"line_number":74,"context_line":"                   \u0027dns_nameservers\u0027: [\u00272001:4860:4860::8844\u0027,"},{"line_number":75,"context_line":"                                       \u00272001:4860:4860::8888\u0027],"},{"line_number":76,"context_line":"                   \u0027host_routes\u0027: [{\u0027destination\u0027: \u00272001::/64\u0027,"},{"line_number":77,"context_line":"                                    \u0027nexthop\u0027: \u00272003::1\u0027}],"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_a23f0985","line":74,"updated":"2014-08-11 10:37:37.000000000","message":"are you sure these hard coded addresses won\u0027t cause conflict if","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"73b7b1d51e5996f09d152b70e15b85241d3f904c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                                str(cls._get_gateway_from_tempest_conf(6)),"},{"line_number":72,"context_line":"                   \u0027allocation_pools\u0027:"},{"line_number":73,"context_line":"                                cls._get_allocation_pools_from_gateway(6),"},{"line_number":74,"context_line":"                   \u0027dns_nameservers\u0027: [\u00272001:4860:4860::8844\u0027,"},{"line_number":75,"context_line":"                                       \u00272001:4860:4860::8888\u0027],"},{"line_number":76,"context_line":"                   \u0027host_routes\u0027: [{\u0027destination\u0027: \u00272001::/64\u0027,"},{"line_number":77,"context_line":"                                    \u0027nexthop\u0027: \u00272003::1\u0027}],"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_e26bc183","line":74,"updated":"2014-08-11 10:37:37.000000000","message":"are you sure these hard coded addresses won\u0027t cause trouble if CONF.network.tenant_network_mask_bits changes?","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"a6709ea3d67ab2c891eb7f793c56cdd3aad70f7e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                                str(cls._get_gateway_from_tempest_conf(6)),"},{"line_number":72,"context_line":"                   \u0027allocation_pools\u0027:"},{"line_number":73,"context_line":"                                cls._get_allocation_pools_from_gateway(6),"},{"line_number":74,"context_line":"                   \u0027dns_nameservers\u0027: [\u00272001:4860:4860::8844\u0027,"},{"line_number":75,"context_line":"                                       \u00272001:4860:4860::8888\u0027],"},{"line_number":76,"context_line":"                   \u0027host_routes\u0027: [{\u0027destination\u0027: \u00272001::/64\u0027,"},{"line_number":77,"context_line":"                                    \u0027nexthop\u0027: \u00272003::1\u0027}],"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_19ee6721","line":74,"in_reply_to":"baada198_a23f0985","updated":"2014-08-11 12:27:13.000000000","message":"Please see L86 answer","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"a6709ea3d67ab2c891eb7f793c56cdd3aad70f7e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                                str(cls._get_gateway_from_tempest_conf(6)),"},{"line_number":72,"context_line":"                   \u0027allocation_pools\u0027:"},{"line_number":73,"context_line":"                                cls._get_allocation_pools_from_gateway(6),"},{"line_number":74,"context_line":"                   \u0027dns_nameservers\u0027: [\u00272001:4860:4860::8844\u0027,"},{"line_number":75,"context_line":"                                       \u00272001:4860:4860::8888\u0027],"},{"line_number":76,"context_line":"                   \u0027host_routes\u0027: [{\u0027destination\u0027: \u00272001::/64\u0027,"},{"line_number":77,"context_line":"                                    \u0027nexthop\u0027: \u00272003::1\u0027}],"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_39c88ba6","line":74,"in_reply_to":"baada198_e26bc183","updated":"2014-08-11 12:27:13.000000000","message":"Please see L86 answer","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"73b7b1d51e5996f09d152b70e15b85241d3f904c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            4: {\u0027gateway\u0027: str(cls._get_gateway_from_tempest_conf(4)),"},{"line_number":83,"context_line":"                   \u0027allocation_pools\u0027:"},{"line_number":84,"context_line":"                   cls._get_allocation_pools_from_gateway(4),"},{"line_number":85,"context_line":"                   \u0027dns_nameservers\u0027: [\u00278.8.4.4\u0027, \u00278.8.8.8\u0027],"},{"line_number":86,"context_line":"                   \u0027host_routes\u0027: [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"},{"line_number":87,"context_line":"                                    \u0027nexthop\u0027: \u002710.100.1.1\u0027}],"},{"line_number":88,"context_line":"                   \u0027new_host_routes\u0027: [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_226219a7","line":85,"updated":"2014-08-11 10:37:37.000000000","message":"are you sure these hard coded addresses won\u0027t cause trouble if CONF.network.tenant_network_mask_bits changes?","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"a6709ea3d67ab2c891eb7f793c56cdd3aad70f7e","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            4: {\u0027gateway\u0027: str(cls._get_gateway_from_tempest_conf(4)),"},{"line_number":83,"context_line":"                   \u0027allocation_pools\u0027:"},{"line_number":84,"context_line":"                   cls._get_allocation_pools_from_gateway(4),"},{"line_number":85,"context_line":"                   \u0027dns_nameservers\u0027: [\u00278.8.4.4\u0027, \u00278.8.8.8\u0027],"},{"line_number":86,"context_line":"                   \u0027host_routes\u0027: [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"},{"line_number":87,"context_line":"                                    \u0027nexthop\u0027: \u002710.100.1.1\u0027}],"},{"line_number":88,"context_line":"                   \u0027new_host_routes\u0027: [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_59945f8b","line":85,"in_reply_to":"baada198_226219a7","updated":"2014-08-11 12:27:13.000000000","message":"{new}dns_nameservers: These addresses are not dependent on CONF.network.tenant_network_mask_bits, dns_addresses can be any valid ip address.\n\n{new}host_routes: This option related to finding routes to other subnets, this option is not affected by CONF.network.tenant_network_mask_bits.","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"8305fced0f60a8b929761f073ba507b0258ec7fd","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            4: {\u0027gateway\u0027: str(cls._get_gateway_from_tempest_conf(4)),"},{"line_number":83,"context_line":"                   \u0027allocation_pools\u0027:"},{"line_number":84,"context_line":"                   cls._get_allocation_pools_from_gateway(4),"},{"line_number":85,"context_line":"                   \u0027dns_nameservers\u0027: [\u00278.8.4.4\u0027, \u00278.8.8.8\u0027],"},{"line_number":86,"context_line":"                   \u0027host_routes\u0027: [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"},{"line_number":87,"context_line":"                                    \u0027nexthop\u0027: \u002710.100.1.1\u0027}],"},{"line_number":88,"context_line":"                   \u0027new_host_routes\u0027: [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9966f7ba","line":85,"in_reply_to":"baada198_59945f8b","updated":"2014-08-11 12:28:49.000000000","message":"Done","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2a11d4873ca29ba79d838e205a4bb54559d08bec","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            cidr \u003d netaddr.IPNetwork(CONF.network.tenant_network_v6_cidr)"},{"line_number":100,"context_line":"            mask_bits \u003d CONF.network.tenant_network_v6_mask_bits"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        for subnet_cidr in cidr.subnet(mask_bits):"},{"line_number":103,"context_line":"            return netaddr.IPAddress(subnet_cidr) + 1"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_4b6c349d","line":102,"updated":"2014-08-14 10:34:46.000000000","message":"If mask_bits \u003c cidr.prefixlen, then the method returns None and _get_allocation_pools_from_gateway seems to crash\n\nMoreover the following seems equivalent and clearer:\n\n  if mask_bits \u003e\u003d cidr.prefixlen:\n    return netaddr.IPAddress(cidr) + 1\n\nAnd the following avoid _get_allocation_pools_from_gateway crash:\n\n  return netaddr.IPAddress(cidr) + 1","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"48407e3c6eba6fe6e7ad8139de050a39f9b2c4de","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            cidr \u003d netaddr.IPNetwork(CONF.network.tenant_network_v6_cidr)"},{"line_number":100,"context_line":"            mask_bits \u003d CONF.network.tenant_network_v6_mask_bits"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        for subnet_cidr in cidr.subnet(mask_bits):"},{"line_number":103,"context_line":"            return netaddr.IPAddress(subnet_cidr) + 1"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_d1e8f57e","line":102,"in_reply_to":"7ac7a964_4b6c349d","updated":"2014-08-19 14:18:22.000000000","message":"Done","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2a11d4873ca29ba79d838e205a4bb54559d08bec","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        return [{\u0027start\u0027: str(gateway + 2), \u0027end\u0027: str(gateway + 3)}]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def subdict(self, values):"},{"line_number":112,"context_line":"        \"\"\"Return a dict with keys as given list of values\"\"\""},{"line_number":113,"context_line":"        return dict((value, self._subnet_data[self._ip_version][value])"},{"line_number":114,"context_line":"                    for value in values)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_cef3f208","line":112,"updated":"2014-08-14 10:34:46.000000000","message":"the term subdict is ambiguous ... by subdict we should understand \"subnet dict\" but i understand \"subdictionary\"\n\nthe docstring is also invalid as it does not describe that subdict really does","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"48407e3c6eba6fe6e7ad8139de050a39f9b2c4de","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        return [{\u0027start\u0027: str(gateway + 2), \u0027end\u0027: str(gateway + 3)}]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def subdict(self, values):"},{"line_number":112,"context_line":"        \"\"\"Return a dict with keys as given list of values\"\"\""},{"line_number":113,"context_line":"        return dict((value, self._subnet_data[self._ip_version][value])"},{"line_number":114,"context_line":"                    for value in values)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_d1447576","line":112,"in_reply_to":"7ac7a964_cef3f208","updated":"2014-08-19 14:18:22.000000000","message":"Done","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1f56484cc64a36cee17037d654f378805b1ab8c9","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _delete_network(self, network_id):"},{"line_number":117,"context_line":"        resp, body \u003d self.client.delete_network(network_id)"},{"line_number":118,"context_line":"        self.assertEqual(\u0027204\u0027, resp[\u0027status\u0027])"},{"line_number":119,"context_line":"        self.networks.pop()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _delete_subnet(self, subnet_id):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_3371380e","line":118,"updated":"2014-08-13 01:02:59.000000000","message":"Status code check should be at client side.","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"48407e3c6eba6fe6e7ad8139de050a39f9b2c4de","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _delete_network(self, network_id):"},{"line_number":117,"context_line":"        resp, body \u003d self.client.delete_network(network_id)"},{"line_number":118,"context_line":"        self.assertEqual(\u0027204\u0027, resp[\u0027status\u0027])"},{"line_number":119,"context_line":"        self.networks.pop()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _delete_subnet(self, subnet_id):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_27f56b83","line":118,"in_reply_to":"baada198_3371380e","updated":"2014-08-19 14:18:22.000000000","message":"Done","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"44bde6bfb087082103cad3f18b30344544f1e91d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":128,"context_line":"        exclude_keys \u003d set(resource).symmetric_difference(attrs)"},{"line_number":129,"context_line":"        matcher \u003d custom_matchers.MatchesDictExceptForKeys(resource,"},{"line_number":130,"context_line":"                                                           exclude_keys)"},{"line_number":131,"context_line":"        diff \u003d matcher.match(attrs)"},{"line_number":132,"context_line":"        if diff:"},{"line_number":133,"context_line":"            msg \u003d diff.describe()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_ee5fb50c","line":130,"updated":"2014-08-14 20:27:03.000000000","message":"This is not a full review - I\u0027m just jumping in here because I noticed you rebased you change on top of mine :)\n\nThis is not the best way to use custom matchers, you should use an assertThat - it will call the describe a generate a nice message with the diff for you automagically.\n\nSee my example:\nhttps://review.openstack.org/#/c/107562/24/tempest/scenario/test_minimum_basic.py,cm\n\nOr the official docs:\nhttp://testtools.readthedocs.org/en/latest/for-test-authors.html#matchers","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"48407e3c6eba6fe6e7ad8139de050a39f9b2c4de","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def _compare_resource_attrs(self, resource, attrs):"},{"line_number":128,"context_line":"        exclude_keys \u003d set(resource).symmetric_difference(attrs)"},{"line_number":129,"context_line":"        matcher \u003d custom_matchers.MatchesDictExceptForKeys(resource,"},{"line_number":130,"context_line":"                                                           exclude_keys)"},{"line_number":131,"context_line":"        diff \u003d matcher.match(attrs)"},{"line_number":132,"context_line":"        if diff:"},{"line_number":133,"context_line":"            msg \u003d diff.describe()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_67ef63b1","line":130,"in_reply_to":"7ac7a964_ee5fb50c","updated":"2014-08-19 14:18:22.000000000","message":"Done","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2a11d4873ca29ba79d838e205a4bb54559d08bec","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        diff \u003d matcher.match(attrs)"},{"line_number":132,"context_line":"        if diff:"},{"line_number":133,"context_line":"            msg \u003d diff.describe()"},{"line_number":134,"context_line":"            self.assertEqual(msg, \u0027\u0027, msg)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def _create_verify_delete_subnet(self, cidr\u003dNone, mask_bits\u003dNone,"},{"line_number":137,"context_line":"                                     **kwargs):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_aed5d644","line":134,"updated":"2014-08-14 10:34:46.000000000","message":"it should be the following?\n\n self.assertEqual(\u0027\u0027, msg, msg)\n\nand the following seems clearer/cleaner:\n\n  if msg:\n    self.fail(msg)","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2a11d4873ca29ba79d838e205a4bb54559d08bec","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                        if v is not None)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if \u0027dns_nameservers\u0027 in set(subnet).intersection(compare_args):"},{"line_number":149,"context_line":"            self.assertEqual(sorted(subnet[\u0027dns_nameservers\u0027]),"},{"line_number":150,"context_line":"                             sorted(compare_args[\u0027dns_nameservers\u0027]))"},{"line_number":151,"context_line":"            del subnet[\u0027dns_nameservers\u0027], compare_args[\u0027dns_nameservers\u0027]"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_19aa9919","line":149,"updated":"2014-08-14 10:34:46.000000000","message":"iiuc, you should change assertEqual argument order because currently it\u0027s (observed, expected) and it should be (expected, observed)\n\nWhy not using dict.pop instead of dict[] + del dict[]?","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"48407e3c6eba6fe6e7ad8139de050a39f9b2c4de","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                        if v is not None)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if \u0027dns_nameservers\u0027 in set(subnet).intersection(compare_args):"},{"line_number":149,"context_line":"            self.assertEqual(sorted(subnet[\u0027dns_nameservers\u0027]),"},{"line_number":150,"context_line":"                             sorted(compare_args[\u0027dns_nameservers\u0027]))"},{"line_number":151,"context_line":"            del subnet[\u0027dns_nameservers\u0027], compare_args[\u0027dns_nameservers\u0027]"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_e788d3e9","line":149,"in_reply_to":"7ac7a964_19aa9919","updated":"2014-08-19 14:18:22.000000000","message":"Done changes for assertEqual\n\nbtw, I am deleting items from two dictionaries in one line. Hence using \"del\" instead of dict.pop()","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2a11d4873ca29ba79d838e205a4bb54559d08bec","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        resp, body \u003d self.client.create_network(name\u003dname)"},{"line_number":281,"context_line":"        self.assertEqual(\u0027201\u0027, resp[\u0027status\u0027])"},{"line_number":282,"context_line":"        network \u003d body[\u0027network\u0027]"},{"line_number":283,"context_line":"        self.networks.append(network)"},{"line_number":284,"context_line":"        net_id \u003d network[\u0027id\u0027]"},{"line_number":285,"context_line":"        self.addCleanup(self._try_delete_network, net_id)"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_cb7cc475","line":283,"updated":"2014-08-14 10:34:46.000000000","message":"it seems cleaner to use self.create_network + client-side-checks","commit_id":"d7de7403589fe6bd511d85d9a24869dbe7ea3f52"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"6af7186c483515ce6cc11c2aef8d9ab8b5aadabc","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                str(cls._get_gateway_from_tempest_conf(4)),"},{"line_number":86,"context_line":"                                \u0027allocation_pools\u0027:"},{"line_number":87,"context_line":"                                cls._get_allocation_pools_from_gateway(4),"},{"line_number":88,"context_line":"                                \u0027dns_nameservers\u0027: [\u00278.8.4.4\u0027, \u00278.8.8.8\u0027],"},{"line_number":89,"context_line":"                                \u0027host_routes\u0027: [{\u0027destination\u0027: \u002710.20.0.0/32\u0027,"},{"line_number":90,"context_line":"                                                 \u0027nexthop\u0027: \u002710.100.1.1\u0027}],"},{"line_number":91,"context_line":"                                \u0027new_host_routes\u0027: [{\u0027destination\u0027:"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_93cf187f","line":88,"updated":"2014-08-19 20:13:00.000000000","message":"We have a dns_servers config option, but it might be not important for an api test.","commit_id":"0572133e4d1c73c6f4542277dc7dc333e154cd4c"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"36248c6aef3ff12b21be13e3da26e2ba0d7ae6eb","unresolved":false,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def _delete_networks(self, created_networks):"},{"line_number":387,"context_line":"        for n in created_networks:"},{"line_number":388,"context_line":"            resp, body \u003d self.client.delete_network(n[\u0027id\u0027])"},{"line_number":389,"context_line":"        # Asserting that the networks are not found in the list after deletion"},{"line_number":390,"context_line":"        resp, body \u003d self.client.list_networks()"},{"line_number":391,"context_line":"        networks_list \u003d [network[\u0027id\u0027] for network in body[\u0027networks\u0027]]"}],"source_content_type":"text/x-python","patch_set":15,"id":"1abeadc6_54a00643","line":388,"updated":"2014-08-27 07:09:53.000000000","message":"Why was this changed? This resp and body never used.","commit_id":"6406ab25fa63fc50fd4fc36749d1ca6d4c8d3375"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"36248c6aef3ff12b21be13e3da26e2ba0d7ae6eb","unresolved":false,"context_lines":[{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def _delete_subnets(self, created_subnets):"},{"line_number":396,"context_line":"        for n in created_subnets:"},{"line_number":397,"context_line":"            resp, body \u003d self.client.delete_subnet(n[\u0027id\u0027])"},{"line_number":398,"context_line":"        # Asserting that the subnets are not found in the list after deletion"},{"line_number":399,"context_line":"        resp, body \u003d self.client.list_subnets()"},{"line_number":400,"context_line":"        subnets_list \u003d [subnet[\u0027id\u0027] for subnet in body[\u0027subnets\u0027]]"}],"source_content_type":"text/x-python","patch_set":15,"id":"1abeadc6_74ba626f","line":397,"updated":"2014-08-27 07:09:53.000000000","message":"the same","commit_id":"6406ab25fa63fc50fd4fc36749d1ca6d4c8d3375"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"36248c6aef3ff12b21be13e3da26e2ba0d7ae6eb","unresolved":false,"context_lines":[{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def _delete_ports(self, created_ports):"},{"line_number":405,"context_line":"        for n in created_ports:"},{"line_number":406,"context_line":"            resp, body \u003d self.client.delete_port(n[\u0027id\u0027])"},{"line_number":407,"context_line":"        # Asserting that the ports are not found in the list after deletion"},{"line_number":408,"context_line":"        resp, body \u003d self.client.list_ports()"},{"line_number":409,"context_line":"        ports_list \u003d [port[\u0027id\u0027] for port in body[\u0027ports\u0027]]"}],"source_content_type":"text/x-python","patch_set":15,"id":"1abeadc6_b4ab1a1d","line":406,"updated":"2014-08-27 07:09:53.000000000","message":"the same","commit_id":"6406ab25fa63fc50fd4fc36749d1ca6d4c8d3375"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"9466d582dbe5d56e6a83a0f78e1a6f0b68e57995","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            mask_bits \u003d CONF.network.tenant_network_v6_mask_bits"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if mask_bits \u003e\u003d cidr.prefixlen:"},{"line_number":108,"context_line":"            return netaddr.IPAddress(cidr) + 1"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    @classmethod"},{"line_number":111,"context_line":"    def _get_allocation_pools_from_gateway(cls, ip_version):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa98f980_9ae2b1ff","line":108,"updated":"2014-09-10 10:03:04.000000000","message":"The case of\n\n else:\n\nthis internal method returns None.\nThat seems unexpected since line 114.","commit_id":"68cef279f57b6803d6ef4c6ef1840c27a7cc3e07"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"f522411dc08eb0ffa08b05c215b9f1f003f74fc7","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                                 \u0027nexthop\u0027: \u00272003::1\u0027}],"},{"line_number":78,"context_line":"                                \u0027new_host_routes\u0027: [{\u0027destination\u0027:"},{"line_number":79,"context_line":"                                                     \u00272001::/64\u0027,"},{"line_number":80,"context_line":"                                                     \u0027nexthop\u0027: \u00272003::1\u0027}],"},{"line_number":81,"context_line":"                                \u0027new_dns_nameservers\u0027:"},{"line_number":82,"context_line":"                                [\u00272001:4860:4860::7744\u0027,"},{"line_number":83,"context_line":"                                 \u00272001:4860:4860::7888\u0027]},"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa98f980_096c9acf","line":80,"updated":"2014-09-11 08:49:42.000000000","message":"new_host_routes same as host_routes.","commit_id":"c186e7a7458f94ee19b69109e0ce18779f1cb671"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"6f7ad40872fdc39a4f86c8b4b741ece6d269605a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                                 \u0027nexthop\u0027: \u00272003::1\u0027}],"},{"line_number":78,"context_line":"                                \u0027new_host_routes\u0027: [{\u0027destination\u0027:"},{"line_number":79,"context_line":"                                                     \u00272001::/64\u0027,"},{"line_number":80,"context_line":"                                                     \u0027nexthop\u0027: \u00272003::1\u0027}],"},{"line_number":81,"context_line":"                                \u0027new_dns_nameservers\u0027:"},{"line_number":82,"context_line":"                                [\u00272001:4860:4860::7744\u0027,"},{"line_number":83,"context_line":"                                 \u00272001:4860:4860::7888\u0027]},"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa98f980_2201736a","line":80,"in_reply_to":"fa98f980_096c9acf","updated":"2014-09-11 10:22:04.000000000","message":"Done","commit_id":"c186e7a7458f94ee19b69109e0ce18779f1cb671"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"f522411dc08eb0ffa08b05c215b9f1f003f74fc7","unresolved":false,"context_lines":[{"line_number":536,"context_line":"    def test_create_delete_subnet_with_v6_attributes(self):"},{"line_number":537,"context_line":"        self._create_verify_delete_subnet("},{"line_number":538,"context_line":"            gateway\u003dself._subnet_data[self._ip_version][\u0027gateway\u0027],"},{"line_number":539,"context_line":"            ipv6_ra_mode\u003d\u0027slaac\u0027,"},{"line_number":540,"context_line":"            ipv6_address_mode\u003d\u0027slaac\u0027)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa98f980_897ecaad","line":539,"updated":"2014-09-11 08:49:42.000000000","message":"There were some concerns raised earlier in previous patchsets [1][2] mentioning that these testcases are only validating the neutron db.\nOn a personal note, I feel that it should be fine as this is an API test case and the real testing would be done in the Scenario tests.\nHowever, I feel that it would be better if you can include the real-time use-case in your tests like configuring\n- Gateway-IP to be a Link Local Address.\n- Setting ipv6_ra_mode/ipv6_address_mode to dhcpv6-stateful instead of slaac (as host_routes, dns_nameservers would not be used in an SLAAC mode).\n\n[1] - https://review.openstack.org/#/c/93483/4 \nComments from Sean Dague [Patch Set 4]\n[2] - https://review.openstack.org/#/c/93400/1/tempest/api/network/test_networks.py","commit_id":"c186e7a7458f94ee19b69109e0ce18779f1cb671"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"4efa6eaa5925629faf10ae9afd2fa8ce5e2437a3","unresolved":false,"context_lines":[{"line_number":536,"context_line":"    def test_create_delete_subnet_with_v6_attributes(self):"},{"line_number":537,"context_line":"        self._create_verify_delete_subnet("},{"line_number":538,"context_line":"            gateway\u003dself._subnet_data[self._ip_version][\u0027gateway\u0027],"},{"line_number":539,"context_line":"            ipv6_ra_mode\u003d\u0027slaac\u0027,"},{"line_number":540,"context_line":"            ipv6_address_mode\u003d\u0027slaac\u0027)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa98f980_1d1e945f","line":539,"in_reply_to":"fa98f980_627a9b25","updated":"2014-09-11 10:48:39.000000000","message":"That is fine Rohan, no problem.","commit_id":"c186e7a7458f94ee19b69109e0ce18779f1cb671"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"6f7ad40872fdc39a4f86c8b4b741ece6d269605a","unresolved":false,"context_lines":[{"line_number":536,"context_line":"    def test_create_delete_subnet_with_v6_attributes(self):"},{"line_number":537,"context_line":"        self._create_verify_delete_subnet("},{"line_number":538,"context_line":"            gateway\u003dself._subnet_data[self._ip_version][\u0027gateway\u0027],"},{"line_number":539,"context_line":"            ipv6_ra_mode\u003d\u0027slaac\u0027,"},{"line_number":540,"context_line":"            ipv6_address_mode\u003d\u0027slaac\u0027)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa98f980_627a9b25","line":539,"in_reply_to":"fa98f980_897ecaad","updated":"2014-09-11 10:22:04.000000000","message":"I would like to see these real-time use-cases, but these tests were not part of my original patchset in this review and I am waiting for this review to land since long, I would prefer to make your suggested changes  in a separate review/bug. \n\nWhat do you think?","commit_id":"c186e7a7458f94ee19b69109e0ce18779f1cb671"}]}
