)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8967e3ede2934343dc39558b85849de51fbc94f6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"block rebuild when numa toplogy changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"this change add functional tests to assert the expected"},{"line_number":10,"context_line":"behavior of rebuild numa instances new images."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"if the image change during a rebuild its posible for the"},{"line_number":13,"context_line":"request numa toplogy to change. As a rebuild uses a noop"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_e7709cdd","line":10,"updated":"2019-10-17 14:34:47.000000000","message":"What is the expected behavior? Describe please.","commit_id":"ef73254946997d7922e3674ef43d410a77dc95f7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8967e3ede2934343dc39558b85849de51fbc94f6","unresolved":false,"context_lines":[{"line_number":9,"context_line":"this change add functional tests to assert the expected"},{"line_number":10,"context_line":"behavior of rebuild numa instances new images."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"if the image change during a rebuild its posible for the"},{"line_number":13,"context_line":"request numa toplogy to change. As a rebuild uses a noop"},{"line_number":14,"context_line":"claim in the resouce tracker the numa toplogy will not be"},{"line_number":15,"context_line":"updated as part of a rebuild."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_a77aa4b7","line":12,"updated":"2019-10-17 14:34:47.000000000","message":"Please clean this up for typos and such.","commit_id":"ef73254946997d7922e3674ef43d410a77dc95f7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8967e3ede2934343dc39558b85849de51fbc94f6","unresolved":false,"context_lines":[{"line_number":15,"context_line":"updated as part of a rebuild."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This change intoduces an api check to block rebuild when"},{"line_number":18,"context_line":"the numa requirement for the new iamge do not match the"},{"line_number":19,"context_line":"existing numa constratints"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I0322d872bdff68936033a6f5a54e8296a6fb3434"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_4749708c","line":18,"range":{"start_line":18,"start_character":33,"end_line":18,"end_character":38},"updated":"2019-10-17 14:34:47.000000000","message":"same - clean this up","commit_id":"ef73254946997d7922e3674ef43d410a77dc95f7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8967e3ede2934343dc39558b85849de51fbc94f6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change intoduces an api check to block rebuild when"},{"line_number":18,"context_line":"the numa requirement for the new iamge do not match the"},{"line_number":19,"context_line":"existing numa constratints"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I0322d872bdff68936033a6f5a54e8296a6fb3434"},{"line_number":22,"context_line":"Closes-Bug: #1763766"},{"line_number":23,"context_line":"Partial-implements: blueprint inplace-rebuild-of-numa-instances"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_c721e0b7","line":20,"updated":"2019-10-17 14:34:47.000000000","message":"I would mention how we added a check for rebuilding a volume-backed server with a new image fails because the compute doesn\u0027t support it as precedent.","commit_id":"ef73254946997d7922e3674ef43d410a77dc95f7"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-14 18:09:34 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_fa341f4b","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":23},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"},{"line_number":11,"context_line":"resource tracker the numa topology will not be updated as part of"},{"line_number":12,"context_line":"a rebuild."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_ba3a2731","line":9,"range":{"start_line":9,"start_character":13,"end_line":9,"end_character":19},"updated":"2019-11-18 17:42:05.000000000","message":"\"changes\", or \"has changed\"","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"},{"line_number":11,"context_line":"resource tracker the numa topology will not be updated as part of"},{"line_number":12,"context_line":"a rebuild."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_9a6bab1d","line":9,"range":{"start_line":9,"start_character":59,"end_line":9,"end_character":66},"updated":"2019-11-18 17:42:05.000000000","message":"\"requested\"","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"},{"line_number":11,"context_line":"resource tracker the numa topology will not be updated as part of"},{"line_number":12,"context_line":"a rebuild."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_ba68e720","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":4},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"},{"line_number":11,"context_line":"resource tracker the numa topology will not be updated as part of"},{"line_number":12,"context_line":"a rebuild."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"If the numa constraints do not change, a rebuild will continue as normal."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_7a6eef2c","line":11,"range":{"start_line":11,"start_character":21,"end_line":11,"end_character":25},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"resource tracker the numa topology will not be updated as part of"},{"line_number":12,"context_line":"a rebuild."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"If the numa constraints do not change, a rebuild will continue as normal."},{"line_number":15,"context_line":"If the new constraints conflict with the existing numa constraints of the"},{"line_number":16,"context_line":"instance the rebuild will be rejected without altering the status of the"},{"line_number":17,"context_line":"instance."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_1a61fb39","line":14,"range":{"start_line":14,"start_character":7,"end_line":14,"end_character":11},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"a rebuild."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"If the numa constraints do not change, a rebuild will continue as normal."},{"line_number":15,"context_line":"If the new constraints conflict with the existing numa constraints of the"},{"line_number":16,"context_line":"instance the rebuild will be rejected without altering the status of the"},{"line_number":17,"context_line":"instance."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_da56035f","line":15,"range":{"start_line":15,"start_character":50,"end_line":15,"end_character":54},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"If the numa constraints do not change, a rebuild will continue as normal."},{"line_number":15,"context_line":"If the new constraints conflict with the existing numa constraints of the"},{"line_number":16,"context_line":"instance the rebuild will be rejected without altering the status of the"},{"line_number":17,"context_line":"instance."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_9a872bb7","line":17,"range":{"start_line":16,"start_character":9,"end_line":17,"end_character":9},"updated":"2019-11-18 17:42:05.000000000","message":"Wait, so the instance won\u0027t go into ERROR? Just silently fail and instance remains ACTIVE? Might be worth detailing that here.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"instance the rebuild will be rejected without altering the status of the"},{"line_number":17,"context_line":"instance."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_7a8a6fbc","line":19,"range":{"start_line":19,"start_character":62,"end_line":19,"end_character":66},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":17,"context_line":"instance."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_1abd7b67","line":20,"range":{"start_line":20,"start_character":31,"end_line":20,"end_character":35},"updated":"2019-11-18 17:42:05.000000000","message":"\"do\" - requirements is plural","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":17,"context_line":"instance."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_3ac2b7ea","line":20,"range":{"start_line":20,"start_character":59,"end_line":20,"end_character":63},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This change adds functional tests to assert the expected behaviour of"},{"line_number":25,"context_line":"rebuilding numa instances with new images. This change also asserts that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_7a510f30","line":22,"range":{"start_line":22,"start_character":40,"end_line":22,"end_character":43},"updated":"2019-11-18 17:42:05.000000000","message":"\"is\" - it\u0027s the rebuild that\u0027s not supported, singular","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"94bd6419966e281a320193103167ed00a288b32b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This change adds functional tests to assert the expected behaviour of"},{"line_number":25,"context_line":"rebuilding numa instances with new images. This change also asserts that"},{"line_number":26,"context_line":"in place rebuilds of numa instances is currently not supported."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_c4604838","line":23,"updated":"2019-11-20 15:29:20.000000000","message":"This is an API behavioural change.\nThat said, I\u0027m clearly OK with *NOT* providng a microversion for this behavioural change since the API guidelines make this as an exception :\nhttp://specs.openstack.org/openstack/api-wg/guidelines/api_interoperability.html#evaluating-api-changes\n\n\"A bug in the API service which results in a client getting a response with a status code in the 500-599 range being fixed to return an informative error response in the 400-499 range (when the request was erroneous but fixable) or responding with success (when the request was properly formed, but the server had broken handling).\n\"\n\nTBC, even if we don\u0027t have a synchronous HTTP500 on the instance rebuild call, the instance will end up in some ERROR state, which is bad. Fixing the problem shouldn\u0027t require a microversion (as an operator, I wouldn\u0027t want to explicitly opt into a version for getting my cloud fixed).","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This change adds functional tests to assert the expected behaviour of"},{"line_number":25,"context_line":"rebuilding numa instances with new images. This change also asserts that"},{"line_number":26,"context_line":"in place rebuilds of numa instances is currently not supported."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes-Bug: #1763766"},{"line_number":29,"context_line":"Partial-implements: blueprint inplace-rebuild-of-numa-instances"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fa7e38b_5a29b399","line":26,"range":{"start_line":24,"start_character":0,"end_line":26,"end_character":63},"updated":"2019-11-18 17:42:05.000000000","message":"Do we really need this paragraph?","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-26 21:17:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_8045ce71","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":1},"updated":"2019-12-02 11:07:05.000000000","message":"B","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-26 21:17:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_205c1a4b","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":23},"updated":"2019-12-02 11:07:05.000000000","message":"NUMA (here and elsewhere)","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-26 21:17:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_9b752a9a","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":23},"in_reply_to":"3fa7e38b_205c1a4b","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-26 21:17:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"block rebuild when numa topology changed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the image change during a rebuild it\u0027s possible for the request"},{"line_number":10,"context_line":"numa topology to change. As a rebuild uses a noop claim in the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_3b6c36cf","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":1},"in_reply_to":"3fa7e38b_8045ce71","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":17,"context_line":"instance."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_4057d628","line":20,"range":{"start_line":20,"start_character":31,"end_line":20,"end_character":35},"updated":"2019-12-02 11:07:05.000000000","message":"do","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":17,"context_line":"instance."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_fb653ee3","line":20,"range":{"start_line":20,"start_character":31,"end_line":20,"end_character":35},"in_reply_to":"3fa7e38b_4057d628","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This change adds functional tests to assert the expected behaviour of"},{"line_number":25,"context_line":"rebuilding numa instances with new images. This change also asserts that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_e055a21f","line":22,"range":{"start_line":22,"start_character":48,"end_line":22,"end_character":57},"updated":"2019-12-02 11:07:05.000000000","message":"supported","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":19,"context_line":"This change introduces an API check to block rebuild when the numa"},{"line_number":20,"context_line":"requirements for the new image does not match the existing numa constraints."},{"line_number":21,"context_line":"This is in line with the previous check introduced to prevent the rebuild of"},{"line_number":22,"context_line":"volume-backed instances which similarly are not supproted."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This change adds functional tests to assert the expected behaviour of"},{"line_number":25,"context_line":"rebuilding numa instances with new images. This change also asserts that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3fa7e38b_1b613ad5","line":22,"range":{"start_line":22,"start_character":48,"end_line":22,"end_character":57},"in_reply_to":"3fa7e38b_e055a21f","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"}],"nova/api/openstack/compute/servers.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":1133,"context_line":"                exception.InvalidMetadata,"},{"line_number":1134,"context_line":"                ) as error:"},{"line_number":1135,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.format_message())"},{"line_number":1136,"context_line":"        except INVALID_FLAVOR_IMAGE_EXCEPTIONS as error:"},{"line_number":1137,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.format_message())"},{"line_number":1138,"context_line":""},{"line_number":1139,"context_line":"        instance \u003d self._get_server(context, req, id, is_detail\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_55fd04b0","line":1136,"range":{"start_line":1136,"start_character":15,"end_line":1136,"end_character":46},"updated":"2019-11-18 17:42:05.000000000","message":"✓ New exception is being caught here","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"}],"nova/compute/api.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"94edb35878995e6787f7856431b06aa1b8b45024","unresolved":false,"context_lines":[{"line_number":3402,"context_line":"    def _validate_numa_rebuild(instance, image, flavor):"},{"line_number":3403,"context_line":"        old_constraints \u003d hardware.numa_get_constraints("},{"line_number":3404,"context_line":"            flavor, instance.image_meta).obj_to_primitive()"},{"line_number":3405,"context_line":"        new_constraints \u003d hardware.numa_get_constraints("},{"line_number":3406,"context_line":"            flavor, objects.ImageMeta.from_dict(image)).obj_to_primitive()"},{"line_number":3407,"context_line":"        if  old_constraints !\u003d new_constraints:"},{"line_number":3408,"context_line":"           raise exception.ImageNUMATopologyRebuildConflict()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_cdbe3364","line":3405,"range":{"start_line":3405,"start_character":26,"end_line":3405,"end_character":55},"updated":"2019-10-11 17:45:36.000000000","message":"also i have to handel the fact this returns None if no numa toplogy is requested...","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f793d250afe5e304846b6d9b34c972bee687d539","unresolved":false,"context_lines":[{"line_number":3405,"context_line":"        new_constraints \u003d hardware.numa_get_constraints("},{"line_number":3406,"context_line":"            flavor, objects.ImageMeta.from_dict(image)).obj_to_primitive()"},{"line_number":3407,"context_line":"        if  old_constraints !\u003d new_constraints:"},{"line_number":3408,"context_line":"           raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3409,"context_line":""},{"line_number":3410,"context_line":""},{"line_number":3411,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_728febcc","line":3408,"updated":"2019-10-10 19:50:00.000000000","message":"Your indent is off by 1.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fa349af2f7d586e984d52eece540203d0f809b70","unresolved":false,"context_lines":[{"line_number":3405,"context_line":"        new_constraints \u003d hardware.numa_get_constraints("},{"line_number":3406,"context_line":"            flavor, objects.ImageMeta.from_dict(image)).obj_to_primitive()"},{"line_number":3407,"context_line":"        if  old_constraints !\u003d new_constraints:"},{"line_number":3408,"context_line":"           raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3409,"context_line":""},{"line_number":3410,"context_line":""},{"line_number":3411,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_ad85f708","line":3408,"in_reply_to":"3fa7e38b_728febcc","updated":"2019-10-11 17:42:54.000000000","message":"ah yes that will annoy pep8 but it wont break anything.\nill fix it in the next version.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":3406,"context_line":"            flavor, objects.ImageMeta.from_dict(image))"},{"line_number":3407,"context_line":""},{"line_number":3408,"context_line":"        # early out for non numa instances"},{"line_number":3409,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3410,"context_line":"            return"},{"line_number":3411,"context_line":""},{"line_number":3412,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3413,"context_line":"        # changed to raise an exception."},{"line_number":3414,"context_line":"        if (old_constraints is None or new_constraints is None and"},{"line_number":3415,"context_line":"                old_constraints !\u003d new_constraints):"},{"line_number":3416,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3417,"context_line":""},{"line_number":3418,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3419,"context_line":"        # them as dictionaries."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_52bde1d5","line":3416,"range":{"start_line":3409,"start_character":0,"end_line":3416,"end_character":62},"updated":"2019-10-31 17:23:44.000000000","message":"if (old_constraints is None or new_constraints is None) and not (old_constraints is None and new_constraints is None):\n  raise ...\n\nconstraints \u003d (old_constraints, new_constraints)\nif any((i is None for i in constraints)) and not all((i is None for i in constraints)):\n  raise...\n\nJust spitballing :)","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abfc25908dae5be1b1e7350b644cf7b98a4c6091","unresolved":false,"context_lines":[{"line_number":3406,"context_line":"            flavor, objects.ImageMeta.from_dict(image))"},{"line_number":3407,"context_line":""},{"line_number":3408,"context_line":"        # early out for non numa instances"},{"line_number":3409,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3410,"context_line":"            return"},{"line_number":3411,"context_line":""},{"line_number":3412,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3413,"context_line":"        # changed to raise an exception."},{"line_number":3414,"context_line":"        if (old_constraints is None or new_constraints is None and"},{"line_number":3415,"context_line":"                old_constraints !\u003d new_constraints):"},{"line_number":3416,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3417,"context_line":""},{"line_number":3418,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3419,"context_line":"        # them as dictionaries."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4e339914","line":3416,"range":{"start_line":3409,"start_character":0,"end_line":3416,"end_character":62},"in_reply_to":"3fa7e38b_52bde1d5","updated":"2019-11-12 16:51:06.000000000","message":"that seams a lot more complicated.\nbut i dont need the \"and old !\u003d new\"\n\nif they were equal and ether was none it would return on line 3410 so in the second if if either are non i know they both cant be so i should just raise since they wont be both none","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":3300,"context_line":"                flavor, metadata, files_to_inject, root_bdm)"},{"line_number":3301,"context_line":""},{"line_number":3302,"context_line":"        # NOTE(sean-k-mooney): When we rebuild with a new image we need to"},{"line_number":3303,"context_line":"        # validate that the numa topology does not change as we do a NOOP claim"},{"line_number":3304,"context_line":"        # in resource tracker. As such we cannot allow the resource usage or"},{"line_number":3305,"context_line":"        # assignment to change as a result of a new image altering the"},{"line_number":3306,"context_line":"        # numa constraints."}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_152d4c45","line":3303,"range":{"start_line":3303,"start_character":28,"end_line":3303,"end_character":32},"updated":"2019-11-18 17:42:05.000000000","message":"NUMA","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":3305,"context_line":"        # assignment to change as a result of a new image altering the"},{"line_number":3306,"context_line":"        # numa constraints."},{"line_number":3307,"context_line":"        if orig_image_ref !\u003d image_href:"},{"line_number":3308,"context_line":"            self._validate_numa_rebuild(instance, image, flavor)"},{"line_number":3309,"context_line":""},{"line_number":3310,"context_line":"        kernel_id, ramdisk_id \u003d self._handle_kernel_and_ramdisk("},{"line_number":3311,"context_line":"                context, None, None, image)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_55ebc4db","line":3308,"range":{"start_line":3308,"start_character":50,"end_line":3308,"end_character":55},"updated":"2019-11-18 17:42:05.000000000","message":"✓ this the new image","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":3399,"context_line":"                request_spec\u003drequest_spec)"},{"line_number":3400,"context_line":""},{"line_number":3401,"context_line":"    @staticmethod"},{"line_number":3402,"context_line":"    def _validate_numa_rebuild(instance, image, flavor):"},{"line_number":3403,"context_line":"        old_constraints \u003d hardware.numa_get_constraints("},{"line_number":3404,"context_line":"            flavor, instance.image_meta)"},{"line_number":3405,"context_line":"        new_constraints \u003d hardware.numa_get_constraints("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_15bb0ce5","line":3402,"updated":"2019-11-18 17:42:05.000000000","message":"Maybe a docstring here, just so we\u0027re clear which (old/new) image and flavor are.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":3411,"context_line":""},{"line_number":3412,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3413,"context_line":"        # changed to raise an exception."},{"line_number":3414,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3415,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3416,"context_line":""},{"line_number":3417,"context_line":"        # otherwise since both the old a new constrains are non none compare"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_55c42460","line":3414,"updated":"2019-11-18 17:42:05.000000000","message":"Wouldn\u0027t NUMA -\u003e non-NUMA rebuilding be allowed? But maybe we don\u0027t want to get into that level of granularity, and just always block if there\u0027s NUMA anywhere.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":3411,"context_line":""},{"line_number":3412,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3413,"context_line":"        # changed to raise an exception."},{"line_number":3414,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3415,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3416,"context_line":""},{"line_number":3417,"context_line":"        # otherwise since both the old a new constrains are non none compare"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_bb8469b2","line":3414,"in_reply_to":"3fa7e38b_55c42460","updated":"2019-11-18 18:46:27.000000000","message":"no because rebuild does a noop claim and we use the toplogy form the claim to generate the xml so numa to non numa would still end up with a numa instance.\n\nany change of numa topology is a change on resource usage and is therefore invalid event the removal of that toplogy.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":3416,"context_line":""},{"line_number":3417,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3418,"context_line":"        # them as dictionaries."},{"line_number":3419,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3420,"context_line":"        new \u003d new_constraints.obj_to_primitive()"},{"line_number":3421,"context_line":"        if old !\u003d new:"},{"line_number":3422,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_d593344d","line":3419,"updated":"2019-11-18 17:42:05.000000000","message":"Open question to fill in my ignorance about this - how does PCI fit into this. For instance, NUMA topology doesn\u0027t change, but the PCI device does? A quick look at the code tells me PCI filter should handle this (right?) We don\u0027t run it on rebuild though... Should we? Out of scope?","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":3416,"context_line":""},{"line_number":3417,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3418,"context_line":"        # them as dictionaries."},{"line_number":3419,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3420,"context_line":"        new \u003d new_constraints.obj_to_primitive()"},{"line_number":3421,"context_line":"        if old !\u003d new:"},{"line_number":3422,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_7ba35144","line":3419,"in_reply_to":"3fa7e38b_d593344d","updated":"2019-11-18 18:46:27.000000000","message":"you cannot request pci devices via the image so they should not change. that said i have another patch\nhttps://review.opendev.org/#/c/674072/7\nthat allows setting the numa affinity policy pci device in the flavor and image which would not be stored in the numa constratis so i gusses i will have to check for that also in the future.\n\nill have to have a follow up patch to handel that case depending on which one merges first but currently the pci request and numa affinity cant change during rebuild so this should be sufficent.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":3399,"context_line":"                request_spec\u003drequest_spec)"},{"line_number":3400,"context_line":""},{"line_number":3401,"context_line":"    @staticmethod"},{"line_number":3402,"context_line":"    def _validate_numa_rebuild(instance, image, flavor):"},{"line_number":3403,"context_line":"        old_constraints \u003d hardware.numa_get_constraints("},{"line_number":3404,"context_line":"            flavor, instance.image_meta)"},{"line_number":3405,"context_line":"        new_constraints \u003d hardware.numa_get_constraints("},{"line_number":3406,"context_line":"            flavor, objects.ImageMeta.from_dict(image))"},{"line_number":3407,"context_line":""},{"line_number":3408,"context_line":"        # early out for non numa instances"},{"line_number":3409,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3410,"context_line":"            return"},{"line_number":3411,"context_line":""},{"line_number":3412,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3413,"context_line":"        # changed to raise an exception."},{"line_number":3414,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3415,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3416,"context_line":""},{"line_number":3417,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3418,"context_line":"        # them as dictionaries."},{"line_number":3419,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3420,"context_line":"        new \u003d new_constraints.obj_to_primitive()"},{"line_number":3421,"context_line":"        if old !\u003d new:"},{"line_number":3422,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3423,"context_line":""},{"line_number":3424,"context_line":"    @staticmethod"},{"line_number":3425,"context_line":"    def _check_quota_for_upsize(context, instance, current_flavor, new_flavor):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_55a744a9","line":3422,"range":{"start_line":3402,"start_character":0,"end_line":3422,"end_character":62},"updated":"2019-11-18 17:42:05.000000000","message":"We can unit test this method, surely? To make sure we hit all the conditionals here, and not have to figure out which func test hits what.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":3399,"context_line":"                request_spec\u003drequest_spec)"},{"line_number":3400,"context_line":""},{"line_number":3401,"context_line":"    @staticmethod"},{"line_number":3402,"context_line":"    def _validate_numa_rebuild(instance, image, flavor):"},{"line_number":3403,"context_line":"        old_constraints \u003d hardware.numa_get_constraints("},{"line_number":3404,"context_line":"            flavor, instance.image_meta)"},{"line_number":3405,"context_line":"        new_constraints \u003d hardware.numa_get_constraints("},{"line_number":3406,"context_line":"            flavor, objects.ImageMeta.from_dict(image))"},{"line_number":3407,"context_line":""},{"line_number":3408,"context_line":"        # early out for non numa instances"},{"line_number":3409,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3410,"context_line":"            return"},{"line_number":3411,"context_line":""},{"line_number":3412,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3413,"context_line":"        # changed to raise an exception."},{"line_number":3414,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3415,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3416,"context_line":""},{"line_number":3417,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3418,"context_line":"        # them as dictionaries."},{"line_number":3419,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3420,"context_line":"        new \u003d new_constraints.obj_to_primitive()"},{"line_number":3421,"context_line":"        if old !\u003d new:"},{"line_number":3422,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3423,"context_line":""},{"line_number":3424,"context_line":"    @staticmethod"},{"line_number":3425,"context_line":"    def _check_quota_for_upsize(context, instance, current_flavor, new_flavor):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_9b75edce","line":3422,"range":{"start_line":3402,"start_character":0,"end_line":3422,"end_character":62},"in_reply_to":"3fa7e38b_55a744a9","updated":"2019-11-18 18:46:27.000000000","message":"am yes i could add unit tests for this i guess.\n\ni really dont want to add unit test for the rebuild function itself since its doing way to much but i can tests this.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b52227a54b479d6c3fb1b499820c256ead788b3d","unresolved":false,"context_lines":[{"line_number":3419,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3420,"context_line":"        new \u003d new_constraints.obj_to_primitive()"},{"line_number":3421,"context_line":"        if old !\u003d new:"},{"line_number":3422,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3423,"context_line":""},{"line_number":3424,"context_line":"    @staticmethod"},{"line_number":3425,"context_line":"    def _check_quota_for_upsize(context, instance, current_flavor, new_flavor):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_10e237d5","line":3422,"in_reply_to":"3fa7e38b_9b75edce","updated":"2019-11-18 20:40:51.000000000","message":"Yep, rebuild would be horrible to unit test. But _validate is self contained and should lend itself to unit testing.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"31c5731a5910b5053c85df0038f5834de145a233","unresolved":false,"context_lines":[{"line_number":709,"context_line":"            hardware.vcpus_realtime_topology(instance_type, image_meta)"},{"line_number":710,"context_line":"        hardware.get_cpu_topology_constraints(instance_type, image_meta)"},{"line_number":711,"context_line":"        if validate_numa:"},{"line_number":712,"context_line":"            hardware.numa_get_constraints(instance_type, image_meta)"},{"line_number":713,"context_line":"        if validate_pci:"},{"line_number":714,"context_line":"            pci_request.get_pci_requests_from_flavor(instance_type)"},{"line_number":715,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_92ef52b0","line":712,"range":{"start_line":712,"start_character":12,"end_line":712,"end_character":68},"updated":"2019-12-03 06:01:40.000000000","message":"we already call \u0027hardware.numa_get_constraints\u0027 at here. I\u0027m thinking we can reuse that.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":709,"context_line":"            hardware.vcpus_realtime_topology(instance_type, image_meta)"},{"line_number":710,"context_line":"        hardware.get_cpu_topology_constraints(instance_type, image_meta)"},{"line_number":711,"context_line":"        if validate_numa:"},{"line_number":712,"context_line":"            hardware.numa_get_constraints(instance_type, image_meta)"},{"line_number":713,"context_line":"        if validate_pci:"},{"line_number":714,"context_line":"            pci_request.get_pci_requests_from_flavor(instance_type)"},{"line_number":715,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_88164258","line":712,"range":{"start_line":712,"start_character":12,"end_line":712,"end_character":68},"in_reply_to":"3fa7e38b_92ef52b0","updated":"2019-12-03 23:22:34.000000000","message":"yes i was aware im not sure that it makes sense to return this as it create tight coupling between these functions that i don\u0027t think should really exists.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"31c5731a5910b5053c85df0038f5834de145a233","unresolved":false,"context_lines":[{"line_number":3416,"context_line":"        # separate variable to make future testing of this easier."},{"line_number":3417,"context_line":"        old_image_meta \u003d instance.image_meta"},{"line_number":3418,"context_line":"        new_image_meta \u003d objects.ImageMeta.from_dict(image)"},{"line_number":3419,"context_line":"        old_constraints \u003d hardware.numa_get_constraints(flavor, old_image_meta)"},{"line_number":3420,"context_line":"        new_constraints \u003d hardware.numa_get_constraints(flavor, new_image_meta)"},{"line_number":3421,"context_line":""},{"line_number":3422,"context_line":"        # early out for non NUMA instances"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_52279a1f","line":3419,"range":{"start_line":3419,"start_character":8,"end_line":3419,"end_character":79},"updated":"2019-12-03 06:01:40.000000000","message":"do we need the old image to rebuild original NUMA topology object? can we use the instance.numa_topology directly?","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":3416,"context_line":"        # separate variable to make future testing of this easier."},{"line_number":3417,"context_line":"        old_image_meta \u003d instance.image_meta"},{"line_number":3418,"context_line":"        new_image_meta \u003d objects.ImageMeta.from_dict(image)"},{"line_number":3419,"context_line":"        old_constraints \u003d hardware.numa_get_constraints(flavor, old_image_meta)"},{"line_number":3420,"context_line":"        new_constraints \u003d hardware.numa_get_constraints(flavor, new_image_meta)"},{"line_number":3421,"context_line":""},{"line_number":3422,"context_line":"        # early out for non NUMA instances"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_28fb8e48","line":3419,"range":{"start_line":3419,"start_character":8,"end_line":3419,"end_character":79},"in_reply_to":"3fa7e38b_52279a1f","updated":"2019-12-03 23:22:34.000000000","message":"i want to compare the constraints rather then the actual topology. i might be able to extract the constraints and compare those but it will be less clean to do so.\n\ni will need the old image metadata to validate pci numa policies in the future once that feature merges. im hoping it will merge in the next week or so before i go on vactation.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3421,"context_line":""},{"line_number":3422,"context_line":"        # early out for non NUMA instances"},{"line_number":3423,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3424,"context_line":"            # return true for easy unit testing"},{"line_number":3425,"context_line":"            return True"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3428,"context_line":"        # changed to raise an exception."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_60377200","line":3425,"range":{"start_line":3424,"start_character":0,"end_line":3425,"end_character":23},"updated":"2019-12-02 11:07:05.000000000","message":"Could we just return here instead? Unit test can sure be adjusted to just check that things don\u0027t raise","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":3421,"context_line":""},{"line_number":3422,"context_line":"        # early out for non NUMA instances"},{"line_number":3423,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3424,"context_line":"            # return true for easy unit testing"},{"line_number":3425,"context_line":"            return True"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3428,"context_line":"        # changed to raise an exception."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_685bad21","line":3425,"range":{"start_line":3424,"start_character":0,"end_line":3425,"end_character":23},"in_reply_to":"3fa7e38b_489b6a16","updated":"2019-12-04 15:14:32.000000000","message":"I wouldn\u0027t even bother calling assertIsNone. I\u0027d just call it. If it errors out, the test will report it","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":3421,"context_line":""},{"line_number":3422,"context_line":"        # early out for non NUMA instances"},{"line_number":3423,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3424,"context_line":"            # return true for easy unit testing"},{"line_number":3425,"context_line":"            return True"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3428,"context_line":"        # changed to raise an exception."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_489b6a16","line":3425,"range":{"start_line":3424,"start_character":0,"end_line":3425,"end_character":23},"in_reply_to":"3fa7e38b_60377200","updated":"2019-12-03 23:22:34.000000000","message":"i used to do that but then i had to do self.assertNone in the unit test which i know some people dont like otherwise some of the unit tes would contain no asserts and when i have wrote tests that way in the pas people have not been happy with that since its not clear the test is intended to fail only if a excpetion is raised that the test expects not to be raised.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3424,"context_line":"            # return true for easy unit testing"},{"line_number":3425,"context_line":"            return True"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3428,"context_line":"        # changed to raise an exception."},{"line_number":3429,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3430,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_a016ca57","line":3427,"range":{"start_line":3427,"start_character":62,"end_line":3427,"end_character":72},"updated":"2019-12-02 11:07:05.000000000","message":"constraints","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3424,"context_line":"            # return true for easy unit testing"},{"line_number":3425,"context_line":"            return True"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3428,"context_line":"        # changed to raise an exception."},{"line_number":3429,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3430,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_0026becc","line":3427,"range":{"start_line":3427,"start_character":44,"end_line":3427,"end_character":52},"updated":"2019-12-02 11:07:05.000000000","message":"non-None (or \u0027set\u0027)","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3425,"context_line":"            return True"},{"line_number":3426,"context_line":""},{"line_number":3427,"context_line":"        # if only one of the constrains are non None then the constrains"},{"line_number":3428,"context_line":"        # changed to raise an exception."},{"line_number":3429,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3430,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3431,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_c0198687","line":3428,"range":{"start_line":3428,"start_character":18,"end_line":3428,"end_character":20},"updated":"2019-12-02 11:07:05.000000000","message":"so","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3429,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3430,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3433,"context_line":"        # them as dictionaries."},{"line_number":3434,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3435,"context_line":"        new \u003d new_constraints.obj_to_primitive()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_6010d25a","line":3432,"range":{"start_line":3432,"start_character":39,"end_line":3432,"end_character":40},"updated":"2019-12-02 11:07:05.000000000","message":"and","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3429,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3430,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3433,"context_line":"        # them as dictionaries."},{"line_number":3434,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3435,"context_line":"        new \u003d new_constraints.obj_to_primitive()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_80138e65","line":3432,"range":{"start_line":3432,"start_character":60,"end_line":3432,"end_character":68},"updated":"2019-12-02 11:07:05.000000000","message":"non-None (or \u0027set\u0027)","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3433,"context_line":"        # them as dictionaries."},{"line_number":3434,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3435,"context_line":"        new \u003d new_constraints.obj_to_primitive()"},{"line_number":3436,"context_line":"        if old !\u003d new:"},{"line_number":3437,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3438,"context_line":"        # TODO(sean-k-mooney): add PCI NUMA affinity policy check."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_9b49bf67","line":3435,"range":{"start_line":3434,"start_character":0,"end_line":3435,"end_character":48},"updated":"2019-12-02 11:07:05.000000000","message":"So these will be instances of InstanceNUMATopology with nested InstanceNUMACell. I wonder if we\u0027d be better off explicitly implementing \u0027__eq__\u0027 on those objects since converting to primitives and comparing like this will compare things like the object version?\n\nLater: actually, that doesn\u0027t matter since we\u0027re calculating both of these objects from scratch above, which means they will always be the same type of object at least","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3433,"context_line":"        # them as dictionaries."},{"line_number":3434,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3435,"context_line":"        new \u003d new_constraints.obj_to_primitive()"},{"line_number":3436,"context_line":"        if old !\u003d new:"},{"line_number":3437,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3438,"context_line":"        # TODO(sean-k-mooney): add PCI NUMA affinity policy check."}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_db416238","line":3435,"range":{"start_line":3434,"start_character":0,"end_line":3435,"end_character":48},"in_reply_to":"3fa7e38b_9b49bf67","updated":"2019-12-03 23:22:34.000000000","message":"they will always be the same time of objects and im intentionally converting them to dictionaries and comparing those to ensure i fully compare all the nested objects.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":3437,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3438,"context_line":"        # TODO(sean-k-mooney): add PCI NUMA affinity policy check."},{"line_number":3439,"context_line":""},{"line_number":3440,"context_line":"        # return true for easy unit testing"},{"line_number":3441,"context_line":"        return True"},{"line_number":3442,"context_line":""},{"line_number":3443,"context_line":"    @staticmethod"},{"line_number":3444,"context_line":"    def _check_quota_for_upsize(context, instance, current_flavor, new_flavor):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_bb4cbb75","line":3441,"range":{"start_line":3440,"start_character":0,"end_line":3441,"end_character":19},"updated":"2019-12-02 11:07:05.000000000","message":"ditto (drop \u0027True\u0027)","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":3437,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3438,"context_line":"        # TODO(sean-k-mooney): add PCI NUMA affinity policy check."},{"line_number":3439,"context_line":""},{"line_number":3440,"context_line":"        # return true for easy unit testing"},{"line_number":3441,"context_line":"        return True"},{"line_number":3442,"context_line":""},{"line_number":3443,"context_line":"    @staticmethod"},{"line_number":3444,"context_line":"    def _check_quota_for_upsize(context, instance, current_flavor, new_flavor):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_28806e9c","line":3441,"range":{"start_line":3440,"start_character":0,"end_line":3441,"end_character":19},"in_reply_to":"3fa7e38b_bb4cbb75","updated":"2019-12-03 23:22:34.000000000","message":"as i said above yes i can but it make the unit test harder to write clearly.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":3423,"context_line":"        # in resource tracker. As such we cannot allow the resource usage or"},{"line_number":3424,"context_line":"        # assignment to change as a result of a new image altering the"},{"line_number":3425,"context_line":"        # numa constraints."},{"line_number":3426,"context_line":"        if orig_image_ref !\u003d image_href:"},{"line_number":3427,"context_line":"            self._validate_numa_rebuild(instance, image, flavor)"},{"line_number":3428,"context_line":""},{"line_number":3429,"context_line":"        kernel_id, ramdisk_id \u003d self._handle_kernel_and_ramdisk("}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_fe7953c5","line":3426,"range":{"start_line":3426,"start_character":11,"end_line":3426,"end_character":39},"updated":"2019-12-09 21:41:00.000000000","message":"Isn\u0027t it possible to change the image meta on the original image, so I could have a conflict even if I\u0027m using the \"same\" image for the rebuild? Or is that somehow accounted for by this point?\n\n[Later] In IRC you told me if the image doesn\u0027t change we use the cached image_meta.","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":3540,"context_line":""},{"line_number":3541,"context_line":"        # early out for non NUMA instances"},{"line_number":3542,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3543,"context_line":"            # return true for easy unit testing"},{"line_number":3544,"context_line":"            return True"},{"line_number":3545,"context_line":""},{"line_number":3546,"context_line":"        # if only one of the constrains are non-None (or \u0027set\u0027) then the"},{"line_number":3547,"context_line":"        # constraints changed so raise an exception."}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_5e7187dd","line":3544,"range":{"start_line":3543,"start_character":11,"end_line":3544,"end_character":23},"updated":"2019-12-09 21:41:00.000000000","message":"That\u0027s not really a thing. Tests can just run the code; not raising is implicitly passing. IMO this actually makes the code less maintainable because now you have to remember to make sure all of your returns return True.\n\nNot worth blocking over, though.","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8766a78e1bc6300bf8c9544c8f3f79cab16c9eca","unresolved":false,"context_lines":[{"line_number":3540,"context_line":""},{"line_number":3541,"context_line":"        # early out for non NUMA instances"},{"line_number":3542,"context_line":"        if old_constraints is None and new_constraints is None:"},{"line_number":3543,"context_line":"            # return true for easy unit testing"},{"line_number":3544,"context_line":"            return True"},{"line_number":3545,"context_line":""},{"line_number":3546,"context_line":"        # if only one of the constrains are non-None (or \u0027set\u0027) then the"},{"line_number":3547,"context_line":"        # constraints changed so raise an exception."}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_2446fca8","line":3544,"range":{"start_line":3543,"start_character":11,"end_line":3544,"end_character":23},"in_reply_to":"3fa7e38b_5e7187dd","updated":"2019-12-09 21:55:07.000000000","message":"ok ill drop this in the fixup patch. while working on some of the test stephen and i notice some typos and other trivial issues so i was going to work on a general cleanup patch anyway so i can either put that in that or as a seperate patch.","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":3543,"context_line":"            # return true for easy unit testing"},{"line_number":3544,"context_line":"            return True"},{"line_number":3545,"context_line":""},{"line_number":3546,"context_line":"        # if only one of the constrains are non-None (or \u0027set\u0027) then the"},{"line_number":3547,"context_line":"        # constraints changed so raise an exception."},{"line_number":3548,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3549,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_de4ed794","line":3546,"range":{"start_line":3546,"start_character":29,"end_line":3546,"end_character":39},"updated":"2019-12-09 21:41:00.000000000","message":"constraints","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":3546,"context_line":"        # if only one of the constrains are non-None (or \u0027set\u0027) then the"},{"line_number":3547,"context_line":"        # constraints changed so raise an exception."},{"line_number":3548,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3549,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3550,"context_line":""},{"line_number":3551,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3552,"context_line":"        # them as dictionaries."}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_be499b8e","line":3549,"range":{"start_line":3549,"start_character":28,"end_line":3549,"end_character":60},"updated":"2019-12-09 21:41:00.000000000","message":"It would be nice if the exception message distinguished between the (currently) two failure conditions. Or a log message?","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8766a78e1bc6300bf8c9544c8f3f79cab16c9eca","unresolved":false,"context_lines":[{"line_number":3546,"context_line":"        # if only one of the constrains are non-None (or \u0027set\u0027) then the"},{"line_number":3547,"context_line":"        # constraints changed so raise an exception."},{"line_number":3548,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3549,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3550,"context_line":""},{"line_number":3551,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3552,"context_line":"        # them as dictionaries."}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_448698bc","line":3549,"range":{"start_line":3549,"start_character":28,"end_line":3549,"end_character":60},"in_reply_to":"3fa7e38b_be499b8e","updated":"2019-12-09 21:55:07.000000000","message":"sure i can add a debug log here and below to make this easier to follow.","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":3548,"context_line":"        if old_constraints is None or new_constraints is None:"},{"line_number":3549,"context_line":"            raise exception.ImageNUMATopologyRebuildConflict()"},{"line_number":3550,"context_line":""},{"line_number":3551,"context_line":"        # otherwise since both the old a new constrains are non none compare"},{"line_number":3552,"context_line":"        # them as dictionaries."},{"line_number":3553,"context_line":"        old \u003d old_constraints.obj_to_primitive()"},{"line_number":3554,"context_line":"        new \u003d new_constraints.obj_to_primitive()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_7e3fa3de","line":3551,"range":{"start_line":3551,"start_character":45,"end_line":3551,"end_character":55},"updated":"2019-12-09 21:41:00.000000000","message":"constraints","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"}],"nova/exception.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":1917,"context_line":""},{"line_number":1918,"context_line":"class ImageNUMATopologyRebuildConflict(Invalid):"},{"line_number":1919,"context_line":"    msg_fmt \u003d _("},{"line_number":1920,"context_line":"        \"Image NUMA constraints conflict with existing instance \""},{"line_number":1921,"context_line":"        \"NUMA topology. An instances NUMA typology cannot be changed \""},{"line_number":1922,"context_line":"        \"as part of a rebuild.\")"},{"line_number":1923,"context_line":""},{"line_number":1924,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_95a13c98","line":1921,"range":{"start_line":1920,"start_character":9,"end_line":1921,"end_character":23},"updated":"2019-11-18 17:42:05.000000000","message":"I\u0027d drop this first sentence.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"class ImageNUMATopologyRebuildConflict(Invalid):"},{"line_number":1919,"context_line":"    msg_fmt \u003d _("},{"line_number":1920,"context_line":"        \"Image NUMA constraints conflict with existing instance \""},{"line_number":1921,"context_line":"        \"NUMA topology. An instances NUMA typology cannot be changed \""},{"line_number":1922,"context_line":"        \"as part of a rebuild.\")"},{"line_number":1923,"context_line":""},{"line_number":1924,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_f598b069","line":1921,"range":{"start_line":1921,"start_character":27,"end_line":1921,"end_character":36},"updated":"2019-11-18 17:42:05.000000000","message":"instance\u0027s","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"class ImageNUMATopologyRebuildConflict(Invalid):"},{"line_number":1919,"context_line":"    msg_fmt \u003d _("},{"line_number":1920,"context_line":"        \"Image NUMA constraints conflict with existing instance \""},{"line_number":1921,"context_line":"        \"NUMA topology. An instances NUMA typology cannot be changed \""},{"line_number":1922,"context_line":"        \"as part of a rebuild.\")"},{"line_number":1923,"context_line":""},{"line_number":1924,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_3b507932","line":1921,"range":{"start_line":1921,"start_character":27,"end_line":1921,"end_character":36},"in_reply_to":"3fa7e38b_f598b069","updated":"2019-11-18 18:46:27.000000000","message":"i could but i wanted to make it clear that the conflcit was cause by the image that was selected.\n\ni could make it\n\n\"An instances NUMA typology cannot be changed as part of a rebuild. The image provided is invalid for this instance\"","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"class ImageNUMATopologyRebuildConflict(Invalid):"},{"line_number":1859,"context_line":"    msg_fmt \u003d _("},{"line_number":1860,"context_line":"        \"An instance\u0027s NUMA typology cannot be changed as part of a rebuild. \""},{"line_number":1861,"context_line":"        \"The image provided is invalid for this instance.\")"},{"line_number":1862,"context_line":""},{"line_number":1863,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_1e778fd3","line":1860,"range":{"start_line":1860,"start_character":28,"end_line":1860,"end_character":36},"updated":"2019-12-09 21:41:00.000000000","message":"topology","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"}],"nova/tests/functional/libvirt/test_numa_servers.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08265bc265f44594014f4921cefd34f3227d58b2","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class NUMAServersTestNew("},{"line_number":65,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":66,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":69,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_5c69a8f6","line":66,"range":{"start_line":64,"start_character":0,"end_line":66,"end_character":47},"updated":"2019-10-10 17:11:30.000000000","message":"this is not strictly required but i know that matt riedemann\ndose not like how the _wait_for_state_change functions and some of the ohter legacy stuff works when you are not using hte intgreated helpers so im trying to make this work with the new way of doing things.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fa349af2f7d586e984d52eece540203d0f809b70","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class NUMAServersTestNew("},{"line_number":65,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":66,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":69,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_4d2803e1","line":66,"range":{"start_line":64,"start_character":0,"end_line":66,"end_character":47},"in_reply_to":"3fa7e38b_1b71f376","updated":"2019-10-11 17:42:54.000000000","message":"the integerate_helpers version\n\nself._wait_for_state_change(self.api, active_server, \u0027ACTIVE\u0027)\n\nwaits until the server state reaches active\n\nthe older one self._wait_for_state_change(created_server, \u0027BUILD\u0027)\n\nwaits untill the server state change form build to any other state. that is something people often get wrong.\n\nbut for clarity i guess it is better to just the old style for now to keep this patch as minimal as possible.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f793d250afe5e304846b6d9b34c972bee687d539","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class NUMAServersTestNew("},{"line_number":65,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":66,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":69,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_1b71f376","line":66,"range":{"start_line":64,"start_character":0,"end_line":66,"end_character":47},"in_reply_to":"3fa7e38b_5c69a8f6","updated":"2019-10-10 19:50:00.000000000","message":"Personal opinion: lose this, but add a NOTE whenever you call that weird waiter. Seems like extra complexity for not much gain.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f793d250afe5e304846b6d9b34c972bee687d539","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"},{"line_number":70,"context_line":"    _flavor_ref_parameter \u003d \u0027flavorRef\u0027"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def setUp(self):"},{"line_number":73,"context_line":"        super(NUMAServersTestNew, self).setUp()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_db66fbbb","line":72,"updated":"2019-10-10 19:50:00.000000000","message":"Why do we need a setUp() all over again? Because of your new _Base class? If we stick with the existing class structure do we still need this?","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fa349af2f7d586e984d52eece540203d0f809b70","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"},{"line_number":70,"context_line":"    _flavor_ref_parameter \u003d \u0027flavorRef\u0027"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def setUp(self):"},{"line_number":73,"context_line":"        super(NUMAServersTestNew, self).setUp()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_cd2b93e8","line":72,"in_reply_to":"3fa7e38b_db66fbbb","updated":"2019-10-11 17:42:54.000000000","message":"this comes form base.ServersTestBase\n\nand no but i know matt want use to not use teh old broken way. i was tryign to avoid re wrtinging the full module i use the integrated helpers.\n \ni guess i could defer that to a different patch if no one objects.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fa349af2f7d586e984d52eece540203d0f809b70","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def _rebuild_server(self, active_server, image_ref):"},{"line_number":146,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": image_ref}}"},{"line_number":147,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":148,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":149,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.rebuild.end\u0027)"},{"line_number":150,"context_line":"        return self._wait_for_state_change(self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_8d583b8a","line":148,"range":{"start_line":147,"start_character":8,"end_line":148,"end_character":52},"updated":"2019-10-11 17:42:54.000000000","message":"by the way the behavior im expecting is that this woudl convert the api error into an exception.\n\nmaybe that is not the behavior of this function.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fa349af2f7d586e984d52eece540203d0f809b70","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": image_ref}}"},{"line_number":147,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":148,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":149,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.rebuild.end\u0027)"},{"line_number":150,"context_line":"        return self._wait_for_state_change(self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def _get_connection(self, host_info, pci_info\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_edcc4f36","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":78},"updated":"2019-10-11 17:42:54.000000000","message":"if api_post jsut retruned the error if the instnace.rebuild.start notification had been sent we might still send this i would have to double check.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fa349af2f7d586e984d52eece540203d0f809b70","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":148,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":149,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.rebuild.end\u0027)"},{"line_number":150,"context_line":"        return self._wait_for_state_change(self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def _get_connection(self, host_info, pci_info\u003dNone,"},{"line_number":153,"context_line":"                        libvirt_version\u003dfakelibvirt.FAKE_LIBVIRT_VERSION,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_4d04834a","line":150,"range":{"start_line":150,"start_character":15,"end_line":150,"end_character":77},"updated":"2019-10-11 17:42:54.000000000","message":"assuming we recived the notification and got here im expecting that hey way im blocking the rebuild will leave the vm in the active state so this would then return the server info which is acatully what im seeign so i need to go check the behavior of api_post.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e726909e36a220100eb9134dd6a7f45d8ca5e7a6","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to fail"},{"line_number":207,"context_line":"        # fail because the NUMA topology filter does not support in place rebuild"},{"line_number":208,"context_line":"        # and we have used all the resources on the compute node."},{"line_number":209,"context_line":"        ex \u003d self.assertRaises("},{"line_number":210,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":211,"context_line":"            server, self.image_ref_1)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_rebuild_server_with_differnt_numa_topology_fails(self):"},{"line_number":214,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_f7050d11","line":211,"range":{"start_line":209,"start_character":8,"end_line":211,"end_character":37},"updated":"2019-10-10 17:19:09.000000000","message":"this shoudl result in a no valide host error","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fa349af2f7d586e984d52eece540203d0f809b70","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to fail"},{"line_number":207,"context_line":"        # fail because the NUMA topology filter does not support in place rebuild"},{"line_number":208,"context_line":"        # and we have used all the resources on the compute node."},{"line_number":209,"context_line":"        ex \u003d self.assertRaises("},{"line_number":210,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":211,"context_line":"            server, self.image_ref_1)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_rebuild_server_with_differnt_numa_topology_fails(self):"},{"line_number":214,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_8de35bd8","line":211,"range":{"start_line":209,"start_character":8,"end_line":211,"end_character":37},"in_reply_to":"3fa7e38b_9b3c0394","updated":"2019-10-11 17:42:54.000000000","message":"oh i should try that thanks good tip. i forgot i could enabel debug logging when runnign functional tests.\n\nmaybe we have somthing wrong with our mocking because the rebuild should not continue if the filter failed.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f793d250afe5e304846b6d9b34c972bee687d539","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to fail"},{"line_number":207,"context_line":"        # fail because the NUMA topology filter does not support in place rebuild"},{"line_number":208,"context_line":"        # and we have used all the resources on the compute node."},{"line_number":209,"context_line":"        ex \u003d self.assertRaises("},{"line_number":210,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":211,"context_line":"            server, self.image_ref_1)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_rebuild_server_with_differnt_numa_topology_fails(self):"},{"line_number":214,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_9b3c0394","line":211,"range":{"start_line":209,"start_character":8,"end_line":211,"end_character":37},"in_reply_to":"3fa7e38b_f7050d11","updated":"2019-10-10 19:50:00.000000000","message":"Had time to play around with this a bit, preliminary findings as follows:\n\nRunning this with export OS_DEBUG\u003dTrue, I do see the NUMATopologyFilter refusing the host:\n\n2019-10-10 15:06:24,298 DEBUG [nova.virt.hardware] Not enough available CPUs to schedule instance. Oversubscription is not possible with pinned instances. Required: 2 (2 + 0), actual: 0\n\nBut then the rebuild proceeds regularly:\n\n2019-10-10 15:06:24,324 INFO [nova.compute.manager] Rebuilding instance","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e726909e36a220100eb9134dd6a7f45d8ca5e7a6","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        # claims therefor it is not allowed for the numa topology or resource"},{"line_number":236,"context_line":"        # usage to change during a rebuild."},{"line_number":237,"context_line":"        ex \u003d self.assertRaises("},{"line_number":238,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":239,"context_line":"            server, self.image_ref_1)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_97161949","line":238,"range":{"start_line":238,"start_character":12,"end_line":238,"end_character":40},"updated":"2019-10-10 17:19:09.000000000","message":"and this should be my new exception\nbut i just get back the server instance.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"08265bc265f44594014f4921cefd34f3227d58b2","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        # and we have enough resources on the host."},{"line_number":188,"context_line":"        self._rebuild_server(server, self.image_ref_1)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def test_rebuild_server_with_numa_inplace_fails(self):"},{"line_number":191,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        \"\"\""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":196,"context_line":"            cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d2, kB_mem\u003d15740000)"},{"line_number":197,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":198,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":199,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        extra_spec \u003d {\u0027hw:cpu_policy\u0027: \u0027dedicated\u0027}"},{"line_number":202,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":203,"context_line":"        server \u003d self._create_active_server("},{"line_number":204,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to fail"},{"line_number":207,"context_line":"        # fail because the NUMA topology filter does not support in place rebuild"},{"line_number":208,"context_line":"        # and we have used all the resources on the compute node."},{"line_number":209,"context_line":"        ex \u003d self.assertRaises("},{"line_number":210,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":211,"context_line":"            server, self.image_ref_1)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_rebuild_server_with_differnt_numa_topology_fails(self):"},{"line_number":214,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        \"\"\""},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":219,"context_line":"            cpu_nodes\u003d2, cpu_sockets\u003d1, cpu_cores\u003d4, kB_mem\u003d15740000)"},{"line_number":220,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":221,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":222,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        extra_spec \u003d {\u0027hw:cpu_policy\u0027: \u0027dedicated\u0027}"},{"line_number":225,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":226,"context_line":"        server \u003d self._create_active_server("},{"line_number":227,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        ctx \u003d nova_context.get_admin_context()"},{"line_number":231,"context_line":"        image_meta \u003d {\u0027hw:numa_nodes\u0027:2}"},{"line_number":232,"context_line":"        self.fake_image_service.update(ctx, self.image_ref_1, image_meta)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # NOTE(sean-k-mooney): this should fail because rebuild uses noop"},{"line_number":235,"context_line":"        # claims therefor it is not allowed for the numa topology or resource"},{"line_number":236,"context_line":"        # usage to change during a rebuild."},{"line_number":237,"context_line":"        ex \u003d self.assertRaises("},{"line_number":238,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":239,"context_line":"            server, self.image_ref_1)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class NUMAServersTest(NUMAServersTestBase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_3c962cf2","line":239,"range":{"start_line":190,"start_character":4,"end_line":239,"end_character":37},"updated":"2019-10-10 17:11:30.000000000","message":"i am not getting back an api exctiopion in these two cases and im not sure why.","commit_id":"099acf5d3edf5530781fd9ef25d774e0c17a7585"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # Mock the \u0027get_connection\u0027 function, as we\u0027re going to need to provide"},{"line_number":104,"context_line":"        # custom capabilities for each test"},{"line_number":105,"context_line":"        _p \u003d mock.patch(\u0027nova.virt.libvirt.host.Host.get_connection\u0027)"},{"line_number":106,"context_line":"        self.mock_conn \u003d _p.start()"},{"line_number":107,"context_line":"        self.addCleanup(_p.stop)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        self.fake_image_service \u003d fake_image.stub_out_image_service(self)"},{"line_number":110,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_ee1429a2","line":107,"range":{"start_line":105,"start_character":0,"end_line":107,"end_character":32},"updated":"2019-10-31 17:23:44.000000000","message":"self.mock_conn \u003d self.useFixture(fixtures.MockPatch(\u0027nova.virt.libvirt.host.Host.get_connection\u0027)).mock","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":66,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"},{"line_number":67,"context_line":"    _flavor_ref_parameter \u003d \u0027flavorRef\u0027"},{"line_number":68,"context_line":"    ADDITIONAL_FILTERS \u003d [\u0027NUMATopologyFilter\u0027]"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def setUp(self):"},{"line_number":71,"context_line":"        super(NUMAServersTestNew, self).setUp()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        # Replace libvirt with fakelibvirt"},{"line_number":74,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":75,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt\u0027,"},{"line_number":76,"context_line":"            fakelibvirt))"},{"line_number":77,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":78,"context_line":"            \u0027nova.virt.libvirt.host.libvirt\u0027,"},{"line_number":79,"context_line":"            fakelibvirt))"},{"line_number":80,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":81,"context_line":"            \u0027nova.virt.libvirt.guest.libvirt\u0027,"},{"line_number":82,"context_line":"            fakelibvirt))"},{"line_number":83,"context_line":"        self.useFixture(fakelibvirt.FakeLibvirtFixture())"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":86,"context_line":"            \u0027nova.virt.libvirt.LibvirtDriver._create_image\u0027))"},{"line_number":87,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":88,"context_line":"            \u0027nova.virt.libvirt.LibvirtDriver._get_local_gb_info\u0027,"},{"line_number":89,"context_line":"            return_value\u003d{\u0027total\u0027: 128, \u0027used\u0027: 44, \u0027free\u0027: 84}))"},{"line_number":90,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":91,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt_utils.is_valid_hostname\u0027,"},{"line_number":92,"context_line":"            return_value\u003dTrue))"},{"line_number":93,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":94,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt_utils.file_open\u0027,"},{"line_number":95,"context_line":"            side_effect\u003dlambda *a, **k: io.BytesIO(b\u0027\u0027)))"},{"line_number":96,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":97,"context_line":"            \u0027nova.privsep.utils.supports_direct_io\u0027,"},{"line_number":98,"context_line":"            return_value\u003dTrue))"},{"line_number":99,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":100,"context_line":"            \u0027nova.virt.libvirt.host.Host.get_online_cpus\u0027,"},{"line_number":101,"context_line":"            return_value\u003dset(range(16))))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # Mock the \u0027get_connection\u0027 function, as we\u0027re going to need to provide"},{"line_number":104,"context_line":"        # custom capabilities for each test"},{"line_number":105,"context_line":"        _p \u003d mock.patch(\u0027nova.virt.libvirt.host.Host.get_connection\u0027)"},{"line_number":106,"context_line":"        self.mock_conn \u003d _p.start()"},{"line_number":107,"context_line":"        self.addCleanup(_p.stop)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        self.fake_image_service \u003d fake_image.stub_out_image_service(self)"},{"line_number":110,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":111,"context_line":"        images \u003d self.api.get_images()"},{"line_number":112,"context_line":"        self.image_ref_0 \u003d images[0][\u0027id\u0027]"},{"line_number":113,"context_line":"        self.image_ref_1 \u003d images[1][\u0027id\u0027]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":116,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self.flags(compute_driver\u003d\u0027libvirt.LibvirtDriver\u0027)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        enabled_filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":121,"context_line":"        enabled_filters +\u003d self.ADDITIONAL_FILTERS"},{"line_number":122,"context_line":"        self.flags(driver\u003d\u0027filter_scheduler\u0027, group\u003d\u0027scheduler\u0027)"},{"line_number":123,"context_line":"        self.flags(enabled_filters\u003denabled_filters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _setup_compute_service(self):"},{"line_number":126,"context_line":"        pass"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _setup_scheduler_service(self):"},{"line_number":129,"context_line":"        enabled_filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":130,"context_line":"        enabled_filters +\u003d self.ADDITIONAL_FILTERS"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        self.flags(driver\u003d\u0027filter_scheduler\u0027, group\u003d\u0027scheduler\u0027)"},{"line_number":133,"context_line":"        self.flags(enabled_filters\u003denabled_filters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        return self.start_service(\u0027scheduler\u0027)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":138,"context_line":"        basic_server \u003d {"},{"line_number":139,"context_line":"            \u0027flavorRef\u0027: 1,"},{"line_number":140,"context_line":"            \u0027name\u0027: \u0027numa_server\u0027,"},{"line_number":141,"context_line":"            \u0027networks\u0027: [{"},{"line_number":142,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":143,"context_line":"            }],"},{"line_number":144,"context_line":"            \u0027imageRef\u0027: self.image_ref_0"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":"        if server_args:"},{"line_number":147,"context_line":"            basic_server.update(server_args)"},{"line_number":148,"context_line":"        server \u003d self.api.post_server({\u0027server\u0027: basic_server})"},{"line_number":149,"context_line":"        return self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _rebuild_server(self, active_server, image_ref):"},{"line_number":152,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": image_ref}}"},{"line_number":153,"context_line":"        self.api.api_post("},{"line_number":154,"context_line":"            \u0027servers/%s/action\u0027 % active_server[\u0027id\u0027], args)"},{"line_number":155,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.rebuild.end\u0027)"},{"line_number":156,"context_line":"        return self._wait_for_state_change(self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _get_connection(self, host_info, pci_info\u003dNone,"},{"line_number":159,"context_line":"                        libvirt_version\u003dfakelibvirt.FAKE_LIBVIRT_VERSION,"},{"line_number":160,"context_line":"                        mdev_info\u003dNone, hostname\u003dNone):"},{"line_number":161,"context_line":"        # sanity check"},{"line_number":162,"context_line":"        self.assertGreater(16, host_info.cpus,"},{"line_number":163,"context_line":"            \"Host.get_online_cpus is only accounting for 16 CPUs but you\u0027re \""},{"line_number":164,"context_line":"            \"requesting %d; change the mock or your test\" % host_info.cpus)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        fake_connection \u003d fakelibvirt.Connection("},{"line_number":167,"context_line":"            \u0027qemu:///system\u0027,"},{"line_number":168,"context_line":"            version\u003dlibvirt_version,"},{"line_number":169,"context_line":"            hv_version\u003dfakelibvirt.FAKE_QEMU_VERSION,"},{"line_number":170,"context_line":"            host_info\u003dhost_info,"},{"line_number":171,"context_line":"            pci_info\u003dpci_info,"},{"line_number":172,"context_line":"            mdev_info\u003dmdev_info,"},{"line_number":173,"context_line":"            hostname\u003dhostname)"},{"line_number":174,"context_line":"        return fake_connection"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def test_rebuild_server_with_numa(self):"},{"line_number":177,"context_line":"        \"\"\"Create a NUMA instance and insure it can be rebuilt."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_6e56f95e","line":174,"range":{"start_line":65,"start_character":0,"end_line":174,"end_character":30},"updated":"2019-10-31 17:23:44.000000000","message":"This is 110 lines of boilerplate which isn\u0027t directly relevant to this test. As previously discussed I\u0027d prefer this to live elsewhere for clarity and re-use, but I won\u0027t insist on it.","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        return fake_connection"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def test_rebuild_server_with_numa(self):"},{"line_number":177,"context_line":"        \"\"\"Create a NUMA instance and insure it can be rebuilt."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_2ea8011e","line":177,"range":{"start_line":177,"start_character":38,"end_line":177,"end_character":44},"updated":"2019-10-31 17:23:44.000000000","message":"ensure","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":202,"context_line":"            cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d2, kB_mem\u003d15740000)"},{"line_number":203,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":204,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":205,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4e51bd2f","line":202,"range":{"start_line":202,"start_character":40,"end_line":202,"end_character":51},"updated":"2019-10-31 17:23:44.000000000","message":"This is the only difference between this test and test_rebuild_server_with_numa. What\u0027s this supposed to be testing? Is this just testing that rebuild is doing a claim, and that we can\u0027t schedule here?\n\nEven if it\u0027s obvious, would you mind spelling it out in a comment for the hard of thinking like myself?","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abfc25908dae5be1b1e7350b644cf7b98a4c6091","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":202,"context_line":"            cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d2, kB_mem\u003d15740000)"},{"line_number":203,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":204,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":205,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_d6c70911","line":202,"range":{"start_line":202,"start_character":40,"end_line":202,"end_character":51},"in_reply_to":"3fa7e38b_4e51bd2f","updated":"2019-11-12 16:51:06.000000000","message":"ya i reduced the core count so that we have enough room to boot and instnace but not enough room to rebuild as the current logic will allow the rebuild to proceed if there is free space to place a second instnce with the requested numa toplogy.","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":216,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":217,"context_line":"            server, self.image_ref_1)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_rebuild_server_with_differnt_numa_topology_fails(self):"},{"line_number":220,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_ae9b9114","line":219,"range":{"start_line":219,"start_character":33,"end_line":219,"end_character":41},"updated":"2019-10-31 17:23:44.000000000","message":"different","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":233,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        ctx \u003d nova_context.get_admin_context()"},{"line_number":236,"context_line":"        image_meta \u003d {\u0027properties\u0027: {\u0027hw_numa_nodes\u0027: 2}}"},{"line_number":237,"context_line":"        self.fake_image_service.update(ctx, self.image_ref_1, image_meta)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        # NOTE(sean-k-mooney): this should fail because rebuild uses noop"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_31e38036","line":236,"updated":"2019-10-31 17:23:44.000000000","message":"Is it worth poking some other types of different for completeness? e.g. thread policy, cpuset, pagesize? I don\u0027t actually know what I\u0027m talking about here, but it seems InstanceNUMATopology is a nested object, so it might be nice to poke things at different levels.","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abfc25908dae5be1b1e7350b644cf7b98a4c6091","unresolved":false,"context_lines":[{"line_number":233,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        ctx \u003d nova_context.get_admin_context()"},{"line_number":236,"context_line":"        image_meta \u003d {\u0027properties\u0027: {\u0027hw_numa_nodes\u0027: 2}}"},{"line_number":237,"context_line":"        self.fake_image_service.update(ctx, self.image_ref_1, image_meta)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        # NOTE(sean-k-mooney): this should fail because rebuild uses noop"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_e947ca4b","line":236,"in_reply_to":"3fa7e38b_31e38036","updated":"2019-11-12 16:51:06.000000000","message":"not really\ni could but the way im comparing them if anything chagnes it will fail.\n\ni could add a loop over different toplogy changes but i dont think it will buy us much.","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        # NOTE(sean-k-mooney): this should fail because rebuild uses noop"},{"line_number":240,"context_line":"        # claims therefor it is not allowed for the numa topology or resource"},{"line_number":241,"context_line":"        # usage to change during a rebuild."},{"line_number":242,"context_line":"        self.assertRaises("},{"line_number":243,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":244,"context_line":"            server, self.image_ref_1)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"class NUMAServersTest(NUMAServersTestBase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_1188c46e","line":244,"range":{"start_line":242,"start_character":0,"end_line":244,"end_character":37},"updated":"2019-10-31 17:23:44.000000000","message":"I feel like we ought to be asserting something more about this failure. As it stands, this could be NoValidHost (like the previous one) and we couldn\u0027t tell the difference.","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abfc25908dae5be1b1e7350b644cf7b98a4c6091","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        # NOTE(sean-k-mooney): this should fail because rebuild uses noop"},{"line_number":240,"context_line":"        # claims therefor it is not allowed for the numa topology or resource"},{"line_number":241,"context_line":"        # usage to change during a rebuild."},{"line_number":242,"context_line":"        self.assertRaises("},{"line_number":243,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":244,"context_line":"            server, self.image_ref_1)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"class NUMAServersTest(NUMAServersTestBase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_696d1acb","line":244,"range":{"start_line":242,"start_character":0,"end_line":244,"end_character":37},"in_reply_to":"3fa7e38b_1188c46e","updated":"2019-11-12 16:51:06.000000000","message":"ya this however is a good change i have added a check on the responce code and the message body","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("},{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_15bd4c67","line":61,"updated":"2019-11-18 17:42:05.000000000","message":"Is this class just to to get the non-weird \"wait for state change\" helper? Stephen\u0027s been doing some refactoring to achieve the same thing here [1], I\u0027d rather we coordinate his work with yours instead of duplicating a whole bunch of methods here.\n\n[1] https://review.opendev.org/#/c/689182/5/nova/tests/functional/test_servers.py","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("},{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_9bce4d81","line":61,"in_reply_to":"3fa7e38b_15bd4c67","updated":"2019-11-18 18:46:27.000000000","message":"yes and this needs to be backported too queens so i dont want to depend on that. im hoping to back port this patch upstream and downstream we were asked to consider backporting this farther but i think we settled on osp13/queens. i know stepen and matt both have been looking at refafctoring this i spoke to both of them about it a few weeks ago.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"569e25a0c29de7e355c22110cfaa18bdc3efee3a","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("},{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_18552750","line":61,"in_reply_to":"3fa7e38b_904387b0","updated":"2019-11-26 21:14:03.000000000","message":"well i had originally hoped Stephen would base his refactor on top of this patch which is why i flagged it to him before he started working on his refactor. that way we could avoid any duplication but he didn\u0027t so we have two efforts.\ni was originally going to updated all the other test in the file too use this but stopped because he was going to work on the refactor.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b52227a54b479d6c3fb1b499820c256ead788b3d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("},{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_904387b0","line":61,"in_reply_to":"3fa7e38b_9bce4d81","updated":"2019-11-18 20:40:51.000000000","message":"Yeah, forgot the backporting argument. Still, if there\u0027s any way of avoiding duplicating a bunch of code here, that way gets my vote. Could we use the \"weird\" \"wait for state change\" helper? Or there\u0027s wait_for_server_parameter?","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            \u0027networks\u0027: [{"},{"line_number":142,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":143,"context_line":"            }],"},{"line_number":144,"context_line":"            \u0027imageRef\u0027: self.image_ref_0"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":"        if server_args:"},{"line_number":147,"context_line":"            basic_server.update(server_args)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_40a544b4","line":144,"range":{"start_line":144,"start_character":29,"end_line":144,"end_character":40},"updated":"2019-11-18 17:42:05.000000000","message":"Ugh, where the heck are these actually set? Mind adding a comment or something, just to make the life of lazy reviewers like me easier?","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b52227a54b479d6c3fb1b499820c256ead788b3d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            \u0027networks\u0027: [{"},{"line_number":142,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":143,"context_line":"            }],"},{"line_number":144,"context_line":"            \u0027imageRef\u0027: self.image_ref_0"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":"        if server_args:"},{"line_number":147,"context_line":"            basic_server.update(server_args)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_70184bd2","line":144,"in_reply_to":"3fa7e38b_3ba5d9b5","updated":"2019-11-18 20:40:51.000000000","message":"Right, but that just says images[0][\u0027id\u0027], which gives no useful information. I mean where\u0027s the original source that api.get_images pulls from?","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            \u0027networks\u0027: [{"},{"line_number":142,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":143,"context_line":"            }],"},{"line_number":144,"context_line":"            \u0027imageRef\u0027: self.image_ref_0"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":"        if server_args:"},{"line_number":147,"context_line":"            basic_server.update(server_args)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_3ba5d9b5","line":144,"range":{"start_line":144,"start_character":29,"end_line":144,"end_character":40},"in_reply_to":"3fa7e38b_40a544b4","updated":"2019-11-18 18:46:27.000000000","message":"line 112 in the setup function","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"569e25a0c29de7e355c22110cfaa18bdc3efee3a","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            \u0027networks\u0027: [{"},{"line_number":142,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":143,"context_line":"            }],"},{"line_number":144,"context_line":"            \u0027imageRef\u0027: self.image_ref_0"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":"        if server_args:"},{"line_number":147,"context_line":"            basic_server.update(server_args)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_d8df8fd4","line":144,"in_reply_to":"3fa7e38b_70184bd2","updated":"2019-11-26 21:14:03.000000000","message":"from the fake image service fixuture on line 109\n\n   self.fake_image_service \u003d fake_image.stub_out_image_service(self)\n\nthat is how glance is being mocked out.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        # Create a host with 4 physical cpus to allow rebuild leveraging"},{"line_number":186,"context_line":"        # the free space to ensure the numa topology filter does not"},{"line_number":187,"context_line":"        # eliminate the host."},{"line_number":188,"context_line":"        host_info \u003d fakelibvirt.HostInfo(cpu_nodes\u003d1, cpu_sockets\u003d1,"},{"line_number":189,"context_line":"                                         cpu_cores\u003d4, kB_mem\u003d15740000)"},{"line_number":190,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":191,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":192,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        server \u003d self._create_active_server("},{"line_number":195,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_407a2488","line":192,"range":{"start_line":188,"start_character":0,"end_line":192,"end_character":69},"updated":"2019-11-18 17:42:05.000000000","message":"This can actually make use of [1] if you want, would save a few lines of code.\n\n[1] https://github.com/openstack/nova/blob/449a5e770b067372762c738d04ce662754351e08/nova/tests/functional/libvirt/base.py#L117","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        # Create a host with 4 physical cpus to allow rebuild leveraging"},{"line_number":186,"context_line":"        # the free space to ensure the numa topology filter does not"},{"line_number":187,"context_line":"        # eliminate the host."},{"line_number":188,"context_line":"        host_info \u003d fakelibvirt.HostInfo(cpu_nodes\u003d1, cpu_sockets\u003d1,"},{"line_number":189,"context_line":"                                         cpu_cores\u003d4, kB_mem\u003d15740000)"},{"line_number":190,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":191,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":192,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        server \u003d self._create_active_server("},{"line_number":195,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_fb13c163","line":192,"range":{"start_line":188,"start_character":0,"end_line":192,"end_character":69},"in_reply_to":"3fa7e38b_407a2488","updated":"2019-11-18 18:46:27.000000000","message":"am yes i might be able to remove the two line in the middle \n\nfake_connection \u003d self._get_connection(host_info\u003dhost_info)\nself.mock_conn.return_value \u003d fake_connection","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"569e25a0c29de7e355c22110cfaa18bdc3efee3a","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        # Create a host with 4 physical cpus to allow rebuild leveraging"},{"line_number":186,"context_line":"        # the free space to ensure the numa topology filter does not"},{"line_number":187,"context_line":"        # eliminate the host."},{"line_number":188,"context_line":"        host_info \u003d fakelibvirt.HostInfo(cpu_nodes\u003d1, cpu_sockets\u003d1,"},{"line_number":189,"context_line":"                                         cpu_cores\u003d4, kB_mem\u003d15740000)"},{"line_number":190,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":191,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":192,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        server \u003d self._create_active_server("},{"line_number":195,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_13c7369b","line":192,"range":{"start_line":188,"start_character":0,"end_line":192,"end_character":69},"in_reply_to":"3fa7e38b_fb13c163","updated":"2019-11-26 21:14:03.000000000","message":"this class does not inherit form that one so no i cant use that","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        # and we have enough resources on the host. We rebuild with"},{"line_number":199,"context_line":"        # a different image to force the rebuild to query the scheduler"},{"line_number":200,"context_line":"        # to validate the host."},{"line_number":201,"context_line":"        self._rebuild_server(server, self.image_ref_1)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def test_rebuild_server_with_numa_inplace_fails(self):"},{"line_number":204,"context_line":"        \"\"\"Create a NUMA instance and ensure in place rebuild fails."}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_e0a550b5","line":201,"range":{"start_line":201,"start_character":42,"end_line":201,"end_character":53},"updated":"2019-11-18 17:42:05.000000000","message":"And here as well (cont\u0027ed from L144)","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        # and we have enough resources on the host. We rebuild with"},{"line_number":199,"context_line":"        # a different image to force the rebuild to query the scheduler"},{"line_number":200,"context_line":"        # to validate the host."},{"line_number":201,"context_line":"        self._rebuild_server(server, self.image_ref_1)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def test_rebuild_server_with_numa_inplace_fails(self):"},{"line_number":204,"context_line":"        \"\"\"Create a NUMA instance and ensure in place rebuild fails."}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_fb450170","line":201,"range":{"start_line":201,"start_character":42,"end_line":201,"end_character":53},"in_reply_to":"3fa7e38b_e0a550b5","updated":"2019-11-18 18:46:27.000000000","message":"again its set up in the setup fucntion so i dont really think we shoudl call that out every time","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        extra_spec \u003d {\u0027hw:cpu_policy\u0027: \u0027dedicated\u0027}"},{"line_number":210,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        # cpu_cores is set to 2 to ensure that"},{"line_number":213,"context_line":"        # we have enough space to boot the vm but not enough space to rebuild"},{"line_number":214,"context_line":"        # by doubling  the resource use during scheduling."},{"line_number":215,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":216,"context_line":"            cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d2, kB_mem\u003d15740000)"},{"line_number":217,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":218,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":219,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        server \u003d self._create_active_server("},{"line_number":222,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_fb566105","line":219,"range":{"start_line":212,"start_character":0,"end_line":219,"end_character":69},"updated":"2019-11-18 17:42:05.000000000","message":"Ditto from L192","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        server \u003d self._create_active_server("},{"line_number":222,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to"},{"line_number":225,"context_line":"        # fail because the NUMA topology filter does not support in place"},{"line_number":226,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":227,"context_line":"        self.assertRaises("},{"line_number":228,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":229,"context_line":"            server, self.image_ref_1)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_rebuild_server_with_different_numa_topology_fails(self):"},{"line_number":232,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_5bba150b","line":229,"range":{"start_line":224,"start_character":0,"end_line":229,"end_character":37},"updated":"2019-11-18 17:42:05.000000000","message":"Oh right - this patch doesn\u0027t actually disable the NUMATopologyFilter on rebuilds, just adds the additional constraint on top that the 2 images should be the same. Even if they are, if you don\u0027t have the spare resources on the host to rebuild \"on the side\", it\u0027ll still fail. It\u0027s only the next patch that\u0027ll disable the filter and allow that.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        server \u003d self._create_active_server("},{"line_number":222,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to"},{"line_number":225,"context_line":"        # fail because the NUMA topology filter does not support in place"},{"line_number":226,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":227,"context_line":"        self.assertRaises("},{"line_number":228,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":229,"context_line":"            server, self.image_ref_1)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_rebuild_server_with_different_numa_topology_fails(self):"},{"line_number":232,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_ed0ea830","line":229,"range":{"start_line":224,"start_character":0,"end_line":229,"end_character":37},"in_reply_to":"3fa7e38b_5bba150b","updated":"2019-11-18 18:46:27.000000000","message":"yes so this patch is a pure bugfix the second patch allow the rebuild in place which is a semi bugfix semi feature.\n\ni separated them so this can be backported upstream and we can decide to backport the filter change independently upstream or downstream depending on how the stable team feel.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"569e25a0c29de7e355c22110cfaa18bdc3efee3a","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":227,"context_line":"        self.assertRaises("},{"line_number":228,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":229,"context_line":"            server, self.image_ref_1)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_rebuild_server_with_different_numa_topology_fails(self):"},{"line_number":232,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_f3f05add","line":229,"in_reply_to":"3fa7e38b_707dabe5","updated":"2019-11-26 21:14:03.000000000","message":"i want to backport this patch upstream so i am doing it properly upstream and spliting. rebuilding with resource changes is a bug regardless of if we support in place numa rebuild so this adress just that bug.\n\nthis is the pattern we use for regression by the way. we submit one patch to create a regression test and assert the incorrect behavior exits then a second patch to correct it.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b52227a54b479d6c3fb1b499820c256ead788b3d","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":227,"context_line":"        self.assertRaises("},{"line_number":228,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":229,"context_line":"            server, self.image_ref_1)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_rebuild_server_with_different_numa_topology_fails(self):"},{"line_number":232,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_707dabe5","line":229,"in_reply_to":"3fa7e38b_ed0ea830","updated":"2019-11-18 20:40:51.000000000","message":"Ah, that\u0027s the reason for the patch split that I actually -1\u0027ed the subsequent patch for. Could we not do it properly upstream, and then hack the backport to only include what we want, as opposed to the other way around? Anyways, not a hill I\u0027m dying on, especially since I\u0027ve done something similar in the past (not patch splitting, but doing it one way for the backport, and then overwriting with another in master).","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        extra_spec \u003d {\u0027hw:cpu_policy\u0027: \u0027dedicated\u0027}"},{"line_number":238,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":241,"context_line":"            cpu_nodes\u003d2, cpu_sockets\u003d1, cpu_cores\u003d4, kB_mem\u003d15740000)"},{"line_number":242,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":243,"context_line":"        self.mock_conn.return_value \u003d fake_connection"},{"line_number":244,"context_line":"        self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027compute1\u0027)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        server \u003d self._create_active_server("},{"line_number":247,"context_line":"            server_args\u003d{\"flavorRef\": flavor_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_dbeda524","line":244,"range":{"start_line":240,"start_character":0,"end_line":244,"end_character":69},"updated":"2019-11-18 17:42:05.000000000","message":"Ditto3","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("},{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":66,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_1b662ff0","line":63,"range":{"start_line":61,"start_character":0,"end_line":63,"end_character":48},"updated":"2019-12-02 11:07:05.000000000","message":"Please no. These things are hard enough to clean up as is without piling more on. It looks like you\u0027re trying to use \u0027_IntegratedTestBase\u0027 so you have the sensible \u0027_wait_for_state_change\u0027 helper. If so, it should no longer be necessary. I fixed this recently [1].\n\n[1] https://review.opendev.org/#/c/689180/","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"14e5335d3ef95bf0bc3aa638cf50000c94cb4cc6","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("},{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":66,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_ea1c7f7c","line":63,"range":{"start_line":61,"start_character":0,"end_line":63,"end_character":48},"updated":"2019-12-04 00:04:15.000000000","message":"still need to rewrite this :( so -w untill that is done","commit_id":"f76a17a0c1f01d81ab064ac5d3701eae80c0ecd0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class _Base(object):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def setUp(self):"},{"line_number":42,"context_line":"        super(_Base, self).setUp()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # Mock the \u0027NUMATopologyFilter\u0027 filter, as most tests need to inspect"},{"line_number":45,"context_line":"        # this"},{"line_number":46,"context_line":"        host_manager \u003d self.scheduler.manager.driver.host_manager"},{"line_number":47,"context_line":"        numa_filter_class \u003d host_manager.filter_cls_map[\u0027NUMATopologyFilter\u0027]"},{"line_number":48,"context_line":"        host_pass_mock \u003d mock.Mock(wraps\u003dnuma_filter_class().host_passes)"},{"line_number":49,"context_line":"        _p \u003d mock.patch(\u0027nova.scheduler.filters\u0027"},{"line_number":50,"context_line":"                        \u0027.numa_topology_filter.NUMATopologyFilter.host_passes\u0027,"},{"line_number":51,"context_line":"                        side_effect\u003dhost_pass_mock)"},{"line_number":52,"context_line":"        self.mock_filter \u003d _p.start()"},{"line_number":53,"context_line":"        self.addCleanup(_p.stop)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class NUMAServersTestBase(_Base, base.ServersTestBase):"},{"line_number":57,"context_line":"    ADDITIONAL_FILTERS \u003d [\u0027NUMATopologyFilter\u0027]"},{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_0881d94d","line":58,"range":{"start_line":39,"start_character":0,"end_line":58,"end_character":8},"updated":"2019-12-04 15:14:32.000000000","message":"You don\u0027t seem to need to do this. You\u0027re using the same definition of \u0027ADDITIONAL_FILTERS\u0027 below and even if you weren\u0027t, you could always override it. Can you undo that?","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"91507cc20ab00f0fbd9fbde31eadb003ae5b2b09","unresolved":false,"context_lines":[{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class _Base(object):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def setUp(self):"},{"line_number":42,"context_line":"        super(_Base, self).setUp()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # Mock the \u0027NUMATopologyFilter\u0027 filter, as most tests need to inspect"},{"line_number":45,"context_line":"        # this"},{"line_number":46,"context_line":"        host_manager \u003d self.scheduler.manager.driver.host_manager"},{"line_number":47,"context_line":"        numa_filter_class \u003d host_manager.filter_cls_map[\u0027NUMATopologyFilter\u0027]"},{"line_number":48,"context_line":"        host_pass_mock \u003d mock.Mock(wraps\u003dnuma_filter_class().host_passes)"},{"line_number":49,"context_line":"        _p \u003d mock.patch(\u0027nova.scheduler.filters\u0027"},{"line_number":50,"context_line":"                        \u0027.numa_topology_filter.NUMATopologyFilter.host_passes\u0027,"},{"line_number":51,"context_line":"                        side_effect\u003dhost_pass_mock)"},{"line_number":52,"context_line":"        self.mock_filter \u003d _p.start()"},{"line_number":53,"context_line":"        self.addCleanup(_p.stop)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class NUMAServersTestBase(_Base, base.ServersTestBase):"},{"line_number":57,"context_line":"    ADDITIONAL_FILTERS \u003d [\u0027NUMATopologyFilter\u0027]"},{"line_number":58,"context_line":"    pass"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class NUMAServersTestNew("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_5f5c5e4b","line":58,"range":{"start_line":39,"start_character":0,"end_line":58,"end_character":8},"in_reply_to":"3fa7e38b_0881d94d","updated":"2019-12-05 00:26:51.000000000","message":"yes although i have reverted all this so its no longer relevent","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":66,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"},{"line_number":67,"context_line":"    _flavor_ref_parameter \u003d \u0027flavorRef\u0027"},{"line_number":68,"context_line":"    ADDITIONAL_FILTERS \u003d [\u0027NUMATopologyFilter\u0027]"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_88c2a985","line":67,"range":{"start_line":65,"start_character":0,"end_line":67,"end_character":39},"updated":"2019-12-04 15:14:32.000000000","message":"This is defined in the base class (from \u0027ServersTestBase\u0027 in \u0027nova/tests/functional/test_servers.py\u0027) and can be dropped","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"91507cc20ab00f0fbd9fbde31eadb003ae5b2b09","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        _Base, integrated_helpers._IntegratedTestBase,"},{"line_number":63,"context_line":"        integrated_helpers.InstanceHelperMixin):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    api_major_version \u003d \u0027v2\u0027"},{"line_number":66,"context_line":"    _image_ref_parameter \u003d \u0027imageRef\u0027"},{"line_number":67,"context_line":"    _flavor_ref_parameter \u003d \u0027flavorRef\u0027"},{"line_number":68,"context_line":"    ADDITIONAL_FILTERS \u003d [\u0027NUMATopologyFilter\u0027]"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_df2daeae","line":67,"range":{"start_line":65,"start_character":0,"end_line":67,"end_character":39},"in_reply_to":"3fa7e38b_88c2a985","updated":"2019-12-05 00:26:51.000000000","message":"this did not inherit form ServersTestBase but yes now that i have reverted this refactor i dont need this.","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def setUp(self):"},{"line_number":71,"context_line":"        super(NUMAServersTestNew, self).setUp()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        # Replace libvirt with fakelibvirt"},{"line_number":74,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":75,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt\u0027,"},{"line_number":76,"context_line":"            fakelibvirt))"},{"line_number":77,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":78,"context_line":"            \u0027nova.virt.libvirt.host.libvirt\u0027,"},{"line_number":79,"context_line":"            fakelibvirt))"},{"line_number":80,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":81,"context_line":"            \u0027nova.virt.libvirt.guest.libvirt\u0027,"},{"line_number":82,"context_line":"            fakelibvirt))"},{"line_number":83,"context_line":"        self.useFixture(fakelibvirt.FakeLibvirtFixture())"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":86,"context_line":"            \u0027nova.virt.libvirt.LibvirtDriver._create_image\u0027))"},{"line_number":87,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":88,"context_line":"            \u0027nova.virt.libvirt.LibvirtDriver._get_local_gb_info\u0027,"},{"line_number":89,"context_line":"            return_value\u003d{\u0027total\u0027: 128, \u0027used\u0027: 44, \u0027free\u0027: 84}))"},{"line_number":90,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":91,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt_utils.is_valid_hostname\u0027,"},{"line_number":92,"context_line":"            return_value\u003dTrue))"},{"line_number":93,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":94,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt_utils.file_open\u0027,"},{"line_number":95,"context_line":"            side_effect\u003dlambda *a, **k: io.BytesIO(b\u0027\u0027)))"},{"line_number":96,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":97,"context_line":"            \u0027nova.privsep.utils.supports_direct_io\u0027,"},{"line_number":98,"context_line":"            return_value\u003dTrue))"},{"line_number":99,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":100,"context_line":"            \u0027nova.virt.libvirt.host.Host.get_online_cpus\u0027,"},{"line_number":101,"context_line":"            return_value\u003dset(range(16))))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # Mock the \u0027get_connection\u0027 function, as we\u0027re going to need to provide"},{"line_number":104,"context_line":"        # custom capabilities for each test"},{"line_number":105,"context_line":"        self.mock_conn \u003d self.useFixture("},{"line_number":106,"context_line":"            fixtures.MockPatch("},{"line_number":107,"context_line":"                \u0027nova.virt.libvirt.host.Host.get_connection\u0027)).mock"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # stub out the glance api"},{"line_number":110,"context_line":"        self.fake_image_service \u003d fake_image.stub_out_image_service(self)"},{"line_number":111,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":112,"context_line":"        images \u003d self.api.get_images()"},{"line_number":113,"context_line":"        # save references to first two image for server create and rebuild"},{"line_number":114,"context_line":"        self.image_ref_0 \u003d images[0][\u0027id\u0027]"},{"line_number":115,"context_line":"        self.image_ref_1 \u003d images[1][\u0027id\u0027]"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":118,"context_line":"        self.addCleanup(fake_notifier.reset)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_488ef179","line":115,"range":{"start_line":73,"start_character":0,"end_line":115,"end_character":42},"updated":"2019-12-04 15:14:32.000000000","message":"You get all this for free from the \u0027base.ServersTestBase\u0027 class","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"91507cc20ab00f0fbd9fbde31eadb003ae5b2b09","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def setUp(self):"},{"line_number":71,"context_line":"        super(NUMAServersTestNew, self).setUp()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        # Replace libvirt with fakelibvirt"},{"line_number":74,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":75,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt\u0027,"},{"line_number":76,"context_line":"            fakelibvirt))"},{"line_number":77,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":78,"context_line":"            \u0027nova.virt.libvirt.host.libvirt\u0027,"},{"line_number":79,"context_line":"            fakelibvirt))"},{"line_number":80,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":81,"context_line":"            \u0027nova.virt.libvirt.guest.libvirt\u0027,"},{"line_number":82,"context_line":"            fakelibvirt))"},{"line_number":83,"context_line":"        self.useFixture(fakelibvirt.FakeLibvirtFixture())"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":86,"context_line":"            \u0027nova.virt.libvirt.LibvirtDriver._create_image\u0027))"},{"line_number":87,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":88,"context_line":"            \u0027nova.virt.libvirt.LibvirtDriver._get_local_gb_info\u0027,"},{"line_number":89,"context_line":"            return_value\u003d{\u0027total\u0027: 128, \u0027used\u0027: 44, \u0027free\u0027: 84}))"},{"line_number":90,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":91,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt_utils.is_valid_hostname\u0027,"},{"line_number":92,"context_line":"            return_value\u003dTrue))"},{"line_number":93,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":94,"context_line":"            \u0027nova.virt.libvirt.driver.libvirt_utils.file_open\u0027,"},{"line_number":95,"context_line":"            side_effect\u003dlambda *a, **k: io.BytesIO(b\u0027\u0027)))"},{"line_number":96,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":97,"context_line":"            \u0027nova.privsep.utils.supports_direct_io\u0027,"},{"line_number":98,"context_line":"            return_value\u003dTrue))"},{"line_number":99,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":100,"context_line":"            \u0027nova.virt.libvirt.host.Host.get_online_cpus\u0027,"},{"line_number":101,"context_line":"            return_value\u003dset(range(16))))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # Mock the \u0027get_connection\u0027 function, as we\u0027re going to need to provide"},{"line_number":104,"context_line":"        # custom capabilities for each test"},{"line_number":105,"context_line":"        self.mock_conn \u003d self.useFixture("},{"line_number":106,"context_line":"            fixtures.MockPatch("},{"line_number":107,"context_line":"                \u0027nova.virt.libvirt.host.Host.get_connection\u0027)).mock"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # stub out the glance api"},{"line_number":110,"context_line":"        self.fake_image_service \u003d fake_image.stub_out_image_service(self)"},{"line_number":111,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":112,"context_line":"        images \u003d self.api.get_images()"},{"line_number":113,"context_line":"        # save references to first two image for server create and rebuild"},{"line_number":114,"context_line":"        self.image_ref_0 \u003d images[0][\u0027id\u0027]"},{"line_number":115,"context_line":"        self.image_ref_1 \u003d images[1][\u0027id\u0027]"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":118,"context_line":"        self.addCleanup(fake_notifier.reset)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_9f10965b","line":115,"range":{"start_line":73,"start_character":0,"end_line":115,"end_character":42},"in_reply_to":"3fa7e38b_488ef179","updated":"2019-12-05 00:26:51.000000000","message":"i have removed most if this","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":118,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        self.flags(compute_driver\u003d\u0027libvirt.LibvirtDriver\u0027)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        enabled_filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":123,"context_line":"        enabled_filters +\u003d self.ADDITIONAL_FILTERS"},{"line_number":124,"context_line":"        self.flags(driver\u003d\u0027filter_scheduler\u0027, group\u003d\u0027scheduler\u0027)"},{"line_number":125,"context_line":"        self.flags(enabled_filters\u003denabled_filters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _setup_compute_service(self):"},{"line_number":128,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_28e93518","line":125,"range":{"start_line":120,"start_character":0,"end_line":125,"end_character":77},"updated":"2019-12-04 15:14:32.000000000","message":"This is handled by the super call","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"91507cc20ab00f0fbd9fbde31eadb003ae5b2b09","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":118,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        self.flags(compute_driver\u003d\u0027libvirt.LibvirtDriver\u0027)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        enabled_filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":123,"context_line":"        enabled_filters +\u003d self.ADDITIONAL_FILTERS"},{"line_number":124,"context_line":"        self.flags(driver\u003d\u0027filter_scheduler\u0027, group\u003d\u0027scheduler\u0027)"},{"line_number":125,"context_line":"        self.flags(enabled_filters\u003denabled_filters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _setup_compute_service(self):"},{"line_number":128,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_bf131265","line":125,"range":{"start_line":120,"start_character":0,"end_line":125,"end_character":77},"in_reply_to":"3fa7e38b_28e93518","updated":"2019-12-05 00:26:51.000000000","message":"this is not needed after the refactor yes","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": image_ref}}"},{"line_number":155,"context_line":"        self.api.api_post("},{"line_number":156,"context_line":"            \u0027servers/%s/action\u0027 % active_server[\u0027id\u0027], args)"},{"line_number":157,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.rebuild.end\u0027)"},{"line_number":158,"context_line":"        return self._wait_for_state_change(self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _get_connection(self, host_info, pci_info\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_a842050c","line":157,"range":{"start_line":157,"start_character":78,"end_line":157,"end_character":78},"updated":"2019-12-04 15:14:32.000000000","message":"This is clever, but you don\u0027t need it. You can just call \u0027self._wait_for_state_change(active_server, \u0027ACTIVE\u0027)\u0027 like we do in \u0027test_create_and_rebuild_server\u0027 in \u0027nova/tests/functional/test_servers.py\u0027. That eliminates the need to use both \u0027integrated_helpers._IntegratedTestBase\u0027 and \u0027integrated_helpers.InstanceHelperMixin\u0027 and also matches what\u0027s done elsewhere. Could you switch these?","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"91507cc20ab00f0fbd9fbde31eadb003ae5b2b09","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": image_ref}}"},{"line_number":155,"context_line":"        self.api.api_post("},{"line_number":156,"context_line":"            \u0027servers/%s/action\u0027 % active_server[\u0027id\u0027], args)"},{"line_number":157,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.rebuild.end\u0027)"},{"line_number":158,"context_line":"        return self._wait_for_state_change(self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _get_connection(self, host_info, pci_info\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_5f73fee8","line":157,"range":{"start_line":157,"start_character":78,"end_line":157,"end_character":78},"in_reply_to":"3fa7e38b_a842050c","updated":"2019-12-05 00:26:51.000000000","message":"removing this would result in a race condition. it was pointed out by gibi i a regression test i wrote a few months ago that if you just use _wait_for_state_change its not correct\n\nif you invoke _wait_for_state_change and the rebuild operation has not started yet then the server will be in the active state and wait for change will return immediately.\n\nwe are testing async code and running it all in a single process with eventlets but there is no guarantee that when we do the post, eventlets will yeild execution to the server side code, its perfectly valid for it to proceed to the \n_wait_for_state_change function directly.\n\nsee the comment here https://review.opendev.org/#/c/669738/7/nova/tests/functional/regressions/test_bug_1835822.py@62","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1d691c530cdaa5d1a2040228717fa4235fd81989","unresolved":false,"context_lines":[{"line_number":928,"context_line":"        self.assertEqual(set([\u0027foo\u0027]), network_metadata.physnets)"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"class NUMAServersRebuild(NUMAServersTestBase):"},{"line_number":932,"context_line":""},{"line_number":933,"context_line":"    def setUp(self):"},{"line_number":934,"context_line":"        super().setUp()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_7b53606d","line":931,"range":{"start_line":931,"start_character":6,"end_line":931,"end_character":24},"updated":"2019-12-05 18:13:54.000000000","message":"I thought you needed to have Test in class names. Clearly not. TIL","commit_id":"2d5fb27d736b1caff552116c285902c8c80ac4a6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"41446a0defa12645519f66395b46e1a10496127b","unresolved":false,"context_lines":[{"line_number":928,"context_line":"        self.assertEqual(set([\u0027foo\u0027]), network_metadata.physnets)"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"class NUMAServersRebuild(NUMAServersTestBase):"},{"line_number":932,"context_line":""},{"line_number":933,"context_line":"    def setUp(self):"},{"line_number":934,"context_line":"        super().setUp()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_3e6716bb","line":931,"range":{"start_line":931,"start_character":6,"end_line":931,"end_character":24},"in_reply_to":"3fa7e38b_7b53606d","updated":"2019-12-05 20:28:40.000000000","message":"no but i can add it\nit need to be in the function name","commit_id":"2d5fb27d736b1caff552116c285902c8c80ac4a6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1d691c530cdaa5d1a2040228717fa4235fd81989","unresolved":false,"context_lines":[{"line_number":933,"context_line":"    def setUp(self):"},{"line_number":934,"context_line":"        super().setUp()"},{"line_number":935,"context_line":"        # stub out the glance api"},{"line_number":936,"context_line":"        self.fake_image_service \u003d fake_image.stub_out_image_service(self)"},{"line_number":937,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":938,"context_line":"        images \u003d self.api.get_images()"},{"line_number":939,"context_line":"        # save references to first two image for server create and rebuild"},{"line_number":940,"context_line":"        self.image_ref_0 \u003d images[0][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_bbca3816","line":937,"range":{"start_line":936,"start_character":0,"end_line":937,"end_character":58},"updated":"2019-12-05 18:13:54.000000000","message":"You get this for free from \u0027_IntegratedTestBase\u0027. Can you drop this?","commit_id":"2d5fb27d736b1caff552116c285902c8c80ac4a6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"41446a0defa12645519f66395b46e1a10496127b","unresolved":false,"context_lines":[{"line_number":933,"context_line":"    def setUp(self):"},{"line_number":934,"context_line":"        super().setUp()"},{"line_number":935,"context_line":"        # stub out the glance api"},{"line_number":936,"context_line":"        self.fake_image_service \u003d fake_image.stub_out_image_service(self)"},{"line_number":937,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":938,"context_line":"        images \u003d self.api.get_images()"},{"line_number":939,"context_line":"        # save references to first two image for server create and rebuild"},{"line_number":940,"context_line":"        self.image_ref_0 \u003d images[0][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_fe02deb9","line":937,"range":{"start_line":936,"start_character":0,"end_line":937,"end_character":58},"in_reply_to":"3fa7e38b_bbca3816","updated":"2019-12-05 20:28:40.000000000","message":"ah ok yep i can drop this but ill need to save a refernce to the service we currently dont do that but its minor.","commit_id":"2d5fb27d736b1caff552116c285902c8c80ac4a6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1d691c530cdaa5d1a2040228717fa4235fd81989","unresolved":false,"context_lines":[{"line_number":943,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":944,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":945,"context_line":""},{"line_number":946,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":947,"context_line":"        basic_server \u003d {"},{"line_number":948,"context_line":"            \u0027flavorRef\u0027: 1,"},{"line_number":949,"context_line":"            \u0027name\u0027: \u0027numa_server\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_3bf7285d","line":946,"updated":"2019-12-05 18:13:54.000000000","message":"[1] isn\u0027t helpful here but might be of interest to you for later\n\n[1] https://review.opendev.org/#/c/697540/","commit_id":"2d5fb27d736b1caff552116c285902c8c80ac4a6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"41446a0defa12645519f66395b46e1a10496127b","unresolved":false,"context_lines":[{"line_number":943,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":944,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":945,"context_line":""},{"line_number":946,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":947,"context_line":"        basic_server \u003d {"},{"line_number":948,"context_line":"            \u0027flavorRef\u0027: 1,"},{"line_number":949,"context_line":"            \u0027name\u0027: \u0027numa_server\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_7e1fce08","line":946,"in_reply_to":"3fa7e38b_3bf7285d","updated":"2019-12-05 20:28:40.000000000","message":"ya i wrote a bunch of helpers in one of my regression tests too i think we could cut a lot of code out of some of these test by pulling out useful function like that.\n\nfor now due to backporting reasons this is not useful as you said but i defiantly would use it if it was there.","commit_id":"2d5fb27d736b1caff552116c285902c8c80ac4a6"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":932,"context_line":"    def setUp(self):"},{"line_number":933,"context_line":"        super().setUp()"},{"line_number":934,"context_line":"        images \u003d self.api.get_images()"},{"line_number":935,"context_line":"        # save references to first two image for server create and rebuild"},{"line_number":936,"context_line":"        self.image_ref_0 \u003d images[0][\u0027id\u0027]"},{"line_number":937,"context_line":"        self.image_ref_1 \u003d images[1][\u0027id\u0027]"},{"line_number":938,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_f9ec0dbd","line":935,"range":{"start_line":935,"start_character":39,"end_line":935,"end_character":44},"updated":"2019-12-09 21:41:00.000000000","message":"images","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":939,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":940,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":941,"context_line":""},{"line_number":942,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":943,"context_line":"        basic_server \u003d {"},{"line_number":944,"context_line":"            \u0027flavorRef\u0027: 1,"},{"line_number":945,"context_line":"            \u0027name\u0027: \u0027numa_server\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_f9a40d4e","line":942,"range":{"start_line":942,"start_character":8,"end_line":942,"end_character":29},"updated":"2019-12-09 21:41:00.000000000","message":"seems like you could have reused _build_server from _IntegratedTestBase here. (Note [1] which consolidates the implementations and makes it more useful.)\n\n[1] https://review.opendev.org/#/c/697537/","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8766a78e1bc6300bf8c9544c8f3f79cab16c9eca","unresolved":false,"context_lines":[{"line_number":939,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":940,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":941,"context_line":""},{"line_number":942,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":943,"context_line":"        basic_server \u003d {"},{"line_number":944,"context_line":"            \u0027flavorRef\u0027: 1,"},{"line_number":945,"context_line":"            \u0027name\u0027: \u0027numa_server\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_24a27c40","line":942,"range":{"start_line":942,"start_character":8,"end_line":942,"end_character":29},"in_reply_to":"3fa7e38b_f9a40d4e","updated":"2019-12-09 21:55:07.000000000","message":"this is intened to be backported so im trying to avoid depencies but yes i spoke to Stephen about that.","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":998,"context_line":""},{"line_number":999,"context_line":"        # cpu_cores is set to 2 to ensure that"},{"line_number":1000,"context_line":"        # we have enough space to boot the vm but not enough space to rebuild"},{"line_number":1001,"context_line":"        # by doubling  the resource use during scheduling."},{"line_number":1002,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":1003,"context_line":"            cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d2, kB_mem\u003d15740000)"},{"line_number":1004,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_a4074c17","line":1001,"range":{"start_line":1001,"start_character":20,"end_line":1001,"end_character":24},"updated":"2019-12-09 21:41:00.000000000","message":"nit: extra space","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to"},{"line_number":1012,"context_line":"        # fail because the NUMA topology filter does not support in place"},{"line_number":1013,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":1014,"context_line":"        self.assertRaises("},{"line_number":1015,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":1016,"context_line":"            server, self.image_ref_1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_640dd433","line":1013,"updated":"2019-12-09 21:41:00.000000000","message":"Is there a bug for that?","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8766a78e1bc6300bf8c9544c8f3f79cab16c9eca","unresolved":false,"context_lines":[{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"        # TODO(sean-k-mooney): this should pass but i currently expect it to"},{"line_number":1012,"context_line":"        # fail because the NUMA topology filter does not support in place"},{"line_number":1013,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":1014,"context_line":"        self.assertRaises("},{"line_number":1015,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":1016,"context_line":"            server, self.image_ref_1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_e416a4a7","line":1013,"in_reply_to":"3fa7e38b_640dd433","updated":"2019-12-09 21:55:07.000000000","message":"yes the next patch addresses this.\nhttps://bugs.launchpad.net/nova/+bug/1804502","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":1014,"context_line":"        self.assertRaises("},{"line_number":1015,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":1016,"context_line":"            server, self.image_ref_1)"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"    def test_rebuild_server_with_different_numa_topology_fails(self):"},{"line_number":1019,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_24135c5b","line":1016,"updated":"2019-12-09 21:41:00.000000000","message":"should we check the failure reason more specifically?","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8766a78e1bc6300bf8c9544c8f3f79cab16c9eca","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":1014,"context_line":"        self.assertRaises("},{"line_number":1015,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":1016,"context_line":"            server, self.image_ref_1)"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"    def test_rebuild_server_with_different_numa_topology_fails(self):"},{"line_number":1019,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_24183ccb","line":1016,"in_reply_to":"3fa7e38b_24135c5b","updated":"2019-12-09 21:55:07.000000000","message":"we could but this test gets updated in the next patch so im not sure its worth it","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bf2d68a80572f4038a0f9df45407edbcd51e8af","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        # rebuild and we have used all the resources on the compute node."},{"line_number":1014,"context_line":"        self.assertRaises("},{"line_number":1015,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":1016,"context_line":"            server, self.image_ref_1)"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"    def test_rebuild_server_with_different_numa_topology_fails(self):"},{"line_number":1019,"context_line":"        \"\"\"Create a NUMA instance and ensure inplace rebuild fails."}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_e44ea494","line":1016,"in_reply_to":"3fa7e38b_24183ccb","updated":"2019-12-09 21:56:53.000000000","message":"ack, see that now.","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"        self.fake_image_service.update(ctx, self.image_ref_1, image_meta)"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"        # NOTE(sean-k-mooney): this should fail because rebuild uses noop"},{"line_number":1044,"context_line":"        # claims therefor it is not allowed for the numa topology or resource"},{"line_number":1045,"context_line":"        # usage to change during a rebuild."},{"line_number":1046,"context_line":"        ex \u003d self.assertRaises("},{"line_number":1047,"context_line":"            client.OpenStackApiException, self._rebuild_server,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_a4550cfb","line":1044,"range":{"start_line":1044,"start_character":17,"end_line":1044,"end_character":25},"updated":"2019-12-09 21:41:00.000000000","message":"therefore","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"            client.OpenStackApiException, self._rebuild_server,"},{"line_number":1048,"context_line":"            server, self.image_ref_1)"},{"line_number":1049,"context_line":"        self.assertEqual(400, ex.response.status_code)"},{"line_number":1050,"context_line":"        self.assertIn(\"An instance\u0027s NUMA typology cannot be changed\","},{"line_number":1051,"context_line":"                      six.text_type(ex))"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_04442047","line":1050,"range":{"start_line":1050,"start_character":42,"end_line":1050,"end_character":50},"updated":"2019-12-09 21:41:00.000000000","message":"topology","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"}],"nova/tests/unit/compute/test_compute_api.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":6224,"context_line":"            self.assertEqual([\u0027context-for-%s\u0027 % c for c in compute_api.CELLS],"},{"line_number":6225,"context_line":"                             cells)"},{"line_number":6226,"context_line":""},{"line_number":6227,"context_line":"    def test__validate_numa_rebuild_non_numa(self):"},{"line_number":6228,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6229,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1, extra_specs\u003d{})"},{"line_number":6230,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_fb5a331c","line":6227,"updated":"2019-12-02 11:07:05.000000000","message":"Any chance you could add a docstring describing what you\u0027re trying to do here? Ditto for the rest of these","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6224,"context_line":"            self.assertEqual([\u0027context-for-%s\u0027 % c for c in compute_api.CELLS],"},{"line_number":6225,"context_line":"                             cells)"},{"line_number":6226,"context_line":""},{"line_number":6227,"context_line":"    def test__validate_numa_rebuild_non_numa(self):"},{"line_number":6228,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6229,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1, extra_specs\u003d{})"},{"line_number":6230,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_e8e6bde7","line":6227,"in_reply_to":"3fa7e38b_4af27a07","updated":"2019-12-04 15:14:32.000000000","message":"thanks","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":6224,"context_line":"            self.assertEqual([\u0027context-for-%s\u0027 % c for c in compute_api.CELLS],"},{"line_number":6225,"context_line":"                             cells)"},{"line_number":6226,"context_line":""},{"line_number":6227,"context_line":"    def test__validate_numa_rebuild_non_numa(self):"},{"line_number":6228,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6229,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1, extra_specs\u003d{})"},{"line_number":6230,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_4af27a07","line":6227,"in_reply_to":"3fa7e38b_fb5a331c","updated":"2019-12-03 23:22:34.000000000","message":"sure ill add some short description although i tired to make the test names self describing.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":6228,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6229,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1, extra_specs\u003d{})"},{"line_number":6230,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"},{"line_number":6231,"context_line":"        image \u003d {"},{"line_number":6232,"context_line":"            \u0027id\u0027: uuids.image_id, \u0027status\u0027: \u0027foo\u0027,"},{"line_number":6233,"context_line":"            \u0027properties\u0027: {}}"},{"line_number":6234,"context_line":"        self.assertTrue("},{"line_number":6235,"context_line":"            self.compute_api._validate_numa_rebuild(instance, image, flavor))"},{"line_number":6236,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_bb835b55","line":6233,"range":{"start_line":6231,"start_character":0,"end_line":6233,"end_character":29},"updated":"2019-12-02 11:07:05.000000000","message":"Can we use an actual ImageMeta object here? It has a very helpful \u0027from_dict\u0027 classmethod you can use","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6228,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6229,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1, extra_specs\u003d{})"},{"line_number":6230,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"},{"line_number":6231,"context_line":"        image \u003d {"},{"line_number":6232,"context_line":"            \u0027id\u0027: uuids.image_id, \u0027status\u0027: \u0027foo\u0027,"},{"line_number":6233,"context_line":"            \u0027properties\u0027: {}}"},{"line_number":6234,"context_line":"        self.assertTrue("},{"line_number":6235,"context_line":"            self.compute_api._validate_numa_rebuild(instance, image, flavor))"},{"line_number":6236,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_c80bc1d2","line":6233,"range":{"start_line":6231,"start_character":0,"end_line":6233,"end_character":29},"in_reply_to":"3fa7e38b_28a94e24","updated":"2019-12-04 15:14:32.000000000","message":"Ah, okay. Can you add a comment here to that effect","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":6228,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6229,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1, extra_specs\u003d{})"},{"line_number":6230,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"},{"line_number":6231,"context_line":"        image \u003d {"},{"line_number":6232,"context_line":"            \u0027id\u0027: uuids.image_id, \u0027status\u0027: \u0027foo\u0027,"},{"line_number":6233,"context_line":"            \u0027properties\u0027: {}}"},{"line_number":6234,"context_line":"        self.assertTrue("},{"line_number":6235,"context_line":"            self.compute_api._validate_numa_rebuild(instance, image, flavor))"},{"line_number":6236,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_28a94e24","line":6233,"range":{"start_line":6231,"start_character":0,"end_line":6233,"end_character":29},"in_reply_to":"3fa7e38b_bb835b55","updated":"2019-12-03 23:22:34.000000000","message":"no _validate_numa_rebuild use from_dict internally so i cant pass the object unless i rewrite it to fucntion to take an object and i pull the construction fo that out to the caller.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":6245,"context_line":"        # The flavor creates a NUMA topology but the default image and the"},{"line_number":6246,"context_line":"        # rebuild image do not have any image properties so there will"},{"line_number":6247,"context_line":"        # be no conflict."},{"line_number":6248,"context_line":"        self.assertTrue("},{"line_number":6249,"context_line":"            self.compute_api._validate_numa_rebuild(instance, image, flavor))"},{"line_number":6250,"context_line":""},{"line_number":6251,"context_line":"    def test__validate_numa_rebuild_add_numa_toplogy(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_aa8d2e7d","line":6248,"range":{"start_line":6248,"start_character":9,"end_line":6248,"end_character":24},"updated":"2019-12-03 23:22:34.000000000","message":"if i dont retrun true then these all need to be self.assertNone which is a lot less intunitve to peopel when then see just a return in the code and not return None","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":6258,"context_line":"            \u0027properties\u0027: {\"hw_numa_nodes\": 1}}"},{"line_number":6259,"context_line":"        # The flavor and default image have no NUMA topology defined. The image"},{"line_number":6260,"context_line":"        # used to rebuild requests a NUMA topology which is not allowed as it"},{"line_number":6261,"context_line":"        # would alter the NUMA constrains."},{"line_number":6262,"context_line":"        self.assertRaises("},{"line_number":6263,"context_line":"            exception.ImageNUMATopologyRebuildConflict,"},{"line_number":6264,"context_line":"            self.compute_api._validate_numa_rebuild, instance, image, flavor)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_5b7a6777","line":6261,"range":{"start_line":6261,"start_character":31,"end_line":6261,"end_character":41},"updated":"2019-12-02 11:07:05.000000000","message":"constraints (here and elsewhere)","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":6311,"context_line":"                exception.ImageNUMATopologyRebuildConflict,"},{"line_number":6312,"context_line":"                self.compute_api._validate_numa_rebuild, instance,"},{"line_number":6313,"context_line":"                image, flavor)"},{"line_number":6314,"context_line":""},{"line_number":6315,"context_line":"    @mock.patch(\u0027nova.pci.request.get_pci_requests_from_flavor\u0027)"},{"line_number":6316,"context_line":"    def test_pmu_image_and_flavor_conflict(self, mock_request):"},{"line_number":6317,"context_line":"        \"\"\"Tests that calling _validate_flavor_image_nostatus()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_1bd94f83","line":6314,"updated":"2019-12-02 11:07:05.000000000","message":"It might be overkill, but could you test with the other extra specs like \u0027hw_cpu_policy\u0027? Also, I wonder if we want to extend this in the future to prevent \u0027traits_required\u0027 too.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":6311,"context_line":"                exception.ImageNUMATopologyRebuildConflict,"},{"line_number":6312,"context_line":"                self.compute_api._validate_numa_rebuild, instance,"},{"line_number":6313,"context_line":"                image, flavor)"},{"line_number":6314,"context_line":""},{"line_number":6315,"context_line":"    @mock.patch(\u0027nova.pci.request.get_pci_requests_from_flavor\u0027)"},{"line_number":6316,"context_line":"    def test_pmu_image_and_flavor_conflict(self, mock_request):"},{"line_number":6317,"context_line":"        \"\"\"Tests that calling _validate_flavor_image_nostatus()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_286e2efe","line":6314,"in_reply_to":"3fa7e38b_1bd94f83","updated":"2019-12-03 23:22:34.000000000","message":"for what its worth im using cpu pinning in the functional tests. it really does not matter what i use provide it result in a change to the numa constraints. i think using hw_numa_node is the most clear as you dont need to know any of the rule related to when an implicit numa topology is created to understand the tests.\n\nwe should not extend _validate_numa_rebuild but we could add another one for traits. im not sure that we should block traits from changing but we should validate them with placement to ensure they are valid for the current allocation. so im not sure if we should block them at the api level form changing but we should be checking traits on rebuild. That is a seperate change however.","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6311,"context_line":"                exception.ImageNUMATopologyRebuildConflict,"},{"line_number":6312,"context_line":"                self.compute_api._validate_numa_rebuild, instance,"},{"line_number":6313,"context_line":"                image, flavor)"},{"line_number":6314,"context_line":""},{"line_number":6315,"context_line":"    @mock.patch(\u0027nova.pci.request.get_pci_requests_from_flavor\u0027)"},{"line_number":6316,"context_line":"    def test_pmu_image_and_flavor_conflict(self, mock_request):"},{"line_number":6317,"context_line":"        \"\"\"Tests that calling _validate_flavor_image_nostatus()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_68d2cdff","line":6314,"in_reply_to":"3fa7e38b_286e2efe","updated":"2019-12-04 15:14:32.000000000","message":"Fair","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6258,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6259,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1, extra_specs\u003d{})"},{"line_number":6260,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"},{"line_number":6261,"context_line":"        image \u003d {"},{"line_number":6262,"context_line":"            \u0027id\u0027: uuids.image_id, \u0027status\u0027: \u0027foo\u0027,"},{"line_number":6263,"context_line":"            \u0027properties\u0027: {}}"},{"line_number":6264,"context_line":"        self.assertTrue("},{"line_number":6265,"context_line":"            self.compute_api._validate_numa_rebuild(instance, image, flavor))"},{"line_number":6266,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_68facdba","line":6263,"range":{"start_line":6261,"start_character":0,"end_line":6263,"end_character":29},"updated":"2019-12-04 15:14:32.000000000","message":"Just noted on PS7, but can you add a comment here and below for why these are dicts, not ImageMeta objects?","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6278,"context_line":"        # The flavor creates a NUMA topology but the default image and the"},{"line_number":6279,"context_line":"        # rebuild image do not have any image properties so there will"},{"line_number":6280,"context_line":"        # be no conflict."},{"line_number":6281,"context_line":"        self.assertTrue("},{"line_number":6282,"context_line":"            self.compute_api._validate_numa_rebuild(instance, image, flavor))"},{"line_number":6283,"context_line":""},{"line_number":6284,"context_line":"    def test__validate_numa_rebuild_add_numa_toplogy(self):"},{"line_number":6285,"context_line":"        \"\"\"This test asserts that a rebuild of an instance with a new image"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_4818311d","line":6282,"range":{"start_line":6281,"start_character":0,"end_line":6282,"end_character":77},"updated":"2019-12-04 15:14:32.000000000","message":"Not going to hold on this, but you could just drop the \u0027self.assertTrue\u0027 and call this. If we got an exception, it would raise and fail the test","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"91507cc20ab00f0fbd9fbde31eadb003ae5b2b09","unresolved":false,"context_lines":[{"line_number":6278,"context_line":"        # The flavor creates a NUMA topology but the default image and the"},{"line_number":6279,"context_line":"        # rebuild image do not have any image properties so there will"},{"line_number":6280,"context_line":"        # be no conflict."},{"line_number":6281,"context_line":"        self.assertTrue("},{"line_number":6282,"context_line":"            self.compute_api._validate_numa_rebuild(instance, image, flavor))"},{"line_number":6283,"context_line":""},{"line_number":6284,"context_line":"    def test__validate_numa_rebuild_add_numa_toplogy(self):"},{"line_number":6285,"context_line":"        \"\"\"This test asserts that a rebuild of an instance with a new image"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_82611dd7","line":6282,"range":{"start_line":6281,"start_character":0,"end_line":6282,"end_character":77},"in_reply_to":"3fa7e38b_4818311d","updated":"2019-12-05 00:26:51.000000000","message":"yep that is all true and i originally wrote the function to return nothing but made it return true because when i have done excatly what you suggest in the past i have got comment that the test appears to not be testing anything.\n\nso i was trying to premept that.","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6318,"context_line":"        image \u003d {"},{"line_number":6319,"context_line":"            \u0027id\u0027: uuidutils.generate_uuid(), \u0027status\u0027: \u0027foo\u0027,"},{"line_number":6320,"context_line":"            \u0027properties\u0027: {}}"},{"line_number":6321,"context_line":"        with mock.patch("},{"line_number":6322,"context_line":"                \u0027nova.objects.instance.Instance.image_meta\u0027,"},{"line_number":6323,"context_line":"                new_callable\u003dmock.PropertyMock(return_value\u003dold_image_meta)):"},{"line_number":6324,"context_line":"            # The old image has a NUMA topology defined but the new image"},{"line_number":6325,"context_line":"            # used to rebuild does not. This would alter the NUMA constrains"},{"line_number":6326,"context_line":"            # and therefor should raise."}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_889f0950","line":6323,"range":{"start_line":6321,"start_character":0,"end_line":6323,"end_character":77},"updated":"2019-12-04 15:14:32.000000000","message":"Hmm, why can\u0027t you just do:\n\n  instance.image_meta \u003d objects.ImageMeta.from_dict(old_image_meta)\n\nor something like that above?\n\nLater: Ah, \u0027image_meta\u0027 is a property that actually calls \u0027objects.ImageMeta.from_instance\u0027. Could you add a comment here explaining what you\u0027re doing?","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6322,"context_line":"                \u0027nova.objects.instance.Instance.image_meta\u0027,"},{"line_number":6323,"context_line":"                new_callable\u003dmock.PropertyMock(return_value\u003dold_image_meta)):"},{"line_number":6324,"context_line":"            # The old image has a NUMA topology defined but the new image"},{"line_number":6325,"context_line":"            # used to rebuild does not. This would alter the NUMA constrains"},{"line_number":6326,"context_line":"            # and therefor should raise."},{"line_number":6327,"context_line":"            self.assertRaises("},{"line_number":6328,"context_line":"                exception.ImageNUMATopologyRebuildConflict,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_c8d98156","line":6325,"range":{"start_line":6325,"start_character":66,"end_line":6325,"end_character":76},"updated":"2019-12-04 15:14:32.000000000","message":"constraints","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":6350,"context_line":"        image \u003d {"},{"line_number":6351,"context_line":"            \u0027id\u0027: uuidutils.generate_uuid(), \u0027status\u0027: \u0027foo\u0027,"},{"line_number":6352,"context_line":"            \u0027properties\u0027: {\"hw_numa_nodes\": 2}}"},{"line_number":6353,"context_line":"        with mock.patch("},{"line_number":6354,"context_line":"                \u0027nova.objects.instance.Instance.image_meta\u0027,"},{"line_number":6355,"context_line":"                new_callable\u003dmock.PropertyMock(return_value\u003dold_image_meta)):"},{"line_number":6356,"context_line":"            # the original image requested 1 NUMA node and the image used"},{"line_number":6357,"context_line":"            # for rebuild requests 2 so assert an error is raised."},{"line_number":6358,"context_line":"            self.assertRaises("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_88c86956","line":6355,"range":{"start_line":6353,"start_character":0,"end_line":6355,"end_character":77},"updated":"2019-12-04 15:14:32.000000000","message":"Ditto (comment)","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":6252,"context_line":"                             cells)"},{"line_number":6253,"context_line":""},{"line_number":6254,"context_line":"    def test__validate_numa_rebuild_non_numa(self):"},{"line_number":6255,"context_line":"        \"\"\"This test asserts that a rebuild of an instance without a NUMA"},{"line_number":6256,"context_line":"        topology passes validation."},{"line_number":6257,"context_line":"        \"\"\""},{"line_number":6258,"context_line":"        flavor \u003d objects.Flavor("}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_e478e48f","line":6255,"range":{"start_line":6255,"start_character":11,"end_line":6255,"end_character":36},"updated":"2019-12-09 21:41:00.000000000","message":"micronit: could remove this (from all the docstrings)","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":6272,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":6273,"context_line":"            id\u003d42, vcpus\u003d1, memory_mb\u003d512, root_gb\u003d1,"},{"line_number":6274,"context_line":"            extra_specs\u003d{\"hw:numa_nodes\": 1})"},{"line_number":6275,"context_line":"        instance \u003d self._create_instance_obj(flavor\u003dflavor)"},{"line_number":6276,"context_line":"        # we use a dict instead of image metadata object as"},{"line_number":6277,"context_line":"        # _validate_numa_rebuild constructs the object internally"},{"line_number":6278,"context_line":"        image \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_4492185a","line":6275,"range":{"start_line":6275,"start_character":24,"end_line":6275,"end_character":44},"updated":"2019-12-09 21:41:00.000000000","message":"okay, so this results in instance.image_meta being None ✔","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":6366,"context_line":"            self.assertRaises("},{"line_number":6367,"context_line":"                exception.ImageNUMATopologyRebuildConflict,"},{"line_number":6368,"context_line":"                self.compute_api._validate_numa_rebuild, instance,"},{"line_number":6369,"context_line":"                image, flavor)"},{"line_number":6370,"context_line":""},{"line_number":6371,"context_line":"    @mock.patch(\u0027nova.pci.request.get_pci_requests_from_flavor\u0027)"},{"line_number":6372,"context_line":"    def test_pmu_image_and_flavor_conflict(self, mock_request):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_649dd455","line":6369,"updated":"2019-12-09 21:41:00.000000000","message":"✔ good coverage","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"}],"releasenotes/notes/numa-rebuild-b75f9a1966f576ea.yaml":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. During a rebuild, an instance resource usage cannot be altered."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_cda3769d","line":5,"range":{"start_line":5,"start_character":11,"end_line":5,"end_character":73},"updated":"2019-10-31 17:23:44.000000000","message":"s/an//\n\nAlso suggest inverting structure to simplify:\n\nInstance resource usage cannot be altered during a rebuild.","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abfc25908dae5be1b1e7350b644cf7b98a4c6091","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. During a rebuild, an instance resource usage cannot be altered."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_8914164f","line":5,"range":{"start_line":5,"start_character":11,"end_line":5,"end_character":73},"in_reply_to":"3fa7e38b_cda3769d","updated":"2019-11-12 16:51:06.000000000","message":"Done","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"fce02ff62098bad9861c20af7b78ce649a0cb9c1","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instnace and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"},{"line_number":11,"context_line":"    existing instance until a move operation was performed."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_6dbcc2ba","line":9,"range":{"start_line":9,"start_character":7,"end_line":9,"end_character":15},"updated":"2019-10-31 17:23:44.000000000","message":"instance","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abfc25908dae5be1b1e7350b644cf7b98a4c6091","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instnace and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"},{"line_number":11,"context_line":"    existing instance until a move operation was performed."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa7e38b_290ba22b","line":9,"range":{"start_line":9,"start_character":7,"end_line":9,"end_character":15},"in_reply_to":"3fa7e38b_6dbcc2ba","updated":"2019-11-12 16:51:06.000000000","message":"Done","commit_id":"b09f7ef0ed458201a3a8ba08c9455bf588d0f13e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_35bc08ba","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":13},"updated":"2019-11-18 17:42:05.000000000","message":"Drop this, we know it\u0027s Nova ;)","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_6d2cf898","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":13},"in_reply_to":"3fa7e38b_35bc08ba","updated":"2019-11-18 18:46:27.000000000","message":"i guess.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instance and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_f5b190e1","line":7,"range":{"start_line":7,"start_character":15,"end_line":7,"end_character":68},"updated":"2019-11-18 17:42:05.000000000","message":"I think you accidentally some words (and link markup).\n\nDid you mean something like \"changes in resources requested by a new image. \u003cbug link\u003e\"","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b52227a54b479d6c3fb1b499820c256ead788b3d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instance and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_f068bb21","line":7,"in_reply_to":"3fa7e38b_8d5e1411","updated":"2019-11-18 20:40:51.000000000","message":"Ah, it does render correctly, apologies. The phrasing is still weird though ;)","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cc810ef83e545948a738b652797d4fbc4d5dd1bb","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instance and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_a7e0c0cd","line":7,"in_reply_to":"3fa7e38b_f068bb21","updated":"2019-11-19 15:30:46.000000000","message":"that\u0027s a difference of opinion.\n\ni dont actully think the suggestion you made improve the readblity of this","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfb44e1d796e2e264801d76ad044085eca09fbf8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    With Nova an instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instance and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_8d5e1411","line":7,"range":{"start_line":7,"start_character":15,"end_line":7,"end_character":68},"in_reply_to":"3fa7e38b_f5b190e1","updated":"2019-11-18 18:46:27.000000000","message":"that should rend correctly form a markup poin of view\ni want the full stop to be after the bug link although it might bitch about a space after the _ before the .\n\nill take a look at this again but it seams to be rendering correctly\n\nhttps://storage.gra1.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_e37/687957/5/check/build-openstack-releasenotes/e3786b3/docs/unreleased.html#bug-fixes","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instance and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"},{"line_number":11,"context_line":"    existing instance until a move operation was performed."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_95ca9c4c","line":9,"range":{"start_line":9,"start_character":52,"end_line":9,"end_character":56},"updated":"2019-11-18 17:42:05.000000000","message":"Nova","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"efa43c513f199a93f2837da044fbccb0da2db8b9","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instance and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"},{"line_number":11,"context_line":"    existing instance until a move operation was performed."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    ..  _BUG1763766: https://bugs.launchpad.net/nova/+bug/1763766"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_d5e1f4d0","line":11,"range":{"start_line":9,"start_character":41,"end_line":11,"end_character":59},"updated":"2019-11-18 17:42:05.000000000","message":"Put this sentence first:\n\nPreviously, \u003cblah blah\u003e.\n\nThe new behavior is to/As for this release, Nova \u003cblah blah\u003e","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cc810ef83e545948a738b652797d4fbc4d5dd1bb","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    In previous releases, Nova did not explicitly guard against inadvertent"},{"line_number":7,"context_line":"    changes in resource request contained in a new image BUG1763766_. Nova now"},{"line_number":8,"context_line":"    explicitly checks if a rebuild would alter the requested NUMA topology of"},{"line_number":9,"context_line":"    an instance and rejects the rebuild. Previously nova would have ignored the"},{"line_number":10,"context_line":"    NUMA topology of the new image continuing to use the NUMA topology of the"},{"line_number":11,"context_line":"    existing instance until a move operation was performed."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    ..  _BUG1763766: https://bugs.launchpad.net/nova/+bug/1763766"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3fa7e38b_07cf5457","line":11,"range":{"start_line":9,"start_character":41,"end_line":11,"end_character":59},"in_reply_to":"3fa7e38b_d5e1f4d0","updated":"2019-11-19 15:30:46.000000000","message":"in participial i think putting this first shifts the emphasise to what the previous behaviour was not the new behaviour. i could delete this and the main content would still be conveyed by the rest its just context.","commit_id":"360ec75731c5dd2e79f9e398f23b8b90282f34b9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    An instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    Previously Nova would have ignored the NUMA topology of the new image"},{"line_number":7,"context_line":"    continuing to use the NUMA topology of the existing instance until a move"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_fbdd536d","line":4,"range":{"start_line":4,"start_character":31,"end_line":4,"end_character":39},"updated":"2019-12-02 11:07:05.000000000","message":"in-place ?","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    An instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    Previously Nova would have ignored the NUMA topology of the new image"},{"line_number":7,"context_line":"    continuing to use the NUMA topology of the existing instance until a move"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_9bce9fb5","line":4,"range":{"start_line":4,"start_character":49,"end_line":4,"end_character":57},"updated":"2019-12-02 11:07:05.000000000","message":"original image or a...","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    An instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    Previously Nova would have ignored the NUMA topology of the new image"},{"line_number":7,"context_line":"    continuing to use the NUMA topology of the existing instance until a move"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_1657c803","line":4,"range":{"start_line":4,"start_character":49,"end_line":4,"end_character":57},"in_reply_to":"3fa7e38b_9bce9fb5","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    An instance can be rebuilt in place with the original or a new"},{"line_number":5,"context_line":"    image. Instance resource usage cannot be altered during a rebuild."},{"line_number":6,"context_line":"    Previously Nova would have ignored the NUMA topology of the new image"},{"line_number":7,"context_line":"    continuing to use the NUMA topology of the existing instance until a move"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_b63d94bd","line":4,"range":{"start_line":4,"start_character":31,"end_line":4,"end_character":39},"in_reply_to":"3fa7e38b_fbdd536d","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    operation was performed. As Nova did not explicitly guard against"},{"line_number":9,"context_line":"    inadvertent changes in resource request contained in a new image,"},{"line_number":10,"context_line":"    it was possible to rebuild with an image that would violate this requirement"},{"line_number":11,"context_line":"    BUG1763766_. This resulted in an inconsistent state as the vm that was"},{"line_number":12,"context_line":"    running did not match the vm that was requested. Nova now explicitly checks"},{"line_number":13,"context_line":"    if a rebuild would alter the requested NUMA topology of an instance and"},{"line_number":14,"context_line":"    rejects the rebuild."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_5bc827a7","line":11,"range":{"start_line":11,"start_character":63,"end_line":11,"end_character":65},"updated":"2019-12-02 11:07:05.000000000","message":"instance","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    operation was performed. As Nova did not explicitly guard against"},{"line_number":9,"context_line":"    inadvertent changes in resource request contained in a new image,"},{"line_number":10,"context_line":"    it was possible to rebuild with an image that would violate this requirement"},{"line_number":11,"context_line":"    BUG1763766_. This resulted in an inconsistent state as the vm that was"},{"line_number":12,"context_line":"    running did not match the vm that was requested. Nova now explicitly checks"},{"line_number":13,"context_line":"    if a rebuild would alter the requested NUMA topology of an instance and"},{"line_number":14,"context_line":"    rejects the rebuild."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_d63850cc","line":11,"range":{"start_line":11,"start_character":63,"end_line":11,"end_character":65},"in_reply_to":"3fa7e38b_5bc827a7","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    inadvertent changes in resource request contained in a new image,"},{"line_number":10,"context_line":"    it was possible to rebuild with an image that would violate this requirement"},{"line_number":11,"context_line":"    BUG1763766_. This resulted in an inconsistent state as the vm that was"},{"line_number":12,"context_line":"    running did not match the vm that was requested. Nova now explicitly checks"},{"line_number":13,"context_line":"    if a rebuild would alter the requested NUMA topology of an instance and"},{"line_number":14,"context_line":"    rejects the rebuild."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_1bc2af87","line":12,"range":{"start_line":12,"start_character":30,"end_line":12,"end_character":32},"updated":"2019-12-02 11:07:05.000000000","message":"instance","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    inadvertent changes in resource request contained in a new image,"},{"line_number":10,"context_line":"    it was possible to rebuild with an image that would violate this requirement"},{"line_number":11,"context_line":"    BUG1763766_. This resulted in an inconsistent state as the vm that was"},{"line_number":12,"context_line":"    running did not match the vm that was requested. Nova now explicitly checks"},{"line_number":13,"context_line":"    if a rebuild would alter the requested NUMA topology of an instance and"},{"line_number":14,"context_line":"    rejects the rebuild."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_76471c4e","line":12,"range":{"start_line":12,"start_character":30,"end_line":12,"end_character":32},"in_reply_to":"3fa7e38b_1bc2af87","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"63888dd566435df0c7f03e15330147cff49ba8e1","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    if a rebuild would alter the requested NUMA topology of an instance and"},{"line_number":14,"context_line":"    rejects the rebuild."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    ..  _BUG1763766: https://bugs.launchpad.net/nova/+bug/1763766"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_dbe2d730","line":16,"range":{"start_line":16,"start_character":8,"end_line":16,"end_character":19},"updated":"2019-12-02 11:07:05.000000000","message":"Try:\n\n  _bug #1763766:\n\nIt reads so much better when rendered","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"abb1f939fd152fbb9d8e261df7f3b51dd0a074aa","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    if a rebuild would alter the requested NUMA topology of an instance and"},{"line_number":14,"context_line":"    rejects the rebuild."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    ..  _BUG1763766: https://bugs.launchpad.net/nova/+bug/1763766"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"3fa7e38b_9642d83a","line":16,"range":{"start_line":16,"start_character":8,"end_line":16,"end_character":19},"in_reply_to":"3fa7e38b_dbe2d730","updated":"2019-12-03 23:22:34.000000000","message":"Done","commit_id":"c14f424c1972b4203e67a850d3586fcd6f0d24ca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    operation was performed. As Nova did not explicitly guard against"},{"line_number":9,"context_line":"    inadvertent changes in resource request contained in a new image,"},{"line_number":10,"context_line":"    it was possible to rebuild with an image that would violate this requirement"},{"line_number":11,"context_line":"    `BUG #1763766`_. This resulted in an inconsistent state as the instance that"},{"line_number":12,"context_line":"    was running did not match the instance that was requested. Nova now explicitly"},{"line_number":13,"context_line":"    checks if a rebuild would alter the requested NUMA topology of an instance"},{"line_number":14,"context_line":"    and rejects the rebuild."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"3fa7e38b_08da391c","line":11,"range":{"start_line":11,"start_character":5,"end_line":11,"end_character":8},"updated":"2019-12-04 15:14:32.000000000","message":"bug","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5d4ba9b921199f4965c84b1cf864e7ce91f3c4ce","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    checks if a rebuild would alter the requested NUMA topology of an instance"},{"line_number":14,"context_line":"    and rejects the rebuild."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    ..  _`BUG #1763766`: https://bugs.launchpad.net/nova/+bug/1763766"}],"source_content_type":"text/x-yaml","patch_set":9,"id":"3fa7e38b_68bdedaf","line":16,"range":{"start_line":16,"start_character":10,"end_line":16,"end_character":13},"updated":"2019-12-04 15:14:32.000000000","message":"bug","commit_id":"7f6fe1c79d07c0ccda2b0216315e27001e808d28"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8c5c782c4985960118dd99749e3524cf64d0e521","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    operation was performed. As Nova did not explicitly guard against"},{"line_number":9,"context_line":"    inadvertent changes in resource request contained in a new image,"},{"line_number":10,"context_line":"    it was possible to rebuild with an image that would violate this requirement"},{"line_number":11,"context_line":"    `bug #1763766`_. This resulted in an inconsistent state as the instance that"},{"line_number":12,"context_line":"    was running did not match the instance that was requested. Nova now explicitly"},{"line_number":13,"context_line":"    checks if a rebuild would alter the requested NUMA topology of an instance"},{"line_number":14,"context_line":"    and rejects the rebuild."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"3fa7e38b_a4b0acdd","line":11,"range":{"start_line":11,"start_character":4,"end_line":11,"end_character":8},"updated":"2019-12-09 21:41:00.000000000","message":"-- see `bug ...","commit_id":"6f5358ac1992b17b7f3f99d9a32290e0d4740dae"}]}
