)]}'
{"tempest/api/compute/admin/test_auto_allocate_network.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"787340835ac4ac344676c9946e80e1ea8a1ba5f8","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # 1. Disassociate the subnets from the router."},{"line_number":103,"context_line":"        for subnet in network[\u0027subnets\u0027]:"},{"line_number":104,"context_line":"            self.routers_client.remove_router_interface("},{"line_number":105,"context_line":"                router[\u0027id\u0027], subnet_id\u003dsubnet[\u0027id\u0027])"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        # 2. Delete the router."},{"line_number":108,"context_line":"        self.routers_client.delete_router(router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_0ee9397f","line":105,"updated":"2016-06-14 22:02:50.000000000","message":"Hmm, something blowing up here:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/77c974f/console.html#_2016-06-14_17_38_43_763\n\nTypeError: string indices must be integers","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"085589f126168e7eaf86bc55796ad4e3192a2c05","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # 1. Disassociate the subnets from the router."},{"line_number":103,"context_line":"        for subnet in network[\u0027subnets\u0027]:"},{"line_number":104,"context_line":"            self.routers_client.remove_router_interface("},{"line_number":105,"context_line":"                router[\u0027id\u0027], subnet_id\u003dsubnet[\u0027id\u0027])"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        # 2. Delete the router."},{"line_number":108,"context_line":"        self.routers_client.delete_router(router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_a6ba8c6f","line":105,"in_reply_to":"7aa08908_0ee9397f","updated":"2016-06-16 00:47:45.000000000","message":"Oh right network[\u0027subnets\u0027] is a list of uuids:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/77c974f/console.html#_2016-06-14_17_38_43_664\n\n\"subnets\": [\"a22fbe4d-18d9-4143-aeb4-3b6825984ebe\", \"aaf2ae11-a270-480b-aab3-d25d93527687\"]","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6b29756e6ddd0f8988fc6fb93f81f01a2c6b7f86","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_bc333161","line":148,"updated":"2016-06-14 08:10:45.000000000","message":"I think this assert may become problematic and potentially lead to spurious failures if tests are not designed as intended. We had numerous instances of tests that interfere with one another, especially around networking scenarios, and we have been painstakingly going over sanitizing these tests to make the Tempest jobs more reliable. I really don\u0027t like the idea of exposing ourselves to the chance of yet another reason to fail.\n\nThis assert and the assert below on routers add no value to the objective of the test, which should be to verify that you can successfully boot servers with the auto option. The underlying network topology details is none of the test\u0027s concern (e.g. we could change the topology logic and have no routers and this test should still pass). In other words, this is almost too coupled with Neutron.","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e8745120e6a3c4032d664e209dbbd6bd525a3b20","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_616579df","line":148,"in_reply_to":"7aa08908_09302155","updated":"2016-06-14 18:06:12.000000000","message":"The search may indeed be safe, but one can never be sure and I have been burned many times in the past, so consider my plea somewhat biased.\n\nOn the other end, my -1 is about the coupling of this test with the auto-allocated-topology extension implementation. In the future we may want to alter the behavior of this and create different topologies that may or may not involve a router or span multiple networks, and without a lockstep change this would not be possible. In the end, all Nova should care about is that a network is indeed usable to boot a VM on, not the number and nor its name and let alone if there are routers involved.","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e000a77dd7d84d45d2e94317126a7d16ca1f55c3","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_e9495561","line":148,"in_reply_to":"7aa08908_0bb82410","updated":"2016-06-14 17:08:57.000000000","message":"The isolation may be potentially broken by another faulty test, why risk it?\n\nAs for the coupling below, if the intention is to see that you\u0027re indeed leveraging the newly introduced API, assert on line 141 suffices, and nothing else.","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"787340835ac4ac344676c9946e80e1ea8a1ba5f8","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_aea8e520","line":148,"in_reply_to":"7aa08908_616579df","updated":"2016-06-14 22:02:50.000000000","message":"I get the concern about checking the network name and router name given it\u0027s not part of the API contract. I was wondering about that myself.\n\nMaybe what I should do is update the neutron client in tempest to call the auto-allocated-topology API with the tenant ID and assert that the network the instance is associated with is the same that comes back from that API. It\u0027s more work, but something that could be done and then doesn\u0027t depend on the specific name for validation.\n\nI\u0027d still need to do the cleanup stuff based on how things work today I think, otherwise I\u0027m not sure how I\u0027d find the correct router for the tenant, unless someone can guide me on that.","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ffd707523baf45db9ccedc2d9af0a33d1f68e5c8","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_bc301f9f","line":148,"in_reply_to":"7aa08908_aea8e520","updated":"2016-06-14 22:58:21.000000000","message":"I like the idea of checking that the auto-allocated network UUID matches the one associated to the instance, I think it\u0027s worth pursuing.\n\nAs for the cleanup, in [1] we search by name, which is not 100% bulletproof, and now coming to think of it, it probably leaks security groups. Python-neutronclient has a purge command that takes the tenant ID and cleans all of his/her associated resources...too bad it\u0027s client-side orchestration.\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/tests/tempest/api/test_auto_allocated_topology.py#L66","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c26bb3c315560cf397f865bd95be3cd8e88c577","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_e6ae5480","line":148,"in_reply_to":"7aa08908_bc301f9f","updated":"2016-06-16 00:32:40.000000000","message":"Tempest doesn\u0027t leak the default security group because with the dynamic credentials provider it looks for the default secgroup specifically and tries to delete it - which this test was failing on a few patch sets ago because the ports on the servers hadn\u0027t been deleted by nova yet. That\u0027s handled now though.\n\nI\u0027ll poke around with adding the auto-allocated-topology client code to tempest and use that to get the network id and compare to the nw info from the instances.\n\nFor the rest of the teardown in this test though, I have to remove the router interfaces to remove the subnets/ports/network and I don\u0027t know of another way to find that router than by name, so that\u0027s what I\u0027m going to be going with unless there is another option (I guess maybe listing routers for the tenant and if there is only one delete that, but if there are multiple then filter on name?).","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e3e304b0c41385263943bb7f76e4c25499087491","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_0bb82410","line":148,"in_reply_to":"7aa08908_bc333161","updated":"2016-06-14 14:06:30.000000000","message":"This test forces tenant isolation, if that can\u0027t be provided then the test shouldn\u0027t run (I\u0027d have to ask mtreinish to confirm that\u0027s what happens if force_tenant_isolation\u003dTrue can\u0027t be upheld).\n\nThe reason I\u0027m validating the actual networking that\u0027s created is to make sure that nova actually did call neutron\u0027s auto-allocated topology and didn\u0027t just pickup a network some other way than what we expected, it\u0027s really more of a scenario test, but I was told originally to just make it a compute API test.","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"0ce1ca204562e356fb076931f05c021a0c1e0b4f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_09302155","line":148,"in_reply_to":"7aa08908_e9495561","updated":"2016-06-14 17:17:14.000000000","message":"The tenant isolation can\u0027t be easily broken by a faulty test as this is written now. This test will always create a new empty tenant (and user) during setupClass and delete it at tearDownClass, the force_tenant_isolation\u003dTrue flag ensures this. The test will be skipped if this can\u0027t be done (although the only check on this is that admin creds are available, that\u0027s all that\u0027s required) I won\u0027t say it\u0027s impossible because you could write a really bad keystone admin test that deletes tenants from under us. (which we don\u0027t have any of, but it\u0027s possible to do something like that)\n\nThat being said if there are resources outside the tenant scope and being manipulated by multiple tests we could have a shared global state problem. (this happens occasionally) I think this what Armando is getting at, that normal networks are tenant scoped so tenant isolation protects for that. But external and shared networks are outside of a tenant scope (and globally visible) so there is a potential race here with other tests.\n\nI am confused, as is Matt I think, on why the list filter parameters that are being sent at L144 wouldn\u0027t only result in showing tenant scoped networks though. If those filters work I think this assert should be safe","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4a64a1241359c94364048452c14df05b21792137","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":146,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":147,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":148,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":149,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":150,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_69b28507","line":148,"in_reply_to":"7aa08908_e9495561","updated":"2016-06-14 17:13:45.000000000","message":"To be honest, even assert on 141 looks too implementation specific, as the network name is not part of the API contract. The aim of the test IMO should be to try and boot a server when the tenant has no accessible networks, and verify that the server has indeed booted with an interface.\n\nThere is still a danger that some other network is made visible to the tenant in between, and that makes me believe that perhaps a Tempest test might not be that suitable after all.","commit_id":"64501156ef91ed514aeda04f900e0910c8e25a0d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"93425fd00fea637c565bbc1bd995b5778a199d9f","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        # Find the auto-allocated router for the tenant (there should be one)."},{"line_number":102,"context_line":"        # This is a bit hacky since we don\u0027t have a great way to find the"},{"line_number":103,"context_line":"        # auto-allocated router given the private tenant network we have."},{"line_number":104,"context_line":"        routers \u003d self.routers_client.list_routers().get(\u0027routers\u0027, [])"},{"line_number":105,"context_line":"        if len(routers) \u003e 1:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_ae80814a","line":102,"updated":"2016-06-16 15:04:07.000000000","message":"yes, I don\u0027t like it either, but as of now I don\u0027t have any suggestion, rather than try to expose a way to delete the auto-allocated-topology, perhaps by specifying another attribute, a la dry-run...that\u0027s hacky too but at least we would have wrapped the logic all within Neutron.","commit_id":"8973d5d7f2a7192b99be0c7c1d3c85b40b81abaf"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"93425fd00fea637c565bbc1bd995b5778a199d9f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                if router[\u0027name\u0027] \u003d\u003d \u0027auto_allocated_router\u0027:"},{"line_number":110,"context_line":"                    break"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                self.fail(\u0027Unable to find auto-allocated router.\u0027)"},{"line_number":113,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":114,"context_line":"            router \u003d routers[0]"},{"line_number":115,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_2ef811c4","line":112,"updated":"2016-06-16 15:04:07.000000000","message":"as my prior point, if we change the way the topology extension work and no routers are allocated this breaks, and I\u0027d rather not make Neutron enhancements dependent on Tempest.","commit_id":"8973d5d7f2a7192b99be0c7c1d3c85b40b81abaf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c6ed3f7cb3f2f8b2c745d4ff789f98ca786226cf","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                if router[\u0027name\u0027] \u003d\u003d \u0027auto_allocated_router\u0027:"},{"line_number":110,"context_line":"                    break"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                self.fail(\u0027Unable to find auto-allocated router.\u0027)"},{"line_number":113,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":114,"context_line":"            router \u003d routers[0]"},{"line_number":115,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_1e5e1945","line":112,"in_reply_to":"7aa08908_2ef811c4","updated":"2016-06-16 19:03:37.000000000","message":"OK, so the alternative here is if we don\u0027t find a router, we just cross our fingers and hope that the subnets can be deleted. But I\u0027m already allowing that on L117 so I\u0027ll do it here too.","commit_id":"8973d5d7f2a7192b99be0c7c1d3c85b40b81abaf"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"93425fd00fea637c565bbc1bd995b5778a199d9f","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":166,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":167,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":168,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":169,"context_line":"        # verify the single private tenant network is the one that the servers"},{"line_number":170,"context_line":"        # are using also"},{"line_number":171,"context_line":"        self.assertEqual(server_nets[0], nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_43529636","line":168,"updated":"2016-06-16 15:04:07.000000000","message":"with the latest attempt to fix bug #1591766 this will be raceful unless you added an admin_state_up\u003dTrue filter. I am disappointed that you are not ignoring my concern. Can you please tell me what you aim to achieve with this assert, because I am not seeing it.","commit_id":"8973d5d7f2a7192b99be0c7c1d3c85b40b81abaf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c6ed3f7cb3f2f8b2c745d4ff789f98ca786226cf","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":166,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":167,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":168,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":169,"context_line":"        # verify the single private tenant network is the one that the servers"},{"line_number":170,"context_line":"        # are using also"},{"line_number":171,"context_line":"        self.assertEqual(server_nets[0], nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_d9b30b09","line":168,"in_reply_to":"7aa08908_43529636","updated":"2016-06-16 19:03:37.000000000","message":"I\u0027m not trying to ignore your concern. The API is supposed to be atomic though, and the code in Nova is dependent on this. The scenario why is in the Neutron bug report and I could potentially trigger the race failure if I made this min_count\u003e2, i.e. hitting an error of network ambiguity.\n\nI was also thinking that L161 above would fail but I guess the 2nd server would get the network id from the first, even if there was a 2nd network created which was going to be deleted later.\n\nI still worry about the case in the bug, with 3 concurrent requests, the first creates the real (valid) network, the 2nd doesn\u0027t see it and creates a 2nd duplicate network, but the id from the first comes back from the neutron API, but a 3rd request does a listing of tenant private networks and gets both of those networks back, nova will fail with an ambiguous network error.\n\nGranted, this is only on the first attempt to boot *any* number of instances for a specific tenant, after that it shouldn\u0027t be an issue. But I worry about devops CI/CD test runs where people setup a fresh tenant for each run and then burst let\u0027s say 100 servers into it.","commit_id":"8973d5d7f2a7192b99be0c7c1d3c85b40b81abaf"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5117e183ab9cc8aa6e247455f4933ec09882246f","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":166,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":167,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":168,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":169,"context_line":"        # verify the single private tenant network is the one that the servers"},{"line_number":170,"context_line":"        # are using also"},{"line_number":171,"context_line":"        self.assertEqual(server_nets[0], nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_018a06bf","line":168,"in_reply_to":"7aa08908_d9b30b09","updated":"2016-06-17 16:23:44.000000000","message":"At this point though the servers have already booted, so asserting the number of networks for the tenant is not giving us any sort of assurance, and hence I am suggesting to remove it. The risk of intermittent failure may or may not be theoretical or dependent on the existence of an interfering test, but I\u0027d take the risk only if the assert is valuable.\n\nWith the latest Neutron fix I could see that N auto requests can clash and lead to N-1 duplicated networks but they would all be in admin_status_up\u003dFalse status and cleaned up eventually.\n\nI think any Nova request to list networks should assume that admin_status_up be True to proceed.","commit_id":"8973d5d7f2a7192b99be0c7c1d3c85b40b81abaf"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6aa1bc3cbbc377745524c5c6bd54b9f36975d7ff","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.assertEqual({}, addresses)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _delete_auto_allocated_network_resources(self, network):"},{"line_number":96,"context_line":"        \"\"\"Deletes the auto_allocated_network and it\u0027s associated resources."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :param network: a network dict with details"},{"line_number":99,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_3314b942","line":96,"updated":"2016-06-17 16:29:48.000000000","message":"I am mulling over the idea of providing you with a call to deallocate an auto-allocated-topology, that should make your life a lot simpler. We already have most of the logic server side already implemented and it would be a matter to expose a DELETE action on the extension.","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"da90ca3880c13f6365d7ff3b0b5dc94b99c889aa","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.assertEqual({}, addresses)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _delete_auto_allocated_network_resources(self, network):"},{"line_number":96,"context_line":"        \"\"\"Deletes the auto_allocated_network and it\u0027s associated resources."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :param network: a network dict with details"},{"line_number":99,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_ece36ed6","line":96,"in_reply_to":"7aa08908_3314b942","updated":"2016-06-17 18:03:51.000000000","message":"That would certainly make this easier, but it\u0027s probably low priority at this point.","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"393cef2656443f283a19d65737808300f011a7d4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        #   so it queues net2 for deletion and returns net1 from the API and"},{"line_number":155,"context_line":"        #   Nova uses that for the second server request."},{"line_number":156,"context_line":"        # - Third request sees net1 and net2 for the tenant and fails with a"},{"line_number":157,"context_line":"        #   NetworkAmbiguous 400 error."},{"line_number":158,"context_line":"        _, servers \u003d compute.create_test_server("},{"line_number":159,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027auto\u0027}], wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":160,"context_line":"            min_count\u003d3)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_7e0e2f8d","line":157,"range":{"start_line":157,"start_character":12,"end_line":157,"end_character":28},"updated":"2016-06-17 01:49:37.000000000","message":"Yup, here is where we hit this:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/8337f93/logs/screen-n-cpu.txt.gz#_2016-06-17_00_27_53_228","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6aa1bc3cbbc377745524c5c6bd54b9f36975d7ff","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        #   so it queues net2 for deletion and returns net1 from the API and"},{"line_number":155,"context_line":"        #   Nova uses that for the second server request."},{"line_number":156,"context_line":"        # - Third request sees net1 and net2 for the tenant and fails with a"},{"line_number":157,"context_line":"        #   NetworkAmbiguous 400 error."},{"line_number":158,"context_line":"        _, servers \u003d compute.create_test_server("},{"line_number":159,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027auto\u0027}], wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":160,"context_line":"            min_count\u003d3)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_93a00df6","line":157,"range":{"start_line":157,"start_character":12,"end_line":157,"end_character":28},"in_reply_to":"7aa08908_7e0e2f8d","updated":"2016-06-17 16:29:48.000000000","message":"Assuming that any nova client filters out networks with admin_state_up\u003dFalse when listing NetworkAmbiguous should not occur.","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"da90ca3880c13f6365d7ff3b0b5dc94b99c889aa","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        #   so it queues net2 for deletion and returns net1 from the API and"},{"line_number":155,"context_line":"        #   Nova uses that for the second server request."},{"line_number":156,"context_line":"        # - Third request sees net1 and net2 for the tenant and fails with a"},{"line_number":157,"context_line":"        #   NetworkAmbiguous 400 error."},{"line_number":158,"context_line":"        _, servers \u003d compute.create_test_server("},{"line_number":159,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027auto\u0027}], wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":160,"context_line":"            min_count\u003d3)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_6cc13e2f","line":157,"range":{"start_line":157,"start_character":12,"end_line":157,"end_character":28},"in_reply_to":"7aa08908_93a00df6","updated":"2016-06-17 18:03:51.000000000","message":"Yeah I\u0027ve built that into the nova series now.","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fbd6d4c120c7abc80f358495ed2901a7f66e235e","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            min_count\u003d3)"},{"line_number":161,"context_line":"        server_nets \u003d set()"},{"line_number":162,"context_line":"        for server in servers:"},{"line_number":163,"context_line":"            self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":164,"context_line":"            # get the server ips"},{"line_number":165,"context_line":"            addresses \u003d self.servers_client.list_addresses("},{"line_number":166,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_21f126ce","line":163,"updated":"2016-06-17 02:19:36.000000000","message":"Looks like this isn\u0027t going to cut if for cleanup, we\u0027re hitting a race with tempest removing the credentials from the tenant and when we\u0027re deallocating the network for the servers and they try to list ports, we get a 401 from neutron:\n\nlogs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/8337f93/logs/screen-n-cpu.txt.gz#_2016-06-17_00_33_10_306\n\nSo I probably need to add the created servers to the parent class self.servers list which does a wait for deletion on teardown.","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff542e35f30ceb63864d7e8af7bd91b7718604b9","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            min_count\u003d3)"},{"line_number":161,"context_line":"        server_nets \u003d set()"},{"line_number":162,"context_line":"        for server in servers:"},{"line_number":163,"context_line":"            self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":164,"context_line":"            # get the server ips"},{"line_number":165,"context_line":"            addresses \u003d self.servers_client.list_addresses("},{"line_number":166,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_8cd011cb","line":163,"in_reply_to":"7aa08908_21f126ce","updated":"2016-06-17 03:12:13.000000000","message":"Although it seems that deleting the credentials should be the last thing tempest does on teardown, the test case cleanups should happen first so the resources are gone before the credentials are dropped. So there might be something else going on here.","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"37344ae136ef0efe5f2348b831b39409620eec4c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            min_count\u003d3)"},{"line_number":161,"context_line":"        server_nets \u003d set()"},{"line_number":162,"context_line":"        for server in servers:"},{"line_number":163,"context_line":"            self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":164,"context_line":"            # get the server ips"},{"line_number":165,"context_line":"            addresses \u003d self.servers_client.list_addresses("},{"line_number":166,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_ace158d2","line":163,"in_reply_to":"7aa08908_2c659d1c","updated":"2016-06-18 01:54:39.000000000","message":"Done","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"80fbf21dace4b79d46c5ceb3fe39aff7cddf5d84","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            min_count\u003d3)"},{"line_number":161,"context_line":"        server_nets \u003d set()"},{"line_number":162,"context_line":"        for server in servers:"},{"line_number":163,"context_line":"            self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":164,"context_line":"            # get the server ips"},{"line_number":165,"context_line":"            addresses \u003d self.servers_client.list_addresses("},{"line_number":166,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_2c659d1c","line":163,"in_reply_to":"7aa08908_8cd011cb","updated":"2016-06-17 03:17:44.000000000","message":"Oh right since we\u0027re not waiting for the async server delete to finish then there is nothing holding tempest up from deleting the tenant credentials at the same time, so I need to add a waiter here.","commit_id":"8d67911abcddc8fcae914ca61a36b908da990210"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0fc1a84c7d84701bd19e05379f3430dd18de93f2","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":187,"context_line":"        # verify the single private tenant network is the one that the servers"},{"line_number":188,"context_line":"        # are using also"},{"line_number":189,"context_line":"        self.assertEqual(server_nets[0], nets[0][\u0027name\u0027])"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        self._delete_auto_allocated_network_resources(nets[0])"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a9d85d2_90d7fa22","line":189,"updated":"2016-06-18 19:42:40.000000000","message":"http://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/57db29a/logs/testr_results.html.gz","commit_id":"0c8ff5806f1ace7645ce392ba4f9c146a9902961"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"736f1d4f444681bf2e96db09b28e8ce4d588e0ea","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # This is a bit hacky since we don\u0027t have a great way to find the"},{"line_number":104,"context_line":"        # auto-allocated router given the private tenant network we have."},{"line_number":105,"context_line":"        routers \u003d self.routers_client.list_routers().get(\u0027routers\u0027, [])"},{"line_number":106,"context_line":"        if len(routers) \u003e 1:"},{"line_number":107,"context_line":"            # Try to find the router by the name that neutron would have used"},{"line_number":108,"context_line":"            # to create the router. We don\u0027t fail if we don\u0027t find it in case"},{"line_number":109,"context_line":"            # different configurations for auto-allocated-topology are"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a9d85d2_53747cfc","line":106,"updated":"2016-06-18 23:53:46.000000000","message":"We\u0027re actually getting 2 duplicate routers:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/46ba8c3/console.html#_2016-06-18_21_52_24_088848\n\nSame name, same tenant, both admin_state_up\u003dTrue. That seems like a bug in auto-allocated-topology in neutron also.","commit_id":"6b91600563165b5ce368113bfe112a92d64b73dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"615eddf656ea4b50f70555acb6bcd9d3e2eac4dc","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if router:"},{"line_number":121,"context_line":"            # Disassociate the subnets from the router."},{"line_number":122,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":123,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":124,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":14,"id":"5a9d85d2_333f3027","line":123,"updated":"2016-06-18 23:43:55.000000000","message":"Oh right, the auto_allocated_router doesn\u0027t have subnet interfaces from the auto_allocated_network, they are from the public external network, so this fails with a 404:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/46ba8c3/console.html#_2016-06-18_21_52_24_089235\n\nSo I can either just not try and do this and delete the router, or handle and pass on a 404 as an expected scenario.","commit_id":"6b91600563165b5ce368113bfe112a92d64b73dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"04e6450c9b506c10282d05feb78cdcaf93fb9e71","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if router:"},{"line_number":121,"context_line":"            # Disassociate the subnets from the router."},{"line_number":122,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":123,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":124,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":14,"id":"5a9d85d2_53463cc0","line":123,"in_reply_to":"5a9d85d2_333f3027","updated":"2016-06-18 23:46:56.000000000","message":"But I can\u0027t probably ignore the 404s because I won\u0027t be able to delete the router. So I\u0027ll need to get the subnets from the router and remove the interfaces from those.","commit_id":"6b91600563165b5ce368113bfe112a92d64b73dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c04d4973872915b13db20240910cfb89addfbeb5","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if router:"},{"line_number":121,"context_line":"            # Disassociate the subnets from the router."},{"line_number":122,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":123,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":124,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":14,"id":"5a9d85d2_b3c68014","line":123,"in_reply_to":"5a9d85d2_53463cc0","updated":"2016-06-19 00:04:37.000000000","message":"Actually that\u0027s not right. The auto-allocated-router has interfaces on the auto-allocated v4 and v6 subnets, but this is failing probably because I got 2 routers back and picked the wrong one, so it fails. This should probably be fixed in neutron, else I\u0027m going to have to loop over the routers and try to remove interfaces for each from the subnets that are still on the auto-allocated-network.","commit_id":"6b91600563165b5ce368113bfe112a92d64b73dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c04d4973872915b13db20240910cfb89addfbeb5","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if router:"},{"line_number":121,"context_line":"            # Disassociate the subnets from the router."},{"line_number":122,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":123,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":124,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":14,"id":"5a9d85d2_534bdcb0","line":123,"in_reply_to":"5a9d85d2_53463cc0","updated":"2016-06-19 00:04:37.000000000","message":"Actually that\u0027s not right. The router has interfaces on the auto-allocated v4 and v6 subnet, the problem is I\u0027m probably picking the wrong router because I get two above. So we need to fix that in neutron I think.","commit_id":"6b91600563165b5ce368113bfe112a92d64b73dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1e4bc8fa02ebe24225f9d63d81a717bad4e5aad9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if router:"},{"line_number":121,"context_line":"            # Disassociate the subnets from the router."},{"line_number":122,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":123,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":124,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":14,"id":"5a9d85d2_b6814e50","line":123,"in_reply_to":"5a9d85d2_b3c68014","updated":"2016-06-19 02:24:18.000000000","message":"Figured it out with Armando. The duplicate router is discovered 19 seconds before we\u0027re listing routers in this test to cleanup. The problem is we\u0027re doing all of this way too early - we haven\u0027t waited for the servers to be deleted, because this delete method isn\u0027t being called from the tearDown stack, it needs to come after deleting the servers, which means calling addCleanup on this before creating the servers, and I\u0027ll need to use class variables for the network and routers.","commit_id":"6b91600563165b5ce368113bfe112a92d64b73dd"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0f3d9f2bc5cdf2305ac20af25eb42c4ee889dcd1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def skip_checks(cls):"},{"line_number":44,"context_line":"        super(AutoAllocateNetworkTest, cls).skip_checks()"},{"line_number":45,"context_line":"        if not CONF.service_available.neutron:"},{"line_number":46,"context_line":"            raise cls.skipException(\u0027Neutron is required\u0027)"},{"line_number":47,"context_line":"        if not CONF.network_feature_enabled.auto_allocated_topology:"},{"line_number":48,"context_line":"            raise cls.skipException(\u0027auto_allocated_topology is not available\u0027)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_fd84fe0b","line":46,"updated":"2016-06-28 18:03:33.000000000","message":"so are we ok of not testing this with nova-net?","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"56390660095be2ef83223258e674fbb1ea74abc8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def skip_checks(cls):"},{"line_number":44,"context_line":"        super(AutoAllocateNetworkTest, cls).skip_checks()"},{"line_number":45,"context_line":"        if not CONF.service_available.neutron:"},{"line_number":46,"context_line":"            raise cls.skipException(\u0027Neutron is required\u0027)"},{"line_number":47,"context_line":"        if not CONF.network_feature_enabled.auto_allocated_topology:"},{"line_number":48,"context_line":"            raise cls.skipException(\u0027auto_allocated_topology is not available\u0027)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_8f338761","line":46,"in_reply_to":"3aaa91ec_fd84fe0b","updated":"2016-06-30 18:19:31.000000000","message":"I am. nova-network is deprecated and the in-tree functional tests in nova are using nova-network. They don\u0027t create a real network, but they test the interfaces.","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0f3d9f2bc5cdf2305ac20af25eb42c4ee889dcd1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        if nets:"},{"line_number":80,"context_line":"            raise exceptions.TempestException("},{"line_number":81,"context_line":"                \u0027Found tenant networks: %s\u0027 % nets)"},{"line_number":82,"context_line":"        # (2) Retrieve public network list."},{"line_number":83,"context_line":"        search_opts \u003d {\u0027shared\u0027: True}"},{"line_number":84,"context_line":"        nets \u003d cls.networks_client.list_networks("},{"line_number":85,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_fd0ebe8a","line":82,"updated":"2016-06-28 18:03:33.000000000","message":"public is a bit of a misnomer because we typically refer to \u0027public\u0027 for those networks that are router:external enabled, and those are not \u0027shared\u0027.\n\nSearching for \u0027shared\u0027 networks returns any network a tenant has access to, and that would exclude router:enabled ones (unless their shared flag is explicitly set)","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"56390660095be2ef83223258e674fbb1ea74abc8","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        if nets:"},{"line_number":80,"context_line":"            raise exceptions.TempestException("},{"line_number":81,"context_line":"                \u0027Found tenant networks: %s\u0027 % nets)"},{"line_number":82,"context_line":"        # (2) Retrieve public network list."},{"line_number":83,"context_line":"        search_opts \u003d {\u0027shared\u0027: True}"},{"line_number":84,"context_line":"        nets \u003d cls.networks_client.list_networks("},{"line_number":85,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_8f0a6777","line":82,"in_reply_to":"3aaa91ec_74b92a79","updated":"2016-06-30 18:19:31.000000000","message":"OK I can just s/public/shared/ here.","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0ebfc739765c9852ef9e18e23aa166040d207487","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        if nets:"},{"line_number":80,"context_line":"            raise exceptions.TempestException("},{"line_number":81,"context_line":"                \u0027Found tenant networks: %s\u0027 % nets)"},{"line_number":82,"context_line":"        # (2) Retrieve public network list."},{"line_number":83,"context_line":"        search_opts \u003d {\u0027shared\u0027: True}"},{"line_number":84,"context_line":"        nets \u003d cls.networks_client.list_networks("},{"line_number":85,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_74b92a79","line":82,"in_reply_to":"3aaa91ec_fd0ebe8a","updated":"2016-06-29 09:26:31.000000000","message":"Yeah, it took me quite some time to understand shared vs external vs public (the latter doesn\u0027t really exist), so maybe that comment should be updated.","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"61725f189dac335f4e21d99d03114b4139b41bcb","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":128,"context_line":"            router \u003d routers[0]"},{"line_number":129,"context_line":"        else:"},{"line_number":130,"context_line":"            # This is unexpected but let\u0027s handle it."},{"line_number":131,"context_line":"            router \u003d None"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        if router:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_37e244a0","line":130,"updated":"2016-06-28 09:14:16.000000000","message":"Why not fail as we usually do when something unexpected happen ? Do you think of something in particular ?","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0da4b7f14aa26f43e8d7a567c11451b4e5f7f32","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":128,"context_line":"            router \u003d routers[0]"},{"line_number":129,"context_line":"        else:"},{"line_number":130,"context_line":"            # This is unexpected but let\u0027s handle it."},{"line_number":131,"context_line":"            router \u003d None"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        if router:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_c1e5eda8","line":130,"in_reply_to":"3aaa91ec_37e244a0","updated":"2016-06-28 15:00:36.000000000","message":"The auto-allocated-topology in neutron works a certain way today but it an be expanded or configured to behave differently in the future, and the neutron team was hesitant to bake specific expectations about how it would all work into this test lest they try to change the setup for network resources at some point and are then blocked by this test making rigid assertions. So I left this open-ended to accommodate that.","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0ebfc739765c9852ef9e18e23aa166040d207487","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":128,"context_line":"            router \u003d routers[0]"},{"line_number":129,"context_line":"        else:"},{"line_number":130,"context_line":"            # This is unexpected but let\u0027s handle it."},{"line_number":131,"context_line":"            router \u003d None"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        if router:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_d4c45e93","line":130,"in_reply_to":"3aaa91ec_c1e5eda8","updated":"2016-06-29 09:26:31.000000000","message":"ack","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"61725f189dac335f4e21d99d03114b4139b41bcb","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"},{"line_number":188,"context_line":"            # assert that there is networking (should only be one)"},{"line_number":189,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":190,"context_line":"            server_nets.add(addresses.keys()[0])"},{"line_number":191,"context_line":"        # all servers should be on the same network"},{"line_number":192,"context_line":"        self.assertEqual(1, len(server_nets))"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_f708bc2f","line":190,"updated":"2016-06-28 09:14:16.000000000","message":"That\u0027s not Python 3 compatible. And python 3 is hot these days :)","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"56390660095be2ef83223258e674fbb1ea74abc8","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"},{"line_number":188,"context_line":"            # assert that there is networking (should only be one)"},{"line_number":189,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":190,"context_line":"            server_nets.add(addresses.keys()[0])"},{"line_number":191,"context_line":"        # all servers should be on the same network"},{"line_number":192,"context_line":"        self.assertEqual(1, len(server_nets))"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_0f1f97b7","line":190,"in_reply_to":"3aaa91ec_542b4eeb","updated":"2016-06-30 18:19:31.000000000","message":"OK I can copy that.","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0ebfc739765c9852ef9e18e23aa166040d207487","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"},{"line_number":188,"context_line":"            # assert that there is networking (should only be one)"},{"line_number":189,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":190,"context_line":"            server_nets.add(addresses.keys()[0])"},{"line_number":191,"context_line":"        # all servers should be on the same network"},{"line_number":192,"context_line":"        self.assertEqual(1, len(server_nets))"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_542b4eeb","line":190,"in_reply_to":"3aaa91ec_7a681e22","updated":"2016-06-29 09:26:31.000000000","message":"Yes. We are trying to be py3, but our plan is not really decided yet :) It\u0027s been more \"ad hoc\" for now. I already fixed the usage of keys()[0] accross Tempest here: https://review.openstack.org/#/c/309993/ so I\u0027d like that to remain. But as we don\"t have unit tests, it\u0027s hard to enforce and a HACKING rule was deemed too fragile.\n\nPlease use list(addresses.keys())[0] (yeah it\u0027s ugly...)","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0da4b7f14aa26f43e8d7a567c11451b4e5f7f32","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"},{"line_number":188,"context_line":"            # assert that there is networking (should only be one)"},{"line_number":189,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":190,"context_line":"            server_nets.add(addresses.keys()[0])"},{"line_number":191,"context_line":"        # all servers should be on the same network"},{"line_number":192,"context_line":"        self.assertEqual(1, len(server_nets))"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3aaa91ec_7a681e22","line":190,"in_reply_to":"3aaa91ec_f708bc2f","updated":"2016-06-28 15:00:36.000000000","message":"Is Tempest trying to get to py3 compat anytime soon? I can update this if needed but not sure how I\u0027d verify it\u0027s correct since we don\u0027t have a py34 gate job that would test it.","commit_id":"0cc7ad8d1fe59762c1068a7042e6f009c17b0d07"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3ca33463cfb860d0e1309f8a87a27a6b78db1a11","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                \u0027Found shared networks: %s\u0027 % nets)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @test.idempotent_id(\u00275eb7b8fa-9c23-47a2-9d7d-02ed5809dd34\u0027)"},{"line_number":91,"context_line":"    @test.services(\u0027network\u0027)"},{"line_number":92,"context_line":"    def test_server_create_no_allocate(self):"},{"line_number":93,"context_line":"        \"\"\"Tests that no networking is allocated for the server.\"\"\""},{"line_number":94,"context_line":"        # create the server with no networking"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_e6082594","line":91,"range":{"start_line":91,"start_character":4,"end_line":91,"end_character":29},"updated":"2016-07-28 01:54:55.000000000","message":"skip_checks already checks the neutron availability, so we can avoid this decorator.","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62477f14be206fb4e5a3ec6769ce4da8d5db2512","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                \u0027Found shared networks: %s\u0027 % nets)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @test.idempotent_id(\u00275eb7b8fa-9c23-47a2-9d7d-02ed5809dd34\u0027)"},{"line_number":91,"context_line":"    @test.services(\u0027network\u0027)"},{"line_number":92,"context_line":"    def test_server_create_no_allocate(self):"},{"line_number":93,"context_line":"        \"\"\"Tests that no networking is allocated for the server.\"\"\""},{"line_number":94,"context_line":"        # create the server with no networking"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_a87c09ec","line":91,"range":{"start_line":91,"start_character":4,"end_line":91,"end_character":29},"in_reply_to":"bacf61ea_e6082594","updated":"2016-07-28 19:44:26.000000000","message":"OK","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3ca33463cfb860d0e1309f8a87a27a6b78db1a11","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # create the server with no networking"},{"line_number":95,"context_line":"        server, _ \u003d compute.create_test_server("},{"line_number":96,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027none\u0027}], wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":97,"context_line":"        self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":98,"context_line":"        # get the server ips"},{"line_number":99,"context_line":"        addresses \u003d self.servers_client.list_addresses("},{"line_number":100,"context_line":"            server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_904b5f2b","line":97,"range":{"start_line":97,"start_character":69,"end_line":97,"end_character":72},"updated":"2016-07-28 01:54:55.000000000","message":"we can \u0027wait_for_server_termination\u0027 also","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62477f14be206fb4e5a3ec6769ce4da8d5db2512","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # create the server with no networking"},{"line_number":95,"context_line":"        server, _ \u003d compute.create_test_server("},{"line_number":96,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027none\u0027}], wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":97,"context_line":"        self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":98,"context_line":"        # get the server ips"},{"line_number":99,"context_line":"        addresses \u003d self.servers_client.list_addresses("},{"line_number":100,"context_line":"            server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_c8605d38","line":97,"range":{"start_line":97,"start_character":69,"end_line":97,"end_character":72},"in_reply_to":"bacf61ea_904b5f2b","updated":"2016-07-28 19:44:26.000000000","message":"Do we need to? I guess that\u0027s what the base class does if you use self.create_test_server but it seems unnecessary in this case - but avoids any racing for quota I guess.","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3ca33463cfb860d0e1309f8a87a27a6b78db1a11","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            # different configurations for auto-allocated-topology are"},{"line_number":123,"context_line":"            # supported in the future."},{"line_number":124,"context_line":"            for router in routers:"},{"line_number":125,"context_line":"                if router[\u0027name\u0027] \u003d\u003d \u0027auto_allocated_router\u0027:"},{"line_number":126,"context_line":"                    break"},{"line_number":127,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":128,"context_line":"            router \u003d routers[0]"},{"line_number":129,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_c6c88177","line":126,"range":{"start_line":125,"start_character":16,"end_line":126,"end_character":25},"updated":"2016-07-28 01:54:55.000000000","message":"I do not have deep knowledge on auto network creation on neutron side. But seems like 2 \u0027auto_allocated_router\u0027 router. are they same ?\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/d432419/logs/tempest.txt.gz#_2016-07-27_21_06_05_388","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62477f14be206fb4e5a3ec6769ce4da8d5db2512","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            # different configurations for auto-allocated-topology are"},{"line_number":123,"context_line":"            # supported in the future."},{"line_number":124,"context_line":"            for router in routers:"},{"line_number":125,"context_line":"                if router[\u0027name\u0027] \u003d\u003d \u0027auto_allocated_router\u0027:"},{"line_number":126,"context_line":"                    break"},{"line_number":127,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":128,"context_line":"            router \u003d routers[0]"},{"line_number":129,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_488aadc0","line":126,"range":{"start_line":125,"start_character":16,"end_line":126,"end_character":25},"in_reply_to":"bacf61ea_8602093d","updated":"2016-07-28 19:44:26.000000000","message":"There is a race, yes, where nova is concurrently calling the auto-allocated-topology API in neutron to create a network/subnets/router for the same tenant. There is duplicate detection in neutron which will rollback the duplicates automatically, but given where we are in the test run we can still pull these via the API so I have to handle it. This is where neutron detects the duplicate and cleans them up in the failed run:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/d432419/logs/screen-q-svc.txt.gz?level\u003dTRACE#_2016-07-27_21_05_37_933\n\nI basically plan to process all of the routers for the tenant and try to disassociate the subnets from the auto-allocated-network but ignore any 404s using:\n\nhttps://github.com/openstack/tempest/blob/master/tempest/lib/common/utils/test_utils.py#L80","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3d36c221a06f298658a8aecfd017e2db7d2f9f5a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            # different configurations for auto-allocated-topology are"},{"line_number":123,"context_line":"            # supported in the future."},{"line_number":124,"context_line":"            for router in routers:"},{"line_number":125,"context_line":"                if router[\u0027name\u0027] \u003d\u003d \u0027auto_allocated_router\u0027:"},{"line_number":126,"context_line":"                    break"},{"line_number":127,"context_line":"        elif len(routers) \u003d\u003d 1:"},{"line_number":128,"context_line":"            router \u003d routers[0]"},{"line_number":129,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_8602093d","line":126,"range":{"start_line":125,"start_character":16,"end_line":126,"end_character":25},"in_reply_to":"bacf61ea_c6c88177","updated":"2016-07-28 01:58:10.000000000","message":"So we can pick both routers with \u0027auto_allocated_router\u0027 and let it cleanup next one  by one with 404 ignore","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dc8aac227413eb0afd859106a955c1de5146d702","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        if router:"},{"line_number":134,"context_line":"            # Disassociate the subnets from the router."},{"line_number":135,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":136,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":137,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_4bb49cf1","line":136,"range":{"start_line":136,"start_character":36,"end_line":136,"end_character":59},"updated":"2016-07-28 01:10:56.000000000","message":"This can fail if we get two routers above with the same name and we pick the wrong one:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/d432419/console.html#_2016-07-27_21_50_39_715950\n\nSo we probably need to iterate over the routers here and handle/ignore any 404s on remote_router_interface.","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62477f14be206fb4e5a3ec6769ce4da8d5db2512","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        if router:"},{"line_number":134,"context_line":"            # Disassociate the subnets from the router."},{"line_number":135,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":136,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":137,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_688fb1cc","line":136,"range":{"start_line":136,"start_character":36,"end_line":136,"end_character":59},"in_reply_to":"bacf61ea_2292f89f","updated":"2016-07-28 19:44:26.000000000","message":"Yeah this:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/d432419/logs/screen-q-svc.txt.gz?level\u003dTRACE#_2016-07-27_21_05_37_933","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ed1948a28c3423207b2c38bc7565928d160cc395","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        if router:"},{"line_number":134,"context_line":"            # Disassociate the subnets from the router."},{"line_number":135,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":136,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":137,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_2292f89f","line":136,"range":{"start_line":136,"start_character":36,"end_line":136,"end_character":59},"in_reply_to":"bacf61ea_465ad184","updated":"2016-07-28 18:41:59.000000000","message":"the \u0027offending router\u0027 is cleaned up by Neutron.","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3d36c221a06f298658a8aecfd017e2db7d2f9f5a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        if router:"},{"line_number":134,"context_line":"            # Disassociate the subnets from the router."},{"line_number":135,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":136,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":137,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            # Delete the router."}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_465ad184","line":136,"range":{"start_line":136,"start_character":36,"end_line":136,"end_character":59},"in_reply_to":"bacf61ea_4bb49cf1","updated":"2016-07-28 01:58:10.000000000","message":"yea, this will be right to have 404 catch here.\n\nBut we should try to cleanup both routers, to make sure if we pick up wrong one then we just not go ahead but also cleanup right one also.","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3ca33463cfb860d0e1309f8a87a27a6b78db1a11","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        if router:"},{"line_number":134,"context_line":"            # Disassociate the subnets from the router."},{"line_number":135,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":136,"context_line":"                self.routers_client.remove_router_interface("},{"line_number":137,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            # Delete the router."},{"line_number":140,"context_line":"            self.routers_client.delete_router(router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_86e7a911","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":54},"updated":"2016-07-28 01:54:55.000000000","message":"seems like interface not found - http://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/d432419/logs/tempest.txt.gz#_2016-07-27_21_06_05_805\n\nAre we sure each subnets will be interface on fetched router?","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3ca33463cfb860d0e1309f8a87a27a6b78db1a11","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.networks_client.delete_network(network[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @test.idempotent_id(\u00272e6cf129-9e28-4e8a-aaaa-045ea826b2a6\u0027)"},{"line_number":156,"context_line":"    @test.services(\u0027network\u0027)"},{"line_number":157,"context_line":"    def test_server_multi_create_auto_allocate(self):"},{"line_number":158,"context_line":"        \"\"\"Tests that networking is auto-allocated for multiple servers.\"\"\""},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_86f8497e","line":156,"range":{"start_line":156,"start_character":4,"end_line":156,"end_character":29},"updated":"2016-07-28 01:54:55.000000000","message":"ditto","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62477f14be206fb4e5a3ec6769ce4da8d5db2512","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.networks_client.delete_network(network[\u0027id\u0027])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @test.idempotent_id(\u00272e6cf129-9e28-4e8a-aaaa-045ea826b2a6\u0027)"},{"line_number":156,"context_line":"    @test.services(\u0027network\u0027)"},{"line_number":157,"context_line":"    def test_server_multi_create_auto_allocate(self):"},{"line_number":158,"context_line":"        \"\"\"Tests that networking is auto-allocated for multiple servers.\"\"\""},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_a8bfe95e","line":156,"range":{"start_line":156,"start_character":4,"end_line":156,"end_character":29},"in_reply_to":"bacf61ea_86f8497e","updated":"2016-07-28 19:44:26.000000000","message":"Done","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3ca33463cfb860d0e1309f8a87a27a6b78db1a11","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":190,"context_line":"            server_nets.add(list(addresses.keys())[0])"},{"line_number":191,"context_line":"        # all servers should be on the same network"},{"line_number":192,"context_line":"        self.assertEqual(1, len(server_nets))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        # List the networks for the tenant; we filter on admin_state_up\u003dTrue"},{"line_number":195,"context_line":"        # because the auto-allocated-topology code in Neutron won\u0027t set that"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_d0e5d7a8","line":192,"range":{"start_line":192,"start_character":32,"end_line":192,"end_character":43},"updated":"2016-07-28 01:54:55.000000000","message":"can we verify it with \"auto_allocated_network\"","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62477f14be206fb4e5a3ec6769ce4da8d5db2512","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":190,"context_line":"            server_nets.add(list(addresses.keys())[0])"},{"line_number":191,"context_line":"        # all servers should be on the same network"},{"line_number":192,"context_line":"        self.assertEqual(1, len(server_nets))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        # List the networks for the tenant; we filter on admin_state_up\u003dTrue"},{"line_number":195,"context_line":"        # because the auto-allocated-topology code in Neutron won\u0027t set that"}],"source_content_type":"text/x-python","patch_set":18,"id":"bacf61ea_e870c1de","line":192,"range":{"start_line":192,"start_character":32,"end_line":192,"end_character":43},"in_reply_to":"bacf61ea_d0e5d7a8","updated":"2016-07-28 19:44:26.000000000","message":"Earlier versions of this test asserted we had one network with the name \u0027auto_allocated_network\u0027 but Armando didn\u0027t like baking that in as an API contract so I removed it.","commit_id":"9d6065fc1b49bb0cd40c50c34606225b80d0151e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"004bfe344a2edd1f917d1205b1170e03294fe499","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class AutoAllocateNetworkTest(base.BaseV2ComputeAdminTest):"},{"line_number":30,"context_line":"    \"\"\"Tests auto-allocating networks with the v2.37 microversion."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    These tests rely on Neutron being enabled. Also, the tenant must not have"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_93c9697b","line":29,"range":{"start_line":29,"start_character":35,"end_line":29,"end_character":57},"updated":"2016-07-29 01:10:39.000000000","message":"we are not using any admin client anywhere. do we need this as admin tests?","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"248fb979f5c4a6572778f6ea68e212b019c0efab","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class AutoAllocateNetworkTest(base.BaseV2ComputeAdminTest):"},{"line_number":30,"context_line":"    \"\"\"Tests auto-allocating networks with the v2.37 microversion."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    These tests rely on Neutron being enabled. Also, the tenant must not have"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_d395a1e4","line":29,"range":{"start_line":29,"start_character":35,"end_line":29,"end_character":57},"in_reply_to":"bacf61ea_93c9697b","updated":"2016-07-29 01:18:41.000000000","message":"If no then, we need to move this file also from admin dir","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e65b91361b7f3cad3e083a647168640397aa05af","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class AutoAllocateNetworkTest(base.BaseV2ComputeAdminTest):"},{"line_number":30,"context_line":"    \"\"\"Tests auto-allocating networks with the v2.37 microversion."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    These tests rely on Neutron being enabled. Also, the tenant must not have"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_93ab291d","line":29,"range":{"start_line":29,"start_character":35,"end_line":29,"end_character":57},"in_reply_to":"bacf61ea_d395a1e4","updated":"2016-07-29 01:23:56.000000000","message":"They needed admin at some point for a reason, what that is I\u0027ve forgotten so I\u0027d have to dig back to find out why I had to move it.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4b5931e2585d32338c80517626446e9652fc718","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    calls to Neutron to automatically allocate the network topology."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    force_tenant_isolation \u003d True"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    min_microversion \u003d \u00272.37\u0027"},{"line_number":40,"context_line":"    max_microversion \u003d \u0027latest\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_6e196e79","line":37,"updated":"2016-07-29 01:27:31.000000000","message":"gmann: this is why it\u0027s an admin test.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3c343358311d8b2a0d4170ee8d8e60592467010c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    calls to Neutron to automatically allocate the network topology."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    force_tenant_isolation \u003d True"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    min_microversion \u003d \u00272.37\u0027"},{"line_number":40,"context_line":"    max_microversion \u003d \u0027latest\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_ee0f1e86","line":37,"in_reply_to":"bacf61ea_6e196e79","updated":"2016-07-29 02:33:56.000000000","message":"oh, right. Thanks.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"004bfe344a2edd1f917d1205b1170e03294fe499","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            LOG.info(\u0027(%s) Found more than one router for tenant.\u0027,"},{"line_number":127,"context_line":"                     test_utils.find_test_caller())"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        for router in routers:"},{"line_number":130,"context_line":"            # Disassociate the subnets from the router. Because of the race"},{"line_number":131,"context_line":"            # mentioned above the subnets might not be associated with the"},{"line_number":132,"context_line":"            # router so ignore any 404."},{"line_number":133,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":134,"context_line":"                test_utils.call_and_ignore_notfound_exc("},{"line_number":135,"context_line":"                    self.routers_client.remove_router_interface,"},{"line_number":136,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            # Delete the router."},{"line_number":139,"context_line":"            self.routers_client.delete_router(router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_b3b90dce","line":136,"range":{"start_line":129,"start_character":0,"end_line":136,"end_character":54},"updated":"2016-07-29 01:10:39.000000000","message":"In case list return shared router etc can we more explicit here by checking the tenant id in each router before detaching the subnet. or list_router with some filter(shared\u003dfalse etc something if any)","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3c343358311d8b2a0d4170ee8d8e60592467010c","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            LOG.info(\u0027(%s) Found more than one router for tenant.\u0027,"},{"line_number":127,"context_line":"                     test_utils.find_test_caller())"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        for router in routers:"},{"line_number":130,"context_line":"            # Disassociate the subnets from the router. Because of the race"},{"line_number":131,"context_line":"            # mentioned above the subnets might not be associated with the"},{"line_number":132,"context_line":"            # router so ignore any 404."},{"line_number":133,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":134,"context_line":"                test_utils.call_and_ignore_notfound_exc("},{"line_number":135,"context_line":"                    self.routers_client.remove_router_interface,"},{"line_number":136,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            # Delete the router."},{"line_number":139,"context_line":"            self.routers_client.delete_router(router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_8cef8b86","line":136,"range":{"start_line":129,"start_character":0,"end_line":136,"end_character":54},"in_reply_to":"bacf61ea_b3662d27","updated":"2016-07-29 02:33:56.000000000","message":"ok. just wondering if router can be shared (adding 2 subnet from different network of different tenants) which means visible to other tenants also. But i feel list should not return that as you mentioned. Should be ok here.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e65b91361b7f3cad3e083a647168640397aa05af","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            LOG.info(\u0027(%s) Found more than one router for tenant.\u0027,"},{"line_number":127,"context_line":"                     test_utils.find_test_caller())"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        for router in routers:"},{"line_number":130,"context_line":"            # Disassociate the subnets from the router. Because of the race"},{"line_number":131,"context_line":"            # mentioned above the subnets might not be associated with the"},{"line_number":132,"context_line":"            # router so ignore any 404."},{"line_number":133,"context_line":"            for subnet_id in network[\u0027subnets\u0027]:"},{"line_number":134,"context_line":"                test_utils.call_and_ignore_notfound_exc("},{"line_number":135,"context_line":"                    self.routers_client.remove_router_interface,"},{"line_number":136,"context_line":"                    router[\u0027id\u0027], subnet_id\u003dsubnet_id)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            # Delete the router."},{"line_number":139,"context_line":"            self.routers_client.delete_router(router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_b3662d27","line":136,"range":{"start_line":129,"start_character":0,"end_line":136,"end_character":54},"in_reply_to":"bacf61ea_b3b90dce","updated":"2016-07-29 01:23:56.000000000","message":"The router client has the tenant so the routers it returns should only be visible to that tenant.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1e2b479863e5fd1aca567e83187152f4604fee50","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.assertEqual({}, addresses)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _delete_auto_allocated_network_resources(self):"},{"line_number":106,"context_line":"        \"\"\"Deletes the auto_allocated_network and it\u0027s associated resources.\"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        network \u003d self.network"},{"line_number":109,"context_line":"        if not network:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_40e5fdd9","line":106,"updated":"2016-08-17 21:00:43.000000000","message":"So we don\u0027t have a good way to auto-deallocate resources?","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf56ac49e68bc73dedc43c05c6034f3965537738","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.assertEqual({}, addresses)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _delete_auto_allocated_network_resources(self):"},{"line_number":106,"context_line":"        \"\"\"Deletes the auto_allocated_network and it\u0027s associated resources.\"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        network \u003d self.network"},{"line_number":109,"context_line":"        if not network:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_d6c09352","line":106,"in_reply_to":"3ac371cc_40e5fdd9","updated":"2016-08-17 21:23:03.000000000","message":"Not unless we want to lookup the resources by name, which I was originally doing since they have a hard-coded predictable name right now, but armax didn\u0027t want that baked into Tempest as an API contract.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d6cdce9bbbf1b720b6ebaeefbcdd5827f6c95c36","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.assertEqual({}, addresses)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _delete_auto_allocated_network_resources(self):"},{"line_number":106,"context_line":"        \"\"\"Deletes the auto_allocated_network and it\u0027s associated resources.\"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        network \u003d self.network"},{"line_number":109,"context_line":"        if not network:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_992f643e","line":106,"in_reply_to":"3ac371cc_7cca611c","updated":"2016-08-18 02:06:45.000000000","message":"Done","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3fb804e123e2110fd180c2b88cc4c0e4adc9d98e","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.assertEqual({}, addresses)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _delete_auto_allocated_network_resources(self):"},{"line_number":106,"context_line":"        \"\"\"Deletes the auto_allocated_network and it\u0027s associated resources.\"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        network \u003d self.network"},{"line_number":109,"context_line":"        if not network:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_7cca611c","line":106,"in_reply_to":"3ac371cc_d6c09352","updated":"2016-08-17 21:33:53.000000000","message":"After talking in IRC, I\u0027ll remove the self.network class var and change this to just resource_cleanup and remove all networks and their resources blindly.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1e2b479863e5fd1aca567e83187152f4604fee50","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # auto-allocated router given the private tenant network we have."},{"line_number":117,"context_line":"        routers \u003d self.routers_client.list_routers().get(\u0027routers\u0027, [])"},{"line_number":118,"context_line":"        if len(routers) \u003e 1:"},{"line_number":119,"context_line":"            # This indicates a race where nova is concurrently calling the"},{"line_number":120,"context_line":"            # neutron auto-allocated-topology API for multiple server builds"},{"line_number":121,"context_line":"            # at the same time (it\u0027s called from nova-compute when setting up"},{"line_number":122,"context_line":"            # networking for a server). Neutron will detect duplicates and"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_80cc156b","line":119,"updated":"2016-08-17 21:00:43.000000000","message":"Well this kinda sucks","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf56ac49e68bc73dedc43c05c6034f3965537738","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # auto-allocated router given the private tenant network we have."},{"line_number":117,"context_line":"        routers \u003d self.routers_client.list_routers().get(\u0027routers\u0027, [])"},{"line_number":118,"context_line":"        if len(routers) \u003e 1:"},{"line_number":119,"context_line":"            # This indicates a race where nova is concurrently calling the"},{"line_number":120,"context_line":"            # neutron auto-allocated-topology API for multiple server builds"},{"line_number":121,"context_line":"            # at the same time (it\u0027s called from nova-compute when setting up"},{"line_number":122,"context_line":"            # networking for a server). Neutron will detect duplicates and"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_d6a7f3ba","line":119,"in_reply_to":"3ac371cc_80cc156b","updated":"2016-08-17 21:23:03.000000000","message":"yup","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3fb804e123e2110fd180c2b88cc4c0e4adc9d98e","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # We have to register the network resource cleanup before creating the"},{"line_number":159,"context_line":"        # servers since it\u0027s the create server request that creates the"},{"line_number":160,"context_line":"        # network resources via the Neutron auto-allocated-topology API."},{"line_number":161,"context_line":"        self.addCleanup(self._delete_auto_allocated_network_resources)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Create multiple servers with auto networking to make sure the"},{"line_number":164,"context_line":"        # automatic network allocation is atomic. Using a minimum of three"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_bcd059ca","line":161,"updated":"2016-08-17 21:33:53.000000000","message":"Should be able to remove this, see above.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d6cdce9bbbf1b720b6ebaeefbcdd5827f6c95c36","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # We have to register the network resource cleanup before creating the"},{"line_number":159,"context_line":"        # servers since it\u0027s the create server request that creates the"},{"line_number":160,"context_line":"        # network resources via the Neutron auto-allocated-topology API."},{"line_number":161,"context_line":"        self.addCleanup(self._delete_auto_allocated_network_resources)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Create multiple servers with auto networking to make sure the"},{"line_number":164,"context_line":"        # automatic network allocation is atomic. Using a minimum of three"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_793268a8","line":161,"in_reply_to":"3ac371cc_bcd059ca","updated":"2016-08-18 02:06:45.000000000","message":"Done","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1e2b479863e5fd1aca567e83187152f4604fee50","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        #   so it queues net2 for deletion and returns net1 from the API and"},{"line_number":172,"context_line":"        #   Nova uses that for the second server request."},{"line_number":173,"context_line":"        # - Third request sees net1 and net2 for the tenant and fails with a"},{"line_number":174,"context_line":"        #   NetworkAmbiguous 400 error."},{"line_number":175,"context_line":"        _, servers \u003d compute.create_test_server("},{"line_number":176,"context_line":"            self.os, networks\u003d\u0027auto\u0027, wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":177,"context_line":"            min_count\u003d3)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_e0f4e95b","line":174,"updated":"2016-08-17 21:00:43.000000000","message":"This is in the nova-\u003eneutron request right? This comment was a little confusing because I was looking for your check for a 400 Response and didn\u0027t see one.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf56ac49e68bc73dedc43c05c6034f3965537738","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        #   so it queues net2 for deletion and returns net1 from the API and"},{"line_number":172,"context_line":"        #   Nova uses that for the second server request."},{"line_number":173,"context_line":"        # - Third request sees net1 and net2 for the tenant and fails with a"},{"line_number":174,"context_line":"        #   NetworkAmbiguous 400 error."},{"line_number":175,"context_line":"        _, servers \u003d compute.create_test_server("},{"line_number":176,"context_line":"            self.os, networks\u003d\u0027auto\u0027, wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":177,"context_line":"            min_count\u003d3)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_d6e373d7","line":174,"in_reply_to":"3ac371cc_e0f4e95b","updated":"2016-08-17 21:23:03.000000000","message":"Yeah, that\u0027s describing what happens in the nova allocate_for_instance code with this scenario (before I fixed that bug). They are really 3 concurrent build requests in n-cpu and that\u0027s the scenario for how they hit things if nova doesn\u0027t handle them properly.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1e2b479863e5fd1aca567e83187152f4604fee50","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # are using also"},{"line_number":205,"context_line":"        self.assertIn(nets[0][\u0027name\u0027], server_nets)"},{"line_number":206,"context_line":"        # set the class variable for _delete_auto_allocated_network_resources"},{"line_number":207,"context_line":"        self.network \u003d nets[0]"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_00c94526","line":207,"updated":"2016-08-17 21:00:43.000000000","message":"So if we accidentally race and create 2 networks or something this means we never clean up anything?","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf56ac49e68bc73dedc43c05c6034f3965537738","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # are using also"},{"line_number":205,"context_line":"        self.assertIn(nets[0][\u0027name\u0027], server_nets)"},{"line_number":206,"context_line":"        # set the class variable for _delete_auto_allocated_network_resources"},{"line_number":207,"context_line":"        self.network \u003d nets[0]"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_f6ef8f84","line":207,"in_reply_to":"3ac371cc_00c94526","updated":"2016-08-17 21:23:03.000000000","message":"See the comment on 192-196. Neutron will automatically detect there is a duplicate network and delete it. When Neutron first creates the networks, the admin_state_up field on the network is False. If everything goes OK when committing the network to the neutron DB, i.e. no duplicates, neutron then updates the admin_state_up field to True. That\u0027s what Nova is using for filtering them out too:\n\nhttps://github.com/openstack/nova/blob/630eed59e5dd55373fa0613de94e1ead48c3c66b/nova/network/neutronv2/api.py#L268\n\nWe don\u0027t care about explicitly cleaning up that duplicate network in tempest because neutron does it automatically for us.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d6cdce9bbbf1b720b6ebaeefbcdd5827f6c95c36","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # are using also"},{"line_number":205,"context_line":"        self.assertIn(nets[0][\u0027name\u0027], server_nets)"},{"line_number":206,"context_line":"        # set the class variable for _delete_auto_allocated_network_resources"},{"line_number":207,"context_line":"        self.network \u003d nets[0]"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_1924145c","line":207,"in_reply_to":"3ac371cc_7cf1c16a","updated":"2016-08-18 02:06:45.000000000","message":"Done","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3fb804e123e2110fd180c2b88cc4c0e4adc9d98e","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # are using also"},{"line_number":205,"context_line":"        self.assertIn(nets[0][\u0027name\u0027], server_nets)"},{"line_number":206,"context_line":"        # set the class variable for _delete_auto_allocated_network_resources"},{"line_number":207,"context_line":"        self.network \u003d nets[0]"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_7cf1c16a","line":207,"in_reply_to":"3ac371cc_f6ef8f84","updated":"2016-08-17 21:33:53.000000000","message":"As noted above, I\u0027ll remove this and just remove all networks for the tenant in resource_cleanup.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"03b95c9d594f0115be54d94dc243e9d3d12996d6","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class AutoAllocateNetworkTest(base.BaseV2ComputeAdminTest):"},{"line_number":30,"context_line":"    \"\"\"Tests auto-allocating networks with the v2.37 microversion."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    These tests rely on Neutron being enabled. Also, the tenant must not have"}],"source_content_type":"text/x-python","patch_set":24,"id":"3ac371cc_c63c3095","line":29,"updated":"2016-08-18 14:39:40.000000000","message":"So this doesn\u0027t actually need to be base.BaseV2ComputeAdminTest it should probably be base.BaseV2ComputeTest. The only difference between the 2 classes is that the admin variant allocates an admin user. (well and aliases the az client for some reason I can\u0027t figure out) Since we don\u0027t use admin creds here anywhere we should either switch this to the non-admin class or override the credentials class var to be just primary. \n\nRight now we are allocating 2 users dynamically (1 normal and 1 with the admin role) and only ever using the normal user","commit_id":"038467e223709092a55155505b390f7f6bfdb5c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2c7f4c45f7fed91bac728c2508bc8d8dfe5ea905","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class AutoAllocateNetworkTest(base.BaseV2ComputeAdminTest):"},{"line_number":30,"context_line":"    \"\"\"Tests auto-allocating networks with the v2.37 microversion."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    These tests rely on Neutron being enabled. Also, the tenant must not have"}],"source_content_type":"text/x-python","patch_set":24,"id":"3ac371cc_075ac2f1","line":29,"in_reply_to":"3ac371cc_46520068","updated":"2016-08-18 15:14:06.000000000","message":"Done","commit_id":"038467e223709092a55155505b390f7f6bfdb5c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e4433d5468b46e6ac278e8f269371ce25965d25","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class AutoAllocateNetworkTest(base.BaseV2ComputeAdminTest):"},{"line_number":30,"context_line":"    \"\"\"Tests auto-allocating networks with the v2.37 microversion."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    These tests rely on Neutron being enabled. Also, the tenant must not have"}],"source_content_type":"text/x-python","patch_set":24,"id":"3ac371cc_46520068","line":29,"in_reply_to":"3ac371cc_c63c3095","updated":"2016-08-18 14:42:04.000000000","message":"This is admin because of force_tenant_isolation \u003d True. gmann brought up the same thing before.","commit_id":"038467e223709092a55155505b390f7f6bfdb5c3"}],"tempest/api/compute/test_auto_allocate_network.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"459f5e1f95b36519313b675a9f544c919997f58c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # Sanity check that there are no networks available to the tenant."},{"line_number":56,"context_line":"        if cls.networks_client.list_networks()[\u0027networks\u0027]:"},{"line_number":57,"context_line":"            raise exceptions.TempestException("},{"line_number":58,"context_line":"                \u0027There should not be networks available.\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @test.idempotent_id(\u00275eb7b8fa-9c23-47a2-9d7d-02ed5809dd34\u0027)"},{"line_number":61,"context_line":"    def test_server_create_no_allocate(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_8fc25183","line":58,"updated":"2016-06-08 21:13:50.000000000","message":"As mtreinish pointed out in IRC, this isn\u0027t helpful:\n\nhttp://logs.openstack.org/91/327191/1/check/gate-tempest-dsvm-neutron-full/615a890/console.html#_2016-06-08_20_09_50_700\n\nWe should add the networks to the error.\n\nHowever, wtf, why is this happening when set_network_resources() in setup_credentials() shouldn\u0027t setup any networking. There could be a global shared network though (which there is the public network from devstack) that could be messing everything up here.","commit_id":"a9c3007bd154e12f5d6cf30ee9724a3437562855"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f8ef8bcd149e8df332bcd192aaea8502907c9d3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # Sanity check that there are no networks available to the tenant."},{"line_number":56,"context_line":"        if cls.networks_client.list_networks()[\u0027networks\u0027]:"},{"line_number":57,"context_line":"            raise exceptions.TempestException("},{"line_number":58,"context_line":"                \u0027There should not be networks available.\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @test.idempotent_id(\u00275eb7b8fa-9c23-47a2-9d7d-02ed5809dd34\u0027)"},{"line_number":61,"context_line":"    def test_server_create_no_allocate(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_6f81e5fa","line":58,"in_reply_to":"7aa08908_8fc25183","updated":"2016-06-08 21:21:14.000000000","message":"Here\u0027s the network:\n\nhttp://logs.openstack.org/91/327191/1/check/gate-tempest-dsvm-neutron-full/615a890/logs/tempest.txt.gz#_2016-06-08_19_39_37_654\n\n{\n   \"networks\":[\n      {\n         \"status\":\"ACTIVE\",\n         \"router:external\":true,\n         \"availability_zone_hints\":[\n\n         ],\n         \"availability_zones\":[\n            \"nova\"\n         ],\n         \"description\":\"\",\n         \"subnets\":[\n            \"48eb9090-a5d5-4527-a75a-b101657059f1\",\n            \"054d408d-55cc-473b-90b1-a3a12083b2d8\"\n         ],\n         \"shared\":false,\n         \"tenant_id\":\"fc965e165a9a406c9a5398283cc7aa1c\",\n         \"created_at\":\"2016-06-08T19:22:13\",\n         \"tags\":[\n\n         ],\n         \"ipv6_address_scope\":null,\n         \"updated_at\":\"2016-06-08T19:22:13\",\n         \"is_default\":true,\n         \"admin_state_up\":true,\n         \"ipv4_address_scope\":null,\n         \"port_security_enabled\":true,\n         \"mtu\":1450,\n         \"id\":\"ebece55e-bc2e-484f-82de-d2efb19cc6ff\",\n         \"name\":\"public\"\n      }\n   ]\n}\n\nThe tenant created was this:\n\nhttp://logs.openstack.org/91/327191/1/check/gate-tempest-dsvm-neutron-full/615a890/logs/tempest.txt.gz#_2016-06-08_19_39_36_871\n\nCreated isolated network resources for : \n credentials: Credentials: {\u0027tenant_id\u0027: u\u0027bd974186ed0440699d319ef6e7466482\u0027, \u0027tenant_name\u0027: u\u0027tempest-AutoAllocateNetworkTest-18733669\u0027, \u0027username\u0027: u\u0027tempest-AutoAllocateNetworkTest-18733669\u0027, \u0027project_name\u0027: u\u0027tempest-AutoAllocateNetworkTest-18733669\u0027, \u0027project_id\u0027: u\u0027bd974186ed0440699d319ef6e7466482\u0027, \u0027user_id\u0027: u\u0027525c7a145afa4953b6b56169dd773c16\u0027}, Network: None, Subnet: None, Router: None\n\nWhich is a different tenant. Looking at how Nova looks this up:\n\nhttps://github.com/openstack/nova/blob/a0bedb332c96b363f0fd6acfa81b5937a82244eb/nova/network/neutronv2/api.py#L155-L160\n\nWhich is slightly different but what I need to test, so I\u0027ll change to using that and see how it works.","commit_id":"a9c3007bd154e12f5d6cf30ee9724a3437562855"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"8a0b791fbc0aba0e3d0ca514fdf9c6509322e220","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                \u0027There should not be networks available.\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @test.idempotent_id(\u00275eb7b8fa-9c23-47a2-9d7d-02ed5809dd34\u0027)"},{"line_number":61,"context_line":"    def test_server_create_no_allocate(self):"},{"line_number":62,"context_line":"        \"\"\"Tests that no networking is allocated for the server.\"\"\""},{"line_number":63,"context_line":"        # create the server with no networking"},{"line_number":64,"context_line":"        server \u003d self.create_test_server("}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_b344ec49","line":61,"updated":"2016-06-08 15:43:12.000000000","message":"You probably want a neutron service tag here too (just so we tag it as network test)","commit_id":"a9c3007bd154e12f5d6cf30ee9724a3437562855"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c3fe0c7f5b1be6dd15260cc4fa4259a82fcbbb2e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                \u0027There should not be networks available.\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @test.idempotent_id(\u00275eb7b8fa-9c23-47a2-9d7d-02ed5809dd34\u0027)"},{"line_number":61,"context_line":"    def test_server_create_no_allocate(self):"},{"line_number":62,"context_line":"        \"\"\"Tests that no networking is allocated for the server.\"\"\""},{"line_number":63,"context_line":"        # create the server with no networking"},{"line_number":64,"context_line":"        server \u003d self.create_test_server("}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_33611caa","line":61,"in_reply_to":"7aa08908_b344ec49","updated":"2016-06-08 15:47:23.000000000","message":"OK. I\u0027ve seen other compute API tests that skip if neutron isn\u0027t available but don\u0027t use that tag, but I\u0027ll add it.","commit_id":"a9c3007bd154e12f5d6cf30ee9724a3437562855"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d946ea8d77c3fdcbc68f35f4c6ce4ed3d0bbaa2c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def test_server_create_no_allocate(self):"},{"line_number":76,"context_line":"        \"\"\"Tests that no networking is allocated for the server.\"\"\""},{"line_number":77,"context_line":"        # create the server with no networking"},{"line_number":78,"context_line":"        server \u003d self.create_test_server("},{"line_number":79,"context_line":"            networks\u003d[{\u0027uuid\u0027: \u0027none\u0027}], wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":80,"context_line":"        # get the server details"},{"line_number":81,"context_line":"        server \u003d self.servers_client.show_server(server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_a68acf61","line":78,"updated":"2016-06-09 01:01:50.000000000","message":"Failing here:\n\nhttps://github.com/openstack/tempest/blob/master/tempest/api/compute/base.py#L222\n\nhttp://logs.openstack.org/91/327191/2/check/gate-tempest-dsvm-neutron-full/59f3701/console.html#_2016-06-08_23_43_51_260\n\nSo I need to use this instead:\n\nhttps://github.com/openstack/tempest/blob/master/tempest/common/compute.py#L30\n\nWhich will use the networks kwarg here:\n\nhttps://github.com/openstack/tempest/blob/master/tempest/common/fixed_network.py#L109\n\nAnd I\u0027ll have to add my own cleanup method to delete the server.","commit_id":"30dea0361f599c291527a49f3865964231456045"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3c11dacaa85806bfb1fb3696a4c984a91deaf524","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @test.idempotent_id(\u00272e6cf129-9e28-4e8a-aaaa-045ea826b2a6\u0027)"},{"line_number":91,"context_line":"    @test.services(\u0027network\u0027)"},{"line_number":92,"context_line":"    def test_server_create_auto_allocate(self):"},{"line_number":93,"context_line":"        \"\"\"Tests that networking is auto-allocated for the server.\"\"\""},{"line_number":94,"context_line":"        # create the server with auto networking"},{"line_number":95,"context_line":"        server, _ \u003d compute.create_test_server("}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_089bf166","line":92,"updated":"2016-06-09 02:06:01.000000000","message":"Should probably also add a test where we boot more than one server and make sure the network allocation is atomic.","commit_id":"52f06d3e3ba472a70dc798009ea18504c3851efd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b4bb6685ef17e83bfab6d54cbd429acbb7685b13","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @test.idempotent_id(\u00275eb7b8fa-9c23-47a2-9d7d-02ed5809dd34\u0027)"},{"line_number":77,"context_line":"    @test.services(\u0027network\u0027)"},{"line_number":78,"context_line":"    def test_server_create_no_allocate(self):"},{"line_number":79,"context_line":"        \"\"\"Tests that no networking is allocated for the server.\"\"\""},{"line_number":80,"context_line":"        # create the server with no networking"},{"line_number":81,"context_line":"        server, _ \u003d compute.create_test_server("}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_4d4cae76","line":78,"updated":"2016-06-09 22:04:39.000000000","message":"This failed b/c of tags coming back in the json response:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/e8cb62a/console.html#_2016-06-09_20_45_17_188","commit_id":"71ccc1dc846f9641a76325f87023c8fe2c5add1e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b4bb6685ef17e83bfab6d54cbd429acbb7685b13","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        # automatic network allocation is atomic"},{"line_number":96,"context_line":"        _, servers \u003d compute.create_test_server("},{"line_number":97,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027auto\u0027}], wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":98,"context_line":"            min_count\u003d2)"},{"line_number":99,"context_line":"        for server in servers:"},{"line_number":100,"context_line":"            self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":101,"context_line":"            # get the server details"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_6d5b6a2f","line":98,"range":{"start_line":98,"start_character":12,"end_line":98,"end_character":21},"updated":"2016-06-09 22:04:39.000000000","message":"This fails:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/e8cb62a/console.html#_2016-06-09_20_45_17_205","commit_id":"71ccc1dc846f9641a76325f87023c8fe2c5add1e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9f27e73e7d928c6d3d964830cc954d747ab057bb","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027none\u0027}], wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":83,"context_line":"        self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":84,"context_line":"        # get the server details"},{"line_number":85,"context_line":"        addresses \u003d self.servers_client.show_server(server[\u0027id\u0027])[\u0027addresses\u0027]"},{"line_number":86,"context_line":"        # assert that there is no networking"},{"line_number":87,"context_line":"        self.assertEqual({}, addresses)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_a9251baf","line":85,"updated":"2016-06-10 15:50:23.000000000","message":"KeyError:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/5597f2a/console.html#_2016-06-10_02_28_43_425\n\nShould probably be [\u0027server\u0027][\u0027addresses\u0027].","commit_id":"51f8767959ea4a9e5aee31b54cf341ffb0caa143"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9f27e73e7d928c6d3d964830cc954d747ab057bb","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @test.idempotent_id(\u00272e6cf129-9e28-4e8a-aaaa-045ea826b2a6\u0027)"},{"line_number":90,"context_line":"    @test.services(\u0027network\u0027)"},{"line_number":91,"context_line":"    def test_server_multi_create_auto_allocate(self):"},{"line_number":92,"context_line":"        \"\"\"Tests that networking is auto-allocated for multiple servers.\"\"\""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # create multiple servers with auto networking to make sure the"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_696cd39c","line":91,"updated":"2016-06-10 15:50:23.000000000","message":"Something blowing up hard here:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/5597f2a/logs/screen-n-api.txt.gz?level\u003dTRACE#_2016-06-10_02_07_59_216","commit_id":"51f8767959ea4a9e5aee31b54cf341ffb0caa143"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0e506f313a228508d8aae15c0129bdc5aa4a3a8a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            # get the server details"},{"line_number":102,"context_line":"            addresses \u003d self.servers_client.show_server("},{"line_number":103,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"},{"line_number":104,"context_line":"            # assert that there is networking"},{"line_number":105,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":106,"context_line":"            # the network would have been auto-allocated with a static name"},{"line_number":107,"context_line":"            self.assertIn(\u0027auto_allocated_network\u0027, addresses)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_20ee79ec","line":104,"range":{"start_line":104,"start_character":12,"end_line":104,"end_character":45},"updated":"2016-06-10 07:16:56.000000000","message":"-\u003eassert that there is no networking","commit_id":"51f8767959ea4a9e5aee31b54cf341ffb0caa143"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9f27e73e7d928c6d3d964830cc954d747ab057bb","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            # get the server details"},{"line_number":102,"context_line":"            addresses \u003d self.servers_client.show_server("},{"line_number":103,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"},{"line_number":104,"context_line":"            # assert that there is networking"},{"line_number":105,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":106,"context_line":"            # the network would have been auto-allocated with a static name"},{"line_number":107,"context_line":"            self.assertIn(\u0027auto_allocated_network\u0027, addresses)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_6eaa191b","line":104,"range":{"start_line":104,"start_character":12,"end_line":104,"end_character":45},"in_reply_to":"7aa08908_20ee79ec","updated":"2016-06-10 15:50:23.000000000","message":"But there is networking in the auto-allocate case.","commit_id":"51f8767959ea4a9e5aee31b54cf341ffb0caa143"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0e506f313a228508d8aae15c0129bdc5aa4a3a8a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            # assert that there is networking"},{"line_number":105,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":106,"context_line":"            # the network would have been auto-allocated with a static name"},{"line_number":107,"context_line":"            self.assertIn(\u0027auto_allocated_network\u0027, addresses)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # list the networks for the tenant (there should be one)"},{"line_number":110,"context_line":"        search_opts \u003d {\u0027tenant_id\u0027: self.networks_client.tenant_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_608c0136","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":62},"updated":"2016-06-10 07:16:56.000000000","message":"will it add \u0027auto_allocated_network\u0027 in \u0027addresses\u0027 field? actually i did not find it in https://review.openstack.org/#/c/316398/12","commit_id":"51f8767959ea4a9e5aee31b54cf341ffb0caa143"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9f27e73e7d928c6d3d964830cc954d747ab057bb","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            # assert that there is networking"},{"line_number":105,"context_line":"            self.assertEqual(1, len(addresses))"},{"line_number":106,"context_line":"            # the network would have been auto-allocated with a static name"},{"line_number":107,"context_line":"            self.assertIn(\u0027auto_allocated_network\u0027, addresses)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # list the networks for the tenant (there should be one)"},{"line_number":110,"context_line":"        search_opts \u003d {\u0027tenant_id\u0027: self.networks_client.tenant_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_ce14ed4e","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":62},"in_reply_to":"7aa08908_608c0136","updated":"2016-06-10 15:50:23.000000000","message":"No, \u0027auto_allocated_network\u0027 is the name of the network when neutron creates it. The addresses dict in the response for the server has the nw_info cache from the instance, and the top level keys are the network names:\n\nhttps://github.com/openstack/nova/blob/master/doc/api_samples/servers/server-get-resp.json#L5-L14","commit_id":"51f8767959ea4a9e5aee31b54cf341ffb0caa143"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c009bce0c706fdb2c4ab3930727a1ecce7d1c7d","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # create multiple servers with auto networking to make sure the"},{"line_number":96,"context_line":"        # automatic network allocation is atomic"},{"line_number":97,"context_line":"        _, servers \u003d compute.create_test_server("},{"line_number":98,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027auto\u0027}], wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":99,"context_line":"            min_count\u003d2)"},{"line_number":100,"context_line":"        for server in servers:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_ccd179fd","line":97,"updated":"2016-06-11 12:58:19.000000000","message":"Getting further:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/7df0df4/console.html#_2016-06-11_04_24_00_640\n\nNow there is a problem in create_test_server with min_count because it tries to list_servers but there isn\u0027t a schema value for that apparently.","commit_id":"1a5e1e36e06d4c0a6b97852fdba42bc7a1bf33de"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"51aa97ccb90c336b76faadffdb9f4625878fce96","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027auto\u0027}], wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":99,"context_line":"            min_count\u003d2)"},{"line_number":100,"context_line":"        for server in servers:"},{"line_number":101,"context_line":"            self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":102,"context_line":"            # get the server ips"},{"line_number":103,"context_line":"            addresses \u003d self.servers_client.list_addresses("},{"line_number":104,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_4760c235","line":101,"updated":"2016-06-11 15:36:14.000000000","message":"Now cleanup is failing because it\u0027s trying to delete the default security group in the allocated network but the 2nd server is still using it:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/79688df/console.html#_2016-06-11_14_01_18_938","commit_id":"6b14641f4af22815f3a442a4a69af42a7e6e2b98"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2032d512a4be4a7a4eff46c5a1bdcdfbc0203160","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            self.os, networks\u003d[{\u0027uuid\u0027: \u0027auto\u0027}], wait_until\u003d\u0027ACTIVE\u0027,"},{"line_number":99,"context_line":"            min_count\u003d2)"},{"line_number":100,"context_line":"        for server in servers:"},{"line_number":101,"context_line":"            self.addCleanup(self.servers_client.delete_server, server[\u0027id\u0027])"},{"line_number":102,"context_line":"            # get the server ips"},{"line_number":103,"context_line":"            addresses \u003d self.servers_client.list_addresses("},{"line_number":104,"context_line":"                server[\u0027id\u0027])[\u0027addresses\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_e246f94d","line":101,"in_reply_to":"7aa08908_4760c235","updated":"2016-06-12 01:28:56.000000000","message":"Yeah we have to wait for the instances to be gone before we can continue with the tearDown.\n\nThe last instance gets to deallocating the network (deleting it\u0027s ports) here:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/79688df/logs/tempest.txt.gz#_2016-06-11_13_39_35_576\n\nThat\u0027s shortly after the 409 failure to delete the default security group:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/79688df/logs/tempest.txt.gz#_2016-06-11_13_39_35_576","commit_id":"6b14641f4af22815f3a442a4a69af42a7e6e2b98"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"edb4e42f9116764da21b9686fb539242c40f376b","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # list the networks for the tenant (there should be one)"},{"line_number":117,"context_line":"        search_opts \u003d {\u0027tenant_id\u0027: self.networks_client.tenant_id,"},{"line_number":118,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":119,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":120,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":121,"context_line":"        self.assertEqual(1, len(nets))"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_e5053cc2","line":118,"updated":"2016-06-13 15:00:36.000000000","message":"router:external networks are also visible to tenants.","commit_id":"ec42b633beee52517e06db51395413f5ab7b884e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ab7732334ddb2eaffb6f45f99e802d0c9c40c5a","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # list the networks for the tenant (there should be one)"},{"line_number":117,"context_line":"        search_opts \u003d {\u0027tenant_id\u0027: self.networks_client.tenant_id,"},{"line_number":118,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":119,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":120,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":121,"context_line":"        self.assertEqual(1, len(nets))"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_0e55fcc0","line":118,"in_reply_to":"7aa08908_e5053cc2","updated":"2016-06-13 20:10:05.000000000","message":"The checks in this test are just copying what we do in nova when looking for available networks when none are provided:\n\nhttps://github.com/openstack/nova/blob/6d2470ade25b3a58045e7f75afa2629e851ac049/nova/network/neutronv2/api.py#L153-L159\n\nWe probably don\u0027t include router:external in that query because of:\n\nhttps://github.com/openstack/nova/blob/6d2470ade25b3a58045e7f75afa2629e851ac049/nova/network/neutronv2/api.py#L250","commit_id":"ec42b633beee52517e06db51395413f5ab7b884e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3134d6e829c74bc7d8923c2b43896b5030adfa49","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":119,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":120,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":121,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":122,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":123,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_f2b88013","line":121,"updated":"2016-06-12 21:06:30.000000000","message":"This failed, there are 2 private networks created for the same tenant with the same name:\n\nhttp://logs.openstack.org/01/327901/1/check/gate-tempest-dsvm-neutron-full/9972b81/console.html#_2016-06-12_15_19_25_240","commit_id":"ec42b633beee52517e06db51395413f5ab7b884e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5b4751c6d4a1b7201c1a88f1bd16996e01f33e9f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":119,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":120,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":121,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":122,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":123,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_e2dd3215","line":121,"in_reply_to":"7aa08908_0c436543","updated":"2016-06-13 14:47:12.000000000","message":"Working around the failure in tempest doesn\u0027t fix the race bug that\u0027s in nova/neutron, details are in the bug report.","commit_id":"ec42b633beee52517e06db51395413f5ab7b884e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ab7732334ddb2eaffb6f45f99e802d0c9c40c5a","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":119,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":120,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":121,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":122,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":123,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_cebad4e0","line":121,"in_reply_to":"7aa08908_253e248b","updated":"2016-06-13 20:10:05.000000000","message":"The tenant within this test class is unique, as long as we\u0027re using tenant isolation (I need to check with mtreinish if that\u0027s not always the case).\n\nHowever, the test cases are using the same tenant and running concurrently, so yeah, if we had another test case in here that was using network auto-allocation, then we\u0027d be in trouble. This is why I wrote the multiple server create test since I wanted that anyway, but had originally just written a single-server create test and knew that running both concurrently would race.\n\nHaving said that, I\u0027m probably missing a network delete on cleanup in this test class.","commit_id":"ec42b633beee52517e06db51395413f5ab7b884e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b1de2c422c8a983eb0489584be453d2d43ee2d0e","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":119,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":120,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":121,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":122,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":123,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_253e248b","line":121,"in_reply_to":"7aa08908_e2dd3215","updated":"2016-06-13 14:59:34.000000000","message":"that\u0027s not my point, actually.\n\nOn the other end, this test is prone to races because if another test ends up creating a network that\u0027s accessible to this tenant, you\u0027d end up failing because you\u0027re assuming there\u0027s always a single network at the end of the test, which in a shared deployment is clearly false.","commit_id":"ec42b633beee52517e06db51395413f5ab7b884e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2abcf8e01a3f007415980e076451348fe936e76f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                       \u0027shared\u0027: False}"},{"line_number":119,"context_line":"        nets \u003d self.networks_client.list_networks("},{"line_number":120,"context_line":"            **search_opts).get(\u0027networks\u0027, [])"},{"line_number":121,"context_line":"        self.assertEqual(1, len(nets))"},{"line_number":122,"context_line":"        # we\u0027ll know the network was auto-allocated by it\u0027s name"},{"line_number":123,"context_line":"        self.assertEqual(\u0027auto_allocated_network\u0027, nets[0][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_0c436543","line":121,"in_reply_to":"7aa08908_f2b88013","updated":"2016-06-13 08:57:37.000000000","message":"I am pretty sure that if you put this into a wait_until_true this should pass. Because the presence of multiple networks should be transient.","commit_id":"ec42b633beee52517e06db51395413f5ab7b884e"}],"tempest/config.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1e2b479863e5fd1aca567e83187152f4604fee50","unresolved":false,"context_lines":[{"line_number":566,"context_line":"                     \" port admin state\"),"},{"line_number":567,"context_line":"    cfg.BoolOpt(\u0027auto_allocated_topology\u0027,"},{"line_number":568,"context_line":"                default\u003dFalse,"},{"line_number":569,"context_line":"                help\u003d\u0027Allow testing the auto_allocated_topology API extension\u0027)"},{"line_number":570,"context_line":"]"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"validation_group \u003d cfg.OptGroup(name\u003d\u0027validation\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_c0c60d67","line":569,"updated":"2016-08-17 21:00:43.000000000","message":"Isn\u0027t this covered by the api_extensions opt?","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d6cdce9bbbf1b720b6ebaeefbcdd5827f6c95c36","unresolved":false,"context_lines":[{"line_number":566,"context_line":"                     \" port admin state\"),"},{"line_number":567,"context_line":"    cfg.BoolOpt(\u0027auto_allocated_topology\u0027,"},{"line_number":568,"context_line":"                default\u003dFalse,"},{"line_number":569,"context_line":"                help\u003d\u0027Allow testing the auto_allocated_topology API extension\u0027)"},{"line_number":570,"context_line":"]"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"validation_group \u003d cfg.OptGroup(name\u003d\u0027validation\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_66064721","line":569,"in_reply_to":"3ac371cc_9c70fda5","updated":"2016-08-18 02:06:45.000000000","message":"Done","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf56ac49e68bc73dedc43c05c6034f3965537738","unresolved":false,"context_lines":[{"line_number":566,"context_line":"                     \" port admin state\"),"},{"line_number":567,"context_line":"    cfg.BoolOpt(\u0027auto_allocated_topology\u0027,"},{"line_number":568,"context_line":"                default\u003dFalse,"},{"line_number":569,"context_line":"                help\u003d\u0027Allow testing the auto_allocated_topology API extension\u0027)"},{"line_number":570,"context_line":"]"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"validation_group \u003d cfg.OptGroup(name\u003d\u0027validation\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3ac371cc_9c70fda5","line":569,"in_reply_to":"3ac371cc_c0c60d67","updated":"2016-08-17 21:23:03.000000000","message":"Hmm, probably? I\u0027ll check, that would make this a lot easier. However, the neutron extension was added in mitaka, but nova didn\u0027t start using it until newton, so running the test against mitaka would actually fail. Although, the test is conditional based on the 2.37 microversion, which wasn\u0027t in mitaka, so that might work.","commit_id":"5e6e3a9bf25e1a0e692f0a15662a967edb86dbcf"}],"tempest/lib/api_schema/response/compute/v2_26/servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1a6cc08f605266000e84199c21d7c6fb8e40994","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"list_servers \u003d copy.deepcopy(servers21.list_servers)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"update_server \u003d copy.deepcopy(servers219.update_server)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"rebuild_server \u003d copy.deepcopy(servers219.rebuild_server)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"rebuild_server_with_admin_pass \u003d copy.deepcopy("},{"line_number":46,"context_line":"    servers219.rebuild_server_with_admin_pass)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_acf34d9e","line":46,"range":{"start_line":41,"start_character":0,"end_line":46,"end_character":46},"updated":"2016-06-11 13:05:22.000000000","message":"These might not be needed since there aren\u0027t any tests using microversion\u003e\u003d2.26 yet that hit update or rebuild.","commit_id":"6b14641f4af22815f3a442a4a69af42a7e6e2b98"},{"author":{"_account_id":1865,"name":"Andrea Rosa","email":"andrea.rosa@gmail.com","username":"andrea-rosa-m"},"change_message_id":"85cbabd3a5d18e4c2aec24b927a13dd43a3c37d8","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"list_servers \u003d copy.deepcopy(servers21.list_servers)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3aaa91ec_ffefabe6","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":52},"updated":"2016-06-23 14:49:59.000000000","message":"why is this required if the response schema wasn\u0027t change for it?","commit_id":"c18dcecd0b39e5e5c0c91b581b20e763d615b9a0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f9ece3b9785e8459f1c763eedd73fd727334f003","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"list_servers \u003d copy.deepcopy(servers21.list_servers)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3aaa91ec_6daf5c2a","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":52},"in_reply_to":"3aaa91ec_ffefabe6","updated":"2016-06-24 14:09:35.000000000","message":"Because the server client uses it for listing servers:\n\nhttps://review.openstack.org/#/c/327191/15/tempest/lib/services/compute/servers_client.py@127\n\nAnd the create_test_server utility method is listing servers and that fails if we don\u0027t have this.","commit_id":"c18dcecd0b39e5e5c0c91b581b20e763d615b9a0"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"004bfe344a2edd1f917d1205b1170e03294fe499","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# The 2.26 microversion changes the server GET and (detailed) LIST responses to"},{"line_number":21,"context_line":"# include the server \u0027tags\u0027 which is just a list of strings."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"get_server \u003d copy.deepcopy(servers219.get_server)"},{"line_number":24,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":25,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":26,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":27,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":28,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"list_servers_detail \u003d copy.deepcopy(servers219.list_servers_detail)"},{"line_number":31,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":32,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":33,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":34,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":35,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_93dcc913","line":35,"range":{"start_line":23,"start_character":0,"end_line":35,"end_character":30},"updated":"2016-07-29 01:10:39.000000000","message":"Actually we can strict tag schema more as defined on nova side too. \n\nI reviewed it on 2.26 patch and it is better there-\nhttps://review.openstack.org/#/c/233176/28/tempest/lib/api_schema/response/compute/v2_26/servers.py\n\nCan we do the same here if it land first. (these situation are not good actually as same file are being reviewed and modified in many patches)","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9c48bf4ed879bb13e57963b7f565b4de56539c58","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# The 2.26 microversion changes the server GET and (detailed) LIST responses to"},{"line_number":21,"context_line":"# include the server \u0027tags\u0027 which is just a list of strings."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"get_server \u003d copy.deepcopy(servers219.get_server)"},{"line_number":24,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":25,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":26,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":27,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":28,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"list_servers_detail \u003d copy.deepcopy(servers219.list_servers_detail)"},{"line_number":31,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":32,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":33,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":34,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":35,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_1ff1d495","line":35,"range":{"start_line":23,"start_character":0,"end_line":35,"end_character":30},"in_reply_to":"bacf61ea_0c8b9bc4","updated":"2016-07-29 18:10:47.000000000","message":"I\u0027m not sure what you mean.\n\nShould I just rebase my change on top of https://review.openstack.org/#/c/233176/ ? Or add a Depends-On?","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3caa61893d0cff72750bdaeade62b36d135f974d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# The 2.26 microversion changes the server GET and (detailed) LIST responses to"},{"line_number":21,"context_line":"# include the server \u0027tags\u0027 which is just a list of strings."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"get_server \u003d copy.deepcopy(servers219.get_server)"},{"line_number":24,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":25,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":26,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":27,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":28,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"list_servers_detail \u003d copy.deepcopy(servers219.list_servers_detail)"},{"line_number":31,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":32,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":33,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":34,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":35,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_127cc5ea","line":35,"range":{"start_line":23,"start_character":0,"end_line":35,"end_character":30},"in_reply_to":"bacf61ea_0dfe7cad","updated":"2016-08-02 04:58:22.000000000","message":"Yea, I understand that this patch just need string as tag in schema but if we are filling the schema of lower version this should be complete otherwise we always forget to make that complete if other patch gets abandon or not accepted.\n\nSorry for making this hard.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"41923aa52988d7290266c9d53b2864049e0351a1","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# The 2.26 microversion changes the server GET and (detailed) LIST responses to"},{"line_number":21,"context_line":"# include the server \u0027tags\u0027 which is just a list of strings."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"get_server \u003d copy.deepcopy(servers219.get_server)"},{"line_number":24,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":25,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":26,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":27,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":28,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"list_servers_detail \u003d copy.deepcopy(servers219.list_servers_detail)"},{"line_number":31,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":32,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":33,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":34,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":35,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_c59629ef","line":35,"range":{"start_line":23,"start_character":0,"end_line":35,"end_character":30},"in_reply_to":"bacf61ea_1ff1d495","updated":"2016-08-01 01:13:56.000000000","message":"Sorry for confusion, Yea copy from this will work fine.\n https://review.openstack.org/#/c/233176/28/tempest/lib/api_schema/response/compute/v2_26/servers.py\n\nDependent and Depends-On not needed.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e65b91361b7f3cad3e083a647168640397aa05af","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# The 2.26 microversion changes the server GET and (detailed) LIST responses to"},{"line_number":21,"context_line":"# include the server \u0027tags\u0027 which is just a list of strings."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"get_server \u003d copy.deepcopy(servers219.get_server)"},{"line_number":24,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":25,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":26,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":27,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":28,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"list_servers_detail \u003d copy.deepcopy(servers219.list_servers_detail)"},{"line_number":31,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":32,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":33,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":34,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":35,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_d34ac182","line":35,"range":{"start_line":23,"start_character":0,"end_line":35,"end_character":30},"in_reply_to":"bacf61ea_93dcc913","updated":"2016-07-29 01:23:56.000000000","message":"I\u0027ll just copy https://review.openstack.org/#/c/233176/28/tempest/lib/api_schema/response/compute/v2_26/servers.py I guess.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a277e10b1acdb5b44c2f7f0289bdfae7eb04239","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# The 2.26 microversion changes the server GET and (detailed) LIST responses to"},{"line_number":21,"context_line":"# include the server \u0027tags\u0027 which is just a list of strings."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"get_server \u003d copy.deepcopy(servers219.get_server)"},{"line_number":24,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":25,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":26,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":27,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":28,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"list_servers_detail \u003d copy.deepcopy(servers219.list_servers_detail)"},{"line_number":31,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":32,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":33,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":34,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":35,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_0dfe7cad","line":35,"range":{"start_line":23,"start_character":0,"end_line":35,"end_character":30},"in_reply_to":"bacf61ea_c59629ef","updated":"2016-08-01 19:24:29.000000000","message":"Sorry but isn\u0027t it kind of odd to have a full schema for 2.26 in this change but not actually test all of it? Or are you specifically concerned around the schema for what a tag can be, which in this change is just a string, but in that other change is more specific:\n\ntag_items \u003d {\n    \u0027type\u0027: \u0027array\u0027,\n    \u0027maxItems\u0027: 50,\n    \u0027items\u0027: {\n        \u0027type\u0027: \u0027string\u0027,\n        \u0027pattern\u0027: \u0027^[^,/]*$\u0027,\n        \u0027maxLength\u0027: 60\n    }\n}","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3c343358311d8b2a0d4170ee8d8e60592467010c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"# The 2.26 microversion changes the server GET and (detailed) LIST responses to"},{"line_number":21,"context_line":"# include the server \u0027tags\u0027 which is just a list of strings."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"get_server \u003d copy.deepcopy(servers219.get_server)"},{"line_number":24,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":25,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":26,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":27,"context_line":"get_server[\u0027response_body\u0027][\u0027properties\u0027][\u0027server\u0027]["},{"line_number":28,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"list_servers_detail \u003d copy.deepcopy(servers219.list_servers_detail)"},{"line_number":31,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":32,"context_line":"    \u0027properties\u0027].update({\u0027tags\u0027: {\u0027type\u0027: \u0027array\u0027,"},{"line_number":33,"context_line":"                                   \u0027items\u0027: {\u0027type\u0027: \u0027string\u0027}}})"},{"line_number":34,"context_line":"list_servers_detail[\u0027response_body\u0027][\u0027properties\u0027][\u0027servers\u0027][\u0027items\u0027]["},{"line_number":35,"context_line":"    \u0027required\u0027].append(\u0027tags\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# list response schema wasn\u0027t changed for v2.26 so use v2.1"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_0c8b9bc4","line":35,"range":{"start_line":23,"start_character":0,"end_line":35,"end_character":30},"in_reply_to":"bacf61ea_d34ac182","updated":"2016-07-29 02:33:56.000000000","message":"it is modified there.","commit_id":"eab166d2120f3fc874b641062c5a71505b1bf099"}]}
