)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dc4d83f0356b93ccc63711a09a6f7ec912d1428","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add policy field to ServerGroup notification object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this patch, the ServerGroupPayload is updated to include"},{"line_number":10,"context_line":"the new ``policy`` field instead of the old ``policies``"},{"line_number":11,"context_line":"field."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Related to blueprint complex-anti-affinity-policies"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"5f7c97a3_bec21953","line":10,"range":{"start_line":10,"start_character":25,"end_line":10,"end_character":35},"updated":"2018-07-05 15:38:40.000000000","message":"It\u0027s not \u0027instead of\u0027, it\u0027s in addition to. Just mention that the \u0027policies\u0027 field is deprecated for removal but still put into the notification payload for backward compatibility.","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"426ed8ef9eb9ec0dc43e5bd998f11d125b438bd8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add policy field to ServerGroup notification object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this patch, the ServerGroupPayload is updated to include"},{"line_number":10,"context_line":"the new ``policy`` field instead of the old ``policies``"},{"line_number":11,"context_line":"field."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Related to blueprint complex-anti-affinity-policies"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"5f7c97a3_161f6309","line":10,"range":{"start_line":10,"start_character":25,"end_line":10,"end_character":35},"in_reply_to":"5f7c97a3_bec21953","updated":"2018-07-09 08:19:12.000000000","message":"Done","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9668e062ecb7d01b7730ddcf88da59bc0f852cb5","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add policy field to ServerGroup notification object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this patch, the ServerGroupPayload is updated to include"},{"line_number":10,"context_line":"the new ``policy`` field, the ``policies`` field is deprecated"},{"line_number":11,"context_line":"for removal but still put into the notification payload for"},{"line_number":12,"context_line":"backward compatibility."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5f7c97a3_f4ae5fe2","line":10,"range":{"start_line":10,"start_character":24,"end_line":10,"end_character":25},"updated":"2018-07-06 13:54:23.000000000","message":"nit: s/,/;/","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"426ed8ef9eb9ec0dc43e5bd998f11d125b438bd8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add policy field to ServerGroup notification object"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this patch, the ServerGroupPayload is updated to include"},{"line_number":10,"context_line":"the new ``policy`` field, the ``policies`` field is deprecated"},{"line_number":11,"context_line":"for removal but still put into the notification payload for"},{"line_number":12,"context_line":"backward compatibility."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5f7c97a3_fe7aa7ed","line":10,"range":{"start_line":10,"start_character":24,"end_line":10,"end_character":25},"in_reply_to":"5f7c97a3_f4ae5fe2","updated":"2018-07-09 08:19:12.000000000","message":"Done","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"}],"doc/notification_samples/common_payloads/ServerGroupPayload.json":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a49e01bba89f0b287835c79dcee94c8fc26ee01","unresolved":false,"context_lines":[{"line_number":7,"context_line":"        \"name\": \"test-server-group\","},{"line_number":8,"context_line":"        \"project_id\": \"6f70656e737461636b20342065766572\","},{"line_number":9,"context_line":"        \"user_id\": \"fake\","},{"line_number":10,"context_line":"        \"policy\": {\"$ref\": \"ServerGroupPolicyPayload.json#\"},"},{"line_number":11,"context_line":"        \"members\": [],"},{"line_number":12,"context_line":"        \"hosts\": null"},{"line_number":13,"context_line":"    }"}],"source_content_type":"application/json","patch_set":3,"id":"5f7c97a3_4e2dd3a6","line":10,"updated":"2018-05-18 09:12:45.000000000","message":"This change requires major version bump due to the removal of the policies field. \nAlternatively you can have the minor bump only iff policy is added but policies is not removed.","commit_id":"9e502f4289bd25b4472ce7bc2aaf059275272514"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a93a6d16a6876ad7b7ad988b260981142105335b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"        \"name\": \"test-server-group\","},{"line_number":8,"context_line":"        \"project_id\": \"6f70656e737461636b20342065766572\","},{"line_number":9,"context_line":"        \"user_id\": \"fake\","},{"line_number":10,"context_line":"        \"policy\": {\"$ref\": \"ServerGroupPolicyPayload.json#\"},"},{"line_number":11,"context_line":"        \"members\": [],"},{"line_number":12,"context_line":"        \"hosts\": null"},{"line_number":13,"context_line":"    }"}],"source_content_type":"application/json","patch_set":3,"id":"5f7c97a3_c72a212b","line":10,"in_reply_to":"5f7c97a3_0731f9a2","updated":"2018-06-05 17:29:31.000000000","message":"Also we discussed this issue with Matt over IRC http://eavesdrop.openstack.org/meetings/nova_notification/2018/nova_notification.2018-06-05-17.00.log.html","commit_id":"9e502f4289bd25b4472ce7bc2aaf059275272514"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3280d740c968036bcc2ea40fbac10f6efb667be2","unresolved":false,"context_lines":[{"line_number":7,"context_line":"        \"name\": \"test-server-group\","},{"line_number":8,"context_line":"        \"project_id\": \"6f70656e737461636b20342065766572\","},{"line_number":9,"context_line":"        \"user_id\": \"fake\","},{"line_number":10,"context_line":"        \"policy\": {\"$ref\": \"ServerGroupPolicyPayload.json#\"},"},{"line_number":11,"context_line":"        \"members\": [],"},{"line_number":12,"context_line":"        \"hosts\": null"},{"line_number":13,"context_line":"    }"}],"source_content_type":"application/json","patch_set":3,"id":"5f7c97a3_0731f9a2","line":10,"in_reply_to":"5f7c97a3_0d1bf380","updated":"2018-06-05 17:28:55.000000000","message":"We never did a major bump before so I\u0027m a bit afraid of it. Also we don\u0027t really know who is using these notifications so we don\u0027t know who will break with this change.\n\nIs there a way to have both the policy and polcies fields in the payload with correct values? Even for groups created with \u003e\u003d2.63 REST API version? \n\nIf yes then I would go with a minor bump, would keep both fields in the payload populated, and add a release notes that the policies field in the payload is deprecated and will be removed in a subsequent release (with a major bump at that time).","commit_id":"9e502f4289bd25b4472ce7bc2aaf059275272514"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"6058c07ec006f1ab3859795fb2d9dfc12f4b4238","unresolved":false,"context_lines":[{"line_number":7,"context_line":"        \"name\": \"test-server-group\","},{"line_number":8,"context_line":"        \"project_id\": \"6f70656e737461636b20342065766572\","},{"line_number":9,"context_line":"        \"user_id\": \"fake\","},{"line_number":10,"context_line":"        \"policy\": {\"$ref\": \"ServerGroupPolicyPayload.json#\"},"},{"line_number":11,"context_line":"        \"members\": [],"},{"line_number":12,"context_line":"        \"hosts\": null"},{"line_number":13,"context_line":"    }"}],"source_content_type":"application/json","patch_set":3,"id":"5f7c97a3_0d1bf380","line":10,"in_reply_to":"5f7c97a3_4e2dd3a6","updated":"2018-05-28 03:21:16.000000000","message":"OK, Thanks. \n\nI still prefer to remove policies with a major version bump, it clearly to user but it means compatibility breaking after change it.\n\nCould give me some suggestion about it? Or to say which way do you prefer?","commit_id":"9e502f4289bd25b4472ce7bc2aaf059275272514"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"a7c69f89fa4f583e6d6d8f95f9dbf23a86603078","unresolved":false,"context_lines":[{"line_number":7,"context_line":"        \"name\": \"test-server-group\","},{"line_number":8,"context_line":"        \"project_id\": \"6f70656e737461636b20342065766572\","},{"line_number":9,"context_line":"        \"user_id\": \"fake\","},{"line_number":10,"context_line":"        \"policy\": {\"$ref\": \"ServerGroupPolicyPayload.json#\"},"},{"line_number":11,"context_line":"        \"members\": [],"},{"line_number":12,"context_line":"        \"hosts\": null"},{"line_number":13,"context_line":"    }"}],"source_content_type":"application/json","patch_set":3,"id":"5f7c97a3_153c59df","line":10,"in_reply_to":"5f7c97a3_c72a212b","updated":"2018-06-11 06:25:37.000000000","message":"Thanks, gibi, and I updated the patch, now we have both the policy and policies in the payload.","commit_id":"9e502f4289bd25b4472ce7bc2aaf059275272514"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f1077fd1d92d971796f1b09bf69051370c67ec5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"5f7c97a3_21c0002b","line":18,"updated":"2018-07-09 08:07:46.000000000","message":"Thanks! It now looks as a clear addition.","commit_id":"8e3776945e908f7fb9617d179fae0e8b7b106c03"}],"doc/notification_samples/common_payloads/ServerGroupPolicyPayload.json":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"1d49ed1d6f7e7d30027e693098c768e5a7ab8ff5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"nova_object.name\": \"ServerGroupPolicyPayload\","},{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"anti-affinity\","},{"line_number":7,"context_line":"        \"rules\": null"},{"line_number":8,"context_line":"    }"},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":12,"id":"5f7c97a3_ce93c7ff","line":7,"range":{"start_line":7,"start_character":17,"end_line":7,"end_character":21},"updated":"2018-06-21 02:54:42.000000000","message":"IMO, it is not proper for example.\nIt should be a rule dict. \n\ne.g.: {\"max_server_per_host\": \"3\"}","commit_id":"db76a5dab2a3e73ca45ddf3d27e9abef520b4518"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"485aef75c46c54572a7cc82cec2f1760068c8262","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"nova_object.name\": \"ServerGroupPolicyPayload\","},{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"anti-affinity\","},{"line_number":7,"context_line":"        \"rules\": null"},{"line_number":8,"context_line":"    }"},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":12,"id":"5f7c97a3_a2087290","line":7,"range":{"start_line":7,"start_character":17,"end_line":7,"end_character":21},"in_reply_to":"5f7c97a3_0a7cf9b3","updated":"2018-06-27 01:29:58.000000000","message":"As my last comment, we have a testcase[1] to validate the notification json. First we need use the NEW api [1] to create policy with rules, and then verify the notification.\n\nThat is we need make new api work first(otherwise we will get a 400 from api if we pass rules to old api), so I put these change in API patch.\n\n[1] https://review.openstack.org/#/c/567534/15/nova/tests/functional/notification_sample_tests/test_server_group.py@37","commit_id":"db76a5dab2a3e73ca45ddf3d27e9abef520b4518"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"acd7a296b64799ee16ca801249afabfbf0c6a383","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"nova_object.name\": \"ServerGroupPolicyPayload\","},{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"anti-affinity\","},{"line_number":7,"context_line":"        \"rules\": null"},{"line_number":8,"context_line":"    }"},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":12,"id":"5f7c97a3_0a7cf9b3","line":7,"range":{"start_line":7,"start_character":17,"end_line":7,"end_character":21},"in_reply_to":"5f7c97a3_2e72764b","updated":"2018-06-26 02:26:34.000000000","message":"Why isn\u0027t it modified in this patch?","commit_id":"db76a5dab2a3e73ca45ddf3d27e9abef520b4518"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"6af0c7a6c81dae0d1c03ce3718d79429348d3165","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"nova_object.name\": \"ServerGroupPolicyPayload\","},{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"anti-affinity\","},{"line_number":7,"context_line":"        \"rules\": null"},{"line_number":8,"context_line":"    }"},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":12,"id":"5f7c97a3_fabf5dcd","line":7,"range":{"start_line":7,"start_character":17,"end_line":7,"end_character":21},"in_reply_to":"5f7c97a3_ce93c7ff","updated":"2018-06-21 06:58:31.000000000","message":"Sure, but we use it in [1], and we can only use the new format policy after API patch.\n\n[1] https://github.com/openstack/nova/blob/9882a60e69a5ab8da314a199a56defc05098b743/nova/tests/functional/notification_sample_tests/test_server_group.py#L40\n\nSo, I will change null to {\"max_server_per_host\": \"3\"} after api patch.","commit_id":"db76a5dab2a3e73ca45ddf3d27e9abef520b4518"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"247da1b07d2e1d9bca541de42f7521f0596ea91f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"nova_object.name\": \"ServerGroupPolicyPayload\","},{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"anti-affinity\","},{"line_number":7,"context_line":"        \"rules\": null"},{"line_number":8,"context_line":"    }"},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":12,"id":"5f7c97a3_2e72764b","line":7,"range":{"start_line":7,"start_character":17,"end_line":7,"end_character":21},"in_reply_to":"5f7c97a3_fabf5dcd","updated":"2018-06-21 08:00:18.000000000","message":"Done:\nhttps://review.openstack.org/#/c/567534/14/doc/notification_samples/common_payloads/ServerGroupPolicyPayload.json@7","commit_id":"db76a5dab2a3e73ca45ddf3d27e9abef520b4518"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b22b8156e0be7534bead8def181b73baa0a6fd1d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"nova_object.name\": \"ServerGroupPolicyPayload\","},{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"anti-affinity\","},{"line_number":7,"context_line":"        \"rules\": null"},{"line_number":8,"context_line":"    }"},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":20,"id":"5f7c97a3_f463bfa9","line":7,"range":{"start_line":7,"start_character":17,"end_line":7,"end_character":21},"updated":"2018-07-06 13:57:48.000000000","message":"The functional tests are failing because this is {} now:\n\nhttps://review.openstack.org/#/c/573628/17/nova/objects/instance_group.py@555","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"}],"nova/notifications/objects/server_group.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"394eef628954c8e4b5fb4d0a21e9b808488f4872","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":57,"context_line":"class InstanceGroupPolicyPayload(base.NotificationPayloadBase):"},{"line_number":58,"context_line":"    # Version 1.0: Initial version"},{"line_number":59,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":60,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_70d800ee","line":57,"range":{"start_line":57,"start_character":6,"end_line":57,"end_character":32},"updated":"2018-05-15 07:46:08.000000000","message":"IMO, it should be \u0027ServerGroupPolicyPayload\u0027 because of consistency with other classes related to server groups.","commit_id":"40048eda5b0036d76263c9c6a1d4d28453546eea"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"3135395d46c81f8069a4a78075e8717125a7dbd3","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":61,"context_line":"    fields \u003d {"},{"line_number":62,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":63,"context_line":"        \u0027rules\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":64,"context_line":"    }"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def __init__(self, policy):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_92039110","line":63,"range":{"start_line":63,"start_character":24,"end_line":63,"end_character":35},"updated":"2018-05-29 12:28:58.000000000","message":"Also need change.","commit_id":"357aeb0407990cfc3a126dc6bdbe736541dbc8ca"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"98cf588eb223aa33fe8f987ad80d7a30bb64a5b0","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":21,"context_line":"class ServerGroupPayload(base.NotificationPayloadBase):"},{"line_number":22,"context_line":"    SCHEMA \u003d {"},{"line_number":23,"context_line":"        \u0027uuid\u0027: (\u0027group\u0027, \u0027uuid\u0027),"},{"line_number":24,"context_line":"        \u0027name\u0027: (\u0027group\u0027, \u0027name\u0027),"},{"line_number":25,"context_line":"        \u0027user_id\u0027: (\u0027group\u0027, \u0027user_id\u0027),"},{"line_number":26,"context_line":"        \u0027project_id\u0027: (\u0027group\u0027, \u0027project_id\u0027),"},{"line_number":27,"context_line":"        \u0027members\u0027: (\u0027group\u0027, \u0027members\u0027),"},{"line_number":28,"context_line":"        \u0027hosts\u0027: (\u0027group\u0027, \u0027hosts\u0027),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":"    # Version 1.0: Initial version"},{"line_number":31,"context_line":"    # Version 2.0: Remove policies and add policy"},{"line_number":32,"context_line":"    VERSION \u003d \u00272.0\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_cf506ad8","line":29,"range":{"start_line":22,"start_character":4,"end_line":29,"end_character":5},"updated":"2018-05-30 09:31:47.000000000","message":"should there be a schema for policy here?","commit_id":"fe3bdb76f8adb20416e0cf46c85d15a5b65eff90"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"a7c69f89fa4f583e6d6d8f95f9dbf23a86603078","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":21,"context_line":"class ServerGroupPayload(base.NotificationPayloadBase):"},{"line_number":22,"context_line":"    SCHEMA \u003d {"},{"line_number":23,"context_line":"        \u0027uuid\u0027: (\u0027group\u0027, \u0027uuid\u0027),"},{"line_number":24,"context_line":"        \u0027name\u0027: (\u0027group\u0027, \u0027name\u0027),"},{"line_number":25,"context_line":"        \u0027user_id\u0027: (\u0027group\u0027, \u0027user_id\u0027),"},{"line_number":26,"context_line":"        \u0027project_id\u0027: (\u0027group\u0027, \u0027project_id\u0027),"},{"line_number":27,"context_line":"        \u0027members\u0027: (\u0027group\u0027, \u0027members\u0027),"},{"line_number":28,"context_line":"        \u0027hosts\u0027: (\u0027group\u0027, \u0027hosts\u0027),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":"    # Version 1.0: Initial version"},{"line_number":31,"context_line":"    # Version 2.0: Remove policies and add policy"},{"line_number":32,"context_line":"    VERSION \u003d \u00272.0\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_6a6ee400","line":29,"range":{"start_line":22,"start_character":4,"end_line":29,"end_character":5},"in_reply_to":"5f7c97a3_cf506ad8","updated":"2018-06-11 06:25:37.000000000","message":"I think no, we set policy manually, and skip the populate_schema.","commit_id":"fe3bdb76f8adb20416e0cf46c85d15a5b65eff90"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"1d49ed1d6f7e7d30027e693098c768e5a7ab8ff5","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027project_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        # TODO(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_8e562f5e","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":61},"updated":"2018-06-21 02:54:42.000000000","message":"Why isn\u0027t it removed? The payload version is bumped up.","commit_id":"db76a5dab2a3e73ca45ddf3d27e9abef520b4518"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"6af0c7a6c81dae0d1c03ce3718d79429348d3165","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027project_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        # TODO(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_d9d15331","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":61},"in_reply_to":"5f7c97a3_8e562f5e","updated":"2018-06-21 06:58:31.000000000","message":"The bumped version is not the major version.\n\nSee the discussion in PS3:\nhttps://review.openstack.org/#/c/563401/3/doc/notification_samples/common_payloads/ServerGroupPayload.json\n\nSo, I just keep policies and policy.","commit_id":"db76a5dab2a3e73ca45ddf3d27e9abef520b4518"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"eafcac7bf5032f058d400799bcaf5adb8e51920d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027hosts\u0027: (\u0027group\u0027, \u0027hosts\u0027),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":"    # Version 1.0: Initial version"},{"line_number":31,"context_line":"    # Version 1.1: Remove policies and add policy"},{"line_number":32,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_af753b35","line":31,"range":{"start_line":31,"start_character":19,"end_line":31,"end_character":26},"updated":"2018-07-03 08:49:48.000000000","message":"seems you did not remove poicies, just deprecated.","commit_id":"6ffe34b52fa10db18f2fcae648a1d0fb0a770878"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"25118296549742e9d39cd1bbc37fba7e1ec47776","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027hosts\u0027: (\u0027group\u0027, \u0027hosts\u0027),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":"    # Version 1.0: Initial version"},{"line_number":31,"context_line":"    # Version 1.1: Remove policies and add policy"},{"line_number":32,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_47dd556b","line":31,"range":{"start_line":31,"start_character":19,"end_line":31,"end_character":26},"in_reply_to":"5f7c97a3_af753b35","updated":"2018-07-04 09:05:19.000000000","message":"Done","commit_id":"6ffe34b52fa10db18f2fcae648a1d0fb0a770878"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"eafcac7bf5032f058d400799bcaf5adb8e51920d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        cgroup._context \u003d None"},{"line_number":53,"context_line":"        if group.policy:"},{"line_number":54,"context_line":"            self.policy \u003d ServerGroupPolicyPayload(policy\u003dgroup.policy)"},{"line_number":55,"context_line":"            self.policies \u003d [group.policy.policy]"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            self.policy \u003d None"},{"line_number":58,"context_line":"            self.policies \u003d []"},{"line_number":59,"context_line":"        self.populate_schema(group\u003dcgroup)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_927ae822","line":58,"range":{"start_line":55,"start_character":0,"end_line":58,"end_character":30},"updated":"2018-07-03 08:49:48.000000000","message":"Should we directly get rid of the policies field? I\u0027m not sure.","commit_id":"6ffe34b52fa10db18f2fcae648a1d0fb0a770878"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"25118296549742e9d39cd1bbc37fba7e1ec47776","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        cgroup._context \u003d None"},{"line_number":53,"context_line":"        if group.policy:"},{"line_number":54,"context_line":"            self.policy \u003d ServerGroupPolicyPayload(policy\u003dgroup.policy)"},{"line_number":55,"context_line":"            self.policies \u003d [group.policy.policy]"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            self.policy \u003d None"},{"line_number":58,"context_line":"            self.policies \u003d []"},{"line_number":59,"context_line":"        self.populate_schema(group\u003dcgroup)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_87d7ed4f","line":58,"range":{"start_line":55,"start_character":0,"end_line":58,"end_character":30},"in_reply_to":"5f7c97a3_927ae822","updated":"2018-07-04 09:05:19.000000000","message":"No, we still have a `policies` field in notification object.","commit_id":"6ffe34b52fa10db18f2fcae648a1d0fb0a770878"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"eafcac7bf5032f058d400799bcaf5adb8e51920d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027hosts\u0027: (\u0027group\u0027, \u0027hosts\u0027),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":"    # Version 1.0: Initial version"},{"line_number":31,"context_line":"    # Version 1.1: Remove policies and add policy"},{"line_number":32,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_72470ca5","line":31,"range":{"start_line":31,"start_character":19,"end_line":31,"end_character":25},"updated":"2018-07-03 08:49:48.000000000","message":"nit, seems you didn\u0027t remove the policies field.","commit_id":"4eb095996eec871b1fc3803799d0ee41ba3cc373"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2336cac54b537525df7392ac4eaa4a9b239a5dc4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027hosts\u0027: (\u0027group\u0027, \u0027hosts\u0027),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":"    # Version 1.0: Initial version"},{"line_number":31,"context_line":"    # Version 1.1: Remove policies and add policy"},{"line_number":32,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_ccb75885","line":31,"range":{"start_line":31,"start_character":19,"end_line":31,"end_character":25},"in_reply_to":"5f7c97a3_72470ca5","updated":"2018-07-03 17:12:48.000000000","message":"Yeah, s/Remove/Deprecate/","commit_id":"4eb095996eec871b1fc3803799d0ee41ba3cc373"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"25118296549742e9d39cd1bbc37fba7e1ec47776","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027hosts\u0027: (\u0027group\u0027, \u0027hosts\u0027),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":"    # Version 1.0: Initial version"},{"line_number":31,"context_line":"    # Version 1.1: Remove policies and add policy"},{"line_number":32,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_8764cde6","line":31,"range":{"start_line":31,"start_character":19,"end_line":31,"end_character":25},"in_reply_to":"5f7c97a3_ccb75885","updated":"2018-07-04 09:05:19.000000000","message":"Done","commit_id":"4eb095996eec871b1fc3803799d0ee41ba3cc373"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2336cac54b537525df7392ac4eaa4a9b239a5dc4","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        cgroup._context \u003d None"},{"line_number":53,"context_line":"        if group.policy:"},{"line_number":54,"context_line":"            self.policy \u003d ServerGroupPolicyPayload(policy\u003dgroup.policy)"},{"line_number":55,"context_line":"            self.policies \u003d [group.policy.policy]"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            self.policy \u003d None"},{"line_number":58,"context_line":"            self.policies \u003d []"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_ec5fb44a","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":49},"updated":"2018-07-03 17:12:48.000000000","message":"This is where we maintain backward compat until version 2.0 of the object. Just a note for reviewers.","commit_id":"4eb095996eec871b1fc3803799d0ee41ba3cc373"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dc4d83f0356b93ccc63711a09a6f7ec912d1428","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        super(ServerGroupPolicyPayload, self).__init__()"},{"line_number":73,"context_line":"        self.name \u003d policy.policy"},{"line_number":74,"context_line":"        self.rules \u003d policy.rules"},{"line_number":75,"context_line":"        self.populate_schema(policy\u003dpolicy)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"@base.notification_sample(\u0027server_group-add_member.json\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_de94b543","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":43},"updated":"2018-07-05 15:38:40.000000000","message":"Is this necessary? There is no SCHEMA defined for this object, and you\u0027ve already set the two fields explicitly.","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"426ed8ef9eb9ec0dc43e5bd998f11d125b438bd8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        super(ServerGroupPolicyPayload, self).__init__()"},{"line_number":73,"context_line":"        self.name \u003d policy.policy"},{"line_number":74,"context_line":"        self.rules \u003d policy.rules"},{"line_number":75,"context_line":"        self.populate_schema(policy\u003dpolicy)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"@base.notification_sample(\u0027server_group-add_member.json\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_96d0532d","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":43},"in_reply_to":"5f7c97a3_de94b543","updated":"2018-07-09 08:19:12.000000000","message":"Done","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"757c5c26cbae951fb1cc89f7b8dd387127557d1e","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":63,"context_line":"class ServerGroupPolicyPayload(base.NotificationPayloadBase):"},{"line_number":64,"context_line":"    # Version 1.0: Initial version"},{"line_number":65,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":66,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":23,"id":"5f7c97a3_45209649","line":63,"range":{"start_line":63,"start_character":6,"end_line":63,"end_character":30},"updated":"2018-07-09 21:43:04.000000000","message":"Now I\u0027m not sure if we need a separate payload object for the policy name and rules, but it doesn\u0027t hurt.","commit_id":"89674029de3abf089a7c785c375d63a282626891"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b53109d33457a581ec50a4216fee86c5b637be43","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":66,"context_line":"    fields \u003d {"},{"line_number":67,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":68,"context_line":"        \u0027rules\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":69,"context_line":"    }"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def __init__(self, group):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_dc678ae9","line":68,"range":{"start_line":68,"start_character":43,"end_line":68,"end_character":56},"updated":"2018-07-10 17:32:22.000000000","message":"If this isn\u0027t nullable in InstanceGroup._rules then it probably shouldn\u0027t be nullable here either.","commit_id":"3b66904ec6391d769e323772d889a9a6526aec01"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e98bdf5595e6c3197cca5b89827454a6bba6962","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":66,"context_line":"    fields \u003d {"},{"line_number":67,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":68,"context_line":"        \u0027rules\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":69,"context_line":"    }"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def __init__(self, group):"}],"source_content_type":"text/x-python","patch_set":27,"id":"5f7c97a3_bcbe4ecb","line":68,"range":{"start_line":68,"start_character":43,"end_line":68,"end_character":56},"updated":"2018-07-10 17:45:48.000000000","message":"We can remove this.","commit_id":"55c0e7fe977b54e0dd2cdde1546b7b66775859b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f401c2292d1dab3aa4081ce100bfc34d6ff4c566","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_17d71d24","line":41,"range":{"start_line":41,"start_character":38,"end_line":41,"end_character":62},"updated":"2018-07-10 18:33:13.000000000","message":"Dan and I were discussing (in IRC) if we should make this flat like we did for the InstanceGroup object itself:\n\nhttp://eavesdrop.openstack.org/irclogs/%23openstack-nova/%23openstack-nova.2018-07-10.log.html#t2018-07-10T18:13:58\n\nI\u0027m generally OK with that if we want to make the versioned notification objects mirror the versioned InstanceGroup object.\n\nIf we do make this flat, then I think we should probably make the REST API response flat as well rather than include a nested policy dict with the \u0027name\u0027 and \u0027rules\u0027 fields here:\n\nhttps://review.openstack.org/#/c/567534/28/doc/api_samples/os-server-groups/v2.64/server-groups-get-resp.json\n\nThen we\u0027d just have \"policy\" and \"rules\" fields in the server group response in the REST API which mirrors how it\u0027s modeled in the InstanceGroup object.\n\nThinking about how we have nested objects in the servers resource in the API, I think a flat structure probably makes more sense for the server group, because the only things we nest in the servers body are other resources which have their own APIs, like flavors, security groups, volumes, ports, etc. Since we don\u0027t manage server group policies as their own resource, making that flat in the server group response body makes sense.","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"b33e2c3e04f8eda45bd21b4dcb2593b7126e9f83","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_a44e2c37","line":41,"range":{"start_line":41,"start_character":38,"end_line":41,"end_character":62},"in_reply_to":"5f7c97a3_17d71d24","updated":"2018-07-11 01:27:36.000000000","message":"\u003e Thinking about how we have nested objects in the servers resource in the API, I think a flat structure probably makes more sense for the server group, because the only things we nest in the servers body are other resources which have their own APIs.\n\nAgree your explanation, I will change it today.","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7160d7f02ab3d3d1cee5ed2ab09de0b1578859b4","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_8afe9702","line":41,"range":{"start_line":41,"start_character":38,"end_line":41,"end_character":62},"in_reply_to":"5f7c97a3_17d71d24","updated":"2018-07-11 03:10:17.000000000","message":"you mean not to have \u0027name\u0027 under \u0027policy\u0027 field and we just have policy name in \u0027policy\u0027 which will be string and \u0027rules\u0027 as dict of string. \nI remember that came up during spec review also.\n\nbut from REST API perspective in that case \u0027rules\u0027 field under \u0027server_group\u0027 might be not very clear for user. They might confuse whether this \u0027rules\u0027 is for sever group or its policy. In that case, we may need to change \u0027rules\u0027 field name to \u0027policy_rules\u0027 in request and response of REST API ?\n\nAlso in that case we might need to put validation of \u0027rules or policy_rules\u0027 (that it is not present in request for any policy other than \u0027anti-affinity\u0027) in code as it will not be possible to do the same using current proposed json schema[1]\nBut that is all ok, JSON schema is not always solution for all.\n\n[1] https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/complex-anti-affinity-policies.html#rest-api-impact","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0ae375749b8b453a510cf352c7d7903181e13f51","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_427847c0","line":41,"range":{"start_line":41,"start_character":38,"end_line":41,"end_character":62},"in_reply_to":"5f7c97a3_691c5f66","updated":"2018-07-12 08:42:06.000000000","message":"ok. yeah doing validation in code is just 2 line so no issue.","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"839036b4add53f2e0f8ed455b28d66cd23fd7666","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_691c5f66","line":41,"range":{"start_line":41,"start_character":38,"end_line":41,"end_character":62},"in_reply_to":"5f7c97a3_8afe9702","updated":"2018-07-11 13:10:25.000000000","message":"\u003e you mean not to have \u0027name\u0027 under \u0027policy\u0027 field and we just have\n \u003e policy name in \u0027policy\u0027 which will be string and \u0027rules\u0027 as dict of\n \u003e string.\n \u003e I remember that came up during spec review also.\n\nYes, that is the thinking after lots of review on the versioned objects and deciding that a separate InstanceGroupPolicy object wasn\u0027t really giving any benefit since group and policy are 1:1 in the data model and the group object does all the work of creating the policy record anyway, so we flattened it and just have 2 new fields: policy (name) and rules (dict of rules for the policy on that group)\n\n \u003e \n \u003e but from REST API perspective in that case \u0027rules\u0027 field under\n \u003e \u0027server_group\u0027 might be not very clear for user. They might confuse\n \u003e whether this \u0027rules\u0027 is for sever group or its policy. In that\n \u003e case, we may need to change \u0027rules\u0027 field name to \u0027policy_rules\u0027 in\n \u003e request and response of REST API ?\n\nI\u0027d rather not rename the \u0027rules\u0027 field to \u0027policy_rules\u0027 at this point. I don\u0027t think it\u0027s really confusing - as noted, group and policy are 1:1. All of the confusion between server group policies stems (I think) from the fact it was originally modeled in the DB as a 1:M relationship so a group could have multiple policies but then that never actually happened, but we still think about it that way.\n\n \u003e \n \u003e Also in that case we might need to put validation of \u0027rules or\n \u003e policy_rules\u0027 (that it is not present in request for any policy\n \u003e other than \u0027anti-affinity\u0027) in code as it will not be possible to\n \u003e do the same using current proposed json schema[1]\n \u003e But that is all ok, JSON schema is not always solution for all.\n \u003e \n \u003e [1] https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/complex-anti-affinity-policies.html#rest-api-impact\n\nYeah, true, but this is pretty simple validation in code:\n\nif body[\u0027group\u0027][\u0027policy\u0027] !\u003d \u0027anti-affinity\u0027 and body[\u0027group\u0027].get(\u0027rules\u0027):\n    raise HTTPBadRequest","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f69cbfe5cc1ca7f4b1b512fe1997b4b82e8dbe6","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_036eec2b","line":41,"range":{"start_line":41,"start_character":38,"end_line":41,"end_character":62},"in_reply_to":"5f7c97a3_8afe9702","updated":"2018-07-11 12:25:20.000000000","message":"I agree to keep the API and the notification payload structure in sync if possible. (and here it is possible.)\n\nRegarding flat or nested on the API I agree with Ghanshyam that we need to make the flat struct as expressive as the nested. But besides that I like the flat direction.\n\nBTW having rules for a policy is a common terminology in neutron QoS so policy_rules as a name for the flat field seems like a good idea to me.","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"69cc9a000f22e2d8f566c60d5ef29ec3441e9d59","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":45,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_f7f141df","line":42,"updated":"2018-07-10 18:32:06.000000000","message":"I missed this before, but I think we should probably flatten this out like we did for the object itself. It\u0027ll be one less notification object to track, one less hash, etc.","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"b33e2c3e04f8eda45bd21b4dcb2593b7126e9f83","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # be removed on the next major version bump"},{"line_number":40,"context_line":"        \u0027policies\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027policy\u0027: fields.ObjectField(\u0027ServerGroupPolicyPayload\u0027,"},{"line_number":42,"context_line":"                                     nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":45,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":28,"id":"5f7c97a3_c46488b6","line":42,"in_reply_to":"5f7c97a3_f7f141df","updated":"2018-07-11 01:27:36.000000000","message":"Yeah, danms, thanks for your help, I will change it today.","commit_id":"ea5d34fa87d76526aa931a478ad1a590271c2178"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7160d7f02ab3d3d1cee5ed2ab09de0b1578859b4","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027policy\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027rules\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, group):"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_6a70dba8","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":15},"updated":"2018-07-11 03:10:17.000000000","message":"here it should be ok but we should change the name of this in REST API?","commit_id":"7f4d731cb6d7133ce6cbc947f18ab6e091415291"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a1fc287b18a35eab698f891b6e28de7c99d2392a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        \u0027rules\u0027: (\u0027group\u0027, \u0027rules\u0027),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":"    # Version 1.0: Initial version"},{"line_number":33,"context_line":"    # Version 1.1: Deprecate policies and add policy"},{"line_number":34,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":35,"context_line":"    fields \u003d {"},{"line_number":36,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_18e173fe","line":33,"updated":"2018-07-11 16:05:51.000000000","message":"we also add the rules field now","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"682a7a21fb675cc18f7871a25ab192adaa0c449b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        \u0027rules\u0027: (\u0027group\u0027, \u0027rules\u0027),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":"    # Version 1.0: Initial version"},{"line_number":33,"context_line":"    # Version 1.1: Deprecate policies and add policy"},{"line_number":34,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":35,"context_line":"    fields \u003d {"},{"line_number":36,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_dcb76585","line":33,"in_reply_to":"5f7c97a3_18e173fe","updated":"2018-07-12 02:00:56.000000000","message":"Yes, forgot to update.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0c8a1b752750931cb48b51914ba060c557b6280d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027policy\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027rules\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, group):"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_890e9be2","line":46,"range":{"start_line":46,"start_character":43,"end_line":46,"end_character":56},"updated":"2018-07-11 13:20:44.000000000","message":"Does this really need to be nullable? We\u0027re always going to set a value on this, even if we just default to {} because of how InstanceGroup.rules works.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a1fc287b18a35eab698f891b6e28de7c99d2392a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027policy\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027rules\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, group):"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_186e5397","line":46,"range":{"start_line":46,"start_character":43,"end_line":46,"end_character":56},"in_reply_to":"5f7c97a3_890e9be2","updated":"2018-07-11 16:05:51.000000000","message":"Agree. the rules property on InstanceGroup makes sure that we always have a value for the rules property of the payload","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"682a7a21fb675cc18f7871a25ab192adaa0c449b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027members\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027hosts\u0027: fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027policy\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027rules\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, group):"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_bc670925","line":46,"range":{"start_line":46,"start_character":43,"end_line":46,"end_character":56},"in_reply_to":"5f7c97a3_890e9be2","updated":"2018-07-12 02:00:56.000000000","message":"Done","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a1fc287b18a35eab698f891b6e28de7c99d2392a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # the group.hosts field."},{"line_number":53,"context_line":"        cgroup \u003d copy.deepcopy(group)"},{"line_number":54,"context_line":"        cgroup._context \u003d None"},{"line_number":55,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":56,"context_line":"        # be removed on the next major version bump"},{"line_number":57,"context_line":"        self.policies \u003d [group.policy] if group.policy else []"},{"line_number":58,"context_line":"        self.populate_schema(group\u003dcgroup)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_58a5abb3","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":62},"updated":"2018-07-11 16:05:51.000000000","message":"We don\u0027t need to repeat this compatibility code here as the InstanceGroup still has the policies field available. Simply keep that in the schema to copy the content over to the payload.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"38bb92e281909147729e3cae50af6c6f6c746db2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # the group.hosts field."},{"line_number":53,"context_line":"        cgroup \u003d copy.deepcopy(group)"},{"line_number":54,"context_line":"        cgroup._context \u003d None"},{"line_number":55,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":56,"context_line":"        # be removed on the next major version bump"},{"line_number":57,"context_line":"        self.policies \u003d [group.policy] if group.policy else []"},{"line_number":58,"context_line":"        self.populate_schema(group\u003dcgroup)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_224759a6","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":62},"in_reply_to":"5f7c97a3_58a5abb3","updated":"2018-07-11 18:57:10.000000000","message":"Good point.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"682a7a21fb675cc18f7871a25ab192adaa0c449b","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # the group.hosts field."},{"line_number":53,"context_line":"        cgroup \u003d copy.deepcopy(group)"},{"line_number":54,"context_line":"        cgroup._context \u003d None"},{"line_number":55,"context_line":"        # NOTE(yikun): policies is deprecated and should"},{"line_number":56,"context_line":"        # be removed on the next major version bump"},{"line_number":57,"context_line":"        self.policies \u003d [group.policy] if group.policy else []"},{"line_number":58,"context_line":"        self.populate_schema(group\u003dcgroup)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_1c639d1b","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":62},"in_reply_to":"5f7c97a3_58a5abb3","updated":"2018-07-12 02:00:56.000000000","message":"Ha, yes","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6db23bfdf663f47976d559923bd0e02af37e9d31","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027rules\u0027: (\u0027group\u0027, \u0027rules\u0027),"},{"line_number":32,"context_line":"    }"},{"line_number":33,"context_line":"    # Version 1.0: Initial version"},{"line_number":34,"context_line":"    # Version 1.1: Deprecate policies, add policy and add rules"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":36,"context_line":"    fields \u003d {"},{"line_number":37,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_05ffb900","line":34,"range":{"start_line":34,"start_character":39,"end_line":34,"end_character":63},"updated":"2018-07-12 08:46:15.000000000","message":"nit:add policy and rules","commit_id":"c67ab38ea0816bc1f3dcdda845217bff18588c42"}],"nova/tests/unit/compute/test_compute_utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dc4d83f0356b93ccc63711a09a6f7ec912d1428","unresolved":false,"context_lines":[{"line_number":1157,"context_line":"        sgp \u003d objects.InstanceGroupPolicy(context\u003dself.context,"},{"line_number":1158,"context_line":"                                          policy\u003d\"anti-affinity\","},{"line_number":1159,"context_line":"                                          group_id\u003d1,"},{"line_number":1160,"context_line":"                                          rules\u003d{\"max_server_per_host\": \"3\"})"},{"line_number":1161,"context_line":"        self.group \u003d objects.InstanceGroup(context\u003dself.context,"},{"line_number":1162,"context_line":"                                           id\u003d1,"},{"line_number":1163,"context_line":"                                           uuid\u003duuids.server_group,"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_1e9d4d56","line":1160,"range":{"start_line":1160,"start_character":72,"end_line":1160,"end_character":75},"updated":"2018-07-05 15:38:40.000000000","message":"nit: this test might be more interesting if you leave this as an int since the payload assertion below will assert it\u0027s now a string in the notification due to using DictOfStringsField.","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9668e062ecb7d01b7730ddcf88da59bc0f852cb5","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"                            \u0027policy\u0027: {"},{"line_number":1222,"context_line":"                                \u0027nova_object.data\u0027: {"},{"line_number":1223,"context_line":"                                    \u0027name\u0027: u\u0027anti-affinity\u0027,"},{"line_number":1224,"context_line":"                                    \u0027rules\u0027: {\"max_server_per_host\": \"3\"}"},{"line_number":1225,"context_line":"                                },"},{"line_number":1226,"context_line":"                                \u0027nova_object.name\u0027:"},{"line_number":1227,"context_line":"                                    \u0027ServerGroupPolicyPayload\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_14dafb77","line":1224,"range":{"start_line":1224,"start_character":69,"end_line":1224,"end_character":72},"updated":"2018-07-06 13:54:23.000000000","message":"I\u0027m surprised this is still a string since the InstanceGroupPolicy.rules field is casting this to an int now:\n\nhttps://review.openstack.org/#/c/573628/17/nova/objects/instance_group.py@559","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"876509a4555c1921416da15392717ef479d2ce6c","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"                            \u0027policy\u0027: {"},{"line_number":1222,"context_line":"                                \u0027nova_object.data\u0027: {"},{"line_number":1223,"context_line":"                                    \u0027name\u0027: u\u0027anti-affinity\u0027,"},{"line_number":1224,"context_line":"                                    \u0027rules\u0027: {\"max_server_per_host\": \"3\"}"},{"line_number":1225,"context_line":"                                },"},{"line_number":1226,"context_line":"                                \u0027nova_object.name\u0027:"},{"line_number":1227,"context_line":"                                    \u0027ServerGroupPolicyPayload\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_942b6b31","line":1224,"range":{"start_line":1224,"start_character":69,"end_line":1224,"end_character":72},"in_reply_to":"5f7c97a3_14dafb77","updated":"2018-07-06 13:59:24.000000000","message":"Oh I guess this is because it\u0027s not using the InstanceGroupPolicy.rules, it\u0027s using the payload which doesn\u0027t do the same type casting:\n\nhttps://review.openstack.org/#/c/563401/20/nova/notifications/objects/server_group.py@68","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f4436b74b76301259548af35a2f2a486bff42f94","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"                            \u0027policy\u0027: {"},{"line_number":1222,"context_line":"                                \u0027nova_object.data\u0027: {"},{"line_number":1223,"context_line":"                                    \u0027name\u0027: u\u0027anti-affinity\u0027,"},{"line_number":1224,"context_line":"                                    \u0027rules\u0027: {\"max_server_per_host\": \"3\"}"},{"line_number":1225,"context_line":"                                },"},{"line_number":1226,"context_line":"                                \u0027nova_object.name\u0027:"},{"line_number":1227,"context_line":"                                    \u0027ServerGroupPolicyPayload\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_242a497d","line":1224,"range":{"start_line":1224,"start_character":69,"end_line":1224,"end_character":72},"in_reply_to":"5f7c97a3_5e263b18","updated":"2018-07-09 12:40:18.000000000","message":"Doesn\u0027t matter much to me for the versioned object. Casting in the InstanceGroupPolicy object is nicer since then we don\u0027t have to cast in the compute REST API or scheduler filter code, but nova doesn\u0027t use these versioned notifications internally.","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"426ed8ef9eb9ec0dc43e5bd998f11d125b438bd8","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"                            \u0027policy\u0027: {"},{"line_number":1222,"context_line":"                                \u0027nova_object.data\u0027: {"},{"line_number":1223,"context_line":"                                    \u0027name\u0027: u\u0027anti-affinity\u0027,"},{"line_number":1224,"context_line":"                                    \u0027rules\u0027: {\"max_server_per_host\": \"3\"}"},{"line_number":1225,"context_line":"                                },"},{"line_number":1226,"context_line":"                                \u0027nova_object.name\u0027:"},{"line_number":1227,"context_line":"                                    \u0027ServerGroupPolicyPayload\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_5e263b18","line":1224,"range":{"start_line":1224,"start_character":69,"end_line":1224,"end_character":72},"in_reply_to":"5f7c97a3_942b6b31","updated":"2018-07-09 08:19:12.000000000","message":"Yes, so should we also do same type casting in notification obj?","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a1fc287b18a35eab698f891b6e28de7c99d2392a","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"                                           project_id\u003dself.project_id,"},{"line_number":1162,"context_line":"                                           name\u003d\"test-server-group\","},{"line_number":1163,"context_line":"                                           policy\u003d\"anti-affinity\","},{"line_number":1164,"context_line":"                                           rules\u003d{\"max_server_per_host\": 3})"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"    def test_notify_about_server_group_action(self):"},{"line_number":1167,"context_line":"        compute_utils.notify_about_server_group_action(self.context,"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_b82ddf46","line":1164,"range":{"start_line":1164,"start_character":73,"end_line":1164,"end_character":75},"updated":"2018-07-11 16:05:51.000000000","message":"The rules (actually _rules) field of the InstanceGroup object is a defined as DictOfString so I would pass \"3\" here.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"38bb92e281909147729e3cae50af6c6f6c746db2","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"                                           project_id\u003dself.project_id,"},{"line_number":1162,"context_line":"                                           name\u003d\"test-server-group\","},{"line_number":1163,"context_line":"                                           policy\u003d\"anti-affinity\","},{"line_number":1164,"context_line":"                                           rules\u003d{\"max_server_per_host\": 3})"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"    def test_notify_about_server_group_action(self):"},{"line_number":1167,"context_line":"        compute_utils.notify_about_server_group_action(self.context,"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_e2c64116","line":1164,"range":{"start_line":1164,"start_character":73,"end_line":1164,"end_character":75},"in_reply_to":"5f7c97a3_b82ddf46","updated":"2018-07-11 18:57:10.000000000","message":"same reply as here:\n\nhttps://review.openstack.org/#/c/563375/39/nova/tests/functional/db/test_instance_group.py@36","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"78ea87c88998a22e484232eb2214ffbc86cb5b93","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"                            \u0027name\u0027: u\u0027test-server-group\u0027,"},{"line_number":1177,"context_line":"                            \u0027policies\u0027: [u\u0027anti-affinity\u0027],"},{"line_number":1178,"context_line":"                            \u0027policy\u0027: u\u0027anti-affinity\u0027,"},{"line_number":1179,"context_line":"                            \u0027rules\u0027: {\"max_server_per_host\": \"3\"},"},{"line_number":1180,"context_line":"                            \u0027project_id\u0027: u\u0027fake\u0027,"},{"line_number":1181,"context_line":"                            \u0027user_id\u0027: u\u0027fake\u0027,"},{"line_number":1182,"context_line":"                            \u0027uuid\u0027: uuids.server_group,"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_86568a05","line":1179,"updated":"2018-07-11 12:37:42.000000000","message":"I\u0027m OK to keep this as string. We don\u0027t have a Dict type with variable value type. I feel that our contract to our notification consumers are the payload class and field type definition. So If the field type is DictOfString then let\u0027s emit a json dict with string values in the interface.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"682a7a21fb675cc18f7871a25ab192adaa0c449b","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"                            \u0027name\u0027: u\u0027test-server-group\u0027,"},{"line_number":1177,"context_line":"                            \u0027policies\u0027: [u\u0027anti-affinity\u0027],"},{"line_number":1178,"context_line":"                            \u0027policy\u0027: u\u0027anti-affinity\u0027,"},{"line_number":1179,"context_line":"                            \u0027rules\u0027: {\"max_server_per_host\": \"3\"},"},{"line_number":1180,"context_line":"                            \u0027project_id\u0027: u\u0027fake\u0027,"},{"line_number":1181,"context_line":"                            \u0027user_id\u0027: u\u0027fake\u0027,"},{"line_number":1182,"context_line":"                            \u0027uuid\u0027: uuids.server_group,"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_9c6ecdfc","line":1179,"in_reply_to":"5f7c97a3_86568a05","updated":"2018-07-12 02:00:56.000000000","message":"OK, thanks for your idea.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8b0322cf6c50266efedb915e3d67432da375232","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"                                           project_id\u003dself.project_id,"},{"line_number":1162,"context_line":"                                           name\u003d\"test-server-group\","},{"line_number":1163,"context_line":"                                           policy\u003d\"anti-affinity\","},{"line_number":1164,"context_line":"                                           policies\u003d[\"anti-affinity\"],"},{"line_number":1165,"context_line":"                                           rules\u003d{\"max_server_per_host\": 3})"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":"    def test_notify_about_server_group_action(self):"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_ac3b4a99","line":1164,"range":{"start_line":1164,"start_character":43,"end_line":1164,"end_character":70},"updated":"2018-07-12 12:14:52.000000000","message":"OK this needs to be explicitly set now since we aren\u0027t loading this object from the DB where both policy and policies would be set. And we don\u0027t set policies automatically based on policy in the payload object.","commit_id":"c67ab38ea0816bc1f3dcdda845217bff18588c42"}],"nova/tests/unit/notifications/objects/test_notification.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"98cf588eb223aa33fe8f987ad80d7a30bb64a5b0","unresolved":false,"context_lines":[{"line_number":401,"context_line":"    \u0027NotificationPublisher\u0027: \u00272.2-b6ad48126247e10b46b6b0240e52e614\u0027,"},{"line_number":402,"context_line":"    \u0027ServerGroupNotification\u0027: \u00271.0-a73147b93b520ff0061865849d3dfa56\u0027,"},{"line_number":403,"context_line":"    \u0027ServerGroupPayload\u0027: \u00272.0-30457db1b455bf852f5b5e4c937cd64f\u0027,"},{"line_number":404,"context_line":"    \u0027ServerGroupPolicyPayload\u0027: \u00271.0-9fe8bac17793bf47f408a6974dae91b6\u0027,"},{"line_number":405,"context_line":"    \u0027ServiceStatusNotification\u0027: \u00271.0-a73147b93b520ff0061865849d3dfa56\u0027,"},{"line_number":406,"context_line":"    \u0027ServiceStatusPayload\u0027: \u00271.1-7b6856bd879db7f3ecbcd0ca9f35f92f\u0027,"},{"line_number":407,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_0ff982c6","line":404,"range":{"start_line":404,"start_character":37,"end_line":404,"end_character":69},"updated":"2018-05-30 09:31:47.000000000","message":"seems still wrong","commit_id":"fe3bdb76f8adb20416e0cf46c85d15a5b65eff90"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"a7c69f89fa4f583e6d6d8f95f9dbf23a86603078","unresolved":false,"context_lines":[{"line_number":401,"context_line":"    \u0027NotificationPublisher\u0027: \u00272.2-b6ad48126247e10b46b6b0240e52e614\u0027,"},{"line_number":402,"context_line":"    \u0027ServerGroupNotification\u0027: \u00271.0-a73147b93b520ff0061865849d3dfa56\u0027,"},{"line_number":403,"context_line":"    \u0027ServerGroupPayload\u0027: \u00272.0-30457db1b455bf852f5b5e4c937cd64f\u0027,"},{"line_number":404,"context_line":"    \u0027ServerGroupPolicyPayload\u0027: \u00271.0-9fe8bac17793bf47f408a6974dae91b6\u0027,"},{"line_number":405,"context_line":"    \u0027ServiceStatusNotification\u0027: \u00271.0-a73147b93b520ff0061865849d3dfa56\u0027,"},{"line_number":406,"context_line":"    \u0027ServiceStatusPayload\u0027: \u00271.1-7b6856bd879db7f3ecbcd0ca9f35f92f\u0027,"},{"line_number":407,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_0ab2d094","line":404,"range":{"start_line":404,"start_character":37,"end_line":404,"end_character":69},"in_reply_to":"5f7c97a3_0ff982c6","updated":"2018-06-11 06:25:37.000000000","message":"done","commit_id":"fe3bdb76f8adb20416e0cf46c85d15a5b65eff90"}],"releasenotes/notes/use-new-style-policy-in-notifications-3c6eefbb56224be2.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dc4d83f0356b93ccc63711a09a6f7ec912d1428","unresolved":false,"context_lines":[{"line_number":2,"context_line":""},{"line_number":3,"context_line":"features:"},{"line_number":4,"context_line":"  - |"},{"line_number":5,"context_line":"    The new style ``policy`` field has been added to ServerGroupPayload. The"},{"line_number":6,"context_line":"    ``server_group.create``, ``server_group.delete`` and"},{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field instead of the old ``policies`` field."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_bea539a2","line":5,"range":{"start_line":5,"start_character":53,"end_line":5,"end_character":71},"updated":"2018-07-05 15:38:40.000000000","message":"``ServerGroupPayload``","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"704d45253fb24c2d7c580f58be2132c4e52d8059","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    The new style ``policy`` field has been added to ServerGroupPayload. The"},{"line_number":6,"context_line":"    ``server_group.create``, ``server_group.delete`` and"},{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field instead of the old ``policies`` field."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_0c676b53","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":74},"updated":"2018-07-05 11:06:39.000000000","message":"I don\u0027t want to be too nitpicking, but you didn\u0027t remove the old policies field now, so maybe mention it is deprecated for removal and suggested to use the new field.","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dc4d83f0356b93ccc63711a09a6f7ec912d1428","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    The new style ``policy`` field has been added to ServerGroupPayload. The"},{"line_number":6,"context_line":"    ``server_group.create``, ``server_group.delete`` and"},{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field instead of the old ``policies`` field."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_3eafe99d","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":74},"in_reply_to":"5f7c97a3_0c676b53","updated":"2018-07-05 15:38:40.000000000","message":"Agree with Kevin.","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9668e062ecb7d01b7730ddcf88da59bc0f852cb5","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    The new style ``policy`` field has been added to ``ServerGroupPayload``."},{"line_number":6,"context_line":"    The ``server_group.create``, ``server_group.delete`` and"},{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field, the ``policies`` field is deprecated"},{"line_number":9,"context_line":"    for removal but still put into the notification payload for backward"},{"line_number":10,"context_line":"    compatibility."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f7c97a3_54c5d38e","line":8,"range":{"start_line":8,"start_character":36,"end_line":8,"end_character":41},"updated":"2018-07-06 13:54:23.000000000","message":"nit: Either change the comma to a semi-colon (;) or make this a new sentence:\n\n... include the new ``policy`` field. The ``policies`` field...","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"426ed8ef9eb9ec0dc43e5bd998f11d125b438bd8","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    The new style ``policy`` field has been added to ``ServerGroupPayload``."},{"line_number":6,"context_line":"    The ``server_group.create``, ``server_group.delete`` and"},{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field, the ``policies`` field is deprecated"},{"line_number":9,"context_line":"    for removal but still put into the notification payload for backward"},{"line_number":10,"context_line":"    compatibility."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f7c97a3_de77ab07","line":8,"range":{"start_line":8,"start_character":36,"end_line":8,"end_character":41},"in_reply_to":"5f7c97a3_54c5d38e","updated":"2018-07-09 08:19:12.000000000","message":"Done","commit_id":"333052e7dee2debd94a683ea89ded2212a6f5603"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a1fc287b18a35eab698f891b6e28de7c99d2392a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field. The ``policies`` field is deprecated"},{"line_number":9,"context_line":"    for removal but still put into the notification payload for backward"},{"line_number":10,"context_line":"    compatibility."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_b8bb9fe2","line":10,"updated":"2018-07-11 16:05:51.000000000","message":"we also added the \u0027rules\u0027 field now","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"682a7a21fb675cc18f7871a25ab192adaa0c449b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field. The ``policies`` field is deprecated"},{"line_number":9,"context_line":"    for removal but still put into the notification payload for backward"},{"line_number":10,"context_line":"    compatibility."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_dfcbd7a1","line":10,"in_reply_to":"5f7c97a3_82e42daa","updated":"2018-07-12 02:00:56.000000000","message":"Done","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"38bb92e281909147729e3cae50af6c6f6c746db2","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` field. The ``policies`` field is deprecated"},{"line_number":9,"context_line":"    for removal but still put into the notification payload for backward"},{"line_number":10,"context_line":"    compatibility."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_82e42daa","line":10,"in_reply_to":"5f7c97a3_b8bb9fe2","updated":"2018-07-11 18:57:10.000000000","message":"Yeah this was written when policy was a nested dict, but since it\u0027s flat now we have to mention policy and rules as new fields.","commit_id":"5ca2a8fa12dd13ffac0b93590339ab2094d010d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8b0322cf6c50266efedb915e3d67432da375232","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    The new style ``policy`` field has been added to ``ServerGroupPayload``."},{"line_number":6,"context_line":"    The ``server_group.create``, ``server_group.delete`` and"},{"line_number":7,"context_line":"    ``server_group.add_member`` versioned notifications will be updated to"},{"line_number":8,"context_line":"    include the new ``policy`` and ``rules``field. The ``policies`` field is"},{"line_number":9,"context_line":"    deprecated for removal but still put into the notification payload for"},{"line_number":10,"context_line":"    backward compatibility."}],"source_content_type":"text/x-yaml","patch_set":32,"id":"5f7c97a3_cc59e6fd","line":8,"range":{"start_line":8,"start_character":44,"end_line":8,"end_character":45},"updated":"2018-07-12 12:14:52.000000000","message":"need a space here - fix in your follow up patch:\n\nhttps://review.openstack.org/#/c/581616/","commit_id":"c67ab38ea0816bc1f3dcdda845217bff18588c42"}]}
