)]}'
{"doc/source/cli/nova-status.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"6084e4a25f62662831b4c3180f3c3eb5d3e8272a","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"  **18.0.0 (Rocky)**"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"  * Checks for the Placement API are modified to require version 1.30."},{"line_number":112,"context_line":"  * Checks that ironic instances have had their embedded flavors migrated to"},{"line_number":113,"context_line":"    use custom resource classes."},{"line_number":114,"context_line":"  * Checks for ``nova-osapi_compute`` service versions that are less than 15"}],"source_content_type":"text/x-rst","patch_set":13,"id":"3f79a3b5_dfbd53b7","line":111,"updated":"2018-08-15 15:35:57.000000000","message":"we\u0027re no longer in rocky, so presumably this needs to move?","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0cccf6bb2964ecb3f87d49ba3afc4d1971dfcd11","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"  **18.0.0 (Rocky)**"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"  * Checks for the Placement API are modified to require version 1.30."},{"line_number":112,"context_line":"  * Checks that ironic instances have had their embedded flavors migrated to"},{"line_number":113,"context_line":"    use custom resource classes."},{"line_number":114,"context_line":"  * Checks for ``nova-osapi_compute`` service versions that are less than 15"}],"source_content_type":"text/x-rst","patch_set":13,"id":"3f79a3b5_7a7ccdea","line":111,"in_reply_to":"3f79a3b5_dfbd53b7","updated":"2018-08-21 18:39:09.000000000","message":"Done","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2487b8fc96c98a9bd5381f6606cf7e88e8ddbc0","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"  **19.0.0 (Stein)**"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"  * Checks for the Placement API are modified to require version 1.30."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"See Also"},{"line_number":126,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3f79a3b5_82a9db24","line":123,"updated":"2018-08-24 23:02:51.000000000","message":"I\u0027m on the fence about how much we should care to document this now that we\u0027ve said you just need to always upgrade placement before nova.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"72eb3ae07071fc9d2f4a8e9fc07e8a4171b678f1","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"  **19.0.0 (Stein)**"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"  * Checks for the Placement API are modified to require version 1.30."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"See Also"},{"line_number":126,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3f79a3b5_93601dd1","line":123,"in_reply_to":"3f79a3b5_82a9db24","updated":"2018-08-28 11:52:03.000000000","message":"Explicit \u003e Implicit","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"}],"doc/source/user/placement.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bdcf23326ebeb710e37f6e8a3cc8c09e2c3c56ea","unresolved":false,"context_lines":[{"line_number":57,"context_line":"* `Request Traits During Scheduling`_"},{"line_number":58,"context_line":"* `filter allocation candidates by aggregate membership`_"},{"line_number":59,"context_line":"* `perform granular allocation candidate requests`_"},{"line_number":60,"context_line":"* `return consumer generations`_"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. _Nested Resource Providers: http://specs.openstack.org/openstack/nova-specs/specs/queens/approved/nested-resource-providers.html"},{"line_number":63,"context_line":".. _Request Traits During Scheduling: https://specs.openstack.org/openstack/nova-specs/specs/queens/approved/request-traits-in-nova.html"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5f7c97a3_26474d55","line":60,"updated":"2018-07-24 17:53:35.000000000","message":"should reshaper be added here too?","commit_id":"118de7e3352a87e9c7a952f4e7d9a67aa5327794"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6f8898524f38e084d42245d1c17b51bd0660fe3f","unresolved":false,"context_lines":[{"line_number":57,"context_line":"* `Request Traits During Scheduling`_"},{"line_number":58,"context_line":"* `filter allocation candidates by aggregate membership`_"},{"line_number":59,"context_line":"* `perform granular allocation candidate requests`_"},{"line_number":60,"context_line":"* `return consumer generations`_"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. _Nested Resource Providers: http://specs.openstack.org/openstack/nova-specs/specs/queens/approved/nested-resource-providers.html"},{"line_number":63,"context_line":".. _Request Traits During Scheduling: https://specs.openstack.org/openstack/nova-specs/specs/queens/approved/request-traits-in-nova.html"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5f7c97a3_f40c883b","line":60,"in_reply_to":"5f7c97a3_26474d55","updated":"2018-07-25 14:52:38.000000000","message":"Done","commit_id":"118de7e3352a87e9c7a952f4e7d9a67aa5327794"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"72eb3ae07071fc9d2f4a8e9fc07e8a4171b678f1","unresolved":false,"context_lines":[{"line_number":63,"context_line":".. _Request Traits During Scheduling: https://specs.openstack.org/openstack/nova-specs/specs/queens/approved/request-traits-in-nova.html"},{"line_number":64,"context_line":".. _filter allocation candidates by aggregate membership: https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/alloc-candidates-member-of.html"},{"line_number":65,"context_line":".. _perform granular allocation candidate requests: http://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/granular-resource-requests.html"},{"line_number":66,"context_line":".. _inventory and allocation data migration: http://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/reshape-provider-tree.html"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Deployment"},{"line_number":69,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3f79a3b5_337ee969","line":66,"updated":"2018-08-28 11:52:03.000000000","message":"this snuck in during a rebase (again) :) I\u0027m not bothered by it, though, so not a -1 for it.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e8fb0445ab63597851c9ce2c2f4456ea30cf9a94","unresolved":false,"context_lines":[{"line_number":63,"context_line":".. _Request Traits During Scheduling: https://specs.openstack.org/openstack/nova-specs/specs/queens/approved/request-traits-in-nova.html"},{"line_number":64,"context_line":".. _filter allocation candidates by aggregate membership: https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/alloc-candidates-member-of.html"},{"line_number":65,"context_line":".. _perform granular allocation candidate requests: http://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/granular-resource-requests.html"},{"line_number":66,"context_line":".. _inventory and allocation data migration: http://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/reshape-provider-tree.html"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Deployment"},{"line_number":69,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3f79a3b5_b45d0017","line":66,"in_reply_to":"3f79a3b5_337ee969","updated":"2018-08-28 13:29:40.000000000","message":"At some point Matt indicated that we should be putting these references in here anyway. We certainly haven\u0027t been consistent about it, though :(","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"}],"nova/cmd/status.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bdcf23326ebeb710e37f6e8a3cc8c09e2c3c56ea","unresolved":false,"context_lines":[{"line_number":52,"context_line":"PLACEMENT_DOCS_LINK \u003d \u0027https://docs.openstack.org/nova/latest\u0027 \\"},{"line_number":53,"context_line":"                      \u0027/user/placement.html\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# NOTE(efried): 1.30 is required by nova-scheduler to support resource provider"},{"line_number":56,"context_line":"# reshaping (inventory and allocation data migration)."},{"line_number":57,"context_line":"# NOTE: If you bump this version, remember to update the history"},{"line_number":58,"context_line":"# section in the nova-status man page (doc/source/cli/nova-status)."}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a63a7dc2","line":55,"updated":"2018-07-24 17:53:35.000000000","message":"It\u0027s not nova-schedule that requires it, it is nova-compute","commit_id":"118de7e3352a87e9c7a952f4e7d9a67aa5327794"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6f8898524f38e084d42245d1c17b51bd0660fe3f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"PLACEMENT_DOCS_LINK \u003d \u0027https://docs.openstack.org/nova/latest\u0027 \\"},{"line_number":53,"context_line":"                      \u0027/user/placement.html\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# NOTE(efried): 1.30 is required by nova-scheduler to support resource provider"},{"line_number":56,"context_line":"# reshaping (inventory and allocation data migration)."},{"line_number":57,"context_line":"# NOTE: If you bump this version, remember to update the history"},{"line_number":58,"context_line":"# section in the nova-status man page (doc/source/cli/nova-status)."}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_341c4065","line":55,"in_reply_to":"5f7c97a3_a63a7dc2","updated":"2018-07-25 14:52:38.000000000","message":"Done","commit_id":"118de7e3352a87e9c7a952f4e7d9a67aa5327794"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"865a1256f1d4349a75417963993f7fd785bd9c09","unresolved":false,"context_lines":[{"line_number":1467,"context_line":"        resp \u003d self.strict_post(\u0027/reshaper\u0027, payload, version\u003dRESHAPER_VERSION,"},{"line_number":1468,"context_line":"                                global_request_id\u003dcontext.global_id)"},{"line_number":1469,"context_line":"        if not resp:"},{"line_number":1470,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"        return resp"},{"line_number":1473,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_5c27fa1e","line":1470,"range":{"start_line":1470,"start_character":28,"end_line":1470,"end_character":41},"updated":"2018-08-02 12:05:18.000000000","message":"This now hides a list of possible cases that might need different handling by the caller.\n1) rp and consumer generation conflict can be retried by the caller (after refreshing the cache)\n2) json validation error, RP not found, or other real logical errors like InventoryInUse indicated software error and should be logged on ERROR to get a bug report\n3) InventoryInUse and InvalidInventory: I don\u0027t even know what we can do with those.","commit_id":"18c64370bc6578890fdcad133ca7e762c08c5817"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5dc4b7e16bcc07e6a80a549873a0c2e4daa7ee07","unresolved":false,"context_lines":[{"line_number":1467,"context_line":"        resp \u003d self.strict_post(\u0027/reshaper\u0027, payload, version\u003dRESHAPER_VERSION,"},{"line_number":1468,"context_line":"                                global_request_id\u003dcontext.global_id)"},{"line_number":1469,"context_line":"        if not resp:"},{"line_number":1470,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"        return resp"},{"line_number":1473,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_c819f2d2","line":1470,"range":{"start_line":1470,"start_character":28,"end_line":1470,"end_character":41},"in_reply_to":"5f7c97a3_5c27fa1e","updated":"2018-08-02 22:47:57.000000000","message":"Well, we\u0027re logging the actual reason; and in the spec discussion we decided that we want a failure of the reshaper - which should only be happening on startup or nova-manage - to be fatal (tank the compute service). Raising a single exception from here makes it easiest to do that - see the Compute: patch further up.","commit_id":"18c64370bc6578890fdcad133ca7e762c08c5817"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1f9b66315930af1f15a4b0c10b1aa287ad3cf59c","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        return self._client.post(url, json\u003ddata, microversion\u003dversion,"},{"line_number":300,"context_line":"                                 headers\u003dheaders)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def strict_post(self, *args, **kwargs):"},{"line_number":303,"context_line":"        @safe_connect"},{"line_number":304,"context_line":"        def safe_post(celf, *args, **kwargs):"},{"line_number":305,"context_line":"            return celf.post(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_0a62abd8","line":302,"updated":"2018-08-15 16:02:15.000000000","message":"would prefer that the callers just handle ksa exceptions instead of doing this to raise PlacementAPIConnectFailure.","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0cccf6bb2964ecb3f87d49ba3afc4d1971dfcd11","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        return self._client.post(url, json\u003ddata, microversion\u003dversion,"},{"line_number":300,"context_line":"                                 headers\u003dheaders)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def strict_post(self, *args, **kwargs):"},{"line_number":303,"context_line":"        @safe_connect"},{"line_number":304,"context_line":"        def safe_post(celf, *args, **kwargs):"},{"line_number":305,"context_line":"            return celf.post(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_3aedf58a","line":302,"in_reply_to":"3f79a3b5_0a62abd8","updated":"2018-08-21 18:39:09.000000000","message":"Done","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"51b64b4403284e889e898aeaf97e5dc9012e634c","unresolved":false,"context_lines":[{"line_number":1449,"context_line":"        payload \u003d {\"inventories\": inventories, \"allocations\": allocations}"},{"line_number":1450,"context_line":"        resp \u003d self.post(\u0027/reshaper\u0027, payload, version\u003dRESHAPER_VERSION,"},{"line_number":1451,"context_line":"                         global_request_id\u003dcontext.global_id)"},{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_9aa154ac","line":1452,"updated":"2018-08-24 09:54:35.000000000","message":"It seems the POST /reshaper does not return any body. If there is no response body will this statement always be true?","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"359b83764570146f6c57a43a49fa6cc0522b5ce7","unresolved":false,"context_lines":[{"line_number":1449,"context_line":"        payload \u003d {\"inventories\": inventories, \"allocations\": allocations}"},{"line_number":1450,"context_line":"        resp \u003d self.post(\u0027/reshaper\u0027, payload, version\u003dRESHAPER_VERSION,"},{"line_number":1451,"context_line":"                         global_request_id\u003dcontext.global_id)"},{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_d5c1dd30","line":1452,"in_reply_to":"3f79a3b5_1a28e4df","updated":"2018-08-24 11:05:01.000000000","message":"Thanks. I see now.","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0ea15e35813f730f1d330a89e6bfe3525147708b","unresolved":false,"context_lines":[{"line_number":1449,"context_line":"        payload \u003d {\"inventories\": inventories, \"allocations\": allocations}"},{"line_number":1450,"context_line":"        resp \u003d self.post(\u0027/reshaper\u0027, payload, version\u003dRESHAPER_VERSION,"},{"line_number":1451,"context_line":"                         global_request_id\u003dcontext.global_id)"},{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_1a28e4df","line":1452,"in_reply_to":"3f79a3b5_9aa154ac","updated":"2018-08-24 10:01:34.000000000","message":"resp is the object returned  by the requests library representing the entire response. In boolean context it returns True if the response is in the 2xx range\n\nthe actual body of the response is an attribute on the object (there are a few, used in different) ways. On the next line, below, the resp.text is used to pass the error message (of the 4xx range response) to the exception.","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"51b64b4403284e889e898aeaf97e5dc9012e634c","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def update_from_provider_tree(self, context, new_tree):"},{"line_number":1458,"context_line":"        \"\"\"Flush changes from a specified ProviderTree back to placement."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_7aac789e","line":1455,"updated":"2018-08-24 09:54:35.000000000","message":"If there is no response body then why we returning it?","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"359b83764570146f6c57a43a49fa6cc0522b5ce7","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def update_from_provider_tree(self, context, new_tree):"},{"line_number":1458,"context_line":"        \"\"\"Flush changes from a specified ProviderTree back to placement."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_95dda515","line":1455,"in_reply_to":"3f79a3b5_3a25a009","updated":"2018-08-24 11:05:01.000000000","message":"Ohh, so the intention is to return something that is meaningful in a boolean context. I did not get it by reading the code. A :returns: line in the function doc would help.","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ba868f9b060e36663a60a1ea12867fb0b6702b94","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def update_from_provider_tree(self, context, new_tree):"},{"line_number":1458,"context_line":"        \"\"\"Flush changes from a specified ProviderTree back to placement."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_8ce914e4","line":1455,"in_reply_to":"3f79a3b5_40e2e6d6","updated":"2018-08-24 20:24:04.000000000","message":"Done","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0ea15e35813f730f1d330a89e6bfe3525147708b","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def update_from_provider_tree(self, context, new_tree):"},{"line_number":1458,"context_line":"        \"\"\"Flush changes from a specified ProviderTree back to placement."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_3a25a009","line":1455,"in_reply_to":"3f79a3b5_7aac789e","updated":"2018-08-24 10:01:34.000000000","message":"Because it is True, and we\u0027ve got a bit of a pattern of return True or False from these things.","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3bd0c628d61b7b6dec8b3b51975897afb416f447","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def update_from_provider_tree(self, context, new_tree):"},{"line_number":1458,"context_line":"        \"\"\"Flush changes from a specified ProviderTree back to placement."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_d51d5dbe","line":1455,"in_reply_to":"3f79a3b5_95dda515","updated":"2018-08-24 11:08:33.000000000","message":"Well, I\u0027m guessing at this point, I didn\u0027t write this code but perhaps Eric will clarify when he shows up.","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3b9294339efc1ddb0b6139f549912da62400589b","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if not resp:"},{"line_number":1453,"context_line":"            raise exception.ReshapeFailed(error\u003dresp.text)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"        return resp"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def update_from_provider_tree(self, context, new_tree):"},{"line_number":1458,"context_line":"        \"\"\"Flush changes from a specified ProviderTree back to placement."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_40e2e6d6","line":1455,"in_reply_to":"3f79a3b5_d51d5dbe","updated":"2018-08-24 16:10:34.000000000","message":"Yes, you nailed it Chris. Agree that a :return: doc wouldn\u0027t go amiss. But perhaps in a fup, if we don\u0027t end up needing to respin anything under this?","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2487b8fc96c98a9bd5381f6606cf7e88e8ddbc0","unresolved":false,"context_lines":[{"line_number":1426,"context_line":""},{"line_number":1427,"context_line":"        :param context: The security context"},{"line_number":1428,"context_line":"        :param inventories: A dict, keyed by resource provider UUID, of:"},{"line_number":1429,"context_line":"                { \"inventories\": { inventory dicts, keyed by resource class },"},{"line_number":1430,"context_line":"                  \"resource_provider_generation\": $RP_GEN }"},{"line_number":1431,"context_line":"        :param allocations: A dict, keyed by consumer UUID, of:"},{"line_number":1432,"context_line":"                { \"project_id\": $PROJ_ID,"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_1d58cc2e","line":1429,"range":{"start_line":1429,"start_character":35,"end_line":1429,"end_character":75},"updated":"2018-08-24 23:02:51.000000000","message":"nit: modeled after https://developer.openstack.org/api-ref/placement/#id31 right? would be nice to flesh this out for the contents but not a huge deal. I assume this is getting tiresome. :)","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"031960688868cf3add21bd7fbfae50423549403e","unresolved":false,"context_lines":[{"line_number":1426,"context_line":""},{"line_number":1427,"context_line":"        :param context: The security context"},{"line_number":1428,"context_line":"        :param inventories: A dict, keyed by resource provider UUID, of:"},{"line_number":1429,"context_line":"                { \"inventories\": { inventory dicts, keyed by resource class },"},{"line_number":1430,"context_line":"                  \"resource_provider_generation\": $RP_GEN }"},{"line_number":1431,"context_line":"        :param allocations: A dict, keyed by consumer UUID, of:"},{"line_number":1432,"context_line":"                { \"project_id\": $PROJ_ID,"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_dce4253f","line":1429,"range":{"start_line":1429,"start_character":35,"end_line":1429,"end_character":75},"in_reply_to":"3f79a3b5_1d58cc2e","updated":"2018-08-30 17:11:59.000000000","message":"Yeah, given that this is a private method anyway, I preferred terseness over completeness. Anyone who\u0027s really interested can go look at the API ref.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2487b8fc96c98a9bd5381f6606cf7e88e8ddbc0","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_1d23eca8","line":1437,"updated":"2018-08-24 23:02:51.000000000","message":"nit: since this is modeled after https://developer.openstack.org/api-ref/placement/#list-allocations doesn\u0027t this sub-dict also have a \u0027generation\u0027 key for the RP generation?","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"339fc2f62143f8a9224fde66becb83cfd92c17ed","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_4e909e43","line":1437,"in_reply_to":"3f79a3b5_13c96daa","updated":"2018-08-28 12:34:53.000000000","message":"for the sake of the record:\n\nTheir optional in put and post to have potential symmetry with GET, which was added (apparently at Jay\u0027s request) in https://review.openstack.org/#/c/366789/","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"72eb3ae07071fc9d2f4a8e9fc07e8a4171b678f1","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_13c96daa","line":1437,"in_reply_to":"3f79a3b5_1d23eca8","updated":"2018-08-28 11:52:03.000000000","message":"No. Allocations don\u0027t have the resource provider generation in the request payload for PUT/POST.\n\nI\u0027m not entirely sure why the resource provider generation is returned in the response payload from GETs.\n\nRemember that for allocations/claims the only generation that matters is the consumer generation.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41b6c4efd039088922308f492f1190004a2f3f64","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_ee096a30","line":1437,"in_reply_to":"3f79a3b5_4e909e43","updated":"2018-08-28 12:57:14.000000000","message":"\u003e for the sake of the record:\n \u003e \n \u003e Their optional in put and post to have potential symmetry with GET,\n \u003e which was added (apparently at Jay\u0027s request) in https://review.openstack.org/#/c/366789/\n\nHuh, it missing from the API reference if it is part of POST:\n\nhttps://developer.openstack.org/api-ref/placement/#manage-allocations","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4ca4eaa15b35bd8ebc6b49f3225e6071f0a3914a","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_0eaf067d","line":1437,"in_reply_to":"3f79a3b5_4e909e43","updated":"2018-08-28 12:35:56.000000000","message":"Good to have that on the record.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0e5aa859f3c62b57c3706f3a61dcedaa57ae27f4","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_b48bc066","line":1437,"in_reply_to":"3f79a3b5_544a6c5b","updated":"2018-08-28 13:04:34.000000000","message":"\u003e Matt, as I mentioned, POST/PUT allocations deliberately do *not*\n \u003e have the provider generation in the request payload. Only consumer\n \u003e generations.\n\nClearly they do, it\u0027s in the API reference for PUT /allocations/{consumer_uuid}:\n\nhttps://developer.openstack.org/api-ref/placement/#update-allocations\n\nHowever, apparently the resource provider generation is unused, per the description (and code I just checked):\n\n\"A consistent view marker that assists with the management of concurrent resource provider updates. The value is ignored; it is present to preserve symmetry between read and write representations.\"\n\nTo be clear, this isn\u0027t a big deal, but the API reference is wrong for POST /allocations/{consumer_uuid} since the schema allows a resource provider generation in the sub-dict for the RP.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6c35029bbc61747a27d5cf45e3cc67bf5831a194","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_a356242a","line":1437,"in_reply_to":"3f79a3b5_5a4a955b","updated":"2018-08-28 16:25:31.000000000","message":"\u003e When we added the generation on GET \"back in the day\" the client side wanted to treat the allocations as much as blobs to not care about, so people didn\u0027t want to have to delete the generation keys before sending them back.\n\nYes I remember that now that you mention it.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7c3f376ab6aff15f7bff120404b6cf783217ed15","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_45062d1f","line":1437,"in_reply_to":"3f79a3b5_a356242a","updated":"2018-08-28 22:38:18.000000000","message":"https://review.openstack.org/597304\n\nI think.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bef54c322d0e7b30845227696dd6058800036901","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_b7ed02b9","line":1437,"in_reply_to":"3f79a3b5_b48bc066","updated":"2018-08-28 13:53:06.000000000","message":"Sorry, Matt. Clearly I didn\u0027t realize PUT /allocations request payload accepted provider generation. POST /allocations/{consumer_uuid} definitely doesn\u0027t though.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22cf3eaf25a081db31ee3a10d3d8cfbe3f9aa2f4","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_5a4a955b","line":1437,"in_reply_to":"3f79a3b5_b77ae2b7","updated":"2018-08-28 14:04:09.000000000","message":"that too is for the sake of symmetry. When we added the generation on GET \"back in the day\" the client side wanted to treat the allocations as much as blobs to not care about, so people didn\u0027t want to have to delete the generation keys before sending them back. So we made them optional in put and post and because we reuse scheme from that to reshaper they are optional here too.\n\nSince they are optional and also not desired, as matt says, it\u0027s not a huge deal, we can make the docs reflect it, and coolness.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7c732f8436b4c6d74a51db4738c28f544fe4030a","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_b77ae2b7","line":1437,"in_reply_to":"3f79a3b5_b7ed02b9","updated":"2018-08-28 13:57:19.000000000","message":"guh. yeah, the schema permits a generation field in the allocations sub-dict for POST /allocations/{consumer_uuid} :(","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4fd88a8afd2ace9bc77067bff6f196773bf31bbc","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"                  \"consumer_generation\": $CONSUMER_GEN,"},{"line_number":1435,"context_line":"                  \"allocations\": {"},{"line_number":1436,"context_line":"                      $RP_UUID: {"},{"line_number":1437,"context_line":"                          \"resources\": { $RC: $AMOUNT, ... }"},{"line_number":1438,"context_line":"                      },"},{"line_number":1439,"context_line":"                      ..."},{"line_number":1440,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_544a6c5b","line":1437,"in_reply_to":"3f79a3b5_ee096a30","updated":"2018-08-28 12:58:39.000000000","message":"Matt, as I mentioned, POST/PUT allocations deliberately do *not* have the provider generation in the request payload. Only consumer generations.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"}],"nova/tests/functional/test_report_client.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1f9b66315930af1f15a4b0c10b1aa287ad3cf59c","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"            self.client.get_allocation_candidates("},{"line_number":1006,"context_line":"                self.context, utils.ResourceRequest())"},{"line_number":1007,"context_line":""},{"line_number":1008,"context_line":"    def _rp_setup(self):"},{"line_number":1009,"context_line":"        \"\"\"Create two compute nodes in placement: \"this\" one, and another one."},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        Must be invoked from within an _interceptor() context."}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_ea896f74","line":1008,"range":{"start_line":1008,"start_character":8,"end_line":1008,"end_character":17},"updated":"2018-08-15 16:02:15.000000000","message":"maybe call this _setup_provider_tree() to indicate that it\u0027s  creating a provider tree and not just an rp.","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0cccf6bb2964ecb3f87d49ba3afc4d1971dfcd11","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"            self.client.get_allocation_candidates("},{"line_number":1006,"context_line":"                self.context, utils.ResourceRequest())"},{"line_number":1007,"context_line":""},{"line_number":1008,"context_line":"    def _rp_setup(self):"},{"line_number":1009,"context_line":"        \"\"\"Create two compute nodes in placement: \"this\" one, and another one."},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        Must be invoked from within an _interceptor() context."}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_5a9551e3","line":1008,"range":{"start_line":1008,"start_character":8,"end_line":1008,"end_character":17},"in_reply_to":"3f79a3b5_ea896f74","updated":"2018-08-21 18:39:09.000000000","message":"Done","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1f9b66315930af1f15a4b0c10b1aa287ad3cf59c","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"                 resp.json()[\u0027resource_provider_generation\u0027]},"},{"line_number":1053,"context_line":"            version\u003d\u00271.19\u0027)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"    def _alloc_setup(self):"},{"line_number":1056,"context_line":"        \"\"\"Create some allocations on our compute (with sharing)."},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"        Must be invoked from within an _interceptor() context."}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_4adf4368","line":1055,"range":{"start_line":1055,"start_character":8,"end_line":1055,"end_character":20},"updated":"2018-08-15 16:02:15.000000000","message":"maybe _setup_provider_tree_allocs()","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0cccf6bb2964ecb3f87d49ba3afc4d1971dfcd11","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"                 resp.json()[\u0027resource_provider_generation\u0027]},"},{"line_number":1053,"context_line":"            version\u003d\u00271.19\u0027)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"    def _alloc_setup(self):"},{"line_number":1056,"context_line":"        \"\"\"Create some allocations on our compute (with sharing)."},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"        Must be invoked from within an _interceptor() context."}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_7a984d1a","line":1055,"range":{"start_line":1055,"start_character":8,"end_line":1055,"end_character":20},"in_reply_to":"3f79a3b5_4adf4368","updated":"2018-08-21 18:39:09.000000000","message":"Done","commit_id":"26e76d38f54d3d0b81cb5d298a117e73c92e5eec"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"004abf1028afebbaae7e8aeba4fed86678e62efd","unresolved":false,"context_lines":[{"line_number":1160,"context_line":"    def test_reshape(self):"},{"line_number":1161,"context_line":"        \"\"\"Smoke test the report client shim for the reshaper API.\"\"\""},{"line_number":1162,"context_line":"        with self._interceptor():"},{"line_number":1163,"context_line":"            # Simulate placement API communication failure"},{"line_number":1164,"context_line":"            with mock.patch.object("},{"line_number":1165,"context_line":"                    self.client, \u0027post\u0027, side_effect\u003dkse.MissingAuthPlugin):"},{"line_number":1166,"context_line":"                self.assertRaises(kse.ClientException,"},{"line_number":1167,"context_line":"                                  self.client._reshape, self.context, {}, {})"},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":"            # Invalid payload (empty inventories) results in a 409, which the"},{"line_number":1170,"context_line":"            # report client converts to ReshapeFailed"},{"line_number":1171,"context_line":"            try:"},{"line_number":1172,"context_line":"                self.client._reshape(self.context, {}, {})"},{"line_number":1173,"context_line":"            except exception.ReshapeFailed as e:"},{"line_number":1174,"context_line":"                self.assertIn(\u0027JSON does not validate: {} does not have \u0027"},{"line_number":1175,"context_line":"                              \u0027enough properties\u0027, e.kwargs[\u0027error\u0027])"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"            # Okay, do some real stuffs. We\u0027re just smoke-testing that we can"},{"line_number":1178,"context_line":"            # hit a good path to the API here; real testing of the API happens"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_0901766a","line":1175,"range":{"start_line":1163,"start_character":0,"end_line":1175,"end_character":69},"updated":"2018-08-24 19:58:19.000000000","message":"this is fine to put in functional tests but generally exception handling or validation stuff like this should just go in unit tests (not that we have very readable reportclient unit tests, but you know...)","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"004abf1028afebbaae7e8aeba4fed86678e62efd","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"                    res[\u0027resources\u0027][\u0027CUSTOM_FOO\u0027] \u003d 1"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":"            resp \u003d self.client._reshape(self.context, inventories, allocs)"},{"line_number":1202,"context_line":"            self.assertEqual(204, resp.status_code)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_090f3688","line":1202,"updated":"2018-08-24 19:58:19.000000000","message":"I don\u0027t see where we\u0027re asserting that anything changed really... perhaps you are adding that in your next revision though?","commit_id":"920cc1ae6009fd91117afeff97cf9faa89e11ea3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"72eb3ae07071fc9d2f4a8e9fc07e8a4171b678f1","unresolved":false,"context_lines":[{"line_number":1061,"context_line":"        # into the cache for us."},{"line_number":1062,"context_line":"        resp \u003d self.client.post("},{"line_number":1063,"context_line":"            \u0027/resource_providers\u0027,"},{"line_number":1064,"context_line":"            {\u0027uuid\u0027: uuids.ssp, \u0027name\u0027: \u0027ssp\u0027}, version\u003d\u00271.20\u0027)"},{"line_number":1065,"context_line":"        resp \u003d self.client.put("},{"line_number":1066,"context_line":"            \u0027/resource_providers/%s/inventories\u0027 % uuids.ssp,"},{"line_number":1067,"context_line":"            {\u0027inventories\u0027: {\u0027DISK_GB\u0027: {\u0027total\u0027: 500}},"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_b34c393f","line":1064,"updated":"2018-08-28 11:52:03.000000000","message":"thanks for moving this creation into a non-ProviderTree method","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2487b8fc96c98a9bd5381f6606cf7e88e8ddbc0","unresolved":false,"context_lines":[{"line_number":1094,"context_line":"        # Part of the shared storage aggregate"},{"line_number":1095,"context_line":"        self.client.put("},{"line_number":1096,"context_line":"            \u0027/resource_providers/%s/aggregates\u0027 % uuids.othercn,"},{"line_number":1097,"context_line":"            {\u0027aggregates\u0027: [uuids.ssp],"},{"line_number":1098,"context_line":"             \u0027resource_provider_generation\u0027:"},{"line_number":1099,"context_line":"                 resp.json()[\u0027resource_provider_generation\u0027]},"},{"line_number":1100,"context_line":"            version\u003d\u00271.19\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_fd32b05d","line":1097,"range":{"start_line":1097,"start_character":28,"end_line":1097,"end_character":37},"updated":"2018-08-24 23:02:51.000000000","message":"agg1 or something right? Apparently doesn\u0027t matter, but probably wrong?","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"72eb3ae07071fc9d2f4a8e9fc07e8a4171b678f1","unresolved":false,"context_lines":[{"line_number":1094,"context_line":"        # Part of the shared storage aggregate"},{"line_number":1095,"context_line":"        self.client.put("},{"line_number":1096,"context_line":"            \u0027/resource_providers/%s/aggregates\u0027 % uuids.othercn,"},{"line_number":1097,"context_line":"            {\u0027aggregates\u0027: [uuids.ssp],"},{"line_number":1098,"context_line":"             \u0027resource_provider_generation\u0027:"},{"line_number":1099,"context_line":"                 resp.json()[\u0027resource_provider_generation\u0027]},"},{"line_number":1100,"context_line":"            version\u003d\u00271.19\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_b36519b1","line":1097,"range":{"start_line":1097,"start_character":28,"end_line":1097,"end_character":37},"in_reply_to":"3f79a3b5_076876f2","updated":"2018-08-28 11:52:03.000000000","message":"Yeah, probably best to fix this up. The series is already long in the tooth though, with mostly +2/Ws so fup is fine.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"579ef81d8f910eb7b07ba133dc3ae47c6857314d","unresolved":false,"context_lines":[{"line_number":1094,"context_line":"        # Part of the shared storage aggregate"},{"line_number":1095,"context_line":"        self.client.put("},{"line_number":1096,"context_line":"            \u0027/resource_providers/%s/aggregates\u0027 % uuids.othercn,"},{"line_number":1097,"context_line":"            {\u0027aggregates\u0027: [uuids.ssp],"},{"line_number":1098,"context_line":"             \u0027resource_provider_generation\u0027:"},{"line_number":1099,"context_line":"                 resp.json()[\u0027resource_provider_generation\u0027]},"},{"line_number":1100,"context_line":"            version\u003d\u00271.19\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_076876f2","line":1097,"range":{"start_line":1097,"start_character":28,"end_line":1097,"end_character":37},"in_reply_to":"3f79a3b5_fd32b05d","updated":"2018-08-25 15:38:26.000000000","message":"Yeah. I fixed this the first time around, then messed up my commits and missed it the second time.\n\nIt wouldn\u0027t matter unless the logic to populate the cache based on aggregate-connected providers was wrong, in which case uuids.agg1 would break (but uuids.ssp wouldn\u0027t). Anyway, I\u0027ll see how the reviews on the rest of the series go and fix it here or in a fup. Thanks.","commit_id":"2833785f5910d115754c449bc0f0fa2a99aa7239"}]}
