)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e0b83ee73879415083c2911ff6754e10a51a1802","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Nova object changes for forbidden aggregates request filter"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch modifies Nova objects that will allow Destination object to store"},{"line_number":10,"context_line":"list of forbidden aggregates that placement should ignore in"},{"line_number":11,"context_line":"\u0027GET /allocation_candidates\u0027 API."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_4826a617","line":9,"range":{"start_line":9,"start_character":71,"end_line":9,"end_character":76},"updated":"2019-07-16 16:18:55.000000000","message":"nit: long line","commit_id":"50a64af7d0f1b465c855655e02374dac9354b7d7"}],"nova/objects/request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9ed6dc73ff2d882fb4f85c8cbf72aa2263bf260","unresolved":false,"context_lines":[{"line_number":895,"context_line":"                                                default\u003dNone),"},{"line_number":896,"context_line":"        # NOTE(vrushali): These are forbidden aggregates (or sets) and"},{"line_number":897,"context_line":"        # are passed to placement. See set_forbidden_aggregates() below."},{"line_number":898,"context_line":"        \u0027forbidden_aggregates\u0027: fields.ListOfStringsField(nullable\u003dTrue,"},{"line_number":899,"context_line":"                                                          default\u003dNone),"},{"line_number":900,"context_line":"    }"},{"line_number":901,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_7ac7c513","line":898,"range":{"start_line":898,"start_character":39,"end_line":898,"end_character":57},"updated":"2019-07-31 18:29:30.000000000","message":"Should this be SetOfStringsField? It looks like you\u0027re copying the aggregates field but the behavior is different. If forbidden_aggregates is just a set, then make the field a set rather than a list.","commit_id":"3a8321123249ffe939cfff1efaebc37b463f7521"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9ed6dc73ff2d882fb4f85c8cbf72aa2263bf260","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"        #     [aggregate_UUID1, aggregate_UUID2, aggregate_UUID3]"},{"line_number":1048,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1049,"context_line":"        # belonging to the aggregates in forbidden_aggregates field."},{"line_number":1050,"context_line":"        \u0027forbidden_aggregates\u0027: fields.ListOfStringsField(default\u003d[]),"},{"line_number":1051,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1052,"context_line":"        # which may not always be a UUID."},{"line_number":1053,"context_line":"        \u0027requester_id\u0027: fields.StringField(nullable\u003dTrue, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_daf6f95d","line":1050,"range":{"start_line":1050,"start_character":39,"end_line":1050,"end_character":43},"updated":"2019-07-31 18:29:30.000000000","message":"Same - should this be a Set?","commit_id":"3a8321123249ffe939cfff1efaebc37b463f7521"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d2adb2f3341951f2a5dc67f2345c08997e17cd87","unresolved":false,"context_lines":[{"line_number":897,"context_line":"        # query params to the allocation candidates API."},{"line_number":898,"context_line":"        # See set_isolated_aggregates() below."},{"line_number":899,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":900,"context_line":"                                                          default\u003dNone),"},{"line_number":901,"context_line":"    }"},{"line_number":902,"context_line":""},{"line_number":903,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_529b6165","line":900,"range":{"start_line":900,"start_character":56,"end_line":900,"end_character":58},"updated":"2019-08-07 20:20:30.000000000","message":"fix indent","commit_id":"8b04a8aea7fc816aea0ed6f3530b7be5bf559617"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"5d1f09b8446326d30eab54bb05263b272f15337c","unresolved":false,"context_lines":[{"line_number":897,"context_line":"        # query params to the allocation candidates API."},{"line_number":898,"context_line":"        # See set_isolated_aggregates() below."},{"line_number":899,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":900,"context_line":"                                                          default\u003dNone),"},{"line_number":901,"context_line":"    }"},{"line_number":902,"context_line":""},{"line_number":903,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_4f716cde","line":900,"range":{"start_line":900,"start_character":56,"end_line":900,"end_character":58},"in_reply_to":"7faddb67_529b6165","updated":"2019-08-08 12:34:15.000000000","message":"Done","commit_id":"8b04a8aea7fc816aea0ed6f3530b7be5bf559617"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d2adb2f3341951f2a5dc67f2345c08997e17cd87","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"        # aggregate_UUID2 or aggregate_UUID3 ."},{"line_number":1046,"context_line":"        \u0027aggregates\u0027: fields.ListOfListsOfStringsField(default\u003d[]),"},{"line_number":1047,"context_line":"        # The isolated_aggregates field has a form of"},{"line_number":1048,"context_line":"        #     (aggregate_UUID1, aggregate_UUID2, aggregate_UUID3)"},{"line_number":1049,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1050,"context_line":"        # belonging to the aggregates in isolated_aggregates field."},{"line_number":1051,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_d2a671ac","line":1048,"range":{"start_line":1048,"start_character":14,"end_line":1048,"end_character":15},"updated":"2019-08-07 20:20:30.000000000","message":"these should be curly braces, really","commit_id":"8b04a8aea7fc816aea0ed6f3530b7be5bf559617"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"5d1f09b8446326d30eab54bb05263b272f15337c","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"        # aggregate_UUID2 or aggregate_UUID3 ."},{"line_number":1046,"context_line":"        \u0027aggregates\u0027: fields.ListOfListsOfStringsField(default\u003d[]),"},{"line_number":1047,"context_line":"        # The isolated_aggregates field has a form of"},{"line_number":1048,"context_line":"        #     (aggregate_UUID1, aggregate_UUID2, aggregate_UUID3)"},{"line_number":1049,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1050,"context_line":"        # belonging to the aggregates in isolated_aggregates field."},{"line_number":1051,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_ef7db8b2","line":1048,"range":{"start_line":1048,"start_character":14,"end_line":1048,"end_character":15},"in_reply_to":"7faddb67_d2a671ac","updated":"2019-08-08 12:34:15.000000000","message":"Done","commit_id":"8b04a8aea7fc816aea0ed6f3530b7be5bf559617"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b81d25cb94ddc693389d0ce6cda589a0d1b47581","unresolved":false,"context_lines":[{"line_number":938,"context_line":"            self.aggregates \u003d []"},{"line_number":939,"context_line":"        self.aggregates.append(\u0027,\u0027.join(aggregates))"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def set_isolated_aggregates(self, isolated_aggregates):"},{"line_number":942,"context_line":"        \"\"\"Add a set of aggregates to the isolated aggregates."},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        This will take a set of isolated aggregates that should be"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_4bdb6720","line":941,"range":{"start_line":941,"start_character":8,"end_line":941,"end_character":11},"updated":"2019-08-13 09:44:46.000000000","message":"Maybe \u0027add_\u0027 or \u0027append_\u0027 would make more sense?","commit_id":"2f7c439ddd8df2ce97ca7d26e6dd9fdcf8ab2d56"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5c373331850e46aa18a09aa1d213489e0b133459","unresolved":false,"context_lines":[{"line_number":938,"context_line":"            self.aggregates \u003d []"},{"line_number":939,"context_line":"        self.aggregates.append(\u0027,\u0027.join(aggregates))"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def set_isolated_aggregates(self, isolated_aggregates):"},{"line_number":942,"context_line":"        \"\"\"Add a set of aggregates to the isolated aggregates."},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        This will take a set of isolated aggregates that should be"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_be3562dd","line":941,"range":{"start_line":941,"start_character":8,"end_line":941,"end_character":31},"updated":"2019-08-13 18:56:23.000000000","message":"This seems like a bad name for this method. I came here from a patch above to check this behavior, and was surprised to see that it does not *set* these, but *add* them. Glad I checked.\n\nThe docstring has it right, so this probably needs to change.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"5e204c1a2237240af4c4e1840e6d84ed9dcde004","unresolved":false,"context_lines":[{"line_number":938,"context_line":"            self.aggregates \u003d []"},{"line_number":939,"context_line":"        self.aggregates.append(\u0027,\u0027.join(aggregates))"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def set_isolated_aggregates(self, isolated_aggregates):"},{"line_number":942,"context_line":"        \"\"\"Add a set of aggregates to the isolated aggregates."},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        This will take a set of isolated aggregates that should be"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_80126757","line":941,"range":{"start_line":941,"start_character":8,"end_line":941,"end_character":31},"in_reply_to":"7faddb67_bdeb1e76","updated":"2019-08-15 00:09:24.000000000","message":"removed as suggested","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"83fff464f139608304b40a2f32bafd870fa7c009","unresolved":false,"context_lines":[{"line_number":938,"context_line":"            self.aggregates \u003d []"},{"line_number":939,"context_line":"        self.aggregates.append(\u0027,\u0027.join(aggregates))"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def set_isolated_aggregates(self, isolated_aggregates):"},{"line_number":942,"context_line":"        \"\"\"Add a set of aggregates to the isolated aggregates."},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        This will take a set of isolated aggregates that should be"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_e39a5e60","line":941,"range":{"start_line":941,"start_character":8,"end_line":941,"end_character":31},"in_reply_to":"7faddb67_be3562dd","updated":"2019-08-13 22:25:07.000000000","message":"+1 to call it add_isolated_aggregates","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7bbe0dfbcd5bdf68004c04c04d9782d574b1c21e","unresolved":false,"context_lines":[{"line_number":938,"context_line":"            self.aggregates \u003d []"},{"line_number":939,"context_line":"        self.aggregates.append(\u0027,\u0027.join(aggregates))"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def set_isolated_aggregates(self, isolated_aggregates):"},{"line_number":942,"context_line":"        \"\"\"Add a set of aggregates to the isolated aggregates."},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        This will take a set of isolated aggregates that should be"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_bdeb1e76","line":941,"range":{"start_line":941,"start_character":8,"end_line":941,"end_character":31},"in_reply_to":"7faddb67_c612d062","updated":"2019-08-14 11:26:41.000000000","message":"As far as I see we never use the extending/appending semantics of this function. It is only called once when we change the value from set() to a set of aggregates. So I think this can be simply removed and the isolated_aggregates field can be written directly instead.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cd374cf41fa8d95c0401abad961eddb0daf35515","unresolved":false,"context_lines":[{"line_number":938,"context_line":"            self.aggregates \u003d []"},{"line_number":939,"context_line":"        self.aggregates.append(\u0027,\u0027.join(aggregates))"},{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def set_isolated_aggregates(self, isolated_aggregates):"},{"line_number":942,"context_line":"        \"\"\"Add a set of aggregates to the isolated aggregates."},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        This will take a set of isolated aggregates that should be"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_c612d062","line":941,"range":{"start_line":941,"start_character":8,"end_line":941,"end_character":31},"in_reply_to":"7faddb67_e39a5e60","updated":"2019-08-14 00:42:43.000000000","message":"ya i think i prefer add or extend_isolated_aggreates to mirror the behavior or the list.extend method.\n\nbut in anycase set is incorrect since we are actully doing an inplace union of the current value or set() and the new aggreates.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cb27918a209eb4515935614db63e752431f18895","unresolved":false,"context_lines":[{"line_number":948,"context_line":"                                    ignored by the placement service."},{"line_number":949,"context_line":""},{"line_number":950,"context_line":"        \"\"\""},{"line_number":951,"context_line":"        if self.isolated_aggregates is None:"},{"line_number":952,"context_line":"            self.isolated_aggregates \u003d set()"},{"line_number":953,"context_line":"        self.isolated_aggregates |\u003d isolated_aggregates"},{"line_number":954,"context_line":""},{"line_number":955,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_7502a040","line":952,"range":{"start_line":951,"start_character":0,"end_line":952,"end_character":44},"updated":"2019-08-14 08:56:59.000000000","message":"do we treat None as a special value of this field elsewhere? (I haven\u0027t found such place yet) If not then we can default the field to an empty set in the field definition.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cb27918a209eb4515935614db63e752431f18895","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"        #     set([\u0027aggregate_UUID1\u0027, \u0027aggregate_UUID12\u0027, \u0027aggregate_UUID3\u0027])"},{"line_number":1049,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1050,"context_line":"        # belonging to the aggregates in isolated_aggregates field."},{"line_number":1051,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"},{"line_number":1052,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1053,"context_line":"        # which may not always be a UUID."},{"line_number":1054,"context_line":"        \u0027requester_id\u0027: fields.StringField(nullable\u003dTrue, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_e7d02356","line":1051,"range":{"start_line":1051,"start_character":9,"end_line":1051,"end_character":28},"updated":"2019-08-14 08:56:59.000000000","message":"Based on the description above I would call this forbidden_aggregates. Also placement API calls this forbidden. Basically the current feature supports isolated aggregates by using forbidden aggregates in the placement query. But forbidden aggregates could be used for other things as well via this field here. So the generic name would be more appropriate. Above in the Destination object I can accept the name isolated_aggregates as that change is more specific for your feature itself than this change in the RequestGroup object.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e296cf004f1dc88e83a3ba19363951c124bb6a84","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"        #     set([\u0027aggregate_UUID1\u0027, \u0027aggregate_UUID12\u0027, \u0027aggregate_UUID3\u0027])"},{"line_number":1049,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1050,"context_line":"        # belonging to the aggregates in isolated_aggregates field."},{"line_number":1051,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"},{"line_number":1052,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1053,"context_line":"        # which may not always be a UUID."},{"line_number":1054,"context_line":"        \u0027requester_id\u0027: fields.StringField(nullable\u003dTrue, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_a038c3d2","line":1051,"range":{"start_line":1051,"start_character":9,"end_line":1051,"end_character":28},"in_reply_to":"7faddb67_0028b783","updated":"2019-08-15 00:11:01.000000000","message":"I agree with gibi. At this point we\u0027re talking in placement-isms, not conf- or filter-isms.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6baa23fee37ddf7b0d98df338774e0299523d41d","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"        #     set([\u0027aggregate_UUID1\u0027, \u0027aggregate_UUID12\u0027, \u0027aggregate_UUID3\u0027])"},{"line_number":1049,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1050,"context_line":"        # belonging to the aggregates in isolated_aggregates field."},{"line_number":1051,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"},{"line_number":1052,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1053,"context_line":"        # which may not always be a UUID."},{"line_number":1054,"context_line":"        \u0027requester_id\u0027: fields.StringField(nullable\u003dTrue, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_b3a01ff5","line":1051,"range":{"start_line":1051,"start_character":9,"end_line":1051,"end_character":28},"in_reply_to":"7faddb67_a038c3d2","updated":"2019-08-15 01:27:13.000000000","message":"yes i can see gibis point here the generic name in the code is better but i think isolate is still better in the config.\n\nso in these two different contexts with two different audices i the object it may be better to stict with forbdien to allow future usage for other features. i am not sure i woud use forbiding here and isonlate in teh destionation object however. i would proably prefer to use forbien for both.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"e096b6e6e00c1ae699ca0c0f1933c09893410d83","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"        #     set([\u0027aggregate_UUID1\u0027, \u0027aggregate_UUID12\u0027, \u0027aggregate_UUID3\u0027])"},{"line_number":1049,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1050,"context_line":"        # belonging to the aggregates in isolated_aggregates field."},{"line_number":1051,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"},{"line_number":1052,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1053,"context_line":"        # which may not always be a UUID."},{"line_number":1054,"context_line":"        \u0027requester_id\u0027: fields.StringField(nullable\u003dTrue, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_3ec281ea","line":1051,"range":{"start_line":1051,"start_character":9,"end_line":1051,"end_character":28},"in_reply_to":"7faddb67_b3a01ff5","updated":"2019-08-19 16:15:48.000000000","message":"Done","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"5e204c1a2237240af4c4e1840e6d84ed9dcde004","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"        #     set([\u0027aggregate_UUID1\u0027, \u0027aggregate_UUID12\u0027, \u0027aggregate_UUID3\u0027])"},{"line_number":1049,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1050,"context_line":"        # belonging to the aggregates in isolated_aggregates field."},{"line_number":1051,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"},{"line_number":1052,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1053,"context_line":"        # which may not always be a UUID."},{"line_number":1054,"context_line":"        \u0027requester_id\u0027: fields.StringField(nullable\u003dTrue, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_0028b783","line":1051,"range":{"start_line":1051,"start_character":9,"end_line":1051,"end_character":28},"in_reply_to":"7faddb67_e7d02356","updated":"2019-08-15 00:09:24.000000000","message":"@All: Please vote for this change.","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"18d282a09ea3540d24bef2091b999dee68fc24b4","unresolved":false,"context_lines":[{"line_number":895,"context_line":"                                                default\u003dNone),"},{"line_number":896,"context_line":"        # NOTE(vrushali): These are isolated aggregates passed to placement as"},{"line_number":897,"context_line":"        # query params to the allocation candidates API."},{"line_number":898,"context_line":"        # See add_isolated_aggregates() below."},{"line_number":899,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":900,"context_line":"                                                        default\u003dset([])),"},{"line_number":901,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_fcf354e5","line":898,"range":{"start_line":898,"start_character":14,"end_line":898,"end_character":37},"updated":"2019-08-22 08:47:21.000000000","message":"There is no such function any more.","commit_id":"83deaebedc6e270c751363fec6693d70b1ca1890"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"40f054c2425a876f4af98608edd426137dc93780","unresolved":false,"context_lines":[{"line_number":895,"context_line":"                                                default\u003dNone),"},{"line_number":896,"context_line":"        # NOTE(vrushali): These are isolated aggregates passed to placement as"},{"line_number":897,"context_line":"        # query params to the allocation candidates API."},{"line_number":898,"context_line":"        # See add_isolated_aggregates() below."},{"line_number":899,"context_line":"        \u0027isolated_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":900,"context_line":"                                                        default\u003dset([])),"},{"line_number":901,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_b52e4a8a","line":898,"range":{"start_line":898,"start_character":14,"end_line":898,"end_character":37},"in_reply_to":"7faddb67_fcf354e5","updated":"2019-08-22 13:15:10.000000000","message":"correct, removed","commit_id":"83deaebedc6e270c751363fec6693d70b1ca1890"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8892b23c6682636856e41df8515c6807a61db505","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"#    Copyright 2015 Red Hat, Inc."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_349fa752","line":1,"updated":"2019-08-23 12:34:47.000000000","message":"Unrelated change?","commit_id":"e95cf58e7dfcb17d390080ae8dbe401ac707a124"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41a96c19082407f6ac9ca1116b49ce5d576f4870","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        # scheduler by default selects hosts from the cell specified in the"},{"line_number":899,"context_line":"        # cell field."},{"line_number":900,"context_line":"        \u0027allow_cross_cell_move\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":901,"context_line":"        # NOTE(vrushali): These are forbidden aggregates passed to placement as"},{"line_number":902,"context_line":"        # query params to the allocation candidates API."},{"line_number":903,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":904,"context_line":"                                                         default\u003dset([])),"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_66cb31a5","line":901,"updated":"2019-09-07 14:27:54.000000000","message":"nit: I would mention the isolated aggregates feature as the user of this field.","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d423a80e4a82204236efd9cc7022e5e1d98c7f8b","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        # scheduler by default selects hosts from the cell specified in the"},{"line_number":899,"context_line":"        # cell field."},{"line_number":900,"context_line":"        \u0027allow_cross_cell_move\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":901,"context_line":"        # NOTE(vrushali): These are forbidden aggregates passed to placement as"},{"line_number":902,"context_line":"        # query params to the allocation candidates API."},{"line_number":903,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":904,"context_line":"                                                         default\u003dset([])),"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_4bc5d08d","line":901,"in_reply_to":"5faad753_034d8671","updated":"2019-09-09 08:31:38.000000000","message":"No worries. As I stated it is OK to fix it in a separate commit.","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6b405c13e5c11bc2d2131848303b77b234b09e5f","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        # scheduler by default selects hosts from the cell specified in the"},{"line_number":899,"context_line":"        # cell field."},{"line_number":900,"context_line":"        \u0027allow_cross_cell_move\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":901,"context_line":"        # NOTE(vrushali): These are forbidden aggregates passed to placement as"},{"line_number":902,"context_line":"        # query params to the allocation candidates API."},{"line_number":903,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":904,"context_line":"                                                         default\u003dset([])),"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_8be668e8","line":901,"in_reply_to":"5faad753_4bc5d08d","updated":"2019-09-09 08:37:06.000000000","message":"I pushed a followup with a note https://review.opendev.org/#/c/680945","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"c6411ff7ac4ea6b5d23adad67a1de4b2906cec36","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        # scheduler by default selects hosts from the cell specified in the"},{"line_number":899,"context_line":"        # cell field."},{"line_number":900,"context_line":"        \u0027allow_cross_cell_move\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":901,"context_line":"        # NOTE(vrushali): These are forbidden aggregates passed to placement as"},{"line_number":902,"context_line":"        # query params to the allocation candidates API."},{"line_number":903,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":904,"context_line":"                                                         default\u003dset([])),"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_034d8671","line":901,"in_reply_to":"5faad753_66cb31a5","updated":"2019-09-08 17:53:51.000000000","message":"sorry, not addressing this for now.","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41a96c19082407f6ac9ca1116b49ce5d576f4870","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"        # The forbidden_aggregates field has a form of"},{"line_number":1040,"context_line":"        #     set([\u0027aggregate_UUID1\u0027, \u0027aggregate_UUID12\u0027, \u0027aggregate_UUID3\u0027])"},{"line_number":1041,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1042,"context_line":"        # belonging to the aggregates in forbidden_aggregates field."},{"line_number":1043,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"},{"line_number":1044,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1045,"context_line":"        # which may not always be a UUID."}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_46c2b587","line":1042,"range":{"start_line":1042,"start_character":20,"end_line":1042,"end_character":27},"updated":"2019-09-07 14:27:54.000000000","message":"nit: to any of the","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"c6411ff7ac4ea6b5d23adad67a1de4b2906cec36","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"        # The forbidden_aggregates field has a form of"},{"line_number":1040,"context_line":"        #     set([\u0027aggregate_UUID1\u0027, \u0027aggregate_UUID12\u0027, \u0027aggregate_UUID3\u0027])"},{"line_number":1041,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1042,"context_line":"        # belonging to the aggregates in forbidden_aggregates field."},{"line_number":1043,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(default\u003dset()),"},{"line_number":1044,"context_line":"        # The entity the request is coming from (e.g. the Neutron port uuid)"},{"line_number":1045,"context_line":"        # which may not always be a UUID."}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_63323af4","line":1042,"range":{"start_line":1042,"start_character":20,"end_line":1042,"end_character":27},"in_reply_to":"5faad753_46c2b587","updated":"2019-09-08 17:53:51.000000000","message":"Done","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c3d3c19dea9cd319f22cd67333b04ebc203aebb4","unresolved":false,"context_lines":[{"line_number":900,"context_line":"        \u0027allow_cross_cell_move\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":901,"context_line":"        # NOTE(vrushali): These are forbidden aggregates passed to placement as"},{"line_number":902,"context_line":"        # query params to the allocation candidates API."},{"line_number":903,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":904,"context_line":"                                                         default\u003dset([])),"},{"line_number":905,"context_line":"    }"},{"line_number":906,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_804abe52","line":903,"range":{"start_line":903,"start_character":57,"end_line":903,"end_character":70},"updated":"2019-09-09 14:46:53.000000000","message":"Sorry, I didn\u0027t catch this before, but either this should be nullable\u003dFalse or the default should be None. Above, the aggregates field uses nullable\u003dTrue,default\u003dNone, and aggregates\u003dNone means none were requested. You\u0027ve got a default\u003dset() here which tells me that you expect this to always be a set, either empty or not, which means that this never needs to be None and thus should be nullable\u003dFalse.\n\nHowever, I think that probably what you want is to *not* use a mutable default, which could have things leaked into it and cause side effects at runtime and instead use nullable\u003dTrue,default\u003dNone like above.","commit_id":"1cea1a20dfab848f63ad1957301eb27cc66635eb"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"7b1652974336b80c012a7bdf60b53d2a66731180","unresolved":false,"context_lines":[{"line_number":900,"context_line":"        \u0027allow_cross_cell_move\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":901,"context_line":"        # NOTE(vrushali): These are forbidden aggregates passed to placement as"},{"line_number":902,"context_line":"        # query params to the allocation candidates API."},{"line_number":903,"context_line":"        \u0027forbidden_aggregates\u0027: fields.SetOfStringsField(nullable\u003dTrue,"},{"line_number":904,"context_line":"                                                         default\u003dset([])),"},{"line_number":905,"context_line":"    }"},{"line_number":906,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5faad753_162b73eb","line":903,"range":{"start_line":903,"start_character":57,"end_line":903,"end_character":70},"in_reply_to":"5faad753_804abe52","updated":"2019-09-09 20:22:13.000000000","message":"Done, added append_forbidden_aggregates() similarly as we have for aggregates above which has require_aggregates() at @925","commit_id":"1cea1a20dfab848f63ad1957301eb27cc66635eb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"22c563e7c924378b02722744067affc4a24fdeb1","unresolved":false,"context_lines":[{"line_number":944,"context_line":"            self.aggregates \u003d []"},{"line_number":945,"context_line":"        self.aggregates.append(\u0027,\u0027.join(aggregates))"},{"line_number":946,"context_line":""},{"line_number":947,"context_line":"    def append_forbidden_aggregates(self, forbidden_aggregates):"},{"line_number":948,"context_line":"        \"\"\"Add a set of aggregates to the forbidden aggregates."},{"line_number":949,"context_line":""},{"line_number":950,"context_line":"        This will take a set of forbidden aggregates that should be"}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_3668eff3","line":947,"range":{"start_line":947,"start_character":8,"end_line":947,"end_character":14},"updated":"2019-09-09 20:28:36.000000000","message":"nit, I would have called this `add` instead of `append` since you\u0027re doing set operations.","commit_id":"3c8af001d540efa271102987c79889ed0b849820"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"22c563e7c924378b02722744067affc4a24fdeb1","unresolved":false,"context_lines":[{"line_number":955,"context_line":""},{"line_number":956,"context_line":"        \"\"\""},{"line_number":957,"context_line":"        if self.forbidden_aggregates is None:"},{"line_number":958,"context_line":"            self.forbidden_aggregates \u003d set([])"},{"line_number":959,"context_line":"        self.forbidden_aggregates |\u003d forbidden_aggregates"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_76a8a71e","line":958,"range":{"start_line":958,"start_character":44,"end_line":958,"end_character":46},"updated":"2019-09-09 20:28:36.000000000","message":"nit, unnecessary.","commit_id":"3c8af001d540efa271102987c79889ed0b849820"}],"nova/scheduler/utils.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4cb662c6fc7c80d3038021831b545d6b74124949","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":310,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":311,"context_line":"                isolated_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join(isolated_aggregates)"},{"line_number":312,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, isolated_aggs))"},{"line_number":313,"context_line":"            return qs_params"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        if self._limit is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_de7cde73","line":312,"updated":"2019-08-13 18:59:22.000000000","message":"Am I missing where the test for this is?","commit_id":"5090a2af3795ee48b3255b8548a08cf812ce20ed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"60291e1a0c3bede8c242685fe82bdab4cfcabe84","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                                  for ored in destination.aggregates]"},{"line_number":466,"context_line":"            if destination.isolated_aggregates:"},{"line_number":467,"context_line":"                grp \u003d res_req.get_request_group(None)"},{"line_number":468,"context_line":"                grp.forbidden_aggregates |\u003d destination.isolated_aggregates"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    if \u0027force_hosts\u0027 in spec_obj and spec_obj.force_hosts:"},{"line_number":471,"context_line":"        # Prioritize the value from requested_destination just in case"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_17d662f3","line":468,"updated":"2019-09-05 15:12:47.000000000","message":"Why are you calling these isolated in one place and forbidden in another?","commit_id":"6e308a84239a8beb0f3e24a03104d84992f2a95f"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"a3a3ad258c15836ce3ef06e5051f574ac55b66f3","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                                  for ored in destination.aggregates]"},{"line_number":466,"context_line":"            if destination.isolated_aggregates:"},{"line_number":467,"context_line":"                grp \u003d res_req.get_request_group(None)"},{"line_number":468,"context_line":"                grp.forbidden_aggregates |\u003d destination.isolated_aggregates"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    if \u0027force_hosts\u0027 in spec_obj and spec_obj.force_hosts:"},{"line_number":471,"context_line":"        # Prioritize the value from requested_destination just in case"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_e9b3aa4c","line":468,"in_reply_to":"7faddb67_17d662f3","updated":"2019-09-05 15:30:40.000000000","message":"Thank you for review.\nAs per [1] comments/discussion changes are done here.\nFrom placement point of view, these are forbidden_aggregates.\n\n[1]: https://review.opendev.org/#/c/671072/6/nova/objects/request_spec.py@1051","commit_id":"6e308a84239a8beb0f3e24a03104d84992f2a95f"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"7e5c2cc854c26d6341a1e00a64b1e5a24847fb41","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                                  for ored in destination.aggregates]"},{"line_number":466,"context_line":"            if destination.isolated_aggregates:"},{"line_number":467,"context_line":"                grp \u003d res_req.get_request_group(None)"},{"line_number":468,"context_line":"                grp.forbidden_aggregates |\u003d destination.isolated_aggregates"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    if \u0027force_hosts\u0027 in spec_obj and spec_obj.force_hosts:"},{"line_number":471,"context_line":"        # Prioritize the value from requested_destination just in case"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_c9658e1e","line":468,"in_reply_to":"7faddb67_c92d8efd","updated":"2019-09-05 16:00:35.000000000","message":"Understood \nWill modify Destination.isolated_aggregates to Destination.forbidden_aggregates","commit_id":"6e308a84239a8beb0f3e24a03104d84992f2a95f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fc6617ad820d3458e33f09d74b7683353c304c3c","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                                  for ored in destination.aggregates]"},{"line_number":466,"context_line":"            if destination.isolated_aggregates:"},{"line_number":467,"context_line":"                grp \u003d res_req.get_request_group(None)"},{"line_number":468,"context_line":"                grp.forbidden_aggregates |\u003d destination.isolated_aggregates"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    if \u0027force_hosts\u0027 in spec_obj and spec_obj.force_hosts:"},{"line_number":471,"context_line":"        # Prioritize the value from requested_destination just in case"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_2e122059","line":468,"in_reply_to":"7faddb67_c9658e1e","updated":"2019-09-05 20:16:11.000000000","message":"Done","commit_id":"6e308a84239a8beb0f3e24a03104d84992f2a95f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"206d96a868f16fc673d1919cf3a62870f5b96cc5","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                                  for ored in destination.aggregates]"},{"line_number":466,"context_line":"            if destination.isolated_aggregates:"},{"line_number":467,"context_line":"                grp \u003d res_req.get_request_group(None)"},{"line_number":468,"context_line":"                grp.forbidden_aggregates |\u003d destination.isolated_aggregates"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    if \u0027force_hosts\u0027 in spec_obj and spec_obj.force_hosts:"},{"line_number":471,"context_line":"        # Prioritize the value from requested_destination just in case"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_c92d8efd","line":468,"in_reply_to":"7faddb67_e9b3aa4c","updated":"2019-09-05 15:47:58.000000000","message":"Yeah, I realize that. See my comments on the later patch in this series. Here\u0027s why I think this is important:\n\nThis request spec object will be persisted in the nova database for a potentially long time. What you\u0027re doing here, is calculating a list of aggregates which are *currently* (i.e. at the time of the request) configured to be isolated for a given trait. This code will do that calculation and store in the database that \"aggregates $foo and $bar are isolated.\" However, that\u0027s true now, but might not be true an hour later when the operator changes the deployment configuration or topology.\n\nWhile still potentially problematic, storing these aggregates as \"forbidden\" describes more clearly what will happen if we look at and/or honor this list of aggregate ids.\n\nIMHO, the feature that nova is providing is isolated aggregates, and you\u0027ve identified that properly. However, aggregates are \"isolated\" only at some point in time based on a particular config, and thus aren\u0027t timeless. The timeless nature of what you\u0027re storing here may or may not be good (presumably later there will be a bug where someone complains that a move operation a year later improperly forbids aggregates that were isolated at the time the instance was booted, but no longer are). Regardless, I think properly naming the field we\u0027re going to store in the database in perpetuity is important.","commit_id":"6e308a84239a8beb0f3e24a03104d84992f2a95f"}],"nova/tests/unit/objects/test_request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9ed6dc73ff2d882fb4f85c8cbf72aa2263bf260","unresolved":false,"context_lines":[{"line_number":919,"context_line":"    def test_destination_set_forbidden_aggregates(self):"},{"line_number":920,"context_line":"        destination \u003d objects.Destination()"},{"line_number":921,"context_line":"        destination.set_forbidden_aggregates([\u0027foo\u0027, \u0027bar\u0027])"},{"line_number":922,"context_line":"        destination.set_forbidden_aggregates([\u0027baz\u0027])"},{"line_number":923,"context_line":"        self.assertEqual([\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027],"},{"line_number":924,"context_line":"                         destination.forbidden_aggregates)"},{"line_number":925,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5aebe976","line":922,"range":{"start_line":922,"start_character":45,"end_line":922,"end_character":52},"updated":"2019-07-31 18:29:30.000000000","message":"What if this is [\u0027bar\u0027, \u0027baz\u0027]? Is it OK to end up with:\n\n[\u0027foo\u0027, \u0027bar\u0027, \u0027bar\u0027, \u0027baz\u0027]?","commit_id":"3a8321123249ffe939cfff1efaebc37b463f7521"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"000722812e08a3173853840b211fbe68045b98cb","unresolved":false,"context_lines":[{"line_number":912,"context_line":"        req_obj.create()"},{"line_number":913,"context_line":"        req_obj.save()"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"    def test_destination_isolated_aggregates_default(self):"},{"line_number":916,"context_line":"        destination \u003d objects.Destination()"},{"line_number":917,"context_line":"        self.assertIsNone(destination.isolated_aggregates)"},{"line_number":918,"context_line":""},{"line_number":919,"context_line":"    def test_destination_set_isolated_aggregates(self):"},{"line_number":920,"context_line":"        destination \u003d objects.Destination()"},{"line_number":921,"context_line":"        destination.set_isolated_aggregates(set([\u0027foo\u0027, \u0027bar\u0027]))"},{"line_number":922,"context_line":"        destination.set_isolated_aggregates(set([\u0027bar\u0027, \u0027baz\u0027]))"},{"line_number":923,"context_line":"        self.assertEqual(set([\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]),"},{"line_number":924,"context_line":"                         destination.isolated_aggregates)"},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"    def test_destination_delete_isolated_aggregates(self):"},{"line_number":927,"context_line":"        destination \u003d objects.Destination(isolated_aggregates\u003dset([\u0027foo\u0027]))"},{"line_number":928,"context_line":"        primitive \u003d destination.obj_to_primitive(target_version\u003d\u00271.0\u0027)"},{"line_number":929,"context_line":"        self.assertNotIn(\u0027isolated_aggregates\u0027, primitive[\u0027nova_object.data\u0027])"},{"line_number":930,"context_line":""},{"line_number":931,"context_line":""},{"line_number":932,"context_line":"class TestRequestSpecObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_6501d939","line":929,"range":{"start_line":915,"start_character":0,"end_line":929,"end_character":78},"updated":"2019-08-09 04:20:00.000000000","message":"nit: These methods should be in class TestDestinationObject (line 1059).","commit_id":"b00f23219ae80627a16149ce62ba92d55863983f"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"956a27fb306139acc478cdec2350d008925cb823","unresolved":false,"context_lines":[{"line_number":912,"context_line":"        req_obj.create()"},{"line_number":913,"context_line":"        req_obj.save()"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"    def test_destination_isolated_aggregates_default(self):"},{"line_number":916,"context_line":"        destination \u003d objects.Destination()"},{"line_number":917,"context_line":"        self.assertIsNone(destination.isolated_aggregates)"},{"line_number":918,"context_line":""},{"line_number":919,"context_line":"    def test_destination_set_isolated_aggregates(self):"},{"line_number":920,"context_line":"        destination \u003d objects.Destination()"},{"line_number":921,"context_line":"        destination.set_isolated_aggregates(set([\u0027foo\u0027, \u0027bar\u0027]))"},{"line_number":922,"context_line":"        destination.set_isolated_aggregates(set([\u0027bar\u0027, \u0027baz\u0027]))"},{"line_number":923,"context_line":"        self.assertEqual(set([\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]),"},{"line_number":924,"context_line":"                         destination.isolated_aggregates)"},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"    def test_destination_delete_isolated_aggregates(self):"},{"line_number":927,"context_line":"        destination \u003d objects.Destination(isolated_aggregates\u003dset([\u0027foo\u0027]))"},{"line_number":928,"context_line":"        primitive \u003d destination.obj_to_primitive(target_version\u003d\u00271.0\u0027)"},{"line_number":929,"context_line":"        self.assertNotIn(\u0027isolated_aggregates\u0027, primitive[\u0027nova_object.data\u0027])"},{"line_number":930,"context_line":""},{"line_number":931,"context_line":""},{"line_number":932,"context_line":"class TestRequestSpecObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_f443283e","line":929,"range":{"start_line":915,"start_character":0,"end_line":929,"end_character":78},"in_reply_to":"7faddb67_6501d939","updated":"2019-08-10 09:23:03.000000000","message":"IMO not required since class TestDestinationObject inherits from class NoDBTestCase","commit_id":"b00f23219ae80627a16149ce62ba92d55863983f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"000722812e08a3173853840b211fbe68045b98cb","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":""},{"line_number":1059,"context_line":"class TestDestinationObject(test.TestCase):"},{"line_number":1060,"context_line":"    def setUp(self):"},{"line_number":1061,"context_line":"        super(TestDestinationObject, self).setUp()"},{"line_number":1062,"context_line":"        self.user_id \u003d uuids.user_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_c5a1ad48","line":1059,"range":{"start_line":1059,"start_character":33,"end_line":1059,"end_character":41},"updated":"2019-08-09 04:20:00.000000000","message":"nit: It should be \u0027NoDBTestCase\u0027:","commit_id":"b00f23219ae80627a16149ce62ba92d55863983f"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"956a27fb306139acc478cdec2350d008925cb823","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":""},{"line_number":1059,"context_line":"class TestDestinationObject(test.TestCase):"},{"line_number":1060,"context_line":"    def setUp(self):"},{"line_number":1061,"context_line":"        super(TestDestinationObject, self).setUp()"},{"line_number":1062,"context_line":"        self.user_id \u003d uuids.user_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_143fe4b5","line":1059,"range":{"start_line":1059,"start_character":33,"end_line":1059,"end_character":41},"in_reply_to":"7faddb67_c5a1ad48","updated":"2019-08-10 09:23:03.000000000","message":"Done","commit_id":"b00f23219ae80627a16149ce62ba92d55863983f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"258aaf8220b35c8249f46cc035adfd7d191cba5b","unresolved":false,"context_lines":[{"line_number":950,"context_line":"    pass"},{"line_number":951,"context_line":""},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"class TestRequestGroupObject(test.TestCase):"},{"line_number":954,"context_line":"    def setUp(self):"},{"line_number":955,"context_line":"        super(TestRequestGroupObject, self).setUp()"},{"line_number":956,"context_line":"        self.user_id \u003d uuids.user_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_c0838dca","line":953,"range":{"start_line":953,"start_character":34,"end_line":953,"end_character":42},"updated":"2019-08-29 15:52:08.000000000","message":"Did this need to change?\n\nLater: it appears not. I reverted this and it continued to work","commit_id":"a75838ce8de0696339d8d13cd2c3f6401b446d12"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"91b1fbce5540943867f24a6a6f3a2f0457498900","unresolved":false,"context_lines":[{"line_number":950,"context_line":"    pass"},{"line_number":951,"context_line":""},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"class TestRequestGroupObject(test.TestCase):"},{"line_number":954,"context_line":"    def setUp(self):"},{"line_number":955,"context_line":"        super(TestRequestGroupObject, self).setUp()"},{"line_number":956,"context_line":"        self.user_id \u003d uuids.user_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_13501332","line":953,"range":{"start_line":953,"start_character":34,"end_line":953,"end_character":42},"in_reply_to":"7faddb67_c0838dca","updated":"2019-08-30 10:59:45.000000000","message":"yes Not needed, removed.","commit_id":"a75838ce8de0696339d8d13cd2c3f6401b446d12"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"258aaf8220b35c8249f46cc035adfd7d191cba5b","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"        self.assertIn(\u0027required_traits\u0027, primitive)"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def test_obj_make_compatible_request_group_with_forbidden_aggregates(self):"},{"line_number":1054,"context_line":"        values \u003d {"},{"line_number":1055,"context_line":"            \u0027use_same_provider\u0027: True,"},{"line_number":1056,"context_line":"            \u0027resources\u0027: {\u0027DISK_GB\u0027: 1, \u0027MEMORY_MB\u0027: 512, \u0027VCPU\u0027: 1},"},{"line_number":1057,"context_line":"            \u0027required_traits\u0027: set([\u0027trait1\u0027, \u0027trait2\u0027]),"},{"line_number":1058,"context_line":"            \u0027forbidden_traits\u0027: set([\u0027trait3\u0027, \u0027trait4\u0027]),"},{"line_number":1059,"context_line":"            \u0027aggregates\u0027: [[\u0027agg1\u0027], [\u0027agg2\u0027]],"},{"line_number":1060,"context_line":"            \u0027forbidden_aggregates\u0027: set([\u0027agg3\u0027, \u0027agg4\u0027])}"},{"line_number":1061,"context_line":"        obj \u003d objects.RequestGroup(self.context, **values)"},{"line_number":1062,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":1063,"context_line":"        obj_primitive \u003d data(obj.obj_to_primitive(target_version\u003d\u00271.3\u0027))"},{"line_number":1064,"context_line":"        self.assertIn(\u0027forbidden_aggregates\u0027, obj_primitive)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_00bf6560","line":1061,"range":{"start_line":1054,"start_character":0,"end_line":1061,"end_character":58},"updated":"2019-08-29 15:52:08.000000000","message":"Can you just combine these to set the properties directly?","commit_id":"a75838ce8de0696339d8d13cd2c3f6401b446d12"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"91b1fbce5540943867f24a6a6f3a2f0457498900","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"        self.assertIn(\u0027required_traits\u0027, primitive)"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def test_obj_make_compatible_request_group_with_forbidden_aggregates(self):"},{"line_number":1054,"context_line":"        values \u003d {"},{"line_number":1055,"context_line":"            \u0027use_same_provider\u0027: True,"},{"line_number":1056,"context_line":"            \u0027resources\u0027: {\u0027DISK_GB\u0027: 1, \u0027MEMORY_MB\u0027: 512, \u0027VCPU\u0027: 1},"},{"line_number":1057,"context_line":"            \u0027required_traits\u0027: set([\u0027trait1\u0027, \u0027trait2\u0027]),"},{"line_number":1058,"context_line":"            \u0027forbidden_traits\u0027: set([\u0027trait3\u0027, \u0027trait4\u0027]),"},{"line_number":1059,"context_line":"            \u0027aggregates\u0027: [[\u0027agg1\u0027], [\u0027agg2\u0027]],"},{"line_number":1060,"context_line":"            \u0027forbidden_aggregates\u0027: set([\u0027agg3\u0027, \u0027agg4\u0027])}"},{"line_number":1061,"context_line":"        obj \u003d objects.RequestGroup(self.context, **values)"},{"line_number":1062,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":1063,"context_line":"        obj_primitive \u003d data(obj.obj_to_primitive(target_version\u003d\u00271.3\u0027))"},{"line_number":1064,"context_line":"        self.assertIn(\u0027forbidden_aggregates\u0027, obj_primitive)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_b3401f61","line":1061,"range":{"start_line":1054,"start_character":0,"end_line":1061,"end_character":58},"in_reply_to":"7faddb67_00bf6560","updated":"2019-08-30 10:59:45.000000000","message":"Done","commit_id":"a75838ce8de0696339d8d13cd2c3f6401b446d12"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"60291e1a0c3bede8c242685fe82bdab4cfcabe84","unresolved":false,"context_lines":[{"line_number":921,"context_line":"        req_obj.create()"},{"line_number":922,"context_line":"        req_obj.save()"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    def test_destination_isolated_aggregates_default(self):"},{"line_number":925,"context_line":"        destination \u003d objects.Destination()"},{"line_number":926,"context_line":"        self.assertEqual(set([]), destination.isolated_aggregates)"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"    def test_destination_append_isolated_aggregates(self):"},{"line_number":929,"context_line":"        destination \u003d objects.Destination("},{"line_number":930,"context_line":"            isolated_aggregates\u003dset([\u0027foo\u0027, \u0027bar\u0027]))"},{"line_number":931,"context_line":"        self.assertEqual(set([\u0027foo\u0027, \u0027bar\u0027]),"},{"line_number":932,"context_line":"                         destination.isolated_aggregates)"},{"line_number":933,"context_line":"        destination.isolated_aggregates |\u003d set([\u0027bar\u0027, \u0027baz\u0027])"},{"line_number":934,"context_line":"        self.assertEqual(set([\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]),"},{"line_number":935,"context_line":"                         destination.isolated_aggregates)"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"    def test_destination_delete_isolated_aggregates(self):"},{"line_number":938,"context_line":"        destination \u003d objects.Destination(isolated_aggregates\u003dset([\u0027foo\u0027]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_f7086691","line":935,"range":{"start_line":924,"start_character":0,"end_line":935,"end_character":57},"updated":"2019-09-05 15:12:47.000000000","message":"These are not meaningful tests, IMHO, so I would just drop them","commit_id":"6e308a84239a8beb0f3e24a03104d84992f2a95f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41a96c19082407f6ac9ca1116b49ce5d576f4870","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        self.assertIn(\u0027forbidden_aggregates\u0027, obj_primitive)"},{"line_number":1065,"context_line":"        self.assertItemsEqual(obj_primitive[\u0027forbidden_aggregates\u0027],"},{"line_number":1066,"context_line":"                              set([\u0027agg3\u0027, \u0027agg4\u0027]))"},{"line_number":1067,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"class TestDestinationObject(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_018ee777","line":1067,"updated":"2019-09-07 14:27:54.000000000","message":"nit: this test seems to be the subset of test_compat_requester_and_provider as both asserts that version 1.3 has the new field forbidden_aggregates","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"c6411ff7ac4ea6b5d23adad67a1de4b2906cec36","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        self.assertIn(\u0027forbidden_aggregates\u0027, obj_primitive)"},{"line_number":1065,"context_line":"        self.assertItemsEqual(obj_primitive[\u0027forbidden_aggregates\u0027],"},{"line_number":1066,"context_line":"                              set([\u0027agg3\u0027, \u0027agg4\u0027]))"},{"line_number":1067,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"class TestDestinationObject(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_23520215","line":1067,"in_reply_to":"5faad753_018ee777","updated":"2019-09-08 17:53:51.000000000","message":"Done, merged with test_compat_requester_and_provider","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41a96c19082407f6ac9ca1116b49ce5d576f4870","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"            \u0027aggregates\u0027: [\u0027agg1\u0027, \u0027agg2\u0027]}"},{"line_number":1082,"context_line":"        obj \u003d objects.Destination(self.context, **values)"},{"line_number":1083,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":1084,"context_line":"        obj_primitive \u003d data(obj.obj_to_primitive(target_version\u003d\u00271.2\u0027))"},{"line_number":1085,"context_line":"        self.assertNotIn(\u0027forbidden_aggregates\u0027, obj_primitive)"},{"line_number":1086,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1087,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_a1e83316","line":1084,"range":{"start_line":1084,"start_character":66,"end_line":1084,"end_character":69},"updated":"2019-09-07 14:27:54.000000000","message":"Why not 1.3?","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"c6411ff7ac4ea6b5d23adad67a1de4b2906cec36","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"            \u0027aggregates\u0027: [\u0027agg1\u0027, \u0027agg2\u0027]}"},{"line_number":1082,"context_line":"        obj \u003d objects.Destination(self.context, **values)"},{"line_number":1083,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":1084,"context_line":"        obj_primitive \u003d data(obj.obj_to_primitive(target_version\u003d\u00271.2\u0027))"},{"line_number":1085,"context_line":"        self.assertNotIn(\u0027forbidden_aggregates\u0027, obj_primitive)"},{"line_number":1086,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1087,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_e35b8a2b","line":1084,"range":{"start_line":1084,"start_character":66,"end_line":1084,"end_character":69},"in_reply_to":"5faad753_a1e83316","updated":"2019-09-08 17:53:51.000000000","message":"Done","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41a96c19082407f6ac9ca1116b49ce5d576f4870","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"        obj \u003d objects.Destination(self.context, **values)"},{"line_number":1083,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":1084,"context_line":"        obj_primitive \u003d data(obj.obj_to_primitive(target_version\u003d\u00271.2\u0027))"},{"line_number":1085,"context_line":"        self.assertNotIn(\u0027forbidden_aggregates\u0027, obj_primitive)"},{"line_number":1086,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"    def test_obj_make_compatible_destination_with_forbidden_aggregates(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_81f737f6","line":1085,"updated":"2019-09-07 14:27:54.000000000","message":"I suggest to initialize the forbidden_aggregates field of the Destination object before calling obj_to_primitive on it to make this test more explicit about what it tests.","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"c6411ff7ac4ea6b5d23adad67a1de4b2906cec36","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"        obj \u003d objects.Destination(self.context, **values)"},{"line_number":1083,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":1084,"context_line":"        obj_primitive \u003d data(obj.obj_to_primitive(target_version\u003d\u00271.2\u0027))"},{"line_number":1085,"context_line":"        self.assertNotIn(\u0027forbidden_aggregates\u0027, obj_primitive)"},{"line_number":1086,"context_line":"        self.assertIn(\u0027aggregates\u0027, obj_primitive)"},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"    def test_obj_make_compatible_destination_with_forbidden_aggregates(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_83409637","line":1085,"in_reply_to":"5faad753_81f737f6","updated":"2019-09-08 17:53:51.000000000","message":"Done","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"}],"nova/tests/unit/scheduler/client/test_report.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41a96c19082407f6ac9ca1116b49ce5d576f4870","unresolved":false,"context_lines":[{"line_number":2091,"context_line":"        expected_query \u003d ["},{"line_number":2092,"context_line":"            (\u0027group_policy\u0027, \u0027isolate\u0027),"},{"line_number":2093,"context_line":"            (\u0027limit\u0027, \u00271000\u0027),"},{"line_number":2094,"context_line":"            (\u0027member_of\u0027, \u0027!in:\u0027 + \u0027,\u0027.join(sorted(forbidden_aggs))),"},{"line_number":2095,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2\u0027),"},{"line_number":2096,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2,agg3\u0027),"},{"line_number":2097,"context_line":"            (\u0027required\u0027, \u0027CUSTOM_TRAIT1,HW_CPU_X86_AVX,!CUSTOM_TRAIT3,\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_01e34735","line":2094,"range":{"start_line":2094,"start_character":27,"end_line":2094,"end_character":66},"updated":"2019-09-07 14:27:54.000000000","message":"nit: you could follow the pattern in this test case and write out \u0027!in:agg1,agg5,agg6\u0027 explicitly.","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"c6411ff7ac4ea6b5d23adad67a1de4b2906cec36","unresolved":false,"context_lines":[{"line_number":2091,"context_line":"        expected_query \u003d ["},{"line_number":2092,"context_line":"            (\u0027group_policy\u0027, \u0027isolate\u0027),"},{"line_number":2093,"context_line":"            (\u0027limit\u0027, \u00271000\u0027),"},{"line_number":2094,"context_line":"            (\u0027member_of\u0027, \u0027!in:\u0027 + \u0027,\u0027.join(sorted(forbidden_aggs))),"},{"line_number":2095,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2\u0027),"},{"line_number":2096,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2,agg3\u0027),"},{"line_number":2097,"context_line":"            (\u0027required\u0027, \u0027CUSTOM_TRAIT1,HW_CPU_X86_AVX,!CUSTOM_TRAIT3,\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_a33d92bc","line":2094,"range":{"start_line":2094,"start_character":27,"end_line":2094,"end_character":66},"in_reply_to":"5faad753_01e34735","updated":"2019-09-08 17:53:51.000000000","message":"Done","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"}],"nova/tests/unit/scheduler/test_utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"41a96c19082407f6ac9ca1116b49ce5d576f4870","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        self.assertEqual(set([]), req.get_request_group(None)."},{"line_number":448,"context_line":"                         forbidden_aggregates)"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        reqspec.requested_destination.aggregates \u003d None"},{"line_number":451,"context_line":"        req \u003d utils.resources_from_request_spec("},{"line_number":452,"context_line":"                self.context, reqspec, self.mock_host_manager)"},{"line_number":453,"context_line":"        self.assertEqual(set([]), req.get_request_group(None)."},{"line_number":454,"context_line":"                         forbidden_aggregates)"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def test_process_extra_specs_granular_called(self):"},{"line_number":457,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d1,"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_c13bef99","line":454,"range":{"start_line":450,"start_character":1,"end_line":454,"end_character":46},"updated":"2019-09-07 14:27:54.000000000","message":"nit: I don\u0027t see how this is different from the previous assert. In both cases the forbidden_aggregates are defaulted to set() and then asserted to be set()","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"c6411ff7ac4ea6b5d23adad67a1de4b2906cec36","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        self.assertEqual(set([]), req.get_request_group(None)."},{"line_number":448,"context_line":"                         forbidden_aggregates)"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        reqspec.requested_destination.aggregates \u003d None"},{"line_number":451,"context_line":"        req \u003d utils.resources_from_request_spec("},{"line_number":452,"context_line":"                self.context, reqspec, self.mock_host_manager)"},{"line_number":453,"context_line":"        self.assertEqual(set([]), req.get_request_group(None)."},{"line_number":454,"context_line":"                         forbidden_aggregates)"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def test_process_extra_specs_granular_called(self):"},{"line_number":457,"context_line":"        flavor \u003d objects.Flavor(vcpus\u003d1,"}],"source_content_type":"text/x-python","patch_set":15,"id":"5faad753_63479a4d","line":454,"range":{"start_line":450,"start_character":1,"end_line":454,"end_character":46},"in_reply_to":"5faad753_c13bef99","updated":"2019-09-08 17:53:51.000000000","message":"Done, corrected line number @450","commit_id":"5d441c5ea05aa30618779d5a5161eceec7620af1"}]}
