)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"2f960da67fbc4cbb758cc18d5b008b2a7f270c13","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     ayefimov \u003cayefimov@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2022-04-20 14:30:48 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fixes:"},{"line_number":8,"context_line":"  skips test_user::test_user_update_own_password when keystone minimum_password_age \u003e 0"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"other: partial fix for bug_1946459"},{"line_number":11,"context_line":"Change-Id: I53f7410ab0771ed5d7afc5d41ca974c36faf8e6c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"a750f6c8_2d60febc","line":8,"range":{"start_line":7,"start_character":0,"end_line":8,"end_character":87},"updated":"2022-04-28 20:13:39.000000000","message":"Title of the commit msg is too long","commit_id":"9f03f928fdc575ef753c8a27a80d1990cdd804e2"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"ad4cdacc56375aa33fd91e3cc5cffebfc11d117c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     ayefimov \u003cayefimov@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2022-04-20 14:30:48 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fixes:"},{"line_number":8,"context_line":"  skips test_user::test_user_update_own_password when keystone minimum_password_age \u003e 0"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"other: partial fix for bug_1946459"},{"line_number":11,"context_line":"Change-Id: I53f7410ab0771ed5d7afc5d41ca974c36faf8e6c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"20333dd3_8cd46468","line":8,"range":{"start_line":7,"start_character":0,"end_line":8,"end_character":87},"in_reply_to":"a750f6c8_2d60febc","updated":"2022-05-02 14:19:09.000000000","message":"Fixed","commit_id":"9f03f928fdc575ef753c8a27a80d1990cdd804e2"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"2f960da67fbc4cbb758cc18d5b008b2a7f270c13","unresolved":true,"context_lines":[{"line_number":7,"context_line":"fixes:"},{"line_number":8,"context_line":"  skips test_user::test_user_update_own_password when keystone minimum_password_age \u003e 0"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"other: partial fix for bug_1946459"},{"line_number":11,"context_line":"Change-Id: I53f7410ab0771ed5d7afc5d41ca974c36faf8e6c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"a9d723e3_391b3e53","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":34},"updated":"2022-04-28 20:13:39.000000000","message":"this won\u0027t be linked to the LP automatically, let\u0027s use \nRelated-Bug: #1946459\nor\nCloses-Bug: #1946459","commit_id":"9f03f928fdc575ef753c8a27a80d1990cdd804e2"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"ad4cdacc56375aa33fd91e3cc5cffebfc11d117c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"fixes:"},{"line_number":8,"context_line":"  skips test_user::test_user_update_own_password when keystone minimum_password_age \u003e 0"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"other: partial fix for bug_1946459"},{"line_number":11,"context_line":"Change-Id: I53f7410ab0771ed5d7afc5d41ca974c36faf8e6c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"07397e65_9c18f048","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":34},"in_reply_to":"a9d723e3_391b3e53","updated":"2022-05-02 14:19:09.000000000","message":"Done","commit_id":"9f03f928fdc575ef753c8a27a80d1990cdd804e2"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"6ce46fb9dc451c9a2a33bed72777c6f90a52cb5c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6db32508_8ff35e9c","updated":"2022-04-20 14:28:31.000000000","message":"This is a partial fix for bug_194659. test_user_update_own_password now is skipped if keystone option minimum_password_age \u003c\u003e 0","commit_id":"bce26636c5c018a8d5b01f8311adc9bd2dc7d918"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"088d2c785712ecc6135e56a2bef73a0df54c393c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"4e688f41_d465b84f","updated":"2022-05-11 16:53:46.000000000","message":"let\u0027s go with adding a new config in tempest and skip the cleanup part of resetting password.","commit_id":"a5299c489a5ee14dbaf26adc4050f05a235f2074"}],"tempest/api/identity/v3/test_users.py":[{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"a75db694d6feb79d6fe937bc896fe97d276a6268","unresolved":true,"context_lines":[{"line_number":96,"context_line":"            self._update_password(original_password\u003dold_pass,"},{"line_number":97,"context_line":"                                  password\u003dpass_1)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            # when \"minimum_password_age\u003e0\" 2 changes need to post exception"},{"line_number":100,"context_line":"            self._update_password(original_password\u003dpass_1,"},{"line_number":101,"context_line":"                                  password\u003dpass_2)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"49902e1b_4d6f0b1d","line":99,"range":{"start_line":99,"start_character":20,"end_line":99,"end_character":40},"updated":"2022-04-25 19:28:26.000000000","message":"minimum_password_age ,if its an openstack param, please user config.py to update test result.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"9f18d411f46ffbef429767e7be16530ad14af079","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            self._update_password(original_password\u003dold_pass,"},{"line_number":97,"context_line":"                                  password\u003dpass_1)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            # when \"minimum_password_age\u003e0\" 2 changes need to post exception"},{"line_number":100,"context_line":"            self._update_password(original_password\u003dpass_1,"},{"line_number":101,"context_line":"                                  password\u003dpass_2)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"e3d0d83d_9dd7d9f5","line":99,"range":{"start_line":99,"start_character":20,"end_line":99,"end_character":40},"in_reply_to":"49902e1b_4d6f0b1d","updated":"2022-04-25 20:21:13.000000000","message":"This is a keystone param","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"a75db694d6feb79d6fe937bc896fe97d276a6268","unresolved":true,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        except exceptions.BadRequest as excp:"},{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"d5c3b692_57281247","line":105,"updated":"2022-04-25 19:28:26.000000000","message":"Please remove the print statement , use log if needed.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"9f18d411f46ffbef429767e7be16530ad14af079","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        except exceptions.BadRequest as excp:"},{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"09a18b81_7fa9466f","line":105,"in_reply_to":"d5c3b692_57281247","updated":"2022-04-25 20:21:13.000000000","message":"Done","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"a75db694d6feb79d6fe937bc896fe97d276a6268","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"890c0e37_c083c8ab","line":107,"updated":"2022-04-25 19:28:26.000000000","message":"I dont think its a good idea to raise skipExcpetion if you already strated the testcase and allocate resources.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"afd6cb7f86b57f41a9cbf39c8c018151083c8696","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"2a261d95_85ee7185","line":107,"in_reply_to":"04a1ece3_c364b572","updated":"2022-06-16 15:41:54.000000000","message":"If parsing the keystone.conf file using python_tempestcomf script and setting a skipIf decorator for this test is the wrong approach,then what is the point of setting a decorator by default in tempest.conf?  What is the difference? Is it not the same thing???","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"0fcb8b05759bc1cd2b01836e11f277fd76c4fdd3","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"6d2b3788_16ca9d46","line":107,"in_reply_to":"0cd26880_abd50594","updated":"2022-05-23 19:08:09.000000000","message":"Okay, seems like a reasonable solution. Let me code it up and then you all can review it.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"088d2c785712ecc6135e56a2bef73a0df54c393c","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"0cd26880_abd50594","line":107,"in_reply_to":"241e0f1d_3531d260","updated":"2022-05-11 16:53:46.000000000","message":"I agree that failing the test is better than skip. Skip can give false result also when there is exception from different reason than \u0027minimum_password_age\u0027\n\nOne way to solve this to refactor the tests how Martin is suggesting. If we use a new user then it will be a easy one but then create user needs to be done by admin and this test become admin test. We can do that but it will be big change from interop side.\n\nLet\u0027s skip the cleanup reset_password part here if minimum_password_age\u003e0 and this need to add the new config option minimum_password_age in tempest.config with default to 0 value.\n\n something like below:\n\n\n    @testtools.skipUnless(CONF.identity_feature_enabled.security_compliance,\n                          \u0027Security compliance not available.\u0027)\n    @decorators.idempotent_id(\u0027ad71bd23-12ad-426b-bb8b-195d2b635f27\u0027)\n    @testtools.skipIf(CONF.identity_feature_enabled.immutable_user_source,\n                      \u0027Skipped because environment has an \u0027\n                      \u0027immutable user source and solely \u0027\n                      \u0027provides read-only access to users.\u0027)\n    def test_user_update_own_password(self):\n        \"\"\"Test updating user\u0027s own password\"\"\"\n        old_pass \u003d self.creds.password\n        old_token \u003d self.non_admin_client.token\n        new_pass \u003d data_utils.rand_password()\n\n        # if minimum_password_age is \u003e0 means we cannot change the password 2nd time\n        # so let\u0027s skip the reset password in cleanup.\n        if CONF.identity_feature_enabled.minimum_password_age \u003c\u003d 0\n            # to change password back. important for use_dynamic_credentials\u003dfalse\n            self.addCleanup(self._restore_password, old_pass, new_pass)\n\n        # user updates own password\n        self._update_password(original_password\u003dold_pass, password\u003dnew_pass)\n\n        # authorize with old token should lead to IdentityError (404 code)\n        self.assertRaises(exceptions.IdentityError,\n                          self.non_admin_token.auth,\n                          token\u003dold_token)\n\n        # authorize with old password should lead to Unauthorized\n        self.assertRaises(exceptions.Unauthorized,\n                          self.non_admin_token.auth,\n                          user_id\u003dself.user_id,\n                          password\u003dold_pass)","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"d8bbedd9ab1c656e90fe025e673cdc80853b8fb1","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa44787_86170142","line":107,"in_reply_to":"2a261d95_85ee7185","updated":"2022-06-24 08:33:18.000000000","message":"creating a new option in tempest.conf will allow a tempest user to configure it based on their need - tempest tests whatever its told, tempest is not supposed to be smart and decide what to test on its own\n\nimproving python-tempestconf so that it can set this opt for the user based on the actual abilities of a given cloud, is a different discussion. Feel free to propose a patch for python-tempestconf project - although python-tempestconf is not supposed to read config files either - it discovers available features/abilities of a cloud by querying it - e.g. it lists endpoints based on which it enables/disables services in tempest.conf. If it read config files, it would discover features which were supposed to be deployed or which should be running, however, there is no guarantee that they were deployed or that they are running - therefore it doesn\u0027t rely on the config files, just on what it can discover \"for real\".","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"ad4cdacc56375aa33fd91e3cc5cffebfc11d117c","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"d39f79da_c236c5d1","line":107,"in_reply_to":"570bde4e_c04e62bc","updated":"2022-05-02 14:19:09.000000000","message":"I don\u0027t think this will work as the new user would have nothing to trigger an exception ... because one password change does not seem to trigger it when when it is suppose to.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"c2ffb223ac3369ae137f3182026bdd50654c582d","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"eedad053_5a2759e7","line":107,"in_reply_to":"6d2b3788_16ca9d46","updated":"2022-05-24 12:59:05.000000000","message":"Is it legitimate to parse /etc/keystone/keystone.conf file to get the value for \"minimum_password_age\"? Then take this value and inject it into tempest.conf. This would be a more automatic way to do it and would work for other keystone options that affect the test.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"2f960da67fbc4cbb758cc18d5b008b2a7f270c13","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"570bde4e_c04e62bc","line":107,"in_reply_to":"6e9c734e_e5efd520","updated":"2022-04-28 20:13:39.000000000","message":"we can\u0027t have a skip in the middle of a test - once test execution starts it can either pass or fail, if we wanna skip the test, we need to do that before we run the test - otherwise we would practically waste resources as we would skip a test after it created a bunch of resources \u003d\u003e that would mean that those resources didn\u0027t provide any value (they didn\u0027t test anything) as the test was skipped.\n\n\nWhat Benny mentioned about having an option in tempest which would be set by user (tempest.conf) and would mirror the keystone\u0027s minimum_password_age option - however, creating a new tempest option and use it in only one test sounds a bit like an overkill - maybe we could do something else which would help us to avoid that minimum password age limitation.\nWe know that the test performs 2 password changes:\n1. when we test whether we can update a password\n2. when we revert the password to the previous one - we do that because the test user (whom password we\u0027re updating) is used in other tests as well (might be even in parallel) and if we didn\u0027t revert the password, all other tests using the user would fail as they wouldn\u0027t know the new password.\n\nSo, maybe we could get rid of that second password change somehow as that\u0027s not part of the test. Maybe we could create a new user whom password we would update, a single user who wouldn\u0027t be shared with other tests - that way we wouldn\u0027t need to revert the password, we would simply remove the user. What do you think?","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"7fdb6faa8e17e72549f3f9c5865872ffbda4d2e5","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"241e0f1d_3531d260","line":107,"in_reply_to":"732ea9bc_981b3e7c","updated":"2022-05-10 19:53:18.000000000","message":"Martin, I think there are a limited number of things we can do here when keystone.minimum.password.age \u003e 0:\n\n1 - run this test and let if fail (currently the choice by default)\n2 - read the keystone.conf somehow and create a decorator to skip this test\n3 - run this test and catch the exception and then skip or pass the test\n4 - delete the test from the tempest test suite\n\nI am fine with any of those. Creating a second user with a password, to me,  does not accomplish anything as the test already has created a new users(current user) to get the the current state.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"9f18d411f46ffbef429767e7be16530ad14af079","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"996c3102_5b97ba0e","line":107,"in_reply_to":"890c0e37_c083c8ab","updated":"2022-04-25 20:21:13.000000000","message":"Benny, This is a keystone option. It is my understanding that there is no way to query the keystone option before the test starts as the decorators can only detect tempest config values.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"d002f04dc012c48940ce1362004affd737b1a9d0","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"c8d80cad_d1ae8e2a","line":107,"in_reply_to":"996c3102_5b97ba0e","updated":"2022-04-26 05:52:05.000000000","message":"Hi Alex, \nBefore the test begins , tempest should know the value of param or at least which test flow to run.\nIn this case you can allow to user configure in config.py the default option and change it .\nDuring testtime you can check the config.py value and choose the test or skip.\n\nIn keystone, do you have defaults for the value ?","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"dee81ed6cee7873ae8b61db4affc52ef94a94a42","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"6e9c734e_e5efd520","line":107,"in_reply_to":"c8d80cad_d1ae8e2a","updated":"2022-04-26 19:58:35.000000000","message":"Yes, they are typically stored in /etc/keystone/keystone.conf file. But those can be changes at anytime. And the change will not take effect until the keystone service is restarted. So potentially the keystone.conf and the keystone service could be out of syn until the next restart.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"02e895acf9e954c68e0fc824190906cdb47450bf","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"732ea9bc_981b3e7c","line":107,"in_reply_to":"d39f79da_c236c5d1","updated":"2022-05-10 18:32:34.000000000","message":"isn\u0027t that kind of the point? the test is supposed to test a user\u0027s password change, nothing else, it shouldn\u0027t try to trigger any exception","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"d4ca645d6d0cec2299596efd06ad2e588e5204dc","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            if \u0027minimum password age\u0027 in str(excp):"},{"line_number":105,"context_line":"                print(\"\\tusername:\", self.creds.username,"},{"line_number":106,"context_line":"                      \"user_id:\", self.creds.user_id)"},{"line_number":107,"context_line":"                raise self.skipException(\"minimum_password_age \u003e 0\")"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            # change password back.Needed when use_dynamic_credentials\u003dfalse"}],"source_content_type":"text/x-python","patch_set":5,"id":"04a1ece3_c364b572","line":107,"in_reply_to":"eedad053_5a2759e7","updated":"2022-06-16 12:13:53.000000000","message":"No, tempest can\u0027t parse any service configuration files, tempest.conf needs to be set up by a user.","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"088d2c785712ecc6135e56a2bef73a0df54c393c","unresolved":true,"context_lines":[{"line_number":134,"context_line":"        new_pass1 \u003d data_utils.rand_password()"},{"line_number":135,"context_line":"        new_pass2 \u003d data_utils.rand_password()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.addCleanup(self._restore_password, old_pass, new_pass2)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        # Update password"},{"line_number":140,"context_line":"        self._update_password(original_password\u003dold_pass, password\u003dnew_pass1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"c470dd7c_62c80baf","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":68},"updated":"2022-05-11 16:53:46.000000000","message":"ditto","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"088d2c785712ecc6135e56a2bef73a0df54c393c","unresolved":true,"context_lines":[{"line_number":153,"context_line":"                              password\u003dold_pass,"},{"line_number":154,"context_line":"                              original_password\u003dnew_pass1)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # A different password can be set"},{"line_number":157,"context_line":"        self._update_password(original_password\u003dnew_pass1, password\u003dnew_pass2)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @testtools.skipUnless(CONF.identity_feature_enabled.security_compliance,"},{"line_number":160,"context_line":"                          \u0027Security compliance not available.\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"76b4618a_e70c3cd4","line":157,"range":{"start_line":156,"start_character":0,"end_line":157,"end_character":78},"updated":"2022-05-11 16:53:46.000000000","message":"ditto","commit_id":"fe392b68d27e7e6f094b01d92e34cd41bdcdb66c"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"2f960da67fbc4cbb758cc18d5b008b2a7f270c13","unresolved":true,"context_lines":[{"line_number":97,"context_line":"                                  password\u003dpass_1)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            # when \"minimum_password_age\u003e0\" 2 changes need to post exception"},{"line_number":100,"context_line":"            self._update_password(original_password\u003dpass_1,"},{"line_number":101,"context_line":"                                  password\u003dpass_2)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        except exceptions.BadRequest as excp:"}],"source_content_type":"text/x-python","patch_set":12,"id":"4ec14652_7e02c448","line":100,"range":{"start_line":100,"start_character":17,"end_line":100,"end_character":33},"updated":"2022-04-28 20:13:39.000000000","message":"in this test we need only one update_password (as we\u0027re testing whether a user is able to change their password), so this second call is redundant","commit_id":"65c0e960eba851a5cbbe00a8bc46661750d04b0f"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"a66a54e307ccfa9adf89944efce4926e12bb2eee","unresolved":true,"context_lines":[{"line_number":97,"context_line":"                                  password\u003dpass_1)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            # when \"minimum_password_age\u003e0\" 2 changes need to post exception"},{"line_number":100,"context_line":"            self._update_password(original_password\u003dpass_1,"},{"line_number":101,"context_line":"                                  password\u003dpass_2)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        except exceptions.BadRequest as excp:"}],"source_content_type":"text/x-python","patch_set":12,"id":"e3e01322_a30a0587","line":100,"range":{"start_line":100,"start_character":17,"end_line":100,"end_character":33},"in_reply_to":"01ffaccc_41c479c2","updated":"2022-05-10 20:05:32.000000000","message":"In my mind, catching the exception is a negative test and should only be done when writing a negative test. This test is not a negative test, so really it should not be thrown.  In my opinion, what should happen:\n\nOSP upstream should be include configuration sets based on services (keystone, Galance, Heat ....) defined by customers. For each configuration there should be a list of tests that are run(positive and negative). The test in question should not be included for all configurations with keystone.minimum_passoword_age \u003e 0.\n\nThe problem is that the current state of our upstream testing framework does not allow for this. This is a big hole in the framework that really should be fixed as soon as possible as this will benefit everyone involved with OSP.","commit_id":"65c0e960eba851a5cbbe00a8bc46661750d04b0f"},{"author":{"_account_id":34308,"name":"Alex Yefimov","display_name":"Alex Yefimov","email":"ayefimov@redhat.com","username":"ayefimov"},"change_message_id":"ad4cdacc56375aa33fd91e3cc5cffebfc11d117c","unresolved":true,"context_lines":[{"line_number":97,"context_line":"                                  password\u003dpass_1)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            # when \"minimum_password_age\u003e0\" 2 changes need to post exception"},{"line_number":100,"context_line":"            self._update_password(original_password\u003dpass_1,"},{"line_number":101,"context_line":"                                  password\u003dpass_2)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        except exceptions.BadRequest as excp:"}],"source_content_type":"text/x-python","patch_set":12,"id":"b6c7e9af_7647a3af","line":100,"range":{"start_line":100,"start_character":17,"end_line":100,"end_character":33},"in_reply_to":"4ec14652_7e02c448","updated":"2022-05-02 14:19:09.000000000","message":"The first passwd change does not seem to throw an exception even when it should. In the original test, \"addCleanup\" acts as a first password change. So, the new version would have to look something like:\n\ntry:\n        self.addCleanup(self._restore_password, old_pass, new_pass)\n\n        self._update_password(original_password\u003dold_pass, password\u003dnew_pass)\n\nexcept:\n\n   if ..... :\n\n        self.addCleanup(self._restore_password, old_pass, new_pass)\n\n        self._update_password(original_password\u003dold_pass, password\u003dnew_pass)\n\n\nSeems like the above would be more problematic in the long run. What happens to the first addClean if we hit an exception? Does it test now run both cleanups? Will it fail the second as the password is not the same in both?","commit_id":"65c0e960eba851a5cbbe00a8bc46661750d04b0f"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"02e895acf9e954c68e0fc824190906cdb47450bf","unresolved":true,"context_lines":[{"line_number":97,"context_line":"                                  password\u003dpass_1)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            # when \"minimum_password_age\u003e0\" 2 changes need to post exception"},{"line_number":100,"context_line":"            self._update_password(original_password\u003dpass_1,"},{"line_number":101,"context_line":"                                  password\u003dpass_2)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        except exceptions.BadRequest as excp:"}],"source_content_type":"text/x-python","patch_set":12,"id":"01ffaccc_41c479c2","line":100,"range":{"start_line":100,"start_character":17,"end_line":100,"end_character":33},"in_reply_to":"b6c7e9af_7647a3af","updated":"2022-05-10 18:32:34.000000000","message":"In what case an exception should be thrown?","commit_id":"65c0e960eba851a5cbbe00a8bc46661750d04b0f"}]}
