)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b9866b9cb37dc5a3c60c165b3fc07a7178e51457","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"fba6808d_608b2858","updated":"2023-05-16 10:17:11.000000000","message":"Done","commit_id":"4faf511f4ffb2222cde2d011d8f0a4d6e8407c6d"}],"openstack/exceptions.py":[{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"ee6f39471fe8227b4b41d50659333f5b103a2831","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        cls \u003d BadRequestException"},{"line_number":204,"context_line":"    elif response.status_code \u003d\u003d 412:"},{"line_number":205,"context_line":"        cls \u003d PreconditionFailedException"},{"line_number":206,"context_line":"    elif response.status_code \u003d\u003d 403:"},{"line_number":207,"context_line":"        cls \u003d ForbiddenException"},{"line_number":208,"context_line":"    else:"},{"line_number":209,"context_line":"        cls \u003d HttpException"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_6c0a07d2","line":207,"range":{"start_line":206,"start_character":4,"end_line":207,"end_character":32},"updated":"2020-06-26 11:40:06.000000000","message":"Reverting this since is impacting other projects too.","commit_id":"7d65a2aa301af3626b7b252b0058bc1f3b79c0f3"}],"openstack/identity/v3/access_rule.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"abcac1424b280c8285c42569c8021d294b45a3bc","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    # Properties"},{"line_number":27,"context_line":"    #: User ID using access rule. *Type: string*"},{"line_number":28,"context_line":"    user_id \u003d resource.URI(\u0027user_id\u0027)"},{"line_number":29,"context_line":"    #: Access rule ID. *Type: string*"},{"line_number":30,"context_line":"    access_rule_id \u003d resource.URI(\u0027access_rule_id\u0027)"},{"line_number":31,"context_line":"    #: The links for the access rule resource."},{"line_number":32,"context_line":"    links \u003d resource.Body(\u0027links\u0027)"},{"line_number":33,"context_line":"    #: Path that the application credential is permitted to access."}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_5b1dccbb","line":30,"range":{"start_line":29,"start_character":4,"end_line":30,"end_character":51},"updated":"2020-06-18 03:07:02.000000000","message":"Why do you need this? \u0027id\u0027 property is defined in resoruce.Resource, so I wonder why you need \"access_rule_id\" too.\n\nIn addition, I don\u0027t find \u0027access_rule_id\u0027 field in the API reference.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"0e7be0e3a092879716de4f7e29cbd8ba23cc3215","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    # Properties"},{"line_number":27,"context_line":"    #: User ID using access rule. *Type: string*"},{"line_number":28,"context_line":"    user_id \u003d resource.URI(\u0027user_id\u0027)"},{"line_number":29,"context_line":"    #: Access rule ID. *Type: string*"},{"line_number":30,"context_line":"    access_rule_id \u003d resource.URI(\u0027access_rule_id\u0027)"},{"line_number":31,"context_line":"    #: The links for the access rule resource."},{"line_number":32,"context_line":"    links \u003d resource.Body(\u0027links\u0027)"},{"line_number":33,"context_line":"    #: Path that the application credential is permitted to access."}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_e9b5ccce","line":30,"range":{"start_line":29,"start_character":4,"end_line":30,"end_character":51},"in_reply_to":"bf51134e_5210ed01","updated":"2020-06-19 22:25:31.000000000","message":"I don\u0027t think this is needed, I can run all the methods without it.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"4b2d1218d1d3034fed4c96ca295543fb00b71428","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    # Properties"},{"line_number":27,"context_line":"    #: User ID using access rule. *Type: string*"},{"line_number":28,"context_line":"    user_id \u003d resource.URI(\u0027user_id\u0027)"},{"line_number":29,"context_line":"    #: Access rule ID. *Type: string*"},{"line_number":30,"context_line":"    access_rule_id \u003d resource.URI(\u0027access_rule_id\u0027)"},{"line_number":31,"context_line":"    #: The links for the access rule resource."},{"line_number":32,"context_line":"    links \u003d resource.Body(\u0027links\u0027)"},{"line_number":33,"context_line":"    #: Path that the application credential is permitted to access."}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_5210ed01","line":30,"range":{"start_line":29,"start_character":4,"end_line":30,"end_character":51},"in_reply_to":"bf51134e_5b1dccbb","updated":"2020-06-19 09:16:26.000000000","message":"\"access_rule_id\" is used for GET and delete request for access_rule [1]\n\n[1] https://docs.openstack.org/api-ref/identity/v3/#show-access-rule-details","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"ada473c4175d5381824f7098100e51efcc116d3c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    # Properties"},{"line_number":27,"context_line":"    #: User ID using access rule. *Type: string*"},{"line_number":28,"context_line":"    user_id \u003d resource.URI(\u0027user_id\u0027)"},{"line_number":29,"context_line":"    #: Access rule ID. *Type: string*"},{"line_number":30,"context_line":"    access_rule_id \u003d resource.URI(\u0027access_rule_id\u0027)"},{"line_number":31,"context_line":"    #: The links for the access rule resource."},{"line_number":32,"context_line":"    links \u003d resource.Body(\u0027links\u0027)"},{"line_number":33,"context_line":"    #: Path that the application credential is permitted to access."}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_3aba166d","line":30,"range":{"start_line":29,"start_character":4,"end_line":30,"end_character":51},"in_reply_to":"bf51134e_e9b5ccce","updated":"2020-06-25 08:37:58.000000000","message":"I removed it. Since I was able to run all the methods without it.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"}],"openstack/tests/functional/identity/v3/test_access_rule.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"0e7be0e3a092879716de4f7e29cbd8ba23cc3215","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        app_creds \u003d self.conn.identity.create_application_credential("},{"line_number":25,"context_line":"            user\u003dself.user_id, name\u003d\u0027app_cred\u0027,"},{"line_number":26,"context_line":"            access_rules\u003d[{\"path\": \"/v2.0/metrics\","},{"line_number":27,"context_line":"                           \"id\": \"07d719df00f349ef8de77d542edf010c\","},{"line_number":28,"context_line":"                           \"service\": \"monitoring\", \"method\": \"GET\"}"},{"line_number":29,"context_line":"                          ],"},{"line_number":30,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_09b760f8","line":27,"updated":"2020-06-19 22:25:31.000000000","message":"The access rule ID shouldn\u0027t need to be specified at creation time","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7e4b1f66b6413ef3e2bca1f26a183dbab9fdf971","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        app_creds \u003d self.conn.identity.create_application_credential("},{"line_number":25,"context_line":"            user\u003dself.user_id, name\u003d\u0027app_cred\u0027,"},{"line_number":26,"context_line":"            access_rules\u003d[{\"path\": \"/v2.0/metrics\","},{"line_number":27,"context_line":"                           \"id\": \"07d719df00f349ef8de77d542edf010c\","},{"line_number":28,"context_line":"                           \"service\": \"monitoring\", \"method\": \"GET\"}"},{"line_number":29,"context_line":"                          ],"},{"line_number":30,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_a53da990","line":27,"in_reply_to":"bf51134e_09b760f8","updated":"2020-06-22 09:06:58.000000000","message":"Do you suggest changing the test case first by creating a app cred without access_rules and then updating the same app_creds with access_rules?","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"c0eec1a243265117f5003b2856ab083cf74e95d2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        app_creds \u003d self.conn.identity.create_application_credential("},{"line_number":25,"context_line":"            user\u003dself.user_id, name\u003d\u0027app_cred\u0027,"},{"line_number":26,"context_line":"            access_rules\u003d[{\"path\": \"/v2.0/metrics\","},{"line_number":27,"context_line":"                           \"id\": \"07d719df00f349ef8de77d542edf010c\","},{"line_number":28,"context_line":"                           \"service\": \"monitoring\", \"method\": \"GET\"}"},{"line_number":29,"context_line":"                          ],"},{"line_number":30,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_c402510b","line":27,"in_reply_to":"bf51134e_a53da990","updated":"2020-06-22 22:37:11.000000000","message":"Colleen just suggests not to specify \u0027id\u0027 in access_rules.\nYou can get ID of the created access rule from app_creds, so I don\u0027t see what is your problem....","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"ada473c4175d5381824f7098100e51efcc116d3c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        app_creds \u003d self.conn.identity.create_application_credential("},{"line_number":25,"context_line":"            user\u003dself.user_id, name\u003d\u0027app_cred\u0027,"},{"line_number":26,"context_line":"            access_rules\u003d[{\"path\": \"/v2.0/metrics\","},{"line_number":27,"context_line":"                           \"id\": \"07d719df00f349ef8de77d542edf010c\","},{"line_number":28,"context_line":"                           \"service\": \"monitoring\", \"method\": \"GET\"}"},{"line_number":29,"context_line":"                          ],"},{"line_number":30,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_baa58649","line":27,"in_reply_to":"bf51134e_c402510b","updated":"2020-06-25 08:37:58.000000000","message":"Sorry for the misconception. I mixed up access rule ID with whole access_rule. Thanks for the clarification.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"0e7be0e3a092879716de4f7e29cbd8ba23cc3215","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def test_delete_access_rule(self):"},{"line_number":55,"context_line":"        app_creds \u003d self._create_application_credential_with_access_rule()"},{"line_number":56,"context_line":"        access_rule_id \u003d app_creds[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":57,"context_line":"        self.assertRaises(exceptions.HttpException,"},{"line_number":58,"context_line":"                          self.conn.identity.delete_access_rule,"},{"line_number":59,"context_line":"                          user\u003dself.user_id,"},{"line_number":60,"context_line":"                          access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_a992b449","line":57,"range":{"start_line":57,"start_character":26,"end_line":57,"end_character":50},"updated":"2020-06-19 22:25:31.000000000","message":"This is too generic, if an error is expected then we should be specific about which HTTP response it is.\n\nThis is testing the negative case when deleting the access rule is prevented, but you should also test the positive case when deletion is allowed (after the application credential is deleted). This would also fix the problem that currently the access rule is orphaned and remains in the database after the tests have run.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"ada473c4175d5381824f7098100e51efcc116d3c","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def test_delete_access_rule(self):"},{"line_number":55,"context_line":"        app_creds \u003d self._create_application_credential_with_access_rule()"},{"line_number":56,"context_line":"        access_rule_id \u003d app_creds[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":57,"context_line":"        self.assertRaises(exceptions.HttpException,"},{"line_number":58,"context_line":"                          self.conn.identity.delete_access_rule,"},{"line_number":59,"context_line":"                          user\u003dself.user_id,"},{"line_number":60,"context_line":"                          access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_5a454a6f","line":57,"range":{"start_line":57,"start_character":26,"end_line":57,"end_character":50},"in_reply_to":"bf51134e_a992b449","updated":"2020-06-25 08:37:58.000000000","message":"Colleen, I updated it with ForbiddenException, But it is a case of ForbiddenNotSecurity, is it fine to display as Forbidden one and adding more information in the test case?","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e22658937511f2af4877e9bb866acc1f52931ef","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        app_creds \u003d self._create_application_credential_with_access_rule()"},{"line_number":56,"context_line":"        access_rule_id \u003d app_creds[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":57,"context_line":"        self.assertRaises(exceptions.HttpException,"},{"line_number":58,"context_line":"                          self.conn.identity.delete_access_rule,"},{"line_number":59,"context_line":"                          user\u003dself.user_id,"},{"line_number":60,"context_line":"                          access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_d73321f5","line":58,"updated":"2020-06-22 22:42:00.000000000","message":"I wonder why delete_access_rule is expected to fail here.\nCan\u0027t we delete an access rule created by a same user?\n\nOr, if you test the deletion of the access rule with a different user, the test name should describe what is tested.\n\nAs summary, normal test_delete_xxxx tests succeed to delete corresponding resources, but it is different. You need more description.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"797041733ac123a36c5dfc84878a528fe4832017","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        app_creds \u003d self._create_application_credential_with_access_rule()"},{"line_number":56,"context_line":"        access_rule_id \u003d app_creds[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":57,"context_line":"        self.assertRaises(exceptions.HttpException,"},{"line_number":58,"context_line":"                          self.conn.identity.delete_access_rule,"},{"line_number":59,"context_line":"                          user\u003dself.user_id,"},{"line_number":60,"context_line":"                          access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_904c0f43","line":58,"in_reply_to":"bf51134e_3717fd53","updated":"2020-06-23 04:50:47.000000000","message":"Ah, I see. Thanks for clarification. L.55 assigns the created access rule to an application credential.\n\nI would like to see two comments to avoid similar confusion to what I had here: the one is L.57 should fail as ..... and the other is the final deletion of the access rule is tested via addCleanup.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"ada473c4175d5381824f7098100e51efcc116d3c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        app_creds \u003d self._create_application_credential_with_access_rule()"},{"line_number":56,"context_line":"        access_rule_id \u003d app_creds[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":57,"context_line":"        self.assertRaises(exceptions.HttpException,"},{"line_number":58,"context_line":"                          self.conn.identity.delete_access_rule,"},{"line_number":59,"context_line":"                          user\u003dself.user_id,"},{"line_number":60,"context_line":"                          access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_7a5dae45","line":58,"in_reply_to":"bf51134e_904c0f43","updated":"2020-06-25 08:37:58.000000000","message":"Thanks Akihiro for pointing this out. I totally agree it can create confusion. I added the comments for the test_delete_access_rule_* test cases as per your suggestion.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"55ea89bc4b477a80677cce2719c4ad7846141d53","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        app_creds \u003d self._create_application_credential_with_access_rule()"},{"line_number":56,"context_line":"        access_rule_id \u003d app_creds[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":57,"context_line":"        self.assertRaises(exceptions.HttpException,"},{"line_number":58,"context_line":"                          self.conn.identity.delete_access_rule,"},{"line_number":59,"context_line":"                          user\u003dself.user_id,"},{"line_number":60,"context_line":"                          access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_3717fd53","line":58,"in_reply_to":"bf51134e_d73321f5","updated":"2020-06-23 00:11:55.000000000","message":"\u003e I wonder why delete_access_rule is expected to fail here.\n \u003e Can\u0027t we delete an access rule created by a same user?\n \u003e \n\nIt is expected to fail if it is still in use by an application credential. So I think it is fine to test the failure in this case, but it should also test a successful deletion by first deleting the app cred that is holding it.","commit_id":"cc6b3a9c51d2eac0067f8101528886d9e32a2637"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"12f495b9c495d042a88fb602143ec07b96577920","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertRaises(exceptions.HttpException,"},{"line_number":62,"context_line":"                          self.conn.identity.delete_access_rule,"},{"line_number":63,"context_line":"                          user\u003dself.user_id,"},{"line_number":64,"context_line":"                          access_rule\u003daccess_rule_id)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test_delete_access_rule_not_in_use(self):"},{"line_number":67,"context_line":"        app_cred \u003d self._create_application_credential_with_access_rule()"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf51134e_18656546","line":64,"updated":"2020-06-29 23:53:50.000000000","message":"This leaves behind an access rule in the database. It needs to be cleaned up somehow. You could either combine these two delete tests into a single test so that it does 1) fail to delete the access rule 2) delete the app cred 3) succeed at deleting the access rule, or add some kind of cleanup for it.","commit_id":"117e11d7d882d01ab602da44268ea29458690ed9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6220a35bdd8ea7d739d0a5b85101d25210463b88","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        access_rule_id \u003d app_cred[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":48,"context_line":"        access_rules \u003d self.conn.identity.access_rules("},{"line_number":49,"context_line":"            user\u003dself.user_id"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"        for access_rule in access_rules:"},{"line_number":52,"context_line":"            self.assertEqual(app_cred[\u0027user_id\u0027], self.user_id)"},{"line_number":53,"context_line":"            self.assertEqual(access_rule_id, access_rule[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_0a65f2e1","line":50,"updated":"2020-07-01 12:39:04.000000000","message":"It looks better to check the length of access_rules.","commit_id":"b951876769f1ea7cb14fd4912212c6d006b6b3a6"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"fa3fac49d56d5c2a7c02b9a5aceb0d5edf035af3","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        access_rule_id \u003d app_cred[\u0027access_rules\u0027][0][\u0027id\u0027]"},{"line_number":48,"context_line":"        access_rules \u003d self.conn.identity.access_rules("},{"line_number":49,"context_line":"            user\u003dself.user_id"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"        for access_rule in access_rules:"},{"line_number":52,"context_line":"            self.assertEqual(app_cred[\u0027user_id\u0027], self.user_id)"},{"line_number":53,"context_line":"            self.assertEqual(access_rule_id, access_rule[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_86f448d1","line":50,"in_reply_to":"bf51134e_0a65f2e1","updated":"2020-07-02 15:12:23.000000000","message":"Done","commit_id":"b951876769f1ea7cb14fd4912212c6d006b6b3a6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6220a35bdd8ea7d739d0a5b85101d25210463b88","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # delete application credential first to delete access rule"},{"line_number":67,"context_line":"        self.conn.identity.delete_application_credential("},{"line_number":68,"context_line":"            user\u003dself.user_id, application_credential\u003dapp_cred[\u0027id\u0027]"},{"line_number":69,"context_line":"        )"},{"line_number":70,"context_line":"        # delete orphaned access rules"},{"line_number":71,"context_line":"        self.conn.identity.delete_access_rule(user\u003dself.user_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_0a9332a5","line":68,"updated":"2020-07-01 12:39:04.000000000","message":"delete_application_credential is called twice here and addCleanup. What happens in addCleanup?","commit_id":"b951876769f1ea7cb14fd4912212c6d006b6b3a6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"bd96bb7006ea62fe119b7f173ef6ada2cbbb8c93","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # delete application credential first to delete access rule"},{"line_number":67,"context_line":"        self.conn.identity.delete_application_credential("},{"line_number":68,"context_line":"            user\u003dself.user_id, application_credential\u003dapp_cred[\u0027id\u0027]"},{"line_number":69,"context_line":"        )"},{"line_number":70,"context_line":"        # delete orphaned access rules"},{"line_number":71,"context_line":"        self.conn.identity.delete_access_rule(user\u003dself.user_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_5475c8cb","line":68,"in_reply_to":"bf51134e_0a9332a5","updated":"2020-07-01 17:29:17.000000000","message":"The delete function has ignore_missing\u003dTrue by default so the second delete call doesn\u0027t error.","commit_id":"b951876769f1ea7cb14fd4912212c6d006b6b3a6"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6220a35bdd8ea7d739d0a5b85101d25210463b88","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        )"},{"line_number":70,"context_line":"        # delete orphaned access rules"},{"line_number":71,"context_line":"        self.conn.identity.delete_access_rule(user\u003dself.user_id,"},{"line_number":72,"context_line":"                                              access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_0ad8527d","line":72,"updated":"2020-07-01 12:39:04.000000000","message":"The identity API does not provide an API to create an access_rule. This means an access_rule is created as part of creating an application credential.\n\nIt leads to a question when a deletion of access rule is used.\n\nI believe a functional test should cover real use cases.","commit_id":"b951876769f1ea7cb14fd4912212c6d006b6b3a6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"bd96bb7006ea62fe119b7f173ef6ada2cbbb8c93","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        )"},{"line_number":70,"context_line":"        # delete orphaned access rules"},{"line_number":71,"context_line":"        self.conn.identity.delete_access_rule(user\u003dself.user_id,"},{"line_number":72,"context_line":"                                              access_rule\u003daccess_rule_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_f4497c8b","line":72,"in_reply_to":"bf51134e_0ad8527d","updated":"2020-07-01 17:29:17.000000000","message":"I\u0027m not sure I understand this concern. Deleting an access rule is a valid part of the API and a real thing users would do, mainly if they want to clean up unused rules from the database.","commit_id":"b951876769f1ea7cb14fd4912212c6d006b6b3a6"}]}
