)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"d4193a51979dc192a91f6b6013853c0806241132","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c5ddd20e_b683bb65","updated":"2026-10-02 12:00:54.000000000","message":"For more context https://bugs.launchpad.net/sushy/+bug/2169279 they have open a bug regarding this","commit_id":"69621a54b60d63a6be56284681c37ba719120857"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a36076d5569d5b19e66e3e7bd9ff5e787add0098","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"eaab7eb8_9fb9fc14","updated":"2026-10-02 13:13:01.000000000","message":"thanks folks, will rework this, I left Opus too much freedom","commit_id":"69621a54b60d63a6be56284681c37ba719120857"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"717ed8ad8767848d5ebacc30869593131ff85258","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9a9cb03f_035a4a19","updated":"2026-10-23 12:22:45.000000000","message":"Thank you for your review and pointers, Dmitry. Uploaded a revised version, let me know if the improvements are sufficient.","commit_id":"63a44806d3fad70f65ca6818fef45f728d325f6d"}],"sushy/resources/settings.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6ddb86fd86360da2d63cbb836b6e3e147e6910cb","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            # 428 Precondition Required when it is absent). Fetch the ETag"},{"line_number":178,"context_line":"            # directly from the Settings endpoint so it can be included."},{"line_number":179,"context_line":"            response \u003d connector.get(self.resource_uri)"},{"line_number":180,"context_line":"            etag \u003d response.headers.get(\u0027ETag\u0027)"},{"line_number":181,"context_line":"        return connector.patch(self.resource_uri, data\u003dvalue, etag\u003detag)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"e459da1a_e56507e9","line":180,"updated":"2026-09-28 11:01:27.000000000","message":"Yep, this code is contrary to why ETags even exist.","commit_id":"69621a54b60d63a6be56284681c37ba719120857"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"544f740f53fdc71ffb03baf7eeed1732fed6e876","unresolved":true,"context_lines":[{"line_number":177,"context_line":"            # 428 Precondition Required when it is absent). Fetch the ETag"},{"line_number":178,"context_line":"            # directly from the Settings endpoint so it can be included."},{"line_number":179,"context_line":"            response \u003d connector.get(self.resource_uri)"},{"line_number":180,"context_line":"            etag \u003d response.headers.get(\u0027ETag\u0027)"},{"line_number":181,"context_line":"        return connector.patch(self.resource_uri, data\u003dvalue, etag\u003detag)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"f46f2be6_77559f06","line":180,"updated":"2026-09-25 20:33:18.000000000","message":"shouldn\u0027t we just try to check/get on the original get? I guess my concern here the user is wanting to potentially patch against one state, and the etag and the get may be different now from when their perception was, so now we\u0027re patching on a *different* base perception potentially.","commit_id":"69621a54b60d63a6be56284681c37ba719120857"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"61d69222cfb19b45aa6230eb860ce06f5c70b58e","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            # 428 Precondition Required when it is absent). Fetch the ETag"},{"line_number":178,"context_line":"            # directly from the Settings endpoint so it can be included."},{"line_number":179,"context_line":"            response \u003d connector.get(self.resource_uri)"},{"line_number":180,"context_line":"            etag \u003d response.headers.get(\u0027ETag\u0027)"},{"line_number":181,"context_line":"        return connector.patch(self.resource_uri, data\u003dvalue, etag\u003detag)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"13150656_9979d513","line":180,"in_reply_to":"e459da1a_e56507e9","updated":"2026-10-22 11:44:33.000000000","message":"Thanks Julia and Dmitry, good points. There is getting past the problem and there\u0027s fixing it. Modified the code in attempt to fix it properly.","commit_id":"69621a54b60d63a6be56284681c37ba719120857"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"5b0e30f870cbbf945dfabdd76fa95a22a353f947","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            # 428 Precondition Required when it is absent). Fetch the ETag"},{"line_number":178,"context_line":"            # directly from the Settings endpoint so it can be included."},{"line_number":179,"context_line":"            response \u003d connector.get(self.resource_uri)"},{"line_number":180,"context_line":"            etag \u003d response.headers.get(\u0027ETag\u0027)"},{"line_number":181,"context_line":"        return connector.patch(self.resource_uri, data\u003dvalue, etag\u003detag)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"81752fd1_9881cf57","line":180,"in_reply_to":"f46f2be6_77559f06","updated":"2026-10-22 11:45:55.000000000","message":"Done","commit_id":"69621a54b60d63a6be56284681c37ba719120857"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1ca5de13062d7bdc5c4edc5ffc299481bfec15b","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        etag \u003d self._etag or self._settings_object_etag"},{"line_number":177,"context_line":"        return connector.patch(self.resource_uri, data\u003dvalue, etag\u003detag)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def capture_settings_object_etag(self, connector):"},{"line_number":180,"context_line":"        \"\"\"Record the HTTP ETag of the SettingsObject"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        Only done when @Redfish.Settings does not provide an ETag. Must be"}],"source_content_type":"text/x-python","patch_set":3,"id":"7cfa5ded_1ebc8524","line":179,"updated":"2026-10-22 16:42:14.000000000","message":"nit: we\u0027re already in a settings object, `capture_etag` is enough","commit_id":"5944243484736f7146144437083e21b854814393"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"717ed8ad8767848d5ebacc30869593131ff85258","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        etag \u003d self._etag or self._settings_object_etag"},{"line_number":177,"context_line":"        return connector.patch(self.resource_uri, data\u003dvalue, etag\u003detag)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def capture_settings_object_etag(self, connector):"},{"line_number":180,"context_line":"        \"\"\"Record the HTTP ETag of the SettingsObject"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        Only done when @Redfish.Settings does not provide an ETag. Must be"}],"source_content_type":"text/x-python","patch_set":3,"id":"9181cfe1_28afd4fd","line":179,"in_reply_to":"7cfa5ded_1ebc8524","updated":"2026-10-23 12:22:45.000000000","message":"Good point, renamed the function.","commit_id":"5944243484736f7146144437083e21b854814393"}],"sushy/resources/system/bios.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1ca5de13062d7bdc5c4edc5ffc299481bfec15b","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _do_refresh(self, force):"},{"line_number":92,"context_line":"        super()._do_refresh(force)"},{"line_number":93,"context_line":"        if self._settings is not None:"},{"line_number":94,"context_line":"            self._settings.capture_settings_object_etag(self._conn)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"d42885ee_ee57308e","line":93,"updated":"2026-10-22 16:42:14.000000000","message":"You may want to respect `force` here, see my comment on set_attributes","commit_id":"5944243484736f7146144437083e21b854814393"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"717ed8ad8767848d5ebacc30869593131ff85258","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _do_refresh(self, force):"},{"line_number":92,"context_line":"        super()._do_refresh(force)"},{"line_number":93,"context_line":"        if self._settings is not None:"},{"line_number":94,"context_line":"            self._settings.capture_settings_object_etag(self._conn)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"55993f74_502046c8","line":93,"in_reply_to":"d42885ee_ee57308e","updated":"2026-10-23 12:22:45.000000000","message":"Good point, reworked this part.","commit_id":"5944243484736f7146144437083e21b854814393"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1ca5de13062d7bdc5c4edc5ffc299481bfec15b","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        # NOTE(vanou): To retrieve current ETag value of @Redfish.Settings"},{"line_number":158,"context_line":"        # but not update cached _pending_settings_resource, because cached"},{"line_number":159,"context_line":"        # property is only this one and re-cache is not required"},{"line_number":160,"context_line":"        self.refresh(force\u003dFalse)"},{"line_number":161,"context_line":"        self._settings.commit(self._conn,"},{"line_number":162,"context_line":"                              payload)"},{"line_number":163,"context_line":"        # The commit changed the SettingsObject, so the captured ETag is no"}],"source_content_type":"text/x-python","patch_set":3,"id":"c4f33a21_4fa05038","line":160,"updated":"2026-10-22 16:42:14.000000000","message":"This is going to fetch a new ETag because it happens regardless of `force`. It may be surprising for consumers: ETag is supposed to guarantee that the version they\u0027re updating matches the version they observed.","commit_id":"5944243484736f7146144437083e21b854814393"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"717ed8ad8767848d5ebacc30869593131ff85258","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        # NOTE(vanou): To retrieve current ETag value of @Redfish.Settings"},{"line_number":158,"context_line":"        # but not update cached _pending_settings_resource, because cached"},{"line_number":159,"context_line":"        # property is only this one and re-cache is not required"},{"line_number":160,"context_line":"        self.refresh(force\u003dFalse)"},{"line_number":161,"context_line":"        self._settings.commit(self._conn,"},{"line_number":162,"context_line":"                              payload)"},{"line_number":163,"context_line":"        # The commit changed the SettingsObject, so the captured ETag is no"}],"source_content_type":"text/x-python","patch_set":3,"id":"93e09f0b_9eb865d7","line":160,"in_reply_to":"c4f33a21_4fa05038","updated":"2026-10-23 12:22:45.000000000","message":"Good catch, made an attempt to improve it, let me know if it is to your satisfaction.","commit_id":"5944243484736f7146144437083e21b854814393"}],"sushy/resources/system/storage/controller.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1ca5de13062d7bdc5c4edc5ffc299481bfec15b","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        r \u003d self._settings.commit(self._conn, payload)"},{"line_number":110,"context_line":"        # The commit changed the SettingsObject, so the captured ETag is no"},{"line_number":111,"context_line":"        # longer valid. Re-read on the next update."},{"line_number":112,"context_line":"        self.invalidate()"},{"line_number":113,"context_line":"        utils.cache_clear(self, force_refresh\u003dFalse,"},{"line_number":114,"context_line":"                          only_these\u003d[\u0027pending_settings\u0027])"},{"line_number":115,"context_line":"        if r.status_code \u003d\u003d 202:"}],"source_content_type":"text/x-python","patch_set":3,"id":"b880d111_2be20ff0","line":112,"updated":"2026-10-22 16:42:14.000000000","message":"nit: it looks like we could create a helper on Base resource since this code is nearly identical between Bios and Controller","commit_id":"5944243484736f7146144437083e21b854814393"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"717ed8ad8767848d5ebacc30869593131ff85258","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        r \u003d self._settings.commit(self._conn, payload)"},{"line_number":110,"context_line":"        # The commit changed the SettingsObject, so the captured ETag is no"},{"line_number":111,"context_line":"        # longer valid. Re-read on the next update."},{"line_number":112,"context_line":"        self.invalidate()"},{"line_number":113,"context_line":"        utils.cache_clear(self, force_refresh\u003dFalse,"},{"line_number":114,"context_line":"                          only_these\u003d[\u0027pending_settings\u0027])"},{"line_number":115,"context_line":"        if r.status_code \u003d\u003d 202:"}],"source_content_type":"text/x-python","patch_set":3,"id":"c84be573_6f9fe086","line":112,"in_reply_to":"b880d111_2be20ff0","updated":"2026-10-23 12:22:45.000000000","message":"settings.py depends on base.py so this could create a circular dependency - unless I do a mixin. Would you like me to do this or leave it as-is?","commit_id":"5944243484736f7146144437083e21b854814393"}]}
