)]}'
{"doc/source/cli/nova-status.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1c11dd1c4cd47a3e3dacd810413fa8b2e6873f7","unresolved":false,"context_lines":[{"line_number":100,"context_line":"  * Checks for the Placement API are modified to require version 1.4, that"},{"line_number":101,"context_line":"    is needed in Pike and further for nova-scheduler to work correctly."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"  **17.0.0 (Queens)**"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"  * Checks for the Placement API are modified to require version 1.17."},{"line_number":106,"context_line":"  * Checks for the Placement API are modified to require version 1.21."}],"source_content_type":"text/x-rst","patch_set":15,"id":"bf659307_7c93515c","line":103,"updated":"2018-03-28 21:05:31.000000000","message":"We\u0027re in Rocky now bra!","commit_id":"c37d61a3abe79abace41631b67a4de471973478a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6a16cc73fe66101497b7cba5239628557f4d5d7f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"  * Checks for the Placement API are modified to require version 1.4, that"},{"line_number":101,"context_line":"    is needed in Pike and further for nova-scheduler to work correctly."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"  **17.0.0 (Queens)**"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"  * Checks for the Placement API are modified to require version 1.17."},{"line_number":106,"context_line":"  * Checks for the Placement API are modified to require version 1.21."}],"source_content_type":"text/x-rst","patch_set":15,"id":"bf659307_620f2a37","line":103,"in_reply_to":"bf659307_7c93515c","updated":"2018-03-28 22:58:08.000000000","message":"Oh jeez.","commit_id":"c37d61a3abe79abace41631b67a4de471973478a"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6981531fd665c1436fbbb47b9665e497fdab60b9","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        if aggregates:"},{"line_number":356,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027,\u0027.join(aggregates)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        version \u003d \u00271.19\u0027"},{"line_number":359,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"},{"line_number":360,"context_line":"        resp \u003d self.get(url, version\u003dversion,"},{"line_number":361,"context_line":"                        global_request_id\u003dcontext.global_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_8a82d2c7","line":358,"range":{"start_line":358,"start_character":19,"end_line":358,"end_character":24},"updated":"2018-03-20 17:43:26.000000000","message":"this is wrong now","commit_id":"decafca0fc3c0c97e1b716504d3b077a13b4aa47"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fa4a34097b88d20b4467a6d35c8a56e042b65c03","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                                   headers\u003dheaders)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    @safe_connect"},{"line_number":312,"context_line":"    def get_allocation_candidates(self, context, resources, aggregates):"},{"line_number":313,"context_line":"        \"\"\"Returns a tuple of (allocation_requests, provider_summaries,"},{"line_number":314,"context_line":"        allocation_request_version)."},{"line_number":315,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_55e1fbfd","line":312,"range":{"start_line":312,"start_character":60,"end_line":312,"end_character":70},"updated":"2018-03-23 23:08:34.000000000","message":"Naw, fold this into \u0027resources\u0027 -- see comment in utils","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fa4a34097b88d20b4467a6d35c8a56e042b65c03","unresolved":false,"context_lines":[{"line_number":337,"context_line":"            membership is required. Note that this is expected to be the"},{"line_number":338,"context_line":"            return value of scheduler.utils.aggregates_from_destination()."},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        Example aggregates value:"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            [(\u0027foo\u0027, \u0027bar\u0027), (\u0027baz\u0027,)]"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        translates to:"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            \"Candidates are in either \u0027foo\u0027 or \u0027bar\u0027, but definitely in \u0027baz\u0027\""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        \"\"\""},{"line_number":349,"context_line":"        # TODO(efried): For now, just use the unnumbered group to retain"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_f5960f95","line":346,"range":{"start_line":340,"start_character":0,"end_line":346,"end_character":78},"updated":"2018-03-23 23:08:34.000000000","message":"yeah, nice.","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fa4a34097b88d20b4467a6d35c8a56e042b65c03","unresolved":false,"context_lines":[{"line_number":368,"context_line":"            # required and optional sets, we must do the naive thing"},{"line_number":369,"context_line":"            # and AND ours together. That will not achieve the same"},{"line_number":370,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":371,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":372,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":373,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":374,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_3559e7fd","line":371,"range":{"start_line":371,"start_character":56,"end_line":371,"end_character":72},"updated":"2018-03-23 23:08:34.000000000","message":"Even when placement has it, we\u0027ll need to account for the 406 case, so we might as well write that code here and now.\n\nIt\u0027ll have to be done *after* the GET /a_c.  The intersection logic you\u0027ve got here should be modified to add the \u0027member_of\u0027 qparam only if it will be nonempty (else the API will error) but will otherwise serve as a partial pre-filter.\n\nThen you\u0027ll have to walk through and do the boolean logic on the returned candidates.\n\nTheoretically you could still end up with viable candidates that don\u0027t make it out of the other side of this, because of ?limit.  But hopefully that\u0027s really rare.","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cb5af43ba4274ebac905aae7fde16a97c37911fb","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":371,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":372,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":373,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":376,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_623fa7d6","line":373,"range":{"start_line":373,"start_character":49,"end_line":373,"end_character":67},"updated":"2018-03-23 22:31:17.000000000","message":"This will have unpredictable order, resulting in intermittent failures [1] of its test case [2].  Recommend sorting here rather than trying to finagle it in the test.\n\n[1] http://logs.openstack.org/51/555851/1/check/openstack-tox-py27/6951f68/testr_results.html.gz\n[2] https://review.openstack.org/#/c/547990/10/nova/tests/unit/scheduler/client/test_report.py@1526","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"aaf32e6cc916ed2498646774fc5c622dc0d9075e","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":371,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":372,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":373,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":376,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_1f74ab98","line":373,"range":{"start_line":373,"start_character":49,"end_line":373,"end_character":67},"in_reply_to":"bf659307_58a80bda","updated":"2018-03-27 21:55:35.000000000","message":"I\u0027ve had the same hesitation when encountering the same issue before, but someone smart (I think it was gibi) pointed out that there\u0027s more to it than just making the tests pass; e.g. it also makes logging easier to read.  There was another good reason, which I forget.\n\nBTW, solving this in the test itself is a PITA, and essentially involves reverse-engineering the result string, which winds up duplicating a lot of the logic from the front end, which kinda defeats the purpose of testing (now you\u0027re asserting that algorithm-A does the same thing as algorithm-more-or-less-the-same-as-A).","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"c3ed8b8f2bfe6536bb959fe70376542f481a9bf7","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":371,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":372,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":373,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":376,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_9438e0d3","line":373,"range":{"start_line":373,"start_character":49,"end_line":373,"end_character":67},"in_reply_to":"bf659307_623fa7d6","updated":"2018-03-26 02:41:28.000000000","message":"++","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"edb5fc9f5d3cb93dfc9ef9b2c4fd974f03be98f6","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":371,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":372,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":373,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":376,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_b42164a2","line":373,"range":{"start_line":373,"start_character":49,"end_line":373,"end_character":67},"in_reply_to":"bf659307_623fa7d6","updated":"2018-03-26 02:45:18.000000000","message":"+1, and the order depends on the order in the set which is random. So, we need resort the aggregates after duplicate removal.","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"08a8f48941f143cf1e6d69cbbc0079aace73d303","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":371,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":372,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":373,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":376,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_58a80bda","line":373,"range":{"start_line":373,"start_character":49,"end_line":373,"end_character":67},"in_reply_to":"bf659307_623fa7d6","updated":"2018-03-27 14:00:54.000000000","message":"Yeah I really hate sorting in production code to make unit tests work. It\u0027s a tiny overhead hit, but if we do it everywhere it adds up. I see that it\u0027s done elsewhere in this method, so I\u0027ll just do it, but IMHO, that means we just need to have more flexible assertions in the test.","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fa4a34097b88d20b4467a6d35c8a56e042b65c03","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            \u0027status_code\u0027: resp.status_code,"},{"line_number":387,"context_line":"            \u0027err_text\u0027: resp.text,"},{"line_number":388,"context_line":"        }"},{"line_number":389,"context_line":"        if required_traits or aggregates:"},{"line_number":390,"context_line":"            msg \u003d (\"Failed to retrieve allocation candidates from placement \""},{"line_number":391,"context_line":"                   \"API for filters %(resources)s, traits %(traits)s, \""},{"line_number":392,"context_line":"                   \"aggregates %(aggregates)s. Got \""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_75043fc7","line":389,"range":{"start_line":389,"start_character":11,"end_line":389,"end_character":40},"updated":"2018-03-23 23:08:34.000000000","message":"Might as well just get rid of the `else` clause at this point.","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d4a6524d37929a060815030e47a66358560eda14","unresolved":false,"context_lines":[{"line_number":366,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":367,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":368,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":369,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":372,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_37a0d9f4","line":369,"range":{"start_line":369,"start_character":54,"end_line":369,"end_character":66},"updated":"2018-03-26 23:17:16.000000000","message":"Still need to sort this (or something).  This is your current py3 test failure.","commit_id":"1d14abb55ce20365f118453eee3ad0081baed21f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d4a6524d37929a060815030e47a66358560eda14","unresolved":false,"context_lines":[{"line_number":368,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":369,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(required_agg)"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":372,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"},{"line_number":373,"context_line":"        resp \u003d self.get(url, version\u003dversion,"},{"line_number":374,"context_line":"                        global_request_id\u003dcontext.global_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_f75b412b","line":371,"range":{"start_line":371,"start_character":8,"end_line":371,"end_character":24},"updated":"2018-03-26 23:17:16.000000000","message":"Lately we\u0027ve been making long, unwieldy consts at the top rather than hardcoding the microversions in place.  Meh, I\u0027m fine either way, just thought you\u0027d want to be aware.","commit_id":"1d14abb55ce20365f118453eee3ad0081baed21f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c10269bf823adda3cd97f4b462593321bbaf272b","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        if required_traits:"},{"line_number":360,"context_line":"            qs_params[\u0027required\u0027] \u003d \",\".join(required_traits)"},{"line_number":361,"context_line":"        if aggregates:"},{"line_number":362,"context_line":"            # NOTE(danms): In 1.21, placement cannot take an AND\u0027d"},{"line_number":363,"context_line":"            # set of aggregates, only an OR\u0027d set. Thus, if we have"},{"line_number":364,"context_line":"            # required and optional sets, we must do the naive thing"},{"line_number":365,"context_line":"            # and AND ours together. That will not achieve the same"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_6e9882bf","line":362,"range":{"start_line":362,"start_character":14,"end_line":362,"end_character":18},"updated":"2018-03-28 15:48:18.000000000","message":"nit: TODO","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e1adc26e31b062a93c615af84968cad06ef3bacf","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":371,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(sorted(required_agg))"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        version \u003d \u00271.21\u0027"},{"line_number":374,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"},{"line_number":375,"context_line":"        resp \u003d self.get(url, version\u003dversion,"},{"line_number":376,"context_line":"                        global_request_id\u003dcontext.global_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bf659307_f1ef8a1b","line":373,"updated":"2018-03-28 20:11:13.000000000","message":"nova-status needs to be updated:\n\nhttps://github.com/openstack/nova/blob/d73b9ab558c349188fde473cabe75fbe84b911d1/nova/cmd/status.py#L199-L203\n\nSorry for missing this last time. Maybe add a NOTE in here as a reminder that nova-status has to be updated if this version is changed.","commit_id":"4a200b114d2c95e07c5bf8e93c1bb4af17209a4c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ecbcd6ceb59c99a566de2fb820a4c7ab70fd4462","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        translates to:"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"            \"Candidates are in either \u0027foo\u0027 or \u0027bar\u0027, but definitely in \u0027baz\u0027\""},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        \"\"\""},{"line_number":344,"context_line":"        # TODO(efried): For now, just use the unnumbered group to retain"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_44eb0112","line":341,"range":{"start_line":341,"start_character":30,"end_line":341,"end_character":78},"updated":"2018-03-29 15:28:26.000000000","message":"well, I\u0027m not good at English but the AND/OR logic translates me to :\nCandidates are in baz *AND* in either \u0027foo\u0027 OR \u0027bar\u0027 (the \u0027but\u0027 has a very specific meaning in my language where semantically it cancels what you just said before, like \"I like you but you\u0027re awful\" which litterally means \"whatever you think you\u0027re good, you suck\")","commit_id":"a9e7581f00e7f4f70d2193af17025dc18d1d845b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b0b6ed4b3c08ae2059b8b7743e112753ad905b94","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        translates to:"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"            \"Candidates are in either \u0027foo\u0027 or \u0027bar\u0027, but definitely in \u0027baz\u0027\""},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        \"\"\""},{"line_number":344,"context_line":"        # TODO(efried): For now, just use the unnumbered group to retain"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_44bea1d5","line":341,"range":{"start_line":341,"start_character":30,"end_line":341,"end_character":78},"in_reply_to":"bf659307_44eb0112","updated":"2018-03-29 15:32:35.000000000","message":"I would translate this as:\n\n...peuvent être dans \u0027foo\u0027 ou \u0027bar\u0027, mais certainement dans \u0027baz\u0027.\n\n...which makes sense to me.  I guess it would have been clearer phrased as \"but definitely must be in \u0027baz\u0027\":\n\n...peuvent être dans \u0027foo\u0027 ou \u0027bar\u0027, mais certainement doivent être dans \u0027baz\u0027.","commit_id":"a9e7581f00e7f4f70d2193af17025dc18d1d845b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ecbcd6ceb59c99a566de2fb820a4c7ab70fd4462","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":368,"context_line":"            # TODO(danms): Update this when placement can take multiple"},{"line_number":369,"context_line":"            # member_of query parameters."},{"line_number":370,"context_line":"            required_agg \u003d set.intersection(*[set(x) for x in aggregates])"},{"line_number":371,"context_line":"            qs_params[\u0027member_of\u0027] \u003d \u0027in:\u0027 + \u0027,\u0027.join(sorted(required_agg))"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        version \u003d \u00271.21\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf659307_643e458d","line":370,"updated":"2018-03-29 15:28:26.000000000","message":"++","commit_id":"a9e7581f00e7f4f70d2193af17025dc18d1d845b"}],"nova/scheduler/manager.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fa4a34097b88d20b4467a6d35c8a56e042b65c03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"bf659307_958eb32c","updated":"2018-03-23 23:08:34.000000000","message":"this delta will go away","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"}],"nova/scheduler/utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fa4a34097b88d20b4467a6d35c8a56e042b65c03","unresolved":false,"context_lines":[{"line_number":336,"context_line":"    return res_req"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"def aggregates_from_request_spec(spec_obj):"},{"line_number":340,"context_line":"    \"\"\"Given a RequestSpec object, returns a list of aggregates that should"},{"line_number":341,"context_line":"    be required of a placement request."},{"line_number":342,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_f57ccf21","line":339,"updated":"2018-03-23 23:08:34.000000000","message":"Add an aggregates field to ResourceRequest and do this processing in utils.resources_from_request_spec to add them in there.","commit_id":"3c04aca0377d4396f8bc09fcd3cd9810fc8a8bc9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d4a6524d37929a060815030e47a66358560eda14","unresolved":false,"context_lines":[{"line_number":333,"context_line":"    for rclass, amount in spec_resources.items():"},{"line_number":334,"context_line":"        res_req.get_request_group(None).resources[rclass] \u003d amount"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    if \u0027requested_destination\u0027 in spec_obj:"},{"line_number":337,"context_line":"        destination \u003d spec_obj.requested_destination"},{"line_number":338,"context_line":"        if destination and destination.aggregates:"},{"line_number":339,"context_line":"            grp \u003d res_req.get_request_group(None)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_b73dc9bc","line":336,"updated":"2018-03-26 23:17:16.000000000","message":"noyce","commit_id":"1d14abb55ce20365f118453eee3ad0081baed21f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c10269bf823adda3cd97f4b462593321bbaf272b","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"def resources_from_request_spec(spec_obj):"},{"line_number":288,"context_line":"    \"\"\"Given a RequestSpec object, returns a ResourceRequest of the resources"},{"line_number":289,"context_line":"    and traits it represents."},{"line_number":290,"context_line":"    \"\"\""},{"line_number":291,"context_line":"    spec_resources \u003d {"},{"line_number":292,"context_line":"        fields.ResourceClass.VCPU: spec_obj.vcpus,"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_4ee25e31","line":289,"updated":"2018-03-28 15:48:18.000000000","message":"and aggregates","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"}],"nova/tests/unit/scheduler/client/test_report.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c10269bf823adda3cd97f4b462593321bbaf272b","unresolved":false,"context_lines":[{"line_number":1520,"context_line":"            \u0027trait:CUSTOM_TRAIT1\u0027: \u0027required\u0027,"},{"line_number":1521,"context_line":"            \u0027trait:CUSTOM_TRAIT2\u0027: \u0027preferred\u0027,"},{"line_number":1522,"context_line":"        })"},{"line_number":1523,"context_line":"        resources.get_request_group(None).member_of \u003d [(\u0027agg1\u0027, \u0027agg2\u0027)]"},{"line_number":1524,"context_line":"        expected_path \u003d \u0027/allocation_candidates\u0027"},{"line_number":1525,"context_line":"        expected_query \u003d {\u0027resources\u0027: [\u0027MEMORY_MB:1024,VCPU:1\u0027],"},{"line_number":1526,"context_line":"                          \u0027required\u0027: [\u0027CUSTOM_TRAIT1\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_8e463621","line":1523,"range":{"start_line":1523,"start_character":65,"end_line":1523,"end_character":69},"updated":"2018-03-28 15:48:18.000000000","message":"We should also do the AND behavior here to show it\u0027s not yet supported, so something like:\n\n[(\u0027agg1\u0027, \u0027agg2\u0027), (\u0027agg3\u0027,)]\n\nWould end up being: \u0027member_of\u0027: [\u0027in:agg1,agg2,agg3\u0027]\n\nRight?","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"506a3d3f9a205dee8f4b955d540ff86cd2012569","unresolved":false,"context_lines":[{"line_number":1520,"context_line":"            \u0027trait:CUSTOM_TRAIT1\u0027: \u0027required\u0027,"},{"line_number":1521,"context_line":"            \u0027trait:CUSTOM_TRAIT2\u0027: \u0027preferred\u0027,"},{"line_number":1522,"context_line":"        })"},{"line_number":1523,"context_line":"        resources.get_request_group(None).member_of \u003d [(\u0027agg1\u0027, \u0027agg2\u0027)]"},{"line_number":1524,"context_line":"        expected_path \u003d \u0027/allocation_candidates\u0027"},{"line_number":1525,"context_line":"        expected_query \u003d {\u0027resources\u0027: [\u0027MEMORY_MB:1024,VCPU:1\u0027],"},{"line_number":1526,"context_line":"                          \u0027required\u0027: [\u0027CUSTOM_TRAIT1\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_886dc7cd","line":1523,"range":{"start_line":1523,"start_character":65,"end_line":1523,"end_character":69},"in_reply_to":"bf659307_8e463621","updated":"2018-03-28 18:11:43.000000000","message":"No, that would be OR. I did\u0027t do it here because I will need three and two in order to get more than one in the output.","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"}],"nova/tests/unit/scheduler/test_scheduler.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c10269bf823adda3cd97f4b462593321bbaf272b","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        fake_spec \u003d objects.RequestSpec()"},{"line_number":192,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":193,"context_line":"        fake_spec.requested_destination \u003d objects.Destination()"},{"line_number":194,"context_line":"        fake_spec.requested_destination.require_aggregates([\u0027a\u0027, \u0027b\u0027])"},{"line_number":195,"context_line":"        place_res \u003d get_allocation_candidates_response"},{"line_number":196,"context_line":"        mock_get_ac.return_value \u003d place_res"},{"line_number":197,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_6ef962c6","line":194,"updated":"2018-03-28 15:48:18.000000000","message":"Why is this needed? Nothing is asserted about it\u0027s usage.","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"506a3d3f9a205dee8f4b955d540ff86cd2012569","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        fake_spec \u003d objects.RequestSpec()"},{"line_number":192,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":193,"context_line":"        fake_spec.requested_destination \u003d objects.Destination()"},{"line_number":194,"context_line":"        fake_spec.requested_destination.require_aggregates([\u0027a\u0027, \u0027b\u0027])"},{"line_number":195,"context_line":"        place_res \u003d get_allocation_candidates_response"},{"line_number":196,"context_line":"        mock_get_ac.return_value \u003d place_res"},{"line_number":197,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_c8d3bf5f","line":194,"in_reply_to":"bf659307_6ef962c6","updated":"2018-03-28 18:11:43.000000000","message":"I think this is a remnant.","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"}],"nova/tests/unit/scheduler/test_utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c10269bf823adda3cd97f4b462593321bbaf272b","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        destination.require_aggregates([\u0027bar\u0027])"},{"line_number":247,"context_line":"        req \u003d utils.resources_from_request_spec(reqspec)"},{"line_number":248,"context_line":"        self.assertEqual([(\u0027foo\u0027, \u0027bar\u0027), (\u0027bar\u0027,)],"},{"line_number":249,"context_line":"                         req.get_request_group(None).member_of)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def test_resources_from_request_spec_no_aggregates(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_4e17beee","line":248,"range":{"start_line":248,"start_character":26,"end_line":248,"end_character":50},"updated":"2018-03-28 15:48:18.000000000","message":"Yikes, this is going to be a confusing failure if someone ever hits this: must be in foo or bar and bar","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"506a3d3f9a205dee8f4b955d540ff86cd2012569","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        destination.require_aggregates([\u0027bar\u0027])"},{"line_number":247,"context_line":"        req \u003d utils.resources_from_request_spec(reqspec)"},{"line_number":248,"context_line":"        self.assertEqual([(\u0027foo\u0027, \u0027bar\u0027), (\u0027bar\u0027,)],"},{"line_number":249,"context_line":"                         req.get_request_group(None).member_of)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def test_resources_from_request_spec_no_aggregates(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_e866c3c1","line":248,"range":{"start_line":248,"start_character":26,"end_line":248,"end_character":50},"in_reply_to":"bf659307_4e17beee","updated":"2018-03-28 18:11:43.000000000","message":"This likely wouldn\u0027t happen in practice as we\u0027d be adding aggregates for different reasons, which would almost certainly be different in name and uuid (for example a tenant restricted aggregate and an AZ aggregate). I probably meant baz here and will change.","commit_id":"3f4e8ad433e0bcfce840fa086d779bffab0341c4"}]}
