)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"dbde4f3e1e2a1cdab284fb4a129c5a740b0a5d42","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Markin, Sergiy (sm515x) \u003csm515x@att.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2022-10-03 18:53:36 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Port tags CADF change"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Creating a project with existing tags was failing to provide a"},{"line_number":10,"context_line":"notification that the tags were created, this change updates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"b09b1227_1d533cfa","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":21},"updated":"2022-10-04 13:44:36.000000000","message":"Not sure what is \"ported\" here about this.\n\nSee https://review.opendev.org/c/openstack/keystone/+/849724 for a more generic description of what this change does, feel free to use that as well.","commit_id":"e44a7e9b24e9922deb566902e3826a7eb3fdc64e"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"4f9bd6b976ce19bdeb12008ce7725aa20d4dc7ed","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Markin, Sergiy (sm515x) \u003csm515x@att.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2022-10-03 18:53:36 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Port tags CADF change"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Creating a project with existing tags was failing to provide a"},{"line_number":10,"context_line":"notification that the tags were created, this change updates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5d1586da_eb6ba422","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":21},"in_reply_to":"b09b1227_1d533cfa","updated":"2022-10-04 14:39:29.000000000","message":"Done","commit_id":"e44a7e9b24e9922deb566902e3826a7eb3fdc64e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"6bbb8f1307e6f291007db396d24319b0dc261c43","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e15fa170_9e2d8c10","updated":"2022-10-04 13:45:01.000000000","message":"Other than the commit message, the change here is valid.","commit_id":"e44a7e9b24e9922deb566902e3826a7eb3fdc64e"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"4f9bd6b976ce19bdeb12008ce7725aa20d4dc7ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fe7e4bed_9f53c250","updated":"2022-10-04 14:39:29.000000000","message":"Commit message has been corrected","commit_id":"ad268e1281535f12c6e99cfb0f43fccab2f0acbc"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"85fea58f996b288a2a7f89834cf9da8b139fcb5c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"85449644_b44e3434","updated":"2022-10-07 15:01:02.000000000","message":"I think adding a release note would make sense here.","commit_id":"ad268e1281535f12c6e99cfb0f43fccab2f0acbc"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"9f7b49c4f9fe1960eae26295b3a33a4198dd31e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d42b0d1a_b7158997","updated":"2022-10-04 15:35:18.000000000","message":"lgtm","commit_id":"ad268e1281535f12c6e99cfb0f43fccab2f0acbc"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"a0c10ba01b45be2d45901115bba4471ab6d5e538","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"67d31f54_317a69b6","in_reply_to":"85449644_b44e3434","updated":"2022-10-07 15:02:35.000000000","message":"Agreed\n\nhttps://docs.openstack.org/reno/latest/user/usage.html for how to use reno","commit_id":"ad268e1281535f12c6e99cfb0f43fccab2f0acbc"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"08518d283980436fa5d7c817872cea05f19f73a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3667df9c_a1a0f9dc","updated":"2022-10-17 14:48:57.000000000","message":"somehow this is odd..\n\nam I correct that one will receive separate notifications \u0027tag created\u0027 but the notification itself won\u0027t contain for which project?\n\nbetter to add tags handling into the notification-from-project serializer IMO","commit_id":"2fde358a8ddc7dd9009c0ac0a8f11704a1fa05f5"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"c4ea8c253b82ba1eb31137da1ccd02f1530398d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"58185aac_a1438555","updated":"2022-11-14 22:23:12.000000000","message":"Gage, _DOMAIN_TAG related comments were implemented. Thank you","commit_id":"721af6c362125cf83aaa9f35eb7814d7d0aa6176"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"876f4df31c0f6000188553e65e2e8e637c50cbde","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":26,"id":"7ee95d1d_fde2fa0b","updated":"2022-12-07 21:34:54.000000000","message":"Hello Kristi,\n\nPlease review my answer on the first comment.\n\nThanks","commit_id":"c2e24a2c83b473944f4737ff608cb97d2115a013"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"e808c0413087e30f8439834c381052c759e0c32f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"68880464_27b908ab","in_reply_to":"7ee95d1d_fde2fa0b","updated":"2022-12-07 21:45:52.000000000","message":"Ack","commit_id":"c2e24a2c83b473944f4737ff608cb97d2115a013"}],"keystone/resource/core.py":[{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"ffa51f1da0f9e6ad31313cba5b73bf8783fed853","unresolved":true,"context_lines":[{"line_number":223,"context_line":"            notifications.Audit.created(self._DOMAIN, project_id, initiator)"},{"line_number":224,"context_line":"        else:"},{"line_number":225,"context_line":"            notifications.Audit.created(self._PROJECT, project_id, initiator)"},{"line_number":226,"context_line":"            if (\u0027tags\u0027 in project.keys()) and project[\u0027tags\u0027]:"},{"line_number":227,"context_line":"                notifications.Audit.updated(self._PROJECT, project_id,"},{"line_number":228,"context_line":"                                            initiator)"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2c39c7af_aabbd6c4","line":226,"updated":"2022-10-04 16:04:18.000000000","message":"I\u0027d probably always send the \u0027tags\u0027 field, as empty list if it is empty.","commit_id":"ad268e1281535f12c6e99cfb0f43fccab2f0acbc"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"1ae38c469763b4da9906c0a5acc86c390889afb2","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            notifications.Audit.created(self._DOMAIN, project_id, initiator)"},{"line_number":224,"context_line":"        else:"},{"line_number":225,"context_line":"            notifications.Audit.created(self._PROJECT, project_id, initiator)"},{"line_number":226,"context_line":"            if (\u0027tags\u0027 in project.keys()) and project[\u0027tags\u0027]:"},{"line_number":227,"context_line":"                notifications.Audit.updated(self._PROJECT, project_id,"},{"line_number":228,"context_line":"                                            initiator)"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"db8ee075_3c443546","line":226,"in_reply_to":"2c39c7af_aabbd6c4","updated":"2022-10-12 21:19:25.000000000","message":"I am removing this code because it does not emits tags notification.","commit_id":"ad268e1281535f12c6e99cfb0f43fccab2f0acbc"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b1c5d978cfb802c096866422ff8c0b74951eceae","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    _provides_api \u003d \u0027resource_api\u0027"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    _DOMAIN \u003d \u0027domain\u0027"},{"line_number":52,"context_line":"    _DOMAIN_TAG \u003d \u0027domain.tag\u0027"},{"line_number":53,"context_line":"    _PROJECT \u003d \u0027project\u0027"},{"line_number":54,"context_line":"    _PROJECT_TAG \u003d \u0027project.tag\u0027"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3e038f45_cc788c98","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":30},"updated":"2022-10-24 20:27:19.000000000","message":"unneeded, just use project tag","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"c4ea8c253b82ba1eb31137da1ccd02f1530398d5","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    _provides_api \u003d \u0027resource_api\u0027"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    _DOMAIN \u003d \u0027domain\u0027"},{"line_number":52,"context_line":"    _DOMAIN_TAG \u003d \u0027domain.tag\u0027"},{"line_number":53,"context_line":"    _PROJECT \u003d \u0027project\u0027"},{"line_number":54,"context_line":"    _PROJECT_TAG \u003d \u0027project.tag\u0027"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"6ab9624e_e224163e","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":30},"in_reply_to":"3e038f45_cc788c98","updated":"2022-11-14 22:23:12.000000000","message":"Done","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"33e0ec5b7458b9740a087b63bc66216d14a833e8","unresolved":true,"context_lines":[{"line_number":223,"context_line":"        if project.get(\u0027is_domain\u0027):"},{"line_number":224,"context_line":"            notifications.Audit.created(self._DOMAIN, project_id, initiator)"},{"line_number":225,"context_line":"            # emitting domain tag created notifications"},{"line_number":226,"context_line":"            if (\u0027tags\u0027 in project.keys()) and project[\u0027tags\u0027]:"},{"line_number":227,"context_line":"                tag_list \u003d [t.strip() for t in project[\u0027tags\u0027]]"},{"line_number":228,"context_line":"                for tag in tag_list:"},{"line_number":229,"context_line":"                    notifications.Audit.created(self._DOMAIN_TAG,"}],"source_content_type":"text/x-python","patch_set":14,"id":"92316a8c_ec42718e","line":226,"range":{"start_line":226,"start_character":16,"end_line":226,"end_character":61},"updated":"2022-10-17 15:22:12.000000000","message":"here and across whole change, let\u0027s be more Pythonic:\n\n  if project.get(\u0027tags\u0027):","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"f58232c7db4a3151d227d0a941c4360da1f70bb0","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        if project.get(\u0027is_domain\u0027):"},{"line_number":224,"context_line":"            notifications.Audit.created(self._DOMAIN, project_id, initiator)"},{"line_number":225,"context_line":"            # emitting domain tag created notifications"},{"line_number":226,"context_line":"            if (\u0027tags\u0027 in project.keys()) and project[\u0027tags\u0027]:"},{"line_number":227,"context_line":"                tag_list \u003d [t.strip() for t in project[\u0027tags\u0027]]"},{"line_number":228,"context_line":"                for tag in tag_list:"},{"line_number":229,"context_line":"                    notifications.Audit.created(self._DOMAIN_TAG,"}],"source_content_type":"text/x-python","patch_set":14,"id":"e3ad1837_4764c38e","line":226,"range":{"start_line":226,"start_character":16,"end_line":226,"end_character":61},"in_reply_to":"92316a8c_ec42718e","updated":"2022-11-16 23:43:55.000000000","message":"Done","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b1c5d978cfb802c096866422ff8c0b74951eceae","unresolved":true,"context_lines":[{"line_number":226,"context_line":"            if (\u0027tags\u0027 in project.keys()) and project[\u0027tags\u0027]:"},{"line_number":227,"context_line":"                tag_list \u003d [t.strip() for t in project[\u0027tags\u0027]]"},{"line_number":228,"context_line":"                for tag in tag_list:"},{"line_number":229,"context_line":"                    notifications.Audit.created(self._DOMAIN_TAG,"},{"line_number":230,"context_line":"                                                tag, initiator)"},{"line_number":231,"context_line":"        else:"},{"line_number":232,"context_line":"            notifications.Audit.created(self._PROJECT, project_id, initiator)"}],"source_content_type":"text/x-python","patch_set":14,"id":"0b0b472f_5e3a1618","line":229,"range":{"start_line":229,"start_character":53,"end_line":229,"end_character":64},"updated":"2022-10-24 20:27:19.000000000","message":"domains are projects, we can just use project tag here.","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"c4ea8c253b82ba1eb31137da1ccd02f1530398d5","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            if (\u0027tags\u0027 in project.keys()) and project[\u0027tags\u0027]:"},{"line_number":227,"context_line":"                tag_list \u003d [t.strip() for t in project[\u0027tags\u0027]]"},{"line_number":228,"context_line":"                for tag in tag_list:"},{"line_number":229,"context_line":"                    notifications.Audit.created(self._DOMAIN_TAG,"},{"line_number":230,"context_line":"                                                tag, initiator)"},{"line_number":231,"context_line":"        else:"},{"line_number":232,"context_line":"            notifications.Audit.created(self._PROJECT, project_id, initiator)"}],"source_content_type":"text/x-python","patch_set":14,"id":"94730d94_d067ebeb","line":229,"range":{"start_line":229,"start_character":53,"end_line":229,"end_character":64},"in_reply_to":"0b0b472f_5e3a1618","updated":"2022-11-14 22:23:12.000000000","message":"Done","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"21bed98f5c9785014c0334f28ea21f881a61ce59","unresolved":true,"context_lines":[{"line_number":405,"context_line":"                assignment.COMPUTED_ASSIGNMENTS_REGION.invalidate()"},{"line_number":406,"context_line":"        finally:"},{"line_number":407,"context_line":"            # attempt to send audit event even if the cache invalidation raises"},{"line_number":408,"context_line":"            if project.get(\u0027is_domain\u0027):"},{"line_number":409,"context_line":"                notifications.Audit.updated(self._DOMAIN, project_id,"},{"line_number":410,"context_line":"                                            initiator)"},{"line_number":411,"context_line":"                # emit notifications for created or deleted project tags"}],"source_content_type":"text/x-python","patch_set":14,"id":"8dc61170_7d484f70","line":408,"updated":"2022-10-17 15:33:59.000000000","message":"a lot of code duplication under this if..else\n\ncan we make it something like this?\n\n  if is_project:\n      entity \u003d self._PROJECT\n      entity_tag \u003d self._PROJECT_TAG\n  else:\n      entity \u003d self._DOMAIN\n      entity_tag \u003d self._DOMAIN_TAG\n  # here parse tags, populate deleted and created sets\n  notification.Audit.updated(entity, ...)\n  for tag in created:\n      notification.Audit.created(entity_tag, ...)\n  for tag in deleted:\n      notification.Audit.deleted(entity_tag, ...)","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"8f363ccb1673adcc763f0d51966b8b0ef9f9d161","unresolved":false,"context_lines":[{"line_number":405,"context_line":"                assignment.COMPUTED_ASSIGNMENTS_REGION.invalidate()"},{"line_number":406,"context_line":"        finally:"},{"line_number":407,"context_line":"            # attempt to send audit event even if the cache invalidation raises"},{"line_number":408,"context_line":"            if project.get(\u0027is_domain\u0027):"},{"line_number":409,"context_line":"                notifications.Audit.updated(self._DOMAIN, project_id,"},{"line_number":410,"context_line":"                                            initiator)"},{"line_number":411,"context_line":"                # emit notifications for created or deleted project tags"}],"source_content_type":"text/x-python","patch_set":14,"id":"21ca2247_ed61817f","line":408,"in_reply_to":"8dc61170_7d484f70","updated":"2022-11-16 23:15:38.000000000","message":"Based on the previous comment by Gage Hugo I have removed this code duplication.","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b1c5d978cfb802c096866422ff8c0b74951eceae","unresolved":true,"context_lines":[{"line_number":421,"context_line":"                    # iterating through original tags looking for deleted tags"},{"line_number":422,"context_line":"                    for original_tag in original_tag_list:"},{"line_number":423,"context_line":"                        if original_tag not in tag_list:"},{"line_number":424,"context_line":"                            notifications.Audit.deleted(self._DOMAIN_TAG,"},{"line_number":425,"context_line":"                                                        original_tag,"},{"line_number":426,"context_line":"                                                        initiator)"},{"line_number":427,"context_line":"                if len(tag_list) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":14,"id":"fbd7eb1d_877d7133","line":424,"range":{"start_line":424,"start_character":62,"end_line":424,"end_character":73},"updated":"2022-10-24 20:27:19.000000000","message":"ditto","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"c4ea8c253b82ba1eb31137da1ccd02f1530398d5","unresolved":false,"context_lines":[{"line_number":421,"context_line":"                    # iterating through original tags looking for deleted tags"},{"line_number":422,"context_line":"                    for original_tag in original_tag_list:"},{"line_number":423,"context_line":"                        if original_tag not in tag_list:"},{"line_number":424,"context_line":"                            notifications.Audit.deleted(self._DOMAIN_TAG,"},{"line_number":425,"context_line":"                                                        original_tag,"},{"line_number":426,"context_line":"                                                        initiator)"},{"line_number":427,"context_line":"                if len(tag_list) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":14,"id":"8a4061b8_7ee3fa4f","line":424,"range":{"start_line":424,"start_character":62,"end_line":424,"end_character":73},"in_reply_to":"fbd7eb1d_877d7133","updated":"2022-11-14 22:23:12.000000000","message":"Done","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"33e0ec5b7458b9740a087b63bc66216d14a833e8","unresolved":true,"context_lines":[{"line_number":417,"context_line":"                        original_project[\u0027tags\u0027]:"},{"line_number":418,"context_line":"                    original_tag_list \u003d [t.strip() for t in"},{"line_number":419,"context_line":"                                         original_project[\u0027tags\u0027]]"},{"line_number":420,"context_line":"                if len(original_tag_list) \u003e 0:"},{"line_number":421,"context_line":"                    # iterating through original tags looking for deleted tags"},{"line_number":422,"context_line":"                    for original_tag in original_tag_list:"},{"line_number":423,"context_line":"                        if original_tag not in tag_list:"},{"line_number":424,"context_line":"                            notifications.Audit.deleted(self._DOMAIN_TAG,"},{"line_number":425,"context_line":"                                                        original_tag,"},{"line_number":426,"context_line":"                                                        initiator)"},{"line_number":427,"context_line":"                if len(tag_list) \u003e 0:"},{"line_number":428,"context_line":"                    # iterating through new tags looking for  created tags"},{"line_number":429,"context_line":"                    for tag in tag_list:"},{"line_number":430,"context_line":"                        if tag not in original_tag_list:"},{"line_number":431,"context_line":"                            notifications.Audit.created(self._DOMAIN_TAG,"},{"line_number":432,"context_line":"                                                        tag,"},{"line_number":433,"context_line":"                                                        initiator)"},{"line_number":434,"context_line":"            else:"},{"line_number":435,"context_line":"                notifications.Audit.updated(self._PROJECT, project_id,"},{"line_number":436,"context_line":"                                            initiator)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bfc9f854_34fe72c3","line":433,"range":{"start_line":420,"start_character":1,"end_line":433,"end_character":66},"updated":"2022-10-17 15:22:12.000000000","message":"it seems this whole should be replaced with sets math - if we presume that tags do not actually repeat (why would they? what is the meaning?..)\n\n  tags \u003d set(project.get(\u0027tags\u0027, []) or [])\n  original_tags \u003d set(original_project.get(\u0027tags\u0027, []) or [])\n  \n  new_tags \u003d tags - original_tags\n  deleted_tags \u003d original_tags - tags","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"f58232c7db4a3151d227d0a941c4360da1f70bb0","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                        original_project[\u0027tags\u0027]:"},{"line_number":418,"context_line":"                    original_tag_list \u003d [t.strip() for t in"},{"line_number":419,"context_line":"                                         original_project[\u0027tags\u0027]]"},{"line_number":420,"context_line":"                if len(original_tag_list) \u003e 0:"},{"line_number":421,"context_line":"                    # iterating through original tags looking for deleted tags"},{"line_number":422,"context_line":"                    for original_tag in original_tag_list:"},{"line_number":423,"context_line":"                        if original_tag not in tag_list:"},{"line_number":424,"context_line":"                            notifications.Audit.deleted(self._DOMAIN_TAG,"},{"line_number":425,"context_line":"                                                        original_tag,"},{"line_number":426,"context_line":"                                                        initiator)"},{"line_number":427,"context_line":"                if len(tag_list) \u003e 0:"},{"line_number":428,"context_line":"                    # iterating through new tags looking for  created tags"},{"line_number":429,"context_line":"                    for tag in tag_list:"},{"line_number":430,"context_line":"                        if tag not in original_tag_list:"},{"line_number":431,"context_line":"                            notifications.Audit.created(self._DOMAIN_TAG,"},{"line_number":432,"context_line":"                                                        tag,"},{"line_number":433,"context_line":"                                                        initiator)"},{"line_number":434,"context_line":"            else:"},{"line_number":435,"context_line":"                notifications.Audit.updated(self._PROJECT, project_id,"},{"line_number":436,"context_line":"                                            initiator)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ab96e796_20d26866","line":433,"range":{"start_line":420,"start_character":1,"end_line":433,"end_character":66},"in_reply_to":"bfc9f854_34fe72c3","updated":"2022-11-16 23:43:55.000000000","message":"Done","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"33e0ec5b7458b9740a087b63bc66216d14a833e8","unresolved":true,"context_lines":[{"line_number":1050,"context_line":"        project \u003d {\u0027tags\u0027: tag_list}"},{"line_number":1051,"context_line":"        self.update_project(project_id, project)"},{"line_number":1052,"context_line":"        for tag in tag_list:"},{"line_number":1053,"context_line":"            notifications.Audit.updated(self._PROJECT_TAG, tag,"},{"line_number":1054,"context_line":"                                        initiator)"},{"line_number":1055,"context_line":"        return tag_list"},{"line_number":1056,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"358781a7_5ef683af","line":1053,"updated":"2022-10-17 15:22:12.000000000","message":"is there really such a thing? isn\u0027t it simply the same as above? \u0027create\u0027 for tags that were not there and \u0027delete\u0027 for tags that are no longer there?","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"f58232c7db4a3151d227d0a941c4360da1f70bb0","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"        project \u003d {\u0027tags\u0027: tag_list}"},{"line_number":1051,"context_line":"        self.update_project(project_id, project)"},{"line_number":1052,"context_line":"        for tag in tag_list:"},{"line_number":1053,"context_line":"            notifications.Audit.updated(self._PROJECT_TAG, tag,"},{"line_number":1054,"context_line":"                                        initiator)"},{"line_number":1055,"context_line":"        return tag_list"},{"line_number":1056,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"4e2f07ac_75437e25","line":1053,"in_reply_to":"358781a7_5ef683af","updated":"2022-11-16 23:43:55.000000000","message":"Technically  - the idea of the code is the same - to send a CAFD notification about each updated tag. The difference is the API endpoint used for this. Most of the project tags operations are performed via \"openstack project set\" command where we can add or remove tags.\nI have added CADF notifications emitting for actions in tags for future needs.","commit_id":"cea2ce2b2c05de66fa41889c8104928041ba73a2"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"8315e13560e79dd77c674cda1694146dae6a1354","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        return project_ref[\u0027options\u0027].get("},{"line_number":293,"context_line":"            ro_opt.IMMUTABLE_OPT.option_name, False)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def _check_whole_subtree_is_disabled(self, project_id, subtree_list\u003dNone):"},{"line_number":296,"context_line":"        if not subtree_list:"},{"line_number":297,"context_line":"            subtree_list \u003d self.list_projects_in_subtree(project_id)"},{"line_number":298,"context_line":"        subtree_enabled \u003d [ref.get(\u0027enabled\u0027, True) for ref in subtree_list]"}],"source_content_type":"text/x-python","patch_set":16,"id":"4971b83c_1aa245cf","line":295,"in_reply_to":"1de7287a_604c5f60","updated":"2022-11-16 23:11:01.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"721af6c362125cf83aaa9f35eb7814d7d0aa6176"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"8315e13560e79dd77c674cda1694146dae6a1354","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        return project_ref[\u0027options\u0027].get("},{"line_number":293,"context_line":"            ro_opt.IMMUTABLE_OPT.option_name, False)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def _check_whole_subtree_is_disabled(self, project_id, subtree_list\u003dNone):"},{"line_number":296,"context_line":"        if not subtree_list:"},{"line_number":297,"context_line":"            subtree_list \u003d self.list_projects_in_subtree(project_id)"},{"line_number":298,"context_line":"        subtree_enabled \u003d [ref.get(\u0027enabled\u0027, True) for ref in subtree_list]"}],"source_content_type":"text/x-python","patch_set":16,"id":"ed76cdc1_6da2f5a0","line":295,"in_reply_to":"f3ee20cd_96fd752f","updated":"2022-11-16 23:11:01.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"721af6c362125cf83aaa9f35eb7814d7d0aa6176"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"8330d082652447be0987e744f5f6dfe2187e7fe7","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    _DOMAIN \u003d \u0027domain\u0027"},{"line_number":52,"context_line":"    _PROJECT \u003d \u0027project\u0027"},{"line_number":53,"context_line":"    _PROJECT_TAG \u003d \u0027project.tag\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __init__(self):"},{"line_number":56,"context_line":"        resource_driver \u003d CONF.resource.driver"}],"source_content_type":"text/x-python","patch_set":26,"id":"3f9572e3_e9861149","line":53,"updated":"2022-12-07 21:10:21.000000000","message":"What was the need for changing this? If someone is monitoring for the previous name they will be missing the notifications now.","commit_id":"c2e24a2c83b473944f4737ff608cb97d2115a013"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"3037f6612156608ad4601c76de2f312b0d428bac","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    _DOMAIN \u003d \u0027domain\u0027"},{"line_number":52,"context_line":"    _PROJECT \u003d \u0027project\u0027"},{"line_number":53,"context_line":"    _PROJECT_TAG \u003d \u0027project.tag\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __init__(self):"},{"line_number":56,"context_line":"        resource_driver \u003d CONF.resource.driver"}],"source_content_type":"text/x-python","patch_set":26,"id":"3bca7ca3_dc2cfc1a","line":53,"in_reply_to":"3db05d4a_33a31430","updated":"2022-12-20 16:35:12.000000000","message":"Done. I have changed _PROJECT_TAG value back to \u0027project tag\u0027.","commit_id":"c2e24a2c83b473944f4737ff608cb97d2115a013"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"876f4df31c0f6000188553e65e2e8e637c50cbde","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    _DOMAIN \u003d \u0027domain\u0027"},{"line_number":52,"context_line":"    _PROJECT \u003d \u0027project\u0027"},{"line_number":53,"context_line":"    _PROJECT_TAG \u003d \u0027project.tag\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def __init__(self):"},{"line_number":56,"context_line":"        resource_driver \u003d CONF.resource.driver"}],"source_content_type":"text/x-python","patch_set":26,"id":"3db05d4a_33a31430","line":53,"in_reply_to":"3f9572e3_e9861149","updated":"2022-12-07 21:34:54.000000000","message":"_PROJECT_TAG notification has never been sent before. Adding this action is actually the main goal of this patchset. \n\nTags operations notification emission was a part of a separate tags management API endpoints that are not used by either openstack cli or horizon UI. This is why in this PS I am removing those lines in methods create_project_tag(), update_progect_tags() and delete_progect_tag(). These methods are calling self.update_project(project_id, {\u0027tags\u0027: project[\u0027tags\u0027]}) anyway to perform the action anyway. And update_project() is now sending the notifications about changes in the tags collection(if any).\n\nAdding a dot into the name makes \"event_type\" and \"action\" look consistent - the dot is used there as a separator already: \n\n{\"message_id\": \"4db247d8-9b5b-4ad8-aa64-92a21b74aecb\", \"publisher_id\": \"identity.keystone-api-bd7b488d9-f5k6l\", \"event_type\": \"identity.project.tag.created\", \"priority\": \"INFO\", \"payload\": {\"typeURI\": \"http://schemas.dmtf.org/cloud/audit/1.0/event\", \"eventType\": \"activity\", \"id\": \"52765b59-d733-51b1-952e-686f1ec57ac8\", \"eventTime\": \"2022-11-28T23:33:08.271545+0000\", \"action\": \"created.project.tag\", \"outcome\": \"success\", \"observer\": {\"id\": \"21fef8303aab4749b35045b00f817529\", \"typeURI\": \"service/security\"}, \"initiator\": {\"id\": \"db64fadaa2374afbabeab9ca3613a661\", \"typeURI\": \"service/security/account/user\", \"host\": {\"address\": \"1.2.3.4\", \"agent\": \"python-keystoneclient\"}, \"user_id\": \"db64fadaa2374afbabeab9ca3613a661\", \"project_id\": \"da7ff281d5ef49a1a8c2540fda9dd6f8\", \"request_id\": \"req-1994fae8-809d-4e53-aeb7-5916d6f8969c\", \"username\": \"admin\"}, \"target\": {\"id\": \"TAG5\", \"typeURI\": \"unknown\"}, \"resource_info\": \"TAG5\"}, \"timestamp\": \"2022-11-28 23:33:08.271899\"}\n\nThanks","commit_id":"c2e24a2c83b473944f4737ff608cb97d2115a013"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"8330d082652447be0987e744f5f6dfe2187e7fe7","unresolved":true,"context_lines":[{"line_number":418,"context_line":"                    notifications.Audit.disabled(self._DOMAIN, project_id,"},{"line_number":419,"context_line":"                                                 public\u003dFalse)"},{"line_number":420,"context_line":"            else:"},{"line_number":421,"context_line":"                notifications.Audit.updated(self._PROJECT, project_id,"},{"line_number":422,"context_line":"                                            initiator)"},{"line_number":423,"context_line":"            # emit notifications for created or deleted project tags"},{"line_number":424,"context_line":"            tags \u003d set(project.get(\u0027tags\u0027, []) or [])"}],"source_content_type":"text/x-python","patch_set":26,"id":"11216805_262e7820","line":421,"updated":"2022-12-07 21:10:21.000000000","message":"A domain is still technically a project, and placing this in the conditional removes a notification that was previously sent. This change also seems unrelated.","commit_id":"c2e24a2c83b473944f4737ff608cb97d2115a013"},{"author":{"_account_id":34520,"name":"Sergiy Markin","email":"smarkin@mirantis.com","username":"sm515x"},"change_message_id":"e808c0413087e30f8439834c381052c759e0c32f","unresolved":false,"context_lines":[{"line_number":418,"context_line":"                    notifications.Audit.disabled(self._DOMAIN, project_id,"},{"line_number":419,"context_line":"                                                 public\u003dFalse)"},{"line_number":420,"context_line":"            else:"},{"line_number":421,"context_line":"                notifications.Audit.updated(self._PROJECT, project_id,"},{"line_number":422,"context_line":"                                            initiator)"},{"line_number":423,"context_line":"            # emit notifications for created or deleted project tags"},{"line_number":424,"context_line":"            tags \u003d set(project.get(\u0027tags\u0027, []) or [])"}],"source_content_type":"text/x-python","patch_set":26,"id":"e91d5b35_c1add9b5","line":421,"in_reply_to":"11216805_262e7820","updated":"2022-12-07 21:45:52.000000000","message":"Kristi,\n\nyou are right. A domain is a project. This is why I am sending common notifications for tags created/deleted. This code is not under \"if project.get(\u0027is_domain\u0027):\" condition.","commit_id":"c2e24a2c83b473944f4737ff608cb97d2115a013"}]}
