)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"134bf174b9b4bf7ed3c37330ccfc7407f1e38ebb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"2966473d_3e69523c","updated":"2024-02-05 20:21:18.000000000","message":"It feels like this is a BMC... ;)\n\nIf we can get some more details on use, in terms of docs, It feels like it might help context wise. I wouldn\u0027t expect folks to just go look at the commit log under normal cirumstances.","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"5117ab2224afb14701666e54fd8f56c162876b01","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9b545d37_32d11d33","updated":"2024-02-13 13:31:46.000000000","message":"This looks very promising, this feature would help a lot with development so thank you Steve Baker for implementing it. I have a few nits but nothing major.\nI would be very interested to see this feature progress further!","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"39b2bb4295293e25194c4a04e3480716367093be","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f1e91916_181534f7","updated":"2024-05-29 09:15:00.000000000","message":"I don\u0027t review sushy-tools stuff much, but this seems like it can do no harm and I don\u0027t want you to wait any longer.","commit_id":"fafb4b0b86d1bbdaaa726aa98f65f98920230ddb"},{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"1d5430f595ed99f1a0447db6177978cfe796ed88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a68d0024_c9f01f47","updated":"2024-05-29 06:50:42.000000000","message":"Is there any blocker in the way of merging this?","commit_id":"fafb4b0b86d1bbdaaa726aa98f65f98920230ddb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"088397aa509d2a4fe5dbf6e722cf5fe1aefd775d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"c6ebe19f_fb294aaa","updated":"2024-04-01 13:15:57.000000000","message":"LGTM, Thanks!","commit_id":"fafb4b0b86d1bbdaaa726aa98f65f98920230ddb"}],"releasenotes/notes/vmedia-openstack-fc422b845c343fc3.yaml":[{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"5117ab2224afb14701666e54fd8f56c162876b01","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The openstack driver now supports insert and eject of virtual media. On"},{"line_number":5,"context_line":"    insert a new empty volume is created and attached to the server and the"},{"line_number":6,"context_line":"    server is rebuilt with the the image. On eject it is assumed that the"},{"line_number":7,"context_line":"    attached volume has been rewritten with bootable image data. The volume is"},{"line_number":8,"context_line":"    detached and uploaded as an image, then the server is rebuilt with that"},{"line_number":9,"context_line":"    image."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"b9cd9102_ab7cdb65","line":6,"updated":"2024-02-13 13:31:46.000000000","message":"either without the second \"the\" or \"with that image\"","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"e9ed9fc1ffee853527716a1752c55a9b3ec9f20f","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The openstack driver now supports insert and eject of virtual media. On"},{"line_number":5,"context_line":"    insert a new empty volume is created and attached to the server and the"},{"line_number":6,"context_line":"    server is rebuilt with the the image. On eject it is assumed that the"},{"line_number":7,"context_line":"    attached volume has been rewritten with bootable image data. The volume is"},{"line_number":8,"context_line":"    detached and uploaded as an image, then the server is rebuilt with that"},{"line_number":9,"context_line":"    image."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"6fd60577_26025fbb","line":6,"in_reply_to":"b9cd9102_ab7cdb65","updated":"2024-02-22 10:54:35.000000000","message":"Comment was aimed at line 6.","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6f266b6e49b7e0ec6ab88d36d5c1ae6c0e8de3a5","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The openstack driver now supports insert and eject of virtual media. On"},{"line_number":5,"context_line":"    insert a new empty volume is created and attached to the server and the"},{"line_number":6,"context_line":"    server is rebuilt with the the image. On eject it is assumed that the"},{"line_number":7,"context_line":"    attached volume has been rewritten with bootable image data. The volume is"},{"line_number":8,"context_line":"    detached and uploaded as an image, then the server is rebuilt with that"},{"line_number":9,"context_line":"    image."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"d9c74726_f7b167b5","line":6,"in_reply_to":"b9cd9102_ab7cdb65","updated":"2024-02-27 20:16:47.000000000","message":"Done","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"}],"sushy_tools/emulator/main.py":[{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"5117ab2224afb14701666e54fd8f56c162876b01","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    @property"},{"line_number":171,"context_line":"    @memoize.memoize()"},{"line_number":172,"context_line":"    def vmedia(self):"},{"line_number":173,"context_line":"        os_cloud \u003d self.config.get(\u0027SUSHY_EMULATOR_OS_CLOUD\u0027)"},{"line_number":174,"context_line":"        if os_cloud:"},{"line_number":175,"context_line":"            return vmddriver.OpenstackDriver(self.config, self.logger,"},{"line_number":176,"context_line":"                                             self.systems.connection)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6d13cc4b_a55fd567","line":173,"updated":"2024-02-13 13:31:46.000000000","message":"Could we move this up into the __init__, I think we shouldn\u0027t do an ENV checking all the time this function (property) is called. It is enough to check the ENV during \"Application\" initialization IMO. I would pair it with some object variable like \"self.os_cloud\" or something along that line.","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"25ba98f27184ba8e71ac5289353d4dbd8ed8c763","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    @property"},{"line_number":171,"context_line":"    @memoize.memoize()"},{"line_number":172,"context_line":"    def vmedia(self):"},{"line_number":173,"context_line":"        os_cloud \u003d self.config.get(\u0027SUSHY_EMULATOR_OS_CLOUD\u0027)"},{"line_number":174,"context_line":"        if os_cloud:"},{"line_number":175,"context_line":"            return vmddriver.OpenstackDriver(self.config, self.logger,"},{"line_number":176,"context_line":"                                             self.systems.connection)"}],"source_content_type":"text/x-python","patch_set":3,"id":"d3a53464_7c5d018d","line":173,"in_reply_to":"05300b4d_c5a3cd8c","updated":"2024-02-15 07:11:15.000000000","message":"Indeed, not sure why I thought it was an env lookup, anyways thanks for the answer.","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"281f3612fe484c86769f920af180c7df048bec74","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    @property"},{"line_number":171,"context_line":"    @memoize.memoize()"},{"line_number":172,"context_line":"    def vmedia(self):"},{"line_number":173,"context_line":"        os_cloud \u003d self.config.get(\u0027SUSHY_EMULATOR_OS_CLOUD\u0027)"},{"line_number":174,"context_line":"        if os_cloud:"},{"line_number":175,"context_line":"            return vmddriver.OpenstackDriver(self.config, self.logger,"},{"line_number":176,"context_line":"                                             self.systems.connection)"}],"source_content_type":"text/x-python","patch_set":3,"id":"05300b4d_c5a3cd8c","line":173,"in_reply_to":"6d13cc4b_a55fd567","updated":"2024-02-15 02:06:03.000000000","message":"In this case it isn\u0027t an ENV lookup, its a config dict. Also the memoize decoration will mean it is only evaluated the first time the vmedia property is accessed","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"}],"sushy_tools/emulator/resources/systems/novadriver.py":[{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"e9ed9fc1ffee853527716a1752c55a9b3ec9f20f","unresolved":true,"context_lines":[{"line_number":395,"context_line":"        :raises: `error.FishyError` if boot device can\u0027t be set"},{"line_number":396,"context_line":"        \"\"\""},{"line_number":397,"context_line":"        instance \u003d self._get_instance(identity)"},{"line_number":398,"context_line":"        vmedia \u003d flask.current_app.vmedia"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        if instance.image.id \u003d\u003d boot_image:"},{"line_number":401,"context_line":"            msg \u003d (\u0027Image %(identity)s already has image %(boot_image)s. \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"cbe799c0_2daf61d2","line":398,"updated":"2024-02-22 10:54:35.000000000","message":"I think we should not involve flask in the novadriver directly, the controller should pass down the refference of the vmedia module\u0027s \"OpenstackDriver\" object as the controller has access to flask already.\n\nI explain my idea in more detail in https://review.opendev.org/c/openstack/sushy-tools/+/906768/comment/a801bc72_12d11486/","commit_id":"80862dca08b65215735b47bcee9f961319911f05"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"dff2d08d1cf9648bff8a14baecdf786f763f21bd","unresolved":false,"context_lines":[{"line_number":395,"context_line":"        :raises: `error.FishyError` if boot device can\u0027t be set"},{"line_number":396,"context_line":"        \"\"\""},{"line_number":397,"context_line":"        instance \u003d self._get_instance(identity)"},{"line_number":398,"context_line":"        vmedia \u003d flask.current_app.vmedia"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        if instance.image.id \u003d\u003d boot_image:"},{"line_number":401,"context_line":"            msg \u003d (\u0027Image %(identity)s already has image %(boot_image)s. \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"a4de403f_7f5e6e77","line":398,"in_reply_to":"cbe799c0_2daf61d2","updated":"2024-03-06 22:17:44.000000000","message":"Done","commit_id":"80862dca08b65215735b47bcee9f961319911f05"}],"sushy_tools/emulator/resources/vmedia.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1180c1a7af0e9edf6c54e246b6080040e28654ad","unresolved":true,"context_lines":[{"line_number":240,"context_line":"        cls._logger \u003d logger"},{"line_number":241,"context_line":"        cls._os_cloud \u003d os_cloud"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        cls._cc \u003d openstack.connect(cloud\u003dos_cloud)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        return cls"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"741519b2_4a110498","line":243,"range":{"start_line":243,"start_character":0,"end_line":243,"end_character":51},"updated":"2024-01-25 22:50:53.000000000","message":"Why would this be needed on the static driver? I\u0027m not sure that makes sense to me, and if really needed it might need an inline note to provide more context.","commit_id":"bf4c068bd67338124e99097ab1a81d3cb0727acd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"134bf174b9b4bf7ed3c37330ccfc7407f1e38ebb","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        cls._logger \u003d logger"},{"line_number":241,"context_line":"        cls._os_cloud \u003d os_cloud"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        cls._cc \u003d openstack.connect(cloud\u003dos_cloud)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        return cls"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"045f78db_65e7ad6d","line":243,"range":{"start_line":243,"start_character":0,"end_line":243,"end_character":51},"in_reply_to":"619b4167_0017218e","updated":"2024-02-05 20:21:18.000000000","message":"Acknowledged","commit_id":"bf4c068bd67338124e99097ab1a81d3cb0727acd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6706de9150d2d1aa68497ff18d5ce3e39f5857de","unresolved":true,"context_lines":[{"line_number":240,"context_line":"        cls._logger \u003d logger"},{"line_number":241,"context_line":"        cls._os_cloud \u003d os_cloud"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        cls._cc \u003d openstack.connect(cloud\u003dos_cloud)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        return cls"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"619b4167_0017218e","line":243,"range":{"start_line":243,"start_character":0,"end_line":243,"end_character":51},"in_reply_to":"741519b2_4a110498","updated":"2024-01-26 00:35:21.000000000","message":"Oh, I think this initialize method should be deleted","commit_id":"bf4c068bd67338124e99097ab1a81d3cb0727acd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1180c1a7af0e9edf6c54e246b6080040e28654ad","unresolved":true,"context_lines":[{"line_number":599,"context_line":"                        \u0027Server rebuild attempt resulted in status %s\u0027"},{"line_number":600,"context_line":"                        % server.status)"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"                while volume.status \u003d\u003d \u0027uploading\u0027:"},{"line_number":603,"context_line":"                    time.sleep(1)"},{"line_number":604,"context_line":"                    volume \u003d self._cc.block_storage.get_volume(volume)"},{"line_number":605,"context_line":"                if volume.status !\u003d \u0027available\u0027:"},{"line_number":606,"context_line":"                    raise error.FishyError("},{"line_number":607,"context_line":"                        \u0027Volume upload resulted in status %s\u0027 % volume.status)"}],"source_content_type":"text/x-python","patch_set":1,"id":"847535c7_f0142589","line":604,"range":{"start_line":602,"start_character":16,"end_line":604,"end_character":70},"updated":"2024-01-25 22:50:53.000000000","message":"are there any other statuses this could hit? I thought there was a converting state which was possible.","commit_id":"bf4c068bd67338124e99097ab1a81d3cb0727acd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6f266b6e49b7e0ec6ab88d36d5c1ae6c0e8de3a5","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                        \u0027Server rebuild attempt resulted in status %s\u0027"},{"line_number":600,"context_line":"                        % server.status)"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"                while volume.status \u003d\u003d \u0027uploading\u0027:"},{"line_number":603,"context_line":"                    time.sleep(1)"},{"line_number":604,"context_line":"                    volume \u003d self._cc.block_storage.get_volume(volume)"},{"line_number":605,"context_line":"                if volume.status !\u003d \u0027available\u0027:"},{"line_number":606,"context_line":"                    raise error.FishyError("},{"line_number":607,"context_line":"                        \u0027Volume upload resulted in status %s\u0027 % volume.status)"}],"source_content_type":"text/x-python","patch_set":1,"id":"297e5df7_b973568c","line":604,"range":{"start_line":602,"start_character":16,"end_line":604,"end_character":70},"in_reply_to":"388f1834_498c2d6b","updated":"2024-02-27 20:16:47.000000000","message":"Done","commit_id":"bf4c068bd67338124e99097ab1a81d3cb0727acd"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6706de9150d2d1aa68497ff18d5ce3e39f5857de","unresolved":true,"context_lines":[{"line_number":599,"context_line":"                        \u0027Server rebuild attempt resulted in status %s\u0027"},{"line_number":600,"context_line":"                        % server.status)"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"                while volume.status \u003d\u003d \u0027uploading\u0027:"},{"line_number":603,"context_line":"                    time.sleep(1)"},{"line_number":604,"context_line":"                    volume \u003d self._cc.block_storage.get_volume(volume)"},{"line_number":605,"context_line":"                if volume.status !\u003d \u0027available\u0027:"},{"line_number":606,"context_line":"                    raise error.FishyError("},{"line_number":607,"context_line":"                        \u0027Volume upload resulted in status %s\u0027 % volume.status)"}],"source_content_type":"text/x-python","patch_set":1,"id":"388f1834_498c2d6b","line":604,"range":{"start_line":602,"start_character":16,"end_line":604,"end_character":70},"in_reply_to":"847535c7_f0142589","updated":"2024-01-26 00:35:21.000000000","message":"Highly likely. I was just going off observed states. I need to actually look at the status documentation for volumes, images, and servers.","commit_id":"bf4c068bd67338124e99097ab1a81d3cb0727acd"},{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"5117ab2224afb14701666e54fd8f56c162876b01","unresolved":true,"context_lines":[{"line_number":416,"context_line":"                pass"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def _check_future(self, identity):"},{"line_number":419,"context_line":"        f \u003d self._futures.pop(identity, None)"},{"line_number":420,"context_line":"        if f is None:"},{"line_number":421,"context_line":"            return"},{"line_number":422,"context_line":"        if f.running():"}],"source_content_type":"text/x-python","patch_set":3,"id":"15bc82d1_8464c987","line":419,"updated":"2024-02-13 13:31:46.000000000","message":"you are using very clear and explicit variable names everywhere except here, could you please change \"f\" to \"future\" ?","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6f266b6e49b7e0ec6ab88d36d5c1ae6c0e8de3a5","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                pass"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def _check_future(self, identity):"},{"line_number":419,"context_line":"        f \u003d self._futures.pop(identity, None)"},{"line_number":420,"context_line":"        if f is None:"},{"line_number":421,"context_line":"            return"},{"line_number":422,"context_line":"        if f.running():"}],"source_content_type":"text/x-python","patch_set":3,"id":"ecb2add6_631c1499","line":419,"in_reply_to":"15bc82d1_8464c987","updated":"2024-02-27 20:16:47.000000000","message":"Done","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"281f3612fe484c86769f920af180c7df048bec74","unresolved":true,"context_lines":[{"line_number":558,"context_line":"                    \u0027Volume attachment resulted in status %s\u0027 %"},{"line_number":559,"context_line":"                    volume.status)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"            self._logger.debug("},{"line_number":562,"context_line":"                \u0027Rebuilding %(identity)s with image %(image)s\u0027 %"},{"line_number":563,"context_line":"                {\u0027identity\u0027: identity, \u0027image\u0027: image.id})"},{"line_number":564,"context_line":"            server \u003d self._cc.compute.rebuild_server(identity, image.id)"},{"line_number":565,"context_line":"            while server.status \u003d\u003d \u0027REBUILD\u0027:"},{"line_number":566,"context_line":"                server \u003d self._cc.compute.get_server(identity)"},{"line_number":567,"context_line":"                time.sleep(1)"},{"line_number":568,"context_line":"            if server.status !\u003d \u0027ACTIVE\u0027:"},{"line_number":569,"context_line":"                raise error.FishyError(\u0027Server rebuild attempt resulted in \u0027"},{"line_number":570,"context_line":"                                       \u0027status %s\u0027 % server.status)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        except error.FishyError as ex:"},{"line_number":573,"context_line":"            msg \u003d \u0027Failed insert image from URL %s: %s\u0027 % (image_url, ex)"}],"source_content_type":"text/x-python","patch_set":3,"id":"f000c55d_e6434c41","line":570,"range":{"start_line":561,"start_character":0,"end_line":570,"end_character":67},"updated":"2024-02-15 02:06:03.000000000","message":"I think the actual rebuild should be moved to a new long running task triggered by setting BootSourceOverrideTarget to Cd, likewise for eject, do the rebuild when BootSourceOverrideTarget is set to something other than Cd","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6f266b6e49b7e0ec6ab88d36d5c1ae6c0e8de3a5","unresolved":false,"context_lines":[{"line_number":558,"context_line":"                    \u0027Volume attachment resulted in status %s\u0027 %"},{"line_number":559,"context_line":"                    volume.status)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"            self._logger.debug("},{"line_number":562,"context_line":"                \u0027Rebuilding %(identity)s with image %(image)s\u0027 %"},{"line_number":563,"context_line":"                {\u0027identity\u0027: identity, \u0027image\u0027: image.id})"},{"line_number":564,"context_line":"            server \u003d self._cc.compute.rebuild_server(identity, image.id)"},{"line_number":565,"context_line":"            while server.status \u003d\u003d \u0027REBUILD\u0027:"},{"line_number":566,"context_line":"                server \u003d self._cc.compute.get_server(identity)"},{"line_number":567,"context_line":"                time.sleep(1)"},{"line_number":568,"context_line":"            if server.status !\u003d \u0027ACTIVE\u0027:"},{"line_number":569,"context_line":"                raise error.FishyError(\u0027Server rebuild attempt resulted in \u0027"},{"line_number":570,"context_line":"                                       \u0027status %s\u0027 % server.status)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"        except error.FishyError as ex:"},{"line_number":573,"context_line":"            msg \u003d \u0027Failed insert image from URL %s: %s\u0027 % (image_url, ex)"}],"source_content_type":"text/x-python","patch_set":3,"id":"f214c99d_fb504de5","line":570,"range":{"start_line":561,"start_character":0,"end_line":570,"end_character":67},"in_reply_to":"f000c55d_e6434c41","updated":"2024-02-27 20:16:47.000000000","message":"Instead it is moved to being triggered off set_boot_image, and set_boot_device is documented as being a noop","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"281f3612fe484c86769f920af180c7df048bec74","unresolved":true,"context_lines":[{"line_number":664,"context_line":"            if server.status !\u003d \u0027ACTIVE\u0027:"},{"line_number":665,"context_line":"                raise error.FishyError("},{"line_number":666,"context_line":"                    \u0027Server rebuild attempt resulted in status %s\u0027"},{"line_number":667,"context_line":"                    % server.status)"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"            # Wait for the volume to be back into a state which can be deleted"},{"line_number":670,"context_line":"            while volume.status \u003d\u003d \u0027uploading\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"2be2c583_53978374","line":667,"updated":"2024-02-15 02:06:03.000000000","message":"See above regarding where to do the rebuild","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6f266b6e49b7e0ec6ab88d36d5c1ae6c0e8de3a5","unresolved":false,"context_lines":[{"line_number":664,"context_line":"            if server.status !\u003d \u0027ACTIVE\u0027:"},{"line_number":665,"context_line":"                raise error.FishyError("},{"line_number":666,"context_line":"                    \u0027Server rebuild attempt resulted in status %s\u0027"},{"line_number":667,"context_line":"                    % server.status)"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"            # Wait for the volume to be back into a state which can be deleted"},{"line_number":670,"context_line":"            while volume.status \u003d\u003d \u0027uploading\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"de597d12_8c32818c","line":667,"in_reply_to":"2be2c583_53978374","updated":"2024-02-27 20:16:47.000000000","message":"Done","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"12e6ef84d19227583716fdfb2ed6e6fc6fd7c7eb","unresolved":true,"context_lines":[{"line_number":678,"context_line":"            msg \u003d \u0027Failed ejecting image %s: %s\u0027 % (device_info[\u0027Image\u0027], ex)"},{"line_number":679,"context_line":"            self._logger.exception(msg)"},{"line_number":680,"context_line":"            raise ex"},{"line_number":681,"context_line":"            # raise error.FishyError(msg)"},{"line_number":682,"context_line":"        finally:"},{"line_number":683,"context_line":"            device_info[\u0027Image\u0027] \u003d \u0027\u0027"},{"line_number":684,"context_line":"            device_info[\u0027ImageName\u0027] \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"689dbb07_0d8e5485","line":681,"updated":"2024-02-06 19:54:23.000000000","message":"Uncomment this line","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6f266b6e49b7e0ec6ab88d36d5c1ae6c0e8de3a5","unresolved":false,"context_lines":[{"line_number":678,"context_line":"            msg \u003d \u0027Failed ejecting image %s: %s\u0027 % (device_info[\u0027Image\u0027], ex)"},{"line_number":679,"context_line":"            self._logger.exception(msg)"},{"line_number":680,"context_line":"            raise ex"},{"line_number":681,"context_line":"            # raise error.FishyError(msg)"},{"line_number":682,"context_line":"        finally:"},{"line_number":683,"context_line":"            device_info[\u0027Image\u0027] \u003d \u0027\u0027"},{"line_number":684,"context_line":"            device_info[\u0027ImageName\u0027] \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"20c8a8cf_f1d268bd","line":681,"in_reply_to":"689dbb07_0d8e5485","updated":"2024-02-27 20:16:47.000000000","message":"Done","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"e9ed9fc1ffee853527716a1752c55a9b3ec9f20f","unresolved":true,"context_lines":[{"line_number":520,"context_line":"        self._devices.update({(identity, device): device_info})"},{"line_number":521,"context_line":"        return image.id"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def rebuild_with_imported_image(self, identity, image_id):"},{"line_number":524,"context_line":"        self._check_future(identity)"},{"line_number":525,"context_line":"        self._logger.debug("},{"line_number":526,"context_line":"            \u0027Creating task to finish import and rebuild for %(identity)s\u0027 %"}],"source_content_type":"text/x-python","patch_set":5,"id":"a801bc72_12d11486","line":523,"updated":"2024-02-22 10:54:35.000000000","message":"Shouldn\u0027t the rebuild logic be placed in the nova driver instead of the nova driver accessing the  flask  system endpoint of the flask app and then querying the vmedia field to run these? I don\u0027t really see a strong reason to do this flow ``\nflask app\u003c-\u003evmedia controller\u003c-\u003enova driver\u003c-\u003eflask app\u003c-\u003evmedia.py\u003c-\u003enova driver`` for example in case of the ``set_boot_image`` . Rebuilding is only accessed from nova driver I don\u0027t see a reason why we should have it here.\n\nThis ties in with a more general architectural discussion, IMO this vmedia.py should already utilize the novadriver instead of directly importing the openstacksdk. \n\nIn the current patch part of openstack specific calls are in vmedia.py and partially in the nova driver. I know that the vmedia controller was accessing both the ``systems (drivers)`` directly and it is accessing the vmedia module separately at the moment but I think the flow should be :\n\n``user \u003c-\u003e flask app \u003c-\u003e vmedia.py \u003c-\u003e driver`` \nor when the vmedia module is not accessed just \n``user\u003c-\u003e flask app \u003c-\u003e driver``. \n\nI think with the flows I mentioned we could avoid putting flask in nova driver and direct openstacksk usage in the vmedia.py.","commit_id":"80862dca08b65215735b47bcee9f961319911f05"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"dff2d08d1cf9648bff8a14baecdf786f763f21bd","unresolved":false,"context_lines":[{"line_number":520,"context_line":"        self._devices.update({(identity, device): device_info})"},{"line_number":521,"context_line":"        return image.id"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def rebuild_with_imported_image(self, identity, image_id):"},{"line_number":524,"context_line":"        self._check_future(identity)"},{"line_number":525,"context_line":"        self._logger.debug("},{"line_number":526,"context_line":"            \u0027Creating task to finish import and rebuild for %(identity)s\u0027 %"}],"source_content_type":"text/x-python","patch_set":5,"id":"267bbb12_b0ac7ff0","line":523,"in_reply_to":"a801bc72_12d11486","updated":"2024-03-06 22:17:44.000000000","message":"I have gone with \n\n  user \u003c-\u003e flask app \u003c-\u003e vmedia.py \u003c-\u003e driver\n  \nand its much cleaner, thanks. Also the state is no longer stored in memory, its stored in nova metadata properties, which is more robust and self-documenting.","commit_id":"80862dca08b65215735b47bcee9f961319911f05"}],"sushy_tools/tests/unit/emulator/resources/test_vmedia.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"134bf174b9b4bf7ed3c37330ccfc7407f1e38ebb","unresolved":true,"context_lines":[{"line_number":511,"context_line":"                    \"DVD\""},{"line_number":512,"context_line":"                ]"},{"line_number":513,"context_line":"            },"},{"line_number":514,"context_line":"            \"Floppy\": {"},{"line_number":515,"context_line":"                \"Name\": \"Virtual Removable Media\","},{"line_number":516,"context_line":"                \"MediaTypes\": ["},{"line_number":517,"context_line":"                    \"Floppy\","},{"line_number":518,"context_line":"                    \"USBStick\""},{"line_number":519,"context_line":"                ]"},{"line_number":520,"context_line":"            }"},{"line_number":521,"context_line":"        }"},{"line_number":522,"context_line":"    }"},{"line_number":523,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5fdbdc5a_e9eae262","line":520,"range":{"start_line":514,"start_character":0,"end_line":520,"end_character":13},"updated":"2024-02-05 20:21:18.000000000","message":"Any reason why this is needed? I\u0027m just thinking this seems un-needed.","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":35233,"name":"Adam Rozman","email":"adam.rozman@est.tech","username":"rozzix"},"change_message_id":"5117ab2224afb14701666e54fd8f56c162876b01","unresolved":true,"context_lines":[{"line_number":511,"context_line":"                    \"DVD\""},{"line_number":512,"context_line":"                ]"},{"line_number":513,"context_line":"            },"},{"line_number":514,"context_line":"            \"Floppy\": {"},{"line_number":515,"context_line":"                \"Name\": \"Virtual Removable Media\","},{"line_number":516,"context_line":"                \"MediaTypes\": ["},{"line_number":517,"context_line":"                    \"Floppy\","},{"line_number":518,"context_line":"                    \"USBStick\""},{"line_number":519,"context_line":"                ]"},{"line_number":520,"context_line":"            }"},{"line_number":521,"context_line":"        }"},{"line_number":522,"context_line":"    }"},{"line_number":523,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7b3d13c2_2ffc2843","line":520,"range":{"start_line":514,"start_character":0,"end_line":520,"end_character":13},"in_reply_to":"5fdbdc5a_e9eae262","updated":"2024-02-13 13:31:46.000000000","message":"When the vmedia endpoint is accessed via the sushy-emulator API so user \u003c- shusy-emulator \u003c- OStack , on the user side the \"Floppy\" section is part of the result.\n\nSo if I access `/redfish/v1/Systems/\u003csystem_id\u003e/VirtualMedia` then it presents two values :\n```\n\"Members\": [\n    {\n      \"@odata.id\": \"/redfish/v1/Systems/\u003csystem_id\u003e/VirtualMedia/Cd\"\n    },\n    {\n      \"@odata.id\": \"/redfish/v1/Systems/\u003csystem_id\u003e/VirtualMedia/Floppy\"\n    }\n  ],\n```\n\nI guess this means it is not a bad idea to mock the \"Floppy\" stuff . But not expert on this, just observation.","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6f266b6e49b7e0ec6ab88d36d5c1ae6c0e8de3a5","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                    \"DVD\""},{"line_number":512,"context_line":"                ]"},{"line_number":513,"context_line":"            },"},{"line_number":514,"context_line":"            \"Floppy\": {"},{"line_number":515,"context_line":"                \"Name\": \"Virtual Removable Media\","},{"line_number":516,"context_line":"                \"MediaTypes\": ["},{"line_number":517,"context_line":"                    \"Floppy\","},{"line_number":518,"context_line":"                    \"USBStick\""},{"line_number":519,"context_line":"                ]"},{"line_number":520,"context_line":"            }"},{"line_number":521,"context_line":"        }"},{"line_number":522,"context_line":"    }"},{"line_number":523,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"0a24b75d_ed065f32","line":520,"range":{"start_line":514,"start_character":0,"end_line":520,"end_character":13},"in_reply_to":"7b3d13c2_2ffc2843","updated":"2024-02-27 20:16:47.000000000","message":"I have changed and documented the openstack driver as only supporting \u0027Cd\u0027, and SUSHY_EMULATOR_VMEDIA_DEVICES is ignored. I\u0027ll remove this to reflect that.","commit_id":"ad69d0a1e889ee278919224b57daf29a512d4c37"}]}
