)]}'
{"keystone/api/credentials.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a03592f332331b3f24d2aa3e348558c6e2ba8f4a","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _list_credentials(self):"},{"line_number":77,"context_line":"        filters \u003d [\u0027user_id\u0027, \u0027type\u0027]"},{"line_number":78,"context_line":"        # WARNING(lbragstad): Need to double check this statement because it"},{"line_number":79,"context_line":"        # might not protect against a user calling `GET /v3/credentials` and"},{"line_number":80,"context_line":"        # seeing credentials that don\u0027t belong to them! I\u0027m still trying to"},{"line_number":81,"context_line":"        # figure out a way to invoke that check with oslo.policy."}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_1bf3a375","line":78,"updated":"2018-08-29 17:06:38.000000000","message":"Need to amend one of the test cases to cover this.","commit_id":"c06bd1ce6f876866f8b1b663637324f24a510f9f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1152429bcf208fa01862ab7609c8d3e902eeb562","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _list_credentials(self):"},{"line_number":77,"context_line":"        filters \u003d [\u0027user_id\u0027, \u0027type\u0027]"},{"line_number":78,"context_line":"        # WARNING(lbragstad): Need to double check this statement because it"},{"line_number":79,"context_line":"        # might not protect against a user calling `GET /v3/credentials` and"},{"line_number":80,"context_line":"        # seeing credentials that don\u0027t belong to them! I\u0027m still trying to"},{"line_number":81,"context_line":"        # figure out a way to invoke that check with oslo.policy."}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_5f3900d6","line":78,"in_reply_to":"3f79a3b5_1bf3a375","updated":"2018-08-29 21:50:47.000000000","message":"Done","commit_id":"c06bd1ce6f876866f8b1b663637324f24a510f9f"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"831fb0f2d71c4479f9e03b0a26499cfc2b715009","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        try:"},{"line_number":118,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:create_credential\u0027)"},{"line_number":119,"context_line":"        except exception.ForbiddenAction:"},{"line_number":120,"context_line":"            if credential[\u0027user_id\u0027] \u003d\u003d self.oslo_context.user_id:"},{"line_number":121,"context_line":"                pass"},{"line_number":122,"context_line":"            else:"},{"line_number":123,"context_line":"                raise"},{"line_number":124,"context_line":"        validation.lazy_validate(schema.credential_create, credential)"},{"line_number":125,"context_line":"        trust_id \u003d getattr(self.oslo_context, \u0027trust_id\u0027, None)"},{"line_number":126,"context_line":"        ref \u003d self._assign_unique_id("}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_10384eec","line":123,"range":{"start_line":120,"start_character":12,"end_line":123,"end_character":21},"updated":"2018-09-12 07:15:42.000000000","message":"Can we get rid of pass and do it like-\n\nif not (credential[\u0027user_id\u0027] \u003d\u003d self.oslo_context.user_id):\n       raise","commit_id":"784169cca37d6fa26b2aa9e49d1a1bd6e9bd054d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5d2ef32fbe9d07bf2e5940447e79965f5f6d02c2","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        try:"},{"line_number":118,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:create_credential\u0027)"},{"line_number":119,"context_line":"        except exception.ForbiddenAction:"},{"line_number":120,"context_line":"            if credential[\u0027user_id\u0027] \u003d\u003d self.oslo_context.user_id:"},{"line_number":121,"context_line":"                pass"},{"line_number":122,"context_line":"            else:"},{"line_number":123,"context_line":"                raise"},{"line_number":124,"context_line":"        validation.lazy_validate(schema.credential_create, credential)"},{"line_number":125,"context_line":"        trust_id \u003d getattr(self.oslo_context, \u0027trust_id\u0027, None)"},{"line_number":126,"context_line":"        ref \u003d self._assign_unique_id("}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_05313ced","line":123,"range":{"start_line":120,"start_character":12,"end_line":123,"end_character":21},"in_reply_to":"3f79a3b5_10384eec","updated":"2018-09-20 21:29:13.000000000","message":"Done","commit_id":"784169cca37d6fa26b2aa9e49d1a1bd6e9bd054d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"daba97bb6b41b3ba2f4ee9047ff8c7e168945412","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":103,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":104,"context_line":"        except exception.NotFound:"},{"line_number":105,"context_line":"            raise exception.ForbiddenAction"},{"line_number":106,"context_line":"        ENFORCER.enforce_call("},{"line_number":107,"context_line":"            action\u003d\u0027identity:get_credential\u0027, target_attr\u003dtarget"},{"line_number":108,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_660810d8","line":105,"range":{"start_line":104,"start_character":0,"end_line":105,"end_character":43},"updated":"2018-10-17 16:39:08.000000000","message":"This isn\u0027t tested","commit_id":"96c8b000254ee8962cb0d4462bc82e4a537a220f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cfcc3bf4ae30bf4ff7757649e1781bc3990048a2","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":103,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":104,"context_line":"        except exception.NotFound:"},{"line_number":105,"context_line":"            raise exception.ForbiddenAction"},{"line_number":106,"context_line":"        ENFORCER.enforce_call("},{"line_number":107,"context_line":"            action\u003d\u0027identity:get_credential\u0027, target_attr\u003dtarget"},{"line_number":108,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_0cd13df9","line":105,"range":{"start_line":104,"start_character":0,"end_line":105,"end_character":43},"in_reply_to":"3f79a3b5_660810d8","updated":"2018-10-17 18:09:13.000000000","message":"Done","commit_id":"96c8b000254ee8962cb0d4462bc82e4a537a220f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"daba97bb6b41b3ba2f4ee9047ff8c7e168945412","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":138,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":139,"context_line":"        except exception.NotFound:"},{"line_number":140,"context_line":"            raise exception.ForbiddenAction"},{"line_number":141,"context_line":"        ENFORCER.enforce_call("},{"line_number":142,"context_line":"            action\u003d\u0027identity:update_credential\u0027, target_attr\u003dtarget"},{"line_number":143,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_26f218e6","line":140,"range":{"start_line":139,"start_character":0,"end_line":140,"end_character":43},"updated":"2018-10-17 16:39:08.000000000","message":"This isn\u0027t tested","commit_id":"96c8b000254ee8962cb0d4462bc82e4a537a220f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cfcc3bf4ae30bf4ff7757649e1781bc3990048a2","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":138,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":139,"context_line":"        except exception.NotFound:"},{"line_number":140,"context_line":"            raise exception.ForbiddenAction"},{"line_number":141,"context_line":"        ENFORCER.enforce_call("},{"line_number":142,"context_line":"            action\u003d\u0027identity:update_credential\u0027, target_attr\u003dtarget"},{"line_number":143,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_ecd3a101","line":140,"range":{"start_line":139,"start_character":0,"end_line":140,"end_character":43},"in_reply_to":"3f79a3b5_26f218e6","updated":"2018-10-17 18:09:13.000000000","message":"Done","commit_id":"96c8b000254ee8962cb0d4462bc82e4a537a220f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"daba97bb6b41b3ba2f4ee9047ff8c7e168945412","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        try:"},{"line_number":154,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":155,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":156,"context_line":"        except exception.NotFound:"},{"line_number":157,"context_line":"            raise exception.ForbiddenAction"},{"line_number":158,"context_line":"        ENFORCER.enforce_call("},{"line_number":159,"context_line":"            action\u003d\u0027identity:delete_credential\u0027, target_attr\u003dtarget"},{"line_number":160,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_e6fbc0bc","line":157,"range":{"start_line":156,"start_character":0,"end_line":157,"end_character":43},"updated":"2018-10-17 16:39:08.000000000","message":"This isn\u0027t tested","commit_id":"96c8b000254ee8962cb0d4462bc82e4a537a220f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cfcc3bf4ae30bf4ff7757649e1781bc3990048a2","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        try:"},{"line_number":154,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":155,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":156,"context_line":"        except exception.NotFound:"},{"line_number":157,"context_line":"            raise exception.ForbiddenAction"},{"line_number":158,"context_line":"        ENFORCER.enforce_call("},{"line_number":159,"context_line":"            action\u003d\u0027identity:delete_credential\u0027, target_attr\u003dtarget"},{"line_number":160,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_4cc7353f","line":157,"range":{"start_line":156,"start_character":0,"end_line":157,"end_character":43},"in_reply_to":"3f79a3b5_e6fbc0bc","updated":"2018-10-17 18:09:13.000000000","message":"Done","commit_id":"96c8b000254ee8962cb0d4462bc82e4a537a220f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8c57b3d9feb679b71154c3326ea2e6688d7672ea","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":103,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":104,"context_line":"        except exception.NotFound:"},{"line_number":105,"context_line":"            try:"},{"line_number":106,"context_line":"                # Since the target doesn\u0027t actually exist we don\u0027t need to"},{"line_number":107,"context_line":"                # populate it for policy enforcement"},{"line_number":108,"context_line":"                ENFORCER.enforce_call(action\u003d\u0027identity:get_credential\u0027)"},{"line_number":109,"context_line":"            except exception.ForbiddenAction:"},{"line_number":110,"context_line":"                # NOTE(lbragstad): If the user is actually unauthorized to"},{"line_number":111,"context_line":"                # access this API, then we need to raise 403 to prevent them"},{"line_number":112,"context_line":"                # from discovering valid credential UUIDs"},{"line_number":113,"context_line":"                raise"},{"line_number":114,"context_line":"            # NOTE(lbragstad): If the user is authorized to access the API,"},{"line_number":115,"context_line":"            # then we should return a 404 since they should know that the"},{"line_number":116,"context_line":"            # resource doesn\u0027t exist."},{"line_number":117,"context_line":"            raise"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        ENFORCER.enforce_call("},{"line_number":120,"context_line":"            action\u003d\u0027identity:get_credential\u0027, target_attr\u003dtarget"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_a08e08d5","line":117,"range":{"start_line":104,"start_character":0,"end_line":117,"end_character":17},"updated":"2018-10-17 21:36:53.000000000","message":"This can actually be simplified to the following:\n\n  except exception.NotFound:\n      ENFORCER.enforce_call(\n          action\u003d\u0027identity:get_credential\u0027\n      )\n      raise","commit_id":"636abc6fa6478dab97734fc55e384bafa958c360"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"775868ffc2adaa71ee93cbe764a3446c3b07f9a8","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":103,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":104,"context_line":"        except exception.NotFound:"},{"line_number":105,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:get_credential\u0027)"},{"line_number":106,"context_line":"            raise"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_f3c7dc3c","line":104,"updated":"2018-10-18 23:31:09.000000000","message":"See below comment re build_target","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"775868ffc2adaa71ee93cbe764a3446c3b07f9a8","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        credential \u003d flask.request.json.get(\u0027credential\u0027, {})"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:create_credential\u0027)"},{"line_number":126,"context_line":"        except exception.ForbiddenAction:"},{"line_number":127,"context_line":"            if not credential[\u0027user_id\u0027] \u003d\u003d self.oslo_context.user_id:"},{"line_number":128,"context_line":"                raise"},{"line_number":129,"context_line":"        validation.lazy_validate(schema.credential_create, credential)"},{"line_number":130,"context_line":"        trust_id \u003d getattr(self.oslo_context, \u0027trust_id\u0027, None)"},{"line_number":131,"context_line":"        ref \u003d self._assign_unique_id("}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_f3c27c35","line":128,"range":{"start_line":126,"start_character":0,"end_line":128,"end_character":21},"updated":"2018-10-18 23:31:09.000000000","message":"Shouldn\u0027t this go in the policy, so you\u0027d create a target dict with the credential in it and then do a check like:\n\nuser_id:%(target.credential.user_id) \n\nThis applies to all the other try/excepts I am not a fan of the try/except in the view if we can avoid it.","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"53abe7d4a43570e654197c11be042ed7a54f7530","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        credential \u003d flask.request.json.get(\u0027credential\u0027, {})"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:create_credential\u0027)"},{"line_number":126,"context_line":"        except exception.ForbiddenAction:"},{"line_number":127,"context_line":"            if not credential[\u0027user_id\u0027] \u003d\u003d self.oslo_context.user_id:"},{"line_number":128,"context_line":"                raise"},{"line_number":129,"context_line":"        validation.lazy_validate(schema.credential_create, credential)"},{"line_number":130,"context_line":"        trust_id \u003d getattr(self.oslo_context, \u0027trust_id\u0027, None)"},{"line_number":131,"context_line":"        ref \u003d self._assign_unique_id("}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_f5bb0e0d","line":128,"range":{"start_line":126,"start_character":0,"end_line":128,"end_character":21},"in_reply_to":"3f79a3b5_f3c27c35","updated":"2018-10-22 17:27:43.000000000","message":"Aha - yeah, you\u0027re right. This must have been leftover cruft before I came up with the current policy check strings.","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"775868ffc2adaa71ee93cbe764a3446c3b07f9a8","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def patch(self, credential_id):"},{"line_number":137,"context_line":"        # Update Credential"},{"line_number":138,"context_line":"        try:"},{"line_number":139,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":140,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":141,"context_line":"        except exception.NotFound:"},{"line_number":142,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:update_credential\u0027)"},{"line_number":143,"context_line":"            raise"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        ENFORCER.enforce_call("},{"line_number":146,"context_line":"            action\u003d\u0027identity:update_credential\u0027, target_attr\u003dtarget"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_13e138d0","line":143,"range":{"start_line":138,"start_character":0,"end_line":143,"end_character":17},"updated":"2018-10-18 23:31:09.000000000","message":"Suggest using the build_target argument for enforce_call(), see https://github.com/openstack/keystone/blob/9c91aa74daba42145c07d5dcc75592812a631701/keystone/api/system.py#L60","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6f0a014e710bf31cc4f10a28c217e2f51f50e50f","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def patch(self, credential_id):"},{"line_number":137,"context_line":"        # Update Credential"},{"line_number":138,"context_line":"        try:"},{"line_number":139,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":140,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":141,"context_line":"        except exception.NotFound:"},{"line_number":142,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:update_credential\u0027)"},{"line_number":143,"context_line":"            raise"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        ENFORCER.enforce_call("},{"line_number":146,"context_line":"            action\u003d\u0027identity:update_credential\u0027, target_attr\u003dtarget"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_ba24a5c4","line":143,"range":{"start_line":138,"start_character":0,"end_line":143,"end_character":17},"in_reply_to":"3f79a3b5_13e138d0","updated":"2018-10-22 16:55:42.000000000","message":"The implementation here needs to have the credential ID in order to build the target. The callback doesn\u0027t support passing an argument. Should the callback method just dig the credential ID out of the request even though it\u0027s already done that?","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"775868ffc2adaa71ee93cbe764a3446c3b07f9a8","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            credential \u003d PROVIDERS.credential_api.get_credential(credential_id)"},{"line_number":159,"context_line":"            target \u003d {\u0027credential\u0027: credential}"},{"line_number":160,"context_line":"        except exception.NotFound:"},{"line_number":161,"context_line":"            ENFORCER.enforce_call(action\u003d\u0027identity:delete_credential\u0027)"},{"line_number":162,"context_line":"            raise"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        ENFORCER.enforce_call("}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_33e6b4e9","line":161,"updated":"2018-10-18 23:31:09.000000000","message":"See above","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"}],"keystone/common/policies/base.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"62ff5b975c6a1a3f430d127d7071caf26be84738","unresolved":false,"context_lines":[{"line_number":30,"context_line":"RULE_SERVICE_OR_ADMIN \u003d \u0027rule:service_or_admin\u0027"},{"line_number":31,"context_line":"RULE_TRUST_OWNER \u003d \u0027user_id:%(trust.trustor_user_id)s\u0027"},{"line_number":32,"context_line":"SYSTEM_READER_OR_OWNER \u003d ("},{"line_number":33,"context_line":"    \u0027(role:reader and system_scope:all) or user_id:%(target.user_id)s\u0027"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":"SYSTEM_MEMBER_OR_OWNER \u003d ("},{"line_number":36,"context_line":"    \u0027(role:member and system_scope:all) or user_id:%(target.user_id)s\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_83fcec3e","line":33,"range":{"start_line":33,"start_character":60,"end_line":33,"end_character":67},"updated":"2018-08-31 19:49:35.000000000","message":"This needs to be:\n\n  target.credential.user_id","commit_id":"e94a5ef5c176c0c009217de8a5a8ead0cc9d4b0a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6c96ea5ba2a3ad1b8f6a5bbbdfdcefd5cb6aac96","unresolved":false,"context_lines":[{"line_number":30,"context_line":"RULE_SERVICE_OR_ADMIN \u003d \u0027rule:service_or_admin\u0027"},{"line_number":31,"context_line":"RULE_TRUST_OWNER \u003d \u0027user_id:%(trust.trustor_user_id)s\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"rules \u003d ["},{"line_number":35,"context_line":"    policy.RuleDefault("},{"line_number":36,"context_line":"        name\u003d\u0027admin_required\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_fdef89f7","side":"PARENT","line":33,"updated":"2018-09-26 20:28:14.000000000","message":"Unrelated whitespace change. I\u0027ll revert this.","commit_id":"504388bd2046a7412e7abab68e57331ca7d7ca7d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ac45282e86325b21924c04f9c3690dc8e653d463","unresolved":false,"context_lines":[{"line_number":30,"context_line":"RULE_SERVICE_OR_ADMIN \u003d \u0027rule:service_or_admin\u0027"},{"line_number":31,"context_line":"RULE_TRUST_OWNER \u003d \u0027user_id:%(trust.trustor_user_id)s\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"rules \u003d ["},{"line_number":35,"context_line":"    policy.RuleDefault("},{"line_number":36,"context_line":"        name\u003d\u0027admin_required\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_c097e89b","side":"PARENT","line":33,"in_reply_to":"3f79a3b5_fdef89f7","updated":"2018-10-12 17:20:24.000000000","message":"Done","commit_id":"504388bd2046a7412e7abab68e57331ca7d7ca7d"}],"keystone/tests/unit/base_classes.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"775868ffc2adaa71ee93cbe764a3446c3b07f9a8","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.useFixture(database.Database())"},{"line_number":42,"context_line":"        super(TestCaseWithBootstrap, self).setUp()"},{"line_number":43,"context_line":"        self.config_fixture \u003d self.useFixture(config_fixture.Config(CONF))"},{"line_number":44,"context_line":"        CONF(args\u003d[], project\u003d\u0027keystone\u0027)"},{"line_number":45,"context_line":"        self.useFixture("},{"line_number":46,"context_line":"            ksfixtures.KeyRepository("},{"line_number":47,"context_line":"                self.config_fixture,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_b3d164fb","line":44,"updated":"2018-10-18 23:31:09.000000000","message":"I\u0027m not sure i\u0027m clear why this was needed.","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d26b55c637268e09f6f8023c751f616548b28882","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.useFixture(database.Database())"},{"line_number":42,"context_line":"        super(TestCaseWithBootstrap, self).setUp()"},{"line_number":43,"context_line":"        self.config_fixture \u003d self.useFixture(config_fixture.Config(CONF))"},{"line_number":44,"context_line":"        CONF(args\u003d[], project\u003d\u0027keystone\u0027)"},{"line_number":45,"context_line":"        self.useFixture("},{"line_number":46,"context_line":"            ksfixtures.KeyRepository("},{"line_number":47,"context_line":"                self.config_fixture,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_f508ee25","line":44,"in_reply_to":"3f79a3b5_b3d164fb","updated":"2018-10-22 16:57:54.000000000","message":"This is to initialize the CONF object so that we can use the default policy settings for the policy file path.","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"}],"keystone/tests/unit/protection/v3/test_credentials.py":[{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d2a7bb15172eafbc5e51c4e1876c39feb20191b0","unresolved":false,"context_lines":[{"line_number":1211,"context_line":"            for credential in expected:"},{"line_number":1212,"context_line":"                self.assertIn(credential, r.json[\u0027credentials\u0027])"},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":"    def test_user_can_filter_their_credentials(self):"},{"line_number":1215,"context_line":"        with self.test_client() as c:"},{"line_number":1216,"context_line":"            credential_type \u003d uuid.uuid4().hex"},{"line_number":1217,"context_line":"            create \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_3ad7e051","line":1214,"updated":"2018-10-02 02:44:48.000000000","message":"Here not mentioned filter_by_type or filter_by_user?and also missing the other test case.","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ac45282e86325b21924c04f9c3690dc8e653d463","unresolved":false,"context_lines":[{"line_number":1211,"context_line":"            for credential in expected:"},{"line_number":1212,"context_line":"                self.assertIn(credential, r.json[\u0027credentials\u0027])"},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":"    def test_user_can_filter_their_credentials(self):"},{"line_number":1215,"context_line":"        with self.test_client() as c:"},{"line_number":1216,"context_line":"            credential_type \u003d uuid.uuid4().hex"},{"line_number":1217,"context_line":"            create \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_20b57c19","line":1214,"in_reply_to":"3f79a3b5_3ad7e051","updated":"2018-10-12 17:20:24.000000000","message":"Done","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d2a7bb15172eafbc5e51c4e1876c39feb20191b0","unresolved":false,"context_lines":[{"line_number":1614,"context_line":"            for credential in expected:"},{"line_number":1615,"context_line":"                self.assertIn(credential, r.json[\u0027credentials\u0027])"},{"line_number":1616,"context_line":""},{"line_number":1617,"context_line":"    def test_user_can_filter_their_credentials(self):"},{"line_number":1618,"context_line":"        with self.test_client() as c:"},{"line_number":1619,"context_line":"            credential_type \u003d uuid.uuid4().hex"},{"line_number":1620,"context_line":"            create \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_dab82c13","line":1617,"updated":"2018-10-02 02:44:48.000000000","message":"ditto","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ac45282e86325b21924c04f9c3690dc8e653d463","unresolved":false,"context_lines":[{"line_number":1614,"context_line":"            for credential in expected:"},{"line_number":1615,"context_line":"                self.assertIn(credential, r.json[\u0027credentials\u0027])"},{"line_number":1616,"context_line":""},{"line_number":1617,"context_line":"    def test_user_can_filter_their_credentials(self):"},{"line_number":1618,"context_line":"        with self.test_client() as c:"},{"line_number":1619,"context_line":"            credential_type \u003d uuid.uuid4().hex"},{"line_number":1620,"context_line":"            create \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_8039f0a2","line":1617,"in_reply_to":"3f79a3b5_dab82c13","updated":"2018-10-12 17:20:24.000000000","message":"Done","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d2a7bb15172eafbc5e51c4e1876c39feb20191b0","unresolved":false,"context_lines":[{"line_number":1831,"context_line":"            r \u003d c.get(path, headers\u003dself.headers)"},{"line_number":1832,"context_line":"            self.assertEqual([], r.json[\u0027credentials\u0027])"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"    def test_user_cannot_update_credentials_for_others(self):"},{"line_number":1835,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1836,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":1837,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_7adb184d","line":1834,"updated":"2018-10-02 02:44:48.000000000","message":"I think here it will be test_user_can_update_credentials_for_others. If not so then there is no difference left between ProjectReaders and ProjectMembers.","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ac45282e86325b21924c04f9c3690dc8e653d463","unresolved":false,"context_lines":[{"line_number":1831,"context_line":"            r \u003d c.get(path, headers\u003dself.headers)"},{"line_number":1832,"context_line":"            self.assertEqual([], r.json[\u0027credentials\u0027])"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"    def test_user_cannot_update_credentials_for_others(self):"},{"line_number":1835,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1836,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":1837,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_805250d9","line":1834,"in_reply_to":"3f79a3b5_7adb184d","updated":"2018-10-12 17:20:24.000000000","message":"In that case, I\u0027m inclined to just refactor these tests to use a single test module to reduce duplication. I\u0027m not sure letting project administrator manage secrets for others is a good idea. Ideally, I think everyone should be able to manage their own credentials, but only system readers, members, and administrators should be able to manage credentials for others.\n\nI\u0027ll refactor this into a common module and see if I can re-use that instead of having all this duplication.","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"16ad94eec073e1487697b00ab04b1cc9b1d6d504","unresolved":false,"context_lines":[{"line_number":1831,"context_line":"            r \u003d c.get(path, headers\u003dself.headers)"},{"line_number":1832,"context_line":"            self.assertEqual([], r.json[\u0027credentials\u0027])"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"    def test_user_cannot_update_credentials_for_others(self):"},{"line_number":1835,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1836,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":1837,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_61a604af","line":1834,"in_reply_to":"3f79a3b5_805250d9","updated":"2018-10-15 02:21:23.000000000","message":"I understood the above point and Yeah right, lot of code duplication due to repetitive tests.","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d2a7bb15172eafbc5e51c4e1876c39feb20191b0","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"            for credential in expected:"},{"line_number":2031,"context_line":"                self.assertIn(credential, r.json[\u0027credentials\u0027])"},{"line_number":2032,"context_line":""},{"line_number":2033,"context_line":"    def test_user_can_filter_their_credentials(self):"},{"line_number":2034,"context_line":"        with self.test_client() as c:"},{"line_number":2035,"context_line":"            credential_type \u003d uuid.uuid4().hex"},{"line_number":2036,"context_line":"            create \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_1acd4485","line":2033,"updated":"2018-10-02 02:44:48.000000000","message":"filter_by_type and user missing test case.","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ac45282e86325b21924c04f9c3690dc8e653d463","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"            for credential in expected:"},{"line_number":2031,"context_line":"                self.assertIn(credential, r.json[\u0027credentials\u0027])"},{"line_number":2032,"context_line":""},{"line_number":2033,"context_line":"    def test_user_can_filter_their_credentials(self):"},{"line_number":2034,"context_line":"        with self.test_client() as c:"},{"line_number":2035,"context_line":"            credential_type \u003d uuid.uuid4().hex"},{"line_number":2036,"context_line":"            create \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_606db497","line":2033,"in_reply_to":"3f79a3b5_1acd4485","updated":"2018-10-12 17:20:24.000000000","message":"Done","commit_id":"4001fc6c2a858223d10213f4c87009ac7a66bc1f"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5052b45a2dd7c526fc60fd9267e7f57d05e5f738","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                expected_status_code\u003dhttp_client.FORBIDDEN"},{"line_number":204,"context_line":"            )"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def test_user_can_list_credentials_for_other_users(self):"},{"line_number":207,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":208,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":209,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_77776a09","line":206,"updated":"2018-10-17 05:58:11.000000000","message":"I noticed that this test is also common between system reader, member and admin. I think we can put this test in _UserCredentialTests class ? As This will help in reducing code duplication.","commit_id":"da61711aa1ced1e2709bff87cb448a7ea9c05b42"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b31c69b57fbb6f40e0948e1d199e0dfff2794e0a","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                expected_status_code\u003dhttp_client.FORBIDDEN"},{"line_number":204,"context_line":"            )"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def test_user_can_list_credentials_for_other_users(self):"},{"line_number":207,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":208,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":209,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_aa1270b2","line":206,"in_reply_to":"3f79a3b5_77776a09","updated":"2018-10-17 15:16:52.000000000","message":"Done","commit_id":"da61711aa1ced1e2709bff87cb448a7ea9c05b42"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5052b45a2dd7c526fc60fd9267e7f57d05e5f738","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            self.assertEqual(credential_id, r.json[\u0027credentials\u0027][0][\u0027id\u0027])"},{"line_number":242,"context_line":"            self.assertEqual(user[\u0027id\u0027], r.json[\u0027credentials\u0027][0][\u0027user_id\u0027])"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def test_user_can_filter_credentials_by_type_for_others(self):"},{"line_number":245,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":246,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":247,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_3781f2c3","line":244,"updated":"2018-10-17 05:58:11.000000000","message":"ditto","commit_id":"da61711aa1ced1e2709bff87cb448a7ea9c05b42"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b31c69b57fbb6f40e0948e1d199e0dfff2794e0a","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            self.assertEqual(credential_id, r.json[\u0027credentials\u0027][0][\u0027id\u0027])"},{"line_number":242,"context_line":"            self.assertEqual(user[\u0027id\u0027], r.json[\u0027credentials\u0027][0][\u0027user_id\u0027])"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def test_user_can_filter_credentials_by_type_for_others(self):"},{"line_number":245,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":246,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":247,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_6a0c5893","line":244,"in_reply_to":"3f79a3b5_3781f2c3","updated":"2018-10-17 15:16:52.000000000","message":"Done","commit_id":"da61711aa1ced1e2709bff87cb448a7ea9c05b42"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5052b45a2dd7c526fc60fd9267e7f57d05e5f738","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            self.assertEqual(credential_id, r.json[\u0027credentials\u0027][0][\u0027id\u0027])"},{"line_number":291,"context_line":"            self.assertEqual(user[\u0027id\u0027], r.json[\u0027credentials\u0027][0][\u0027user_id\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def test_user_can_filter_credentials_by_user_for_others(self):"},{"line_number":294,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":295,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":296,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_177cf6e8","line":293,"updated":"2018-10-17 05:58:11.000000000","message":"ditto","commit_id":"da61711aa1ced1e2709bff87cb448a7ea9c05b42"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b31c69b57fbb6f40e0948e1d199e0dfff2794e0a","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            self.assertEqual(credential_id, r.json[\u0027credentials\u0027][0][\u0027id\u0027])"},{"line_number":291,"context_line":"            self.assertEqual(user[\u0027id\u0027], r.json[\u0027credentials\u0027][0][\u0027user_id\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def test_user_can_filter_credentials_by_user_for_others(self):"},{"line_number":294,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":295,"context_line":"        user_password \u003d user[\u0027password\u0027]"},{"line_number":296,"context_line":"        user \u003d PROVIDERS.identity_api.create_user(user)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f79a3b5_0a2124fe","line":293,"in_reply_to":"3f79a3b5_177cf6e8","updated":"2018-10-17 15:16:52.000000000","message":"Done","commit_id":"da61711aa1ced1e2709bff87cb448a7ea9c05b42"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"775868ffc2adaa71ee93cbe764a3446c3b07f9a8","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                \u0027type\u0027: uuid.uuid4().hex"},{"line_number":40,"context_line":"            }"},{"line_number":41,"context_line":"        }"},{"line_number":42,"context_line":"        with self.test_client() as c:"},{"line_number":43,"context_line":"            c.post(\u0027/v3/credentials\u0027, json\u003dcreate, headers\u003dself.headers)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_user_can_get_their_credentials(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_73050c79","line":42,"updated":"2018-10-18 23:31:09.000000000","message":"THIS IS SO MUCH NICER THAN THE OLD WAY!","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d26b55c637268e09f6f8023c751f616548b28882","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                \u0027type\u0027: uuid.uuid4().hex"},{"line_number":40,"context_line":"            }"},{"line_number":41,"context_line":"        }"},{"line_number":42,"context_line":"        with self.test_client() as c:"},{"line_number":43,"context_line":"            c.post(\u0027/v3/credentials\u0027, json\u003dcreate, headers\u003dself.headers)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_user_can_get_their_credentials(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_151d6a61","line":42,"in_reply_to":"3f79a3b5_73050c79","updated":"2018-10-22 16:57:54.000000000","message":"++ I agree","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"775868ffc2adaa71ee93cbe764a3446c3b07f9a8","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            r \u003d c.post(\u0027/v3/credentials\u0027, json\u003dcreate, headers\u003dheaders)"},{"line_number":189,"context_line":"            credential_id \u003d r.json[\u0027credential\u0027][\u0027id\u0027]"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        with self.test_client() as c:"},{"line_number":192,"context_line":"            path \u003d \u0027/v3/credentials/%s\u0027 % credential_id"},{"line_number":193,"context_line":"            c.get("},{"line_number":194,"context_line":"                path, headers\u003dself.headers,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_33ff9467","line":191,"updated":"2018-10-18 23:31:09.000000000","message":"As a note, unless you\u0027re explicitly wanting to clear the local context, you don\u0027t need to re-create the client you can just keep using it.\n\nWith that said, i think this is a nice way to show isolation between requests in a single test. Don\u0027t change this.","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d26b55c637268e09f6f8023c751f616548b28882","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            r \u003d c.post(\u0027/v3/credentials\u0027, json\u003dcreate, headers\u003dheaders)"},{"line_number":189,"context_line":"            credential_id \u003d r.json[\u0027credential\u0027][\u0027id\u0027]"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        with self.test_client() as c:"},{"line_number":192,"context_line":"            path \u003d \u0027/v3/credentials/%s\u0027 % credential_id"},{"line_number":193,"context_line":"            c.get("},{"line_number":194,"context_line":"                path, headers\u003dself.headers,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_d53612e9","line":191,"in_reply_to":"3f79a3b5_33ff9467","updated":"2018-10-22 16:57:54.000000000","message":"++","commit_id":"ed98b69842e225581ab1bd45965e66cc86dbe656"}]}
