)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e8f1978ad48015bae51884452b8756b2c0e55e08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"aaff81b8_455b4bbd","updated":"2026-09-17 09:28:26.000000000","message":"Thank you for your review Dmitry, uploading revised version","commit_id":"d8877d419c555d2c9ce4bc437f67f80655e578ee"}],"releasenotes/notes/dell-job-status-api-3f2d835ce01c282e.yaml":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"5a6451dfffd9c69e5faac43b373f21ab1a734df0","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds ``DellJobCollection.get_jobs()`` and ``DellJobCollection.get_job()``"},{"line_number":5,"context_line":"    and a ``DellJob`` resource for the Dell OEM Lifecycle Controller job"},{"line_number":6,"context_line":"    collection, exposing each job\u0027s ``job_state``, ``message``,"},{"line_number":7,"context_line":"    ``message_id``, ``percent_complete`` and related fields, plus"},{"line_number":8,"context_line":"    ``is_finished`` and ``is_failed`` properties based on the new"},{"line_number":9,"context_line":"    ``sushy.oem.dell.constants.TERMINAL_JOB_STATES`` and"},{"line_number":10,"context_line":"    ``FAILED_JOB_STATES`` lists. Callers can now tell"},{"line_number":11,"context_line":"    whether a job finished successfully and why it failed, which"},{"line_number":12,"context_line":"    ``get_unfinished_jobs()`` (which only returns identities) could not"},{"line_number":13,"context_line":"    express."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"566c99b0_8c4e51e5","line":13,"range":{"start_line":2,"start_character":0,"end_line":13,"end_character":12},"updated":"2026-09-17 04:47:23.000000000","message":"recommend to align more with https://opendev.org/openstack/ironic/commit/6d8ca6a7f774b3fd7cd2ee8a7248c35b0b459094#diff-54772daad01b519a1dfa3ed6a428c0acb97a718b and existing sushy release notes","commit_id":"146902903d682d30fe784441918f506a543943ba"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"c1ae277adc6c3b6c92b6676093b8abaabd8fa16a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds ``DellJobCollection.get_jobs()`` and ``DellJobCollection.get_job()``"},{"line_number":5,"context_line":"    and a ``DellJob`` resource for the Dell OEM Lifecycle Controller job"},{"line_number":6,"context_line":"    collection, exposing each job\u0027s ``job_state``, ``message``,"},{"line_number":7,"context_line":"    ``message_id``, ``percent_complete`` and related fields, plus"},{"line_number":8,"context_line":"    ``is_finished`` and ``is_failed`` properties based on the new"},{"line_number":9,"context_line":"    ``sushy.oem.dell.constants.TERMINAL_JOB_STATES`` and"},{"line_number":10,"context_line":"    ``FAILED_JOB_STATES`` lists. Callers can now tell"},{"line_number":11,"context_line":"    whether a job finished successfully and why it failed, which"},{"line_number":12,"context_line":"    ``get_unfinished_jobs()`` (which only returns identities) could not"},{"line_number":13,"context_line":"    express."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"902ec2c4_fb89ab76","line":13,"range":{"start_line":2,"start_character":0,"end_line":13,"end_character":12},"in_reply_to":"566c99b0_8c4e51e5","updated":"2026-09-17 06:14:18.000000000","message":"Done","commit_id":"146902903d682d30fe784441918f506a543943ba"}],"sushy/oem/dell/resources/manager/job_collection.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b895ce83fe0ca2851ba49ff1a03a982cc9dfeb1","unresolved":true,"context_lines":[{"line_number":54,"context_line":"            job.DellJob` instances."},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        job_expand_uri \u003d f\u0027{self._path}{self._JOB_EXPAND}\u0027"},{"line_number":57,"context_line":"        LOG.debug(\u0027Getting jobs...\u0027)"},{"line_number":58,"context_line":"        job_response \u003d self._conn.get(job_expand_uri)"},{"line_number":59,"context_line":"        data \u003d job_response.json()"},{"line_number":60,"context_line":"        jobs \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"8c425224_faa9e6ad","line":57,"updated":"2026-09-17 07:38:35.000000000","message":"nit: let\u0027s avoid this, sushy already logs a lot","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e8f1978ad48015bae51884452b8756b2c0e55e08","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            job.DellJob` instances."},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":"        job_expand_uri \u003d f\u0027{self._path}{self._JOB_EXPAND}\u0027"},{"line_number":57,"context_line":"        LOG.debug(\u0027Getting jobs...\u0027)"},{"line_number":58,"context_line":"        job_response \u003d self._conn.get(job_expand_uri)"},{"line_number":59,"context_line":"        data \u003d job_response.json()"},{"line_number":60,"context_line":"        jobs \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"561423a4_dbd80643","line":57,"in_reply_to":"8c425224_faa9e6ad","updated":"2026-09-17 09:28:26.000000000","message":"Done","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b895ce83fe0ca2851ba49ff1a03a982cc9dfeb1","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        for member in data[\u0027Members\u0027]:"},{"line_number":62,"context_line":"            job_id \u003d member.get(\u0027Id\u0027)"},{"line_number":63,"context_line":"            if job_id is None:"},{"line_number":64,"context_line":"                LOG.debug(\u0027Skipping a job member with no Id: %s\u0027, member)"},{"line_number":65,"context_line":"                continue"},{"line_number":66,"context_line":"            if job_ids is not None and job_id not in job_ids:"},{"line_number":67,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"f9fc432c_c2a783db","line":64,"updated":"2026-09-17 07:38:35.000000000","message":"Id is marked as required in your model, so this will be a failure earlier","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e8f1978ad48015bae51884452b8756b2c0e55e08","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        for member in data[\u0027Members\u0027]:"},{"line_number":62,"context_line":"            job_id \u003d member.get(\u0027Id\u0027)"},{"line_number":63,"context_line":"            if job_id is None:"},{"line_number":64,"context_line":"                LOG.debug(\u0027Skipping a job member with no Id: %s\u0027, member)"},{"line_number":65,"context_line":"                continue"},{"line_number":66,"context_line":"            if job_ids is not None and job_id not in job_ids:"},{"line_number":67,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"ad1b8824_bcc1430e","line":64,"in_reply_to":"f9fc432c_c2a783db","updated":"2026-09-17 09:28:26.000000000","message":"Done","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b895ce83fe0ca2851ba49ff1a03a982cc9dfeb1","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                self._conn, job_path, json_doc\u003dmember,"},{"line_number":71,"context_line":"                redfish_version\u003dself.redfish_version,"},{"line_number":72,"context_line":"                registries\u003dself.registries, root\u003dself.root))"},{"line_number":73,"context_line":"        LOG.info(\u0027Got jobs\u0027)"},{"line_number":74,"context_line":"        return jobs"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def get_job(self, job_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ca24eb9c_89d9ca85","line":73,"updated":"2026-09-17 07:38:35.000000000","message":"ditto","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e8f1978ad48015bae51884452b8756b2c0e55e08","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                self._conn, job_path, json_doc\u003dmember,"},{"line_number":71,"context_line":"                redfish_version\u003dself.redfish_version,"},{"line_number":72,"context_line":"                registries\u003dself.registries, root\u003dself.root))"},{"line_number":73,"context_line":"        LOG.info(\u0027Got jobs\u0027)"},{"line_number":74,"context_line":"        return jobs"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def get_job(self, job_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"0dff4d81_624f270c","line":73,"in_reply_to":"ca24eb9c_89d9ca85","updated":"2026-09-17 09:28:26.000000000","message":"Done","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b895ce83fe0ca2851ba49ff1a03a982cc9dfeb1","unresolved":true,"context_lines":[{"line_number":89,"context_line":"            self._conn, f\u0027{self._path}/{job_id}\u0027,"},{"line_number":90,"context_line":"            redfish_version\u003dself.redfish_version,"},{"line_number":91,"context_line":"            registries\u003dself.registries, root\u003dself.root)"},{"line_number":92,"context_line":"        LOG.info(\u0027Got job %s\u0027, job_id)"},{"line_number":93,"context_line":"        return dell_job"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get_unfinished_jobs(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6112c025_07938088","line":92,"updated":"2026-09-17 07:38:35.000000000","message":"Ditto and definitely not as INFO","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e8f1978ad48015bae51884452b8756b2c0e55e08","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            self._conn, f\u0027{self._path}/{job_id}\u0027,"},{"line_number":90,"context_line":"            redfish_version\u003dself.redfish_version,"},{"line_number":91,"context_line":"            registries\u003dself.registries, root\u003dself.root)"},{"line_number":92,"context_line":"        LOG.info(\u0027Got job %s\u0027, job_id)"},{"line_number":93,"context_line":"        return dell_job"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get_unfinished_jobs(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"23665502_f52f2140","line":92,"in_reply_to":"6112c025_07938088","updated":"2026-09-17 09:28:26.000000000","message":"Done","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b895ce83fe0ca2851ba49ff1a03a982cc9dfeb1","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        :returns: A list of unfinished jobs."},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        unfinished_jobs \u003d []"},{"line_number":107,"context_line":"        LOG.debug(\u0027Getting unfinished jobs...\u0027)"},{"line_number":108,"context_line":"        for dell_job in self.get_jobs():"},{"line_number":109,"context_line":"            if not dell_job.is_finished:"},{"line_number":110,"context_line":"                LOG.debug(\u0027Job %(id)s is in state %(state)s, treating it \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ef17411f_92d6a380","line":107,"updated":"2026-09-17 07:38:35.000000000","message":"aside: we need to drop excessive logging here too","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e8f1978ad48015bae51884452b8756b2c0e55e08","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        :returns: A list of unfinished jobs."},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        unfinished_jobs \u003d []"},{"line_number":107,"context_line":"        LOG.debug(\u0027Getting unfinished jobs...\u0027)"},{"line_number":108,"context_line":"        for dell_job in self.get_jobs():"},{"line_number":109,"context_line":"            if not dell_job.is_finished:"},{"line_number":110,"context_line":"                LOG.debug(\u0027Job %(id)s is in state %(state)s, treating it \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a1c9f3d_1d267f28","line":107,"in_reply_to":"ef17411f_92d6a380","updated":"2026-09-17 09:28:26.000000000","message":"Done","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"}],"sushy/tests/oem/dell/unit/resources/manager/test_job.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b895ce83fe0ca2851ba49ff1a03a982cc9dfeb1","unresolved":true,"context_lines":[{"line_number":51,"context_line":"                         self.dell_job.completion_time)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_is_finished_terminal_state(self):"},{"line_number":54,"context_line":"        self.assertTrue(self.dell_job.is_finished)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def test_is_finished_non_terminal_state(self):"},{"line_number":57,"context_line":"        self.dell_job.job_state \u003d \u0027UserIntervention\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"29fd37a6_d36c97df","line":54,"updated":"2026-09-17 07:38:35.000000000","message":"Let\u0027s assert values of both is_finished and is_failed in all cases","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e8f1978ad48015bae51884452b8756b2c0e55e08","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                         self.dell_job.completion_time)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_is_finished_terminal_state(self):"},{"line_number":54,"context_line":"        self.assertTrue(self.dell_job.is_finished)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def test_is_finished_non_terminal_state(self):"},{"line_number":57,"context_line":"        self.dell_job.job_state \u003d \u0027UserIntervention\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"e59323aa_e14fbb1b","line":54,"in_reply_to":"29fd37a6_d36c97df","updated":"2026-09-17 09:28:26.000000000","message":"Done","commit_id":"386acaf4361cd823ccd8535d14344c2e0b5d1993"}]}
