)]}'
{"nova/scheduler/client/report.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d10362d6670a2f224945258b12701b1035f45d1f","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            else:"},{"line_number":358,"context_line":"                qs_params[\u0027required\u0027] \u003d \u0027!\u0027 + forbiddens"},{"line_number":359,"context_line":"        if aggregates:"},{"line_number":360,"context_line":"            # NOTE(danms): In 1.21, placement cannot take an AND\u0027d"},{"line_number":361,"context_line":"            # set of aggregates, only an OR\u0027d set. Thus, if we have"},{"line_number":362,"context_line":"            # required and optional sets, we must do the naive thing"},{"line_number":363,"context_line":"            # and AND ours together. That will not achieve the same"},{"line_number":364,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":365,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":366,"context_line":"            # TODO(danms): Update this when placement can take multiple"},{"line_number":367,"context_line":"            # member_of query parameters."},{"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(sorted(required_agg))"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        version \u003d \u00271.21\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_d37c9473","side":"PARENT","line":368,"range":{"start_line":360,"start_character":0,"end_line":368,"end_character":74},"updated":"2018-05-14 13:34:31.000000000","message":"Do I understand correctly that we don\u0027t need this as 1.24 already supports multiple member_of query parameters and we are now jumping to 1.25?","commit_id":"ed646ac55dfdcec4f3b98ae07392cb2880fbbbb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"02f9429f63e5528a971430e059b578af5707fb8d","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            else:"},{"line_number":358,"context_line":"                qs_params[\u0027required\u0027] \u003d \u0027!\u0027 + forbiddens"},{"line_number":359,"context_line":"        if aggregates:"},{"line_number":360,"context_line":"            # NOTE(danms): In 1.21, placement cannot take an AND\u0027d"},{"line_number":361,"context_line":"            # set of aggregates, only an OR\u0027d set. Thus, if we have"},{"line_number":362,"context_line":"            # required and optional sets, we must do the naive thing"},{"line_number":363,"context_line":"            # and AND ours together. That will not achieve the same"},{"line_number":364,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":365,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":366,"context_line":"            # TODO(danms): Update this when placement can take multiple"},{"line_number":367,"context_line":"            # member_of query parameters."},{"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(sorted(required_agg))"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        version \u003d \u00271.21\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_5c1ad116","side":"PARENT","line":368,"range":{"start_line":360,"start_character":0,"end_line":368,"end_character":74},"in_reply_to":"5f7c97a3_360cd6a3","updated":"2018-05-14 14:58:47.000000000","message":"I think there is no need to do it in a separate patch as this is the patch that bumps the microversion to higher or equal than 1.24","commit_id":"ed646ac55dfdcec4f3b98ae07392cb2880fbbbb9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"346d4e52b8868c2d77a0b8e49ae21bd9564a2cd9","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            else:"},{"line_number":358,"context_line":"                qs_params[\u0027required\u0027] \u003d \u0027!\u0027 + forbiddens"},{"line_number":359,"context_line":"        if aggregates:"},{"line_number":360,"context_line":"            # NOTE(danms): In 1.21, placement cannot take an AND\u0027d"},{"line_number":361,"context_line":"            # set of aggregates, only an OR\u0027d set. Thus, if we have"},{"line_number":362,"context_line":"            # required and optional sets, we must do the naive thing"},{"line_number":363,"context_line":"            # and AND ours together. That will not achieve the same"},{"line_number":364,"context_line":"            # result, but we can\u0027t do it from the client side. When"},{"line_number":365,"context_line":"            # placement supports AND\u0027ing multiple sets, we can fix this."},{"line_number":366,"context_line":"            # TODO(danms): Update this when placement can take multiple"},{"line_number":367,"context_line":"            # member_of query parameters."},{"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(sorted(required_agg))"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        version \u003d \u00271.21\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_360cd6a3","side":"PARENT","line":368,"range":{"start_line":360,"start_character":0,"end_line":368,"end_character":74},"in_reply_to":"5f7c97a3_d37c9473","updated":"2018-05-14 14:30:50.000000000","message":"Correct.  Um, it\u0027s possible these things should be done in separate patches.  What do you think?","commit_id":"ed646ac55dfdcec4f3b98ae07392cb2880fbbbb9"}],"nova/scheduler/utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f9bcd4c5e9dbcb13c52a6105aec9bca2717092f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    The other groups represent requests for resources and traits which must be"},{"line_number":55,"context_line":"    satisfied by a single resource provider."},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    RESOURCES_PREFIX \u003d \u0027resources\u0027"},{"line_number":58,"context_line":"    REQ_TRAIT_PREFIX \u003d \u0027required\u0027"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self, ident):"},{"line_number":61,"context_line":"        \"\"\"ident is a string (not a number).\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_81d08d55","line":58,"range":{"start_line":57,"start_character":0,"end_line":58,"end_character":33},"updated":"2017-10-31 20:19:02.000000000","message":"These are probably unnecessary.","commit_id":"a8ca81595f9eb1e5e5c925d1b5b0f6a4f746ebd8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a683a98d72ed0d06c5c9d381dde89760b7eab769","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        Keys and values are of the form expected by GET /allocation_candidates."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        # NOTE(efried): Sorting is not necessary for the API; it\u0027s just to make"},{"line_number":78,"context_line":"        # testing easier."},{"line_number":79,"context_line":"        suffix \u003d \u0027\u0027 if self._ident \u003d\u003d \u00270\u0027 else self._ident"},{"line_number":80,"context_line":"        ret \u003d []"},{"line_number":81,"context_line":"        if self.resources:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4b6375_051da9bc","line":78,"range":{"start_line":77,"start_character":0,"end_line":78,"end_character":25},"updated":"2017-10-30 14:47:06.000000000","message":"+++\nand reading the logs is also easier this way.","commit_id":"a8ca81595f9eb1e5e5c925d1b5b0f6a4f746ebd8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d10362d6670a2f224945258b12701b1035f45d1f","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        if ret._group_policy is None:"},{"line_number":165,"context_line":"            numbered \u003d set(ret._rg_by_id) - set([None])"},{"line_number":166,"context_line":"            if len(numbered) \u003e 1:"},{"line_number":167,"context_line":"                raise exception.FlavorGroupPolicyRequired()"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # Make sure there are no orphaned numbered trait groups."},{"line_number":170,"context_line":"        # NOTE(efried): We skip the unnumbered group because at the moment it"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_f301906b","line":167,"range":{"start_line":167,"start_character":32,"end_line":167,"end_character":57},"updated":"2018-05-14 13:34:31.000000000","message":"This check happens quite late and quite close to when placement would catch it anyhow.\n\nI would either do the input validation in the nova-api or let placement do it with the existing implementation.","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"392c187144fb806d6dd63dc374a0aa49a0f52d1e","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        if ret._group_policy is None:"},{"line_number":165,"context_line":"            numbered \u003d set(ret._rg_by_id) - set([None])"},{"line_number":166,"context_line":"            if len(numbered) \u003e 1:"},{"line_number":167,"context_line":"                raise exception.FlavorGroupPolicyRequired()"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # Make sure there are no orphaned numbered trait groups."},{"line_number":170,"context_line":"        # NOTE(efried): We skip the unnumbered group because at the moment it"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_82b9e015","line":167,"range":{"start_line":167,"start_character":32,"end_line":167,"end_character":57},"in_reply_to":"5f7c97a3_5cef31e8","updated":"2018-05-16 12:11:52.000000000","message":"Okay, removing these checks.","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fcafa5e927f9e240bd743541ac87407e765c2dd6","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        if ret._group_policy is None:"},{"line_number":165,"context_line":"            numbered \u003d set(ret._rg_by_id) - set([None])"},{"line_number":166,"context_line":"            if len(numbered) \u003e 1:"},{"line_number":167,"context_line":"                raise exception.FlavorGroupPolicyRequired()"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # Make sure there are no orphaned numbered trait groups."},{"line_number":170,"context_line":"        # NOTE(efried): We skip the unnumbered group because at the moment it"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_5cef31e8","line":167,"range":{"start_line":167,"start_character":32,"end_line":167,"end_character":57},"in_reply_to":"5f7c97a3_6134c6de","updated":"2018-05-14 14:58:12.000000000","message":"So if we don\u0027t validate this in nova explicitly, what will happen? I expect we\u0027ll get a 400 response back from GET /allocation_candidates, log an error here:\n\nhttps://github.com/openstack/nova/blob/36345f34c404ef711fbf821ea2bf3d4f62797544/nova/scheduler/client/report.py#L394\n\nAnd then I think we\u0027ll raise NoValidHost here:\n\nhttps://github.com/openstack/nova/blob/36345f34c404ef711fbf821ea2bf3d4f62797544/nova/scheduler/manager.py#L152\n\nSo the user\u0027s server create request will fail in some obscure way, they open a ticket and the operator has to figure out how the flavor is wrong based on the scheduling failure (or presumably/hopefully the operator is testing granular syntax in a new private flavor before ever making the flavor public). If we assume that, then I think failing in Placement and the resulting NoValidHost is OK since it\u0027s basically misconfiguration of the flavor.","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"346d4e52b8868c2d77a0b8e49ae21bd9564a2cd9","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        if ret._group_policy is None:"},{"line_number":165,"context_line":"            numbered \u003d set(ret._rg_by_id) - set([None])"},{"line_number":166,"context_line":"            if len(numbered) \u003e 1:"},{"line_number":167,"context_line":"                raise exception.FlavorGroupPolicyRequired()"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # Make sure there are no orphaned numbered trait groups."},{"line_number":170,"context_line":"        # NOTE(efried): We skip the unnumbered group because at the moment it"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_6134c6de","line":167,"range":{"start_line":167,"start_character":32,"end_line":167,"end_character":57},"in_reply_to":"5f7c97a3_f301906b","updated":"2018-05-14 14:30:50.000000000","message":"Jay and Matt and I talked about this in IRC [1] and decided we wanted to do this enforcement here.\n\nBut I think you\u0027re right; there\u0027s not a whole lot of point given that the placement API will do the same thing very shortly hereafter.\n\nJay/Matt, what do you think?\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-placement/%23openstack-placement.2018-05-11.log.html#t2018-05-11T20:09:26","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d10362d6670a2f224945258b12701b1035f45d1f","unresolved":false,"context_lines":[{"line_number":176,"context_line":"               (rg.required_traits or rg.forbidden_traits)"},{"line_number":177,"context_line":"        ]"},{"line_number":178,"context_line":"        if orphan_trait_groups:"},{"line_number":179,"context_line":"            raise exception.FlavorOrphanedTraits("},{"line_number":180,"context_line":"                orphan_trait_groups\u003d\u0027, \u0027.join(sorted(orphan_trait_groups)))"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_13176ca6","line":179,"range":{"start_line":179,"start_character":28,"end_line":179,"end_character":48},"updated":"2018-05-14 13:34:31.000000000","message":"ditto","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d10362d6670a2f224945258b12701b1035f45d1f","unresolved":false,"context_lines":[{"line_number":272,"context_line":""},{"line_number":273,"context_line":"            # Assemble required and forbidden traits, allowing for either/both"},{"line_number":274,"context_line":"            # to be empty."},{"line_number":275,"context_line":"            required_val \u003d \u0027\u0027"},{"line_number":276,"context_line":"            if required_traits:"},{"line_number":277,"context_line":"                required_val \u003d \",\".join(sorted(required_traits))"},{"line_number":278,"context_line":"            if forbidden_traits:"},{"line_number":279,"context_line":"                forbiddens \u003d \u0027,!\u0027.join(sorted(forbidden_traits))"},{"line_number":280,"context_line":"                if required_val:"},{"line_number":281,"context_line":"                    required_val +\u003d \u0027,\u0027"},{"line_number":282,"context_line":"                required_val +\u003d \u0027!\u0027 + forbiddens"},{"line_number":283,"context_line":"            if required_val:"},{"line_number":284,"context_line":"                qs_params.append((\u0027required%s\u0027 % suffix, required_val))"},{"line_number":285,"context_line":"            if aggregates:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_907932c9","line":282,"range":{"start_line":275,"start_character":1,"end_line":282,"end_character":48},"updated":"2018-05-14 13:34:31.000000000","message":"you can avoid the conditionals with something like\n\n  val \u003d \u0027,\u0027.join(sorted(required_traits) + [\u0027!\u0027 + trait for trait in sorted(forbidden_traits]))","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"346d4e52b8868c2d77a0b8e49ae21bd9564a2cd9","unresolved":false,"context_lines":[{"line_number":272,"context_line":""},{"line_number":273,"context_line":"            # Assemble required and forbidden traits, allowing for either/both"},{"line_number":274,"context_line":"            # to be empty."},{"line_number":275,"context_line":"            required_val \u003d \u0027\u0027"},{"line_number":276,"context_line":"            if required_traits:"},{"line_number":277,"context_line":"                required_val \u003d \",\".join(sorted(required_traits))"},{"line_number":278,"context_line":"            if forbidden_traits:"},{"line_number":279,"context_line":"                forbiddens \u003d \u0027,!\u0027.join(sorted(forbidden_traits))"},{"line_number":280,"context_line":"                if required_val:"},{"line_number":281,"context_line":"                    required_val +\u003d \u0027,\u0027"},{"line_number":282,"context_line":"                required_val +\u003d \u0027!\u0027 + forbiddens"},{"line_number":283,"context_line":"            if required_val:"},{"line_number":284,"context_line":"                qs_params.append((\u0027required%s\u0027 % suffix, required_val))"},{"line_number":285,"context_line":"            if aggregates:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_019b9265","line":282,"range":{"start_line":275,"start_character":1,"end_line":282,"end_character":48},"in_reply_to":"5f7c97a3_907932c9","updated":"2018-05-14 14:30:50.000000000","message":"Will do.","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"651ac324992c34cbf62466d4f4483154831bd883","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _add_group_policy(self, policy):"},{"line_number":111,"context_line":"        # The only valid values for group_policy are \u0027none\u0027 and \u0027isolate\u0027."},{"line_number":112,"context_line":"        if policy not in (\u0027none\u0027, \u0027isolate\u0027):"},{"line_number":113,"context_line":"            LOG.warning("},{"line_number":114,"context_line":"                \"Invalid group_policy \u0027%s\u0027. Valid values are \u0027none\u0027 and \""},{"line_number":115,"context_line":"                \"\u0027isolate\u0027.\", policy)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_4c8dd679","line":112,"range":{"start_line":112,"start_character":25,"end_line":112,"end_character":44},"updated":"2018-05-18 14:58:40.000000000","message":"suggestion for followup patch... you could place these into a const/enum","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"651ac324992c34cbf62466d4f4483154831bd883","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            \"trait:$TRAIT_NAME\": \"required\""},{"line_number":127,"context_line":"            \"trait$N:$TRAIT_NAME\": \"required\""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        Does *not* yet handle member_of[$N]."},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        :param extra_specs: The flavor extra_specs dict."},{"line_number":132,"context_line":"        :param req: the ResourceRequest object to add the requirements to or"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_8c6f6e91","line":129,"range":{"start_line":129,"start_character":8,"end_line":129,"end_character":44},"updated":"2018-05-18 14:58:40.000000000","message":"I don\u0027t necessarily see how a flavor or image\u0027s extra specs are ever going to contain aggregate information... more likely that they will contain something that would be handled as a placement req filter. do I have that right?","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"}],"releasenotes/notes/granular-extra-specs-50b26b8f63717942.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d128707858bd5cc0455a592003d36a1792e9ca4b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for granular resource and traits requests to the scheduler."},{"line_number":5,"context_line":"    A flavor extra spec is extended to support specifying numbered groupings of"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"5f7c97a3_021070a7","line":2,"updated":"2018-05-14 16:33:02.000000000","message":"For a follow up, something should be documented in our flavors docs:\n\nhttps://docs.openstack.org/nova/latest/user/flavors.html#extra-specs","commit_id":"1db4837e4b47c8d0ab2ade6b1ef42f9b11d25205"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9f8c4a6aa9d6c90a2f785498cec6dcae1d5601b6","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    resources and required/forbidden traits.  A ``resources`` key with a"},{"line_number":7,"context_line":"    positive integer suffix (e.g. ``resources42:VCPU``) will be logically"},{"line_number":8,"context_line":"    associated with ``required`` keys with the same suffix (e.g."},{"line_number":9,"context_line":"    ``required42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"5f7c97a3_68b799f6","line":9,"range":{"start_line":9,"start_character":6,"end_line":9,"end_character":31},"updated":"2018-05-16 08:32:15.000000000","message":"In the flavor extra_spec the traits are not specified in the form of required:\u003ctrait name\u003e but in the form of trait:\u003ctrait name\u003e: required [1]. So expecting required42 keys in the flavor extra_spec feels inconsistent.\n\n\n[1] https://github.com/openstack/nova/blob/ed646ac55dfdcec4f3b98ae07392cb2880fbbbb9/nova/tests/functional/test_servers.py#L3708","commit_id":"c31d4232929212e563e04abec699f90b9bc087ed"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"392c187144fb806d6dd63dc374a0aa49a0f52d1e","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    resources and required/forbidden traits.  A ``resources`` key with a"},{"line_number":7,"context_line":"    positive integer suffix (e.g. ``resources42:VCPU``) will be logically"},{"line_number":8,"context_line":"    associated with ``required`` keys with the same suffix (e.g."},{"line_number":9,"context_line":"    ``required42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"5f7c97a3_9419f0d7","line":9,"range":{"start_line":9,"start_character":6,"end_line":9,"end_character":31},"in_reply_to":"5f7c97a3_68b799f6","updated":"2018-05-16 12:11:52.000000000","message":"oh, whoops, yes, bad copy/paste from the placement side reno.  Good eye, thanks.","commit_id":"c31d4232929212e563e04abec699f90b9bc087ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"651ac324992c34cbf62466d4f4483154831bd883","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    ``trait42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"},{"line_number":13,"context_line":"    groups should interact. With ``group_policy\u003dnone``, separate groupings -"},{"line_number":14,"context_line":"    numbered or unnumbered - may or may not be satisfied by the same provider."},{"line_number":15,"context_line":"    With ``group_policy\u003disolate``, numbered groups are guaranteed to be"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_6c7c5220","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":57},"updated":"2018-05-18 14:58:40.000000000","message":"I\u0027m still wondering whether we should default group_policy to something when we don\u0027t find it... seems to me that if we let this patch get merged as-is, then there will be a period of time when a flavor that is created or edited by an admin will go from working to not working (due to the missing group_policy spec). and that isn\u0027t a great upgrade experience, of course.\n\nI know we\u0027ve discussed this on IRC and on the spec, but what are Matt/Dan/Sylvain\u0027s thoughts on this?","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c344752c1de8f6ad1a4601586924499e19451288","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    ``trait42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"},{"line_number":13,"context_line":"    groups should interact. With ``group_policy\u003dnone``, separate groupings -"},{"line_number":14,"context_line":"    numbered or unnumbered - may or may not be satisfied by the same provider."},{"line_number":15,"context_line":"    With ``group_policy\u003disolate``, numbered groups are guaranteed to be"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_cced668c","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":57},"in_reply_to":"5f7c97a3_2cf2da9b","updated":"2018-05-18 15:09:54.000000000","message":"From my own point of view, I just feel that providing an extra spec to be \"group_policy\u003dnone\" is redundant and could be implicit, if you don\u0027t provide that extra spec.\n\nIn other words, I feel that this \"none\" policy is just the default policy, hence it could be optional to provide that extra spec.","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ade41a20a653ed7436ef0f7cabafe758cc2a25fa","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    ``trait42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"},{"line_number":13,"context_line":"    groups should interact. With ``group_policy\u003dnone``, separate groupings -"},{"line_number":14,"context_line":"    numbered or unnumbered - may or may not be satisfied by the same provider."},{"line_number":15,"context_line":"    With ``group_policy\u003disolate``, numbered groups are guaranteed to be"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_ecc5c20b","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":57},"in_reply_to":"5f7c97a3_2cf2da9b","updated":"2018-05-18 15:08:18.000000000","message":"Yeah, understood. I\u0027m really just trying to think of what an admin would experience if they edit a flavor after upgrading, don\u0027t put the group_policy extra spec in the flavor, and then all builds of that flavor die until the admin realizes what they need to do. Again, I understand it\u0027s a temporary situation, and frankly making a default group_policy would possibly create a temporary situation where the admin got behaviour that was different from what they expected as well... it\u0027s a tough call I guess.","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c1a4756a1d5cf65f19457c598157a0bc6e76292e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    ``trait42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"},{"line_number":13,"context_line":"    groups should interact. With ``group_policy\u003dnone``, separate groupings -"},{"line_number":14,"context_line":"    numbered or unnumbered - may or may not be satisfied by the same provider."},{"line_number":15,"context_line":"    With ``group_policy\u003disolate``, numbered groups are guaranteed to be"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_2cf2da9b","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":57},"in_reply_to":"5f7c97a3_6c7c5220","updated":"2018-05-18 15:03:04.000000000","message":"group_policy only applies to numbered granular request groups right? And we didn\u0027t support those before this, right? If yes, then it seems we won\u0027t break anything on upgrade since it wasn\u0027t supported before anyway.","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a0d12ae573526d2dccbd453c1e0907b32a0ccc04","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    ``trait42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"},{"line_number":13,"context_line":"    groups should interact. With ``group_policy\u003dnone``, separate groupings -"},{"line_number":14,"context_line":"    numbered or unnumbered - may or may not be satisfied by the same provider."},{"line_number":15,"context_line":"    With ``group_policy\u003disolate``, numbered groups are guaranteed to be"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_a720459d","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":57},"in_reply_to":"5f7c97a3_ccbb2670","updated":"2018-05-18 15:19:37.000000000","message":"\u003e Would it be enough to have a nice NOTE in the flavor extra_spec\n \u003e devref about the requirement of the group_policy key?\n\nYes, I asked for this earlier, I would like to see functional end to end tests and clear user guide documentation in the extra specs docs (which will likely just pull from the spec).","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7a58e9cf7dd392b3cd1fa2b937c0a769ad8cab6d","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    ``trait42:HW_CPU_X86_AVX``). The resources and required/forbidden traits"},{"line_number":10,"context_line":"    in that group will be satisfied by the same resource provider on the host"},{"line_number":11,"context_line":"    selected by the scheduler. When more than one numbered grouping is"},{"line_number":12,"context_line":"    supplied, the ``group_policy`` extra spec is required to indicate how the"},{"line_number":13,"context_line":"    groups should interact. With ``group_policy\u003dnone``, separate groupings -"},{"line_number":14,"context_line":"    numbered or unnumbered - may or may not be satisfied by the same provider."},{"line_number":15,"context_line":"    With ``group_policy\u003disolate``, numbered groups are guaranteed to be"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_ccbb2670","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":57},"in_reply_to":"5f7c97a3_cced668c","updated":"2018-05-18 15:12:20.000000000","message":"Would it be enough to have a nice NOTE in the flavor extra_spec devref about the requirement of the group_policy key?","commit_id":"d71284ac8359d7c96ad29768ab3100b6e977214c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d29ef670e4dda6c37718e35a28d8a3d3279640","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for granular resource and traits requests to the scheduler."},{"line_number":5,"context_line":"    A flavor extra spec is extended to support specifying numbered groupings of"}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f7c97a3_3a601901","line":2,"updated":"2018-06-13 15:05:01.000000000","message":"This should exist in the scheduler does somewhere, or the flavor extra specs docs:\n\nhttps://docs.openstack.org/nova/latest/user/flavors.html#extra-specs\n\nhttps://docs.openstack.org/nova/latest/admin/configuration/schedulers.html","commit_id":"9ef4d7662e4a31e05d155982e25d3d35e2362e3e"}],"tox.ini":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d10362d6670a2f224945258b12701b1035f45d1f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  find"},{"line_number":11,"context_line":"  rm"},{"line_number":12,"context_line":"  env"},{"line_number":13,"context_line":"install_command \u003d pip install --no-cache -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}"},{"line_number":14,"context_line":"setenv \u003d"},{"line_number":15,"context_line":"  VIRTUAL_ENV\u003d{envdir}"},{"line_number":16,"context_line":"  LANGUAGE\u003den_US"}],"source_content_type":"text/x-properties","patch_set":16,"id":"5f7c97a3_f3a0b044","line":13,"updated":"2018-05-14 13:34:31.000000000","message":"I feel this needs to be in a separate change.","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"346d4e52b8868c2d77a0b8e49ae21bd9564a2cd9","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  find"},{"line_number":11,"context_line":"  rm"},{"line_number":12,"context_line":"  env"},{"line_number":13,"context_line":"install_command \u003d pip install --no-cache -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}"},{"line_number":14,"context_line":"setenv \u003d"},{"line_number":15,"context_line":"  VIRTUAL_ENV\u003d{envdir}"},{"line_number":16,"context_line":"  LANGUAGE\u003den_US"}],"source_content_type":"text/x-properties","patch_set":16,"id":"5f7c97a3_e1977639","line":13,"in_reply_to":"5f7c97a3_f3a0b044","updated":"2018-05-14 14:30:50.000000000","message":"Dammit, I keep forgetting to rip it out.\n\nThe backstory here is, due to some kind of glitch on my end, if I don\u0027t include --no-cache, pip install hangs.  A real PITA for running local tests.\n\nWill remove.","commit_id":"55ff09cbe44d3e1720e41c029fd84bc21d3ca994"}]}
