)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"a874e7de4119e5f94a19d7ec826d1d8bd829b784","unresolved":true,"context_lines":[{"line_number":19,"context_line":"that the backend system is introduced in isolation without affecting existing functionality."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Benefits:"},{"line_number":22,"context_line":"- Provides a solid foundation for alternative backends like Eventlet and NextGen."},{"line_number":23,"context_line":"- Enhances modularity and flexibility in `oslo.service`."},{"line_number":24,"context_line":"- Maintains backward compatibility with current implementations."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"13af1301_2b49a518","line":22,"range":{"start_line":22,"start_character":73,"end_line":22,"end_character":80},"updated":"2024-11-20 12:52:08.000000000","message":"We decided to rather name it \"threading\"\nhttps://review.opendev.org/c/openstack/oslo-specs/+/927503/comment/c31a4c63_4601bcb9/","commit_id":"dea15ddcd87c70a19e1855b667fe8e9a500b529a"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"a50855cb4d13777831ce58d6578fc2e2739b9757","unresolved":true,"context_lines":[{"line_number":19,"context_line":"that the backend system is introduced in isolation without affecting existing functionality."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Benefits:"},{"line_number":22,"context_line":"- Provides a solid foundation for alternative backends like Eventlet and NextGen."},{"line_number":23,"context_line":"- Enhances modularity and flexibility in `oslo.service`."},{"line_number":24,"context_line":"- Maintains backward compatibility with current implementations."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"952892a1_f33f45f4","line":22,"range":{"start_line":22,"start_character":73,"end_line":22,"end_character":80},"in_reply_to":"13af1301_2b49a518","updated":"2024-11-20 13:41:01.000000000","message":"Yes, you’re right, good catch. I’ll update it to use “threading” as the name. Thanks a lot!","commit_id":"dea15ddcd87c70a19e1855b667fe8e9a500b529a"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"af228945f8ea59526aa2a2f45c72d0f71011a8b2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"that the backend system is introduced in isolation without affecting existing functionality."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Benefits:"},{"line_number":22,"context_line":"- Provides a solid foundation for alternative backends like Eventlet and NextGen."},{"line_number":23,"context_line":"- Enhances modularity and flexibility in `oslo.service`."},{"line_number":24,"context_line":"- Maintains backward compatibility with current implementations."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3dc4c01f_9f5edbb9","line":22,"range":{"start_line":22,"start_character":73,"end_line":22,"end_character":80},"in_reply_to":"952892a1_f33f45f4","updated":"2024-11-20 13:43:03.000000000","message":"Done","commit_id":"dea15ddcd87c70a19e1855b667fe8e9a500b529a"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"e05cf24485fd052af99b2a18aefaa3218b08b73f","unresolved":true,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"- A `get_backend()` method in `backend/__init__.py` for dynamically"},{"line_number":13,"context_line":"loading"},{"line_number":14,"context_line":"  backends based on a configuration option (`CONF.backend`)."},{"line_number":15,"context_line":"- An abstract `BaseBackend` class in `backend/base.py` to define the"},{"line_number":16,"context_line":"  interface that all backends must implement."},{"line_number":17,"context_line":"- Unit tests for the dynamic loading mechanism and the abstract base"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"5855bd54_97134d67","line":14,"range":{"start_line":14,"start_character":11,"end_line":14,"end_character":59},"updated":"2025-01-22 16:21:59.000000000","message":"Not true anymore","commit_id":"51e8de5b484707e79b57a11f19e31a99db61b543"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"069a53d61b7e3d9048fee063219c09319730e92e","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"- A `get_backend()` method in `backend/__init__.py` for dynamically"},{"line_number":13,"context_line":"loading"},{"line_number":14,"context_line":"  backends based on a configuration option (`CONF.backend`)."},{"line_number":15,"context_line":"- An abstract `BaseBackend` class in `backend/base.py` to define the"},{"line_number":16,"context_line":"  interface that all backends must implement."},{"line_number":17,"context_line":"- Unit tests for the dynamic loading mechanism and the abstract base"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"c06a6cb2_95ef684b","line":14,"range":{"start_line":14,"start_character":11,"end_line":14,"end_character":59},"in_reply_to":"5855bd54_97134d67","updated":"2025-01-22 16:25:03.000000000","message":"Done","commit_id":"51e8de5b484707e79b57a11f19e31a99db61b543"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"a874e7de4119e5f94a19d7ec826d1d8bd829b784","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a2c143c6_619f7ec4","updated":"2024-11-20 12:52:08.000000000","message":"Awesome! Great job! That\u0027s an excellent starts.\nThank you Daniel.","commit_id":"dea15ddcd87c70a19e1855b667fe8e9a500b529a"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"a50855cb4d13777831ce58d6578fc2e2739b9757","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"596cb57b_7b374eb0","in_reply_to":"a2c143c6_619f7ec4","updated":"2024-11-20 13:41:01.000000000","message":"No worries, you’re welcome, and thanks a lot for the encouraging feedback. I really appreciate it!","commit_id":"dea15ddcd87c70a19e1855b667fe8e9a500b529a"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"d915ff23cbe514a5bc51f0c5f3ae17e8bb492f12","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"34df14bf_92b9c6a1","updated":"2024-11-27 13:38:03.000000000","message":"All i had to say is already said. I\u0027d have prefered to wait for introducing the exposure of the option, at least I\u0027d loved to have the eventlet backend available, before exposing it.\n\nConcerning the `NotImplementedError` choice, I\u0027d have prefered the `ValueError`, but if you think that\u0027s the right way to do that I won\u0027t block the patch for that.\n\nI\u0027ll Mike and Takashi review it.\nI put a +1 for now. If you think this patch is ready then take it as a +2.","commit_id":"457b1967027aaa1193987805edc64b7ebb3e99c3"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"888795242b5ad7f83b54076ccae46b4df266e778","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"eee0b081_1c9ecc24","in_reply_to":"34df14bf_92b9c6a1","updated":"2024-11-27 13:39:02.000000000","message":"*let","commit_id":"457b1967027aaa1193987805edc64b7ebb3e99c3"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"dd2fbf75b564389d04eccd45b98c8f8e098a869a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"61b7c959_0ab931f4","updated":"2024-11-27 13:51:06.000000000","message":"What\u0027s missing for me here is that I dont really have a sense how this registry gets invoked from an external use of the library.  that would shed some more light on \"None\", \"NotImplementedError\", etc.   as it stands this looks like a dictionary registry that somehow is useful to load different modules of code but I\u0027m not seeing front-to-back how is it populated, how is it invoked.","commit_id":"f8371f626aa715e8e3d5542f38030c20b766b5d7"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"6ad5c99f513bf292c1e2a442303edcea6c6ef791","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"5ca01629_00a59abd","updated":"2024-12-19 12:44:45.000000000","message":"I believe this patch is in a good state and ready to be merged. Let me know if there are any additional concerns or suggestions.","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"e50825af01ad1f8a7448fe24af60f2e0c5697211","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"73064b08_12a4e132","updated":"2024-11-27 14:35:13.000000000","message":"so the actual moving of the current eventlet routines into a \"backend\" will be done in a subsequent patch.\n\nCan work proceed on that patch using this one as a parent without merging this?   having a series of patches in progress will make it easier to review the full change as well as to revise this patch if the implemenetation patch runs into problems.","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"b63ae15bb814d60a80ba2ea321998f57aff0a5ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"39f5754d_462e535c","in_reply_to":"73064b08_12a4e132","updated":"2024-11-28 07:35:18.000000000","message":"Thanks a lot for the suggestion! Yes, the migration of the current Eventlet routines into the backend will be handled in a subsequent patch. I can proceed with that implementation using this patch as a parent, even before merging it. I’ll start working on the next patch based on this structure. Let me know if you have further thoughts!","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"126c6ef0fcfd8dcd13fc90f7baba13bf98e6c928","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"74f7f347_3b2e1066","updated":"2025-01-14 14:02:56.000000000","message":"LGTM\n\n@Takashi let us know if the CONF option is implemented like what you had in mind.","commit_id":"93d02483d55e518e763658bfdc6efe6af20a6dd3"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"3e4aa36252eab23ec2268a3a7f1d0fa88c0f4fff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"0f71b887_594e76a8","updated":"2025-01-14 15:22:47.000000000","message":"The updated version looks good to me so far, but I\u0027ve identified a main concern about current overall design, which I pointed in https://review.opendev.org/c/openstack/oslo.service/+/937010/25/oslo_service/service.py#29 .\n\nI strongly prefer to having clear answer for that problem, because it may break the overall idea to have configuration option, before merging this.","commit_id":"93d02483d55e518e763658bfdc6efe6af20a6dd3"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"61bd80508985457067353553b4eaccd4621c8ea6","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":27,"id":"2c6024ef_eacf5ed3","in_reply_to":"01ae6f7c_f20a6be6","updated":"2025-01-15 13:17:56.000000000","message":"Thank a lot for the feedback! I have added a unit test to validate the backend selection logic under different scenarios:\n\n1. When no specific configuration is loaded, the default backend (`eventlet`) is correctly selected.\n2. When the `execution_backend` configuration is updated (e.g., set to `eventlet2`), the correct backend is dynamically selected, even if the configuration is loaded after the initial import.\n\nThe test confirms that the current implementation handles both cases appropriately, ensuring the backend is initialized only when explicitly requested via `get_backend()`.\n\nGiven these results, I believe the implementation is robust and does not need further changes. Let me know if there are additional scenarios you\u0027d like me to cover or any other adjustments you\u0027d prefer!","commit_id":"93d02483d55e518e763658bfdc6efe6af20a6dd3"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"061225ceede2828048177e2e8ac123cfaf116e1e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"a95e1b91_ced4996c","in_reply_to":"0f71b887_594e76a8","updated":"2025-01-14 16:09:20.000000000","message":"ill remark that I dont see the config option as something essential here, usually, if I were nova or whatever, I\u0027d set the backend to \"eventlet\", then as we wanted to migrate to threads, we\u0027d set a global in nova somewhere that starts using the new backend and test against that version.\n\nthat is, I dont see the use case at all for someone going into a .cnf file somewhere and changing the oslo.service backend in either direction.  this a code change and we should plan that there will be behavioral idiosyncrasies between eventlet/threaded (to say the least).\n\nunless someone can make the case for why this needs to be conf i\u0027d be +1 on backend is more of a code option set up front where top level imports happen (and also can\u0027t be switched once selected, it would raise.   we definitely want to catch code that is inadvertently switching this at runtime back and forth)","commit_id":"93d02483d55e518e763658bfdc6efe6af20a6dd3"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"f2e4e5d2e8594f004959fee1bc990112e29693f6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"420a1df7_f378eceb","in_reply_to":"2c6024ef_eacf5ed3","updated":"2025-01-22 16:21:52.000000000","message":"Done","commit_id":"93d02483d55e518e763658bfdc6efe6af20a6dd3"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"86788d46b733f52e8b1dc0ff67260227303008d3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":27,"id":"c5aa9415_56c7c10e","in_reply_to":"a95e1b91_ced4996c","updated":"2025-01-14 17:12:51.000000000","message":"In the initial design we considered that developer may make the decision to migrate from eventlet to the new mechanism, and didn\u0027t intend to provide any options to switch back to the original eventlet model.\n\nHowever there was some strong push back during the previous PTG and people were concerned with having no mechanism to switch back to \"previously worked well\" eventlet model and to address the concern we agreed to introduce the option for operators to switch the backend.\n\nIf we don\u0027t allow users to configure the option then IMO we should not expose the option and we should use an internal flag instead (though that\u0027s basically what was disagreed with during the PTG, AFAIR)","commit_id":"93d02483d55e518e763658bfdc6efe6af20a6dd3"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"7c29068d5ff175f05b860821dbd186100e0c3827","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":27,"id":"01ae6f7c_f20a6be6","in_reply_to":"c5aa9415_56c7c10e","updated":"2025-01-14 18:12:42.000000000","message":"fine with me, people wanted it so that\u0027s that.   I dont think in practice \"switching back to the eventlet version that worked well\" will really be happening because I think switching to threading is going to require adjustments from the calling code anyway but perhaps these can be made in a backend-agnostic way.    it\u0027s not clear yet until we get further.","commit_id":"93d02483d55e518e763658bfdc6efe6af20a6dd3"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"2128abe200e26d97431e8ce6159999617715b5e6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"feecf125_4aaa3873","updated":"2025-01-16 15:40:30.000000000","message":"two additional CONF related items to remove if I\u0027m not mistaken","commit_id":"5ed3089e2a2455c2be31ad138f216000d7673e39"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"8a39f0f9e4b76215fa2dd5f6498bf5bd37332636","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"e619b41f_1f27bdb8","updated":"2025-01-17 09:42:49.000000000","message":"As we moved - with the latest patch sets - to an env var instead of a config option, we should have some doc updates in this patch to describe and explain the env var as it won\u0027t be automatically documented as with the config option.\n\nElse nobody will see be aware of it.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"1e78838f432a03094c56eb11e33e9bf52577893f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"7c24c308_3bff4233","updated":"2025-01-20 14:51:45.000000000","message":"I think my previous comment about the documentation of the env var is still valid https://review.opendev.org/c/openstack/oslo.service/+/935783/comments/e619b41f_1f27bdb8","commit_id":"a7bff537944abc6dfa2c9a24b616fddeb99441c9"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"92c81546d50171c3d199938c5276bac34ba21124","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"213bb333_3db2b0e8","in_reply_to":"11eb6094_3596feb4","updated":"2025-01-20 15:21:19.000000000","message":"Yes no problem. Just want to ensure that we have this env var documented somewhere as it won\u0027t be automatically documented like it was the case with the config option.","commit_id":"a7bff537944abc6dfa2c9a24b616fddeb99441c9"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"67dc5004a316aee68a565aa0b39fa3078b97c62f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"11eb6094_3596feb4","in_reply_to":"7c24c308_3bff4233","updated":"2025-01-20 15:19:03.000000000","message":"Yes is still valid. Can I do the documentation to another commit?","commit_id":"a7bff537944abc6dfa2c9a24b616fddeb99441c9"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"3a4897d872143b62f5833b9db7ca828dc085d664","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"2250130c_91558460","updated":"2025-01-28 09:17:37.000000000","message":"The latest version LGTM, I\u0027m just +2 to allow Takashi (and other) to ensure that all is previous comments are addressed.","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7fb6aa58dfc15afc8b4215802b6967aa153499c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"9318bf4e_8a5f372a","updated":"2025-01-29 01:21:19.000000000","message":"i didn\u0027t have any outstanding comments by the way so i was also happy for this to proceed","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"6fc3f6f7_5cfb9b45","updated":"2025-01-23 17:33:03.000000000","message":"i\u0027ve altered this to use an init_backend() function which receives an enumerated type.  this also sets up for no-double-init of a backend which is the main thing I\u0027m worried about (e.g. get_backend() is called somewhere in the code before they did their init_backend()).","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"e4cf76f90e06715c37096d212afe42ddaa5c9007","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"c83da740_5e904c3d","updated":"2025-01-24 09:16:35.000000000","message":"recheck","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"4c1ecf37367a1e0c242025b82d80b35ccea0b705","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"0cc6a150_088ce66f","in_reply_to":"6fc3f6f7_5cfb9b45","updated":"2025-01-23 17:51:02.000000000","message":"Indeed, good catch","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"}],"oslo_service/_options.py":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"67d37d721f2429358dcc164cac1db39545aab888","unresolved":true,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027, \u0027threading\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff71721_1fd6954c","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":42},"updated":"2024-11-22 15:28:06.000000000","message":"I agree with using `choices` but I\u0027m a bit hesitant to introduce them now.\nI mean, there is not existing backends yet, so, should not we expose this config later, once we will have introduced a real backend?\n\nMaybe we could simply introduce the logic of the backend mechanisms now, as you are trying to do, and then expose it in a second time (with a follow up) once the it will be ready and functional.\n\nThe problem is that we are refactoring oslo.service over the master branch, so if for some reasons we have to introduce some unrelated fixes in parallel and have to do a release of them, then, we will release the optionnability of the backends too, but it will be an empty feature. It could mislead many people. For this reason, I think it will be better to postpone its exposure as far as possible.","commit_id":"4669b6eead9f804dc6c6661429720706ab70f3a3"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e7ff74af2321926448399b4dd303d6255771e36a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027, \u0027threading\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7231c97c_c12b6dc6","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":42},"in_reply_to":"0c0ae0a6_2f0b3cc2","updated":"2024-11-28 07:31:59.000000000","message":"Done","commit_id":"4669b6eead9f804dc6c6661429720706ab70f3a3"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"42b5ec74b6115585f28234816c4ad1317d175b48","unresolved":true,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027, \u0027threading\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"330b25b2_400cf0a5","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":42},"in_reply_to":"2d787a7d_d43d59ae","updated":"2024-11-27 13:20:38.000000000","message":"I think it\u0027s ok to add this option now assuming we expect subsequent changes to implement threading backend soon.\n\nHowever I think we should not allow threading as a valid choice atm, because it\u0027s completely broken","commit_id":"4669b6eead9f804dc6c6661429720706ab70f3a3"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"dd2fbf75b564389d04eccd45b98c8f8e098a869a","unresolved":true,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027, \u0027threading\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"0c0ae0a6_2f0b3cc2","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":42},"in_reply_to":"330b25b2_400cf0a5","updated":"2024-11-27 13:51:06.000000000","message":"I think it\u0027s entirely appropriate to introduce the option now","commit_id":"4669b6eead9f804dc6c6661429720706ab70f3a3"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"b3c61b5a2614d50f6885020ea0117d5c7e722c67","unresolved":true,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027, \u0027threading\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"210d4317_f1580db9","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":42},"in_reply_to":"330b25b2_400cf0a5","updated":"2024-11-27 13:41:11.000000000","message":"and the eventlet one do not yet exist","commit_id":"4669b6eead9f804dc6c6661429720706ab70f3a3"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"271674383486ae7623d131a7158d1ebe8f6df113","unresolved":true,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027, \u0027threading\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"2d787a7d_d43d59ae","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":42},"in_reply_to":"bff71721_1fd6954c","updated":"2024-11-26 16:15:46.000000000","message":"I understand your point. I don’t think it’s problematic to introduce the option now, especially since it helps with defining the backend system early on. However, I can delay exposing it until the Eventlet backend is implemented, if that seems better for the overall flow and to avoid confusion. Let me know your thoughts on this!","commit_id":"4669b6eead9f804dc6c6661429720706ab70f3a3"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"7a4eb8096be28c21797f0823481e6b4b9de02fdd","unresolved":true,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"b321d1b4_8eec01d5","line":128,"updated":"2024-12-20 22:25:51.000000000","message":"sorry for catching this late, but I noticed that this option appears in DEFAULT section. The name sould be more specific like thereading_backend or this shiould be added to a dedicated section like oslo_service.","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"3e4aa36252eab23ec2268a3a7f1d0fa88c0f4fff","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"5dec7d9a_029b6545","line":128,"in_reply_to":"0d844f27_c4075b1c","updated":"2025-01-14 15:22:47.000000000","message":"I was referring to the DEFAULT configuration group","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"7110c0a6b6d1932be1d5c8546347bd0fa46b22f7","unresolved":true,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"0d844f27_c4075b1c","line":128,"in_reply_to":"212b3c6c_85fb1d54","updated":"2025-01-13 15:26:10.000000000","message":"Ok I will rename it by execution_backend that sounds good for me.","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"215788ff5b2b788a1af3dddb43d227ec87b3e28d","unresolved":true,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"212b3c6c_85fb1d54","line":128,"in_reply_to":"8e74cf82_85c7f184","updated":"2025-01-13 15:20:58.000000000","message":"Sorry, I think I misunderstood your original comment. I’ve renamed the variable to threading_backend_opts, but now I’m wondering if you would prefer going back to the previous name. When you mentioned “default,” I might have misinterpreted what you meant—were you referring to the [DEFAULT] configuration group or something else? Let me know your preference, and I’ll adjust accordingly.","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"6058ce80718d5b6af78df86010927e20a8ad654f","unresolved":true,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"820b3cfc_b31e1d4a","line":128,"in_reply_to":"8e74cf82_85c7f184","updated":"2025-01-13 15:10:54.000000000","message":"What do you think of \"execution_backend\"? (rather than \"threading backend\")","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"a636a2e167d7453f0bb7faddd7af3761a8b238a9","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"de5a82f0_3991854b","line":128,"in_reply_to":"9070f0ad_9013cfd3","updated":"2025-01-13 13:32:11.000000000","message":"I think Takashi spoke about the string \u0027backend\u0027 and not the variable name, but I don\u0027t think we should rename the config option to threading, because threading is one of the future value choices that will be available for this config option. Renaming it into \"threading_backend\" will be confusing (IMO).\n\nAlso, I am not shocked by the fact that this option is in the default section, because, this option will determine the whole internal mechanisms of oslo.service","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"af9ecbc0e826fb2ecba5b7b5ede1f1da0b488f04","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"9070f0ad_9013cfd3","line":128,"in_reply_to":"b321d1b4_8eec01d5","updated":"2025-01-13 12:34:33.000000000","message":"Done","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ddd2e9254ad1dc390bbdbbef812c58113acc01a2","unresolved":true,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":130,"context_line":"        choices\u003d[\u0027eventlet\u0027],"},{"line_number":131,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"8e74cf82_85c7f184","line":128,"in_reply_to":"de5a82f0_3991854b","updated":"2025-01-13 13:46:46.000000000","message":"Yeah Hervé is correct and I\u0027m talking about the actual option name rather than that variable name.\n\nCurrently the option is registered as `[DEFAULT] backend` which is too verbose. It can be in the default section but the name does not represent what uses it actually.\n\n\u003e Also, I am not shocked by the fact that this option is in the default section, because, this option will determine the whole internal mechanisms of oslo.service\n\nMy point is the current naming  ( `[DEFAULT] backend` ) has no indication of its being related to oslo.service .","commit_id":"cfba6bc3c948455c76f1474e34aa46b5ba77b5f5"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"2128abe200e26d97431e8ce6159999617715b5e6","unresolved":true,"context_lines":[{"line_number":123,"context_line":"               ),"},{"line_number":124,"context_line":"]"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"execution_backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027execution_backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"}],"source_content_type":"text/x-python","patch_set":30,"id":"30bb1006_cc3e19b0","line":126,"updated":"2025-01-16 15:40:30.000000000","message":"remove this (right?  since we are env var now)","commit_id":"5ed3089e2a2455c2be31ad138f216000d7673e39"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"85678565cba22fd0a6881233eaf1be391d232ae7","unresolved":true,"context_lines":[{"line_number":123,"context_line":"               ),"},{"line_number":124,"context_line":"]"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"execution_backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027execution_backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"}],"source_content_type":"text/x-python","patch_set":30,"id":"a12be416_22e8faf0","line":126,"in_reply_to":"30bb1006_cc3e19b0","updated":"2025-01-16 18:15:34.000000000","message":"Yes right I forget it. I will do it.","commit_id":"5ed3089e2a2455c2be31ad138f216000d7673e39"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"fbfc9b13bd451a7a5cccf5f8841410ed0d09b05a","unresolved":false,"context_lines":[{"line_number":123,"context_line":"               ),"},{"line_number":124,"context_line":"]"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"execution_backend_opts \u003d ["},{"line_number":127,"context_line":"    cfg.StrOpt("},{"line_number":128,"context_line":"        \u0027execution_backend\u0027,"},{"line_number":129,"context_line":"        default\u003d\u0027eventlet\u0027,"}],"source_content_type":"text/x-python","patch_set":30,"id":"acef656b_e71fad23","line":126,"in_reply_to":"a12be416_22e8faf0","updated":"2025-01-16 18:17:36.000000000","message":"Done","commit_id":"5ed3089e2a2455c2be31ad138f216000d7673e39"}],"oslo_service/backend/__init__.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"fe0e316813d1cbe603c77ed91e2cd101e524a8a1","unresolved":true,"context_lines":[{"line_number":22,"context_line":"CONF \u003d cfg.CONF"},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"backend_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt("},{"line_number":27,"context_line":"        \u0027backend\u0027,"},{"line_number":28,"context_line":"        default\u003d\u0027eventlet\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"2fdbe8c1_ef8f6126","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":12},"updated":"2024-11-22 11:42:25.000000000","message":"Can we define this in oslo_service/_options.py instead ?\n\nAlso, we need to expose the oslo.config.opts entry point with this option","commit_id":"0e783cebb2f3e41b24c46a15a6fa0d368fe74e82"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"1c774525435858f8dc0eb62677ce778a8553fbcd","unresolved":false,"context_lines":[{"line_number":22,"context_line":"CONF \u003d cfg.CONF"},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"backend_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt("},{"line_number":27,"context_line":"        \u0027backend\u0027,"},{"line_number":28,"context_line":"        default\u003d\u0027eventlet\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"2b0dfca2_e7a68c61","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":12},"in_reply_to":"1402b0eb_de40958f","updated":"2024-11-22 13:17:08.000000000","message":"Done","commit_id":"0e783cebb2f3e41b24c46a15a6fa0d368fe74e82"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"685d9461843aef729798f006ca68a87bbbd8caf5","unresolved":true,"context_lines":[{"line_number":22,"context_line":"CONF \u003d cfg.CONF"},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"backend_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt("},{"line_number":27,"context_line":"        \u0027backend\u0027,"},{"line_number":28,"context_line":"        default\u003d\u0027eventlet\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1402b0eb_de40958f","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":12},"in_reply_to":"2fdbe8c1_ef8f6126","updated":"2024-11-22 11:52:50.000000000","message":"Yes, you’re absolutely right, defining it in oslo_service/_options.py makes more sense. I’ll move it there and also ensure that the oslo.config.opts entry point is properly exposed with this option. Thanks for pointing it out!","commit_id":"0e783cebb2f3e41b24c46a15a6fa0d368fe74e82"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"fe0e316813d1cbe603c77ed91e2cd101e524a8a1","unresolved":true,"context_lines":[{"line_number":25,"context_line":"backend_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt("},{"line_number":27,"context_line":"        \u0027backend\u0027,"},{"line_number":28,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":29,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027,"},{"line_number":30,"context_line":"    ),"},{"line_number":31,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"0db053d9_46076661","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":15},"updated":"2024-11-22 11:42:25.000000000","message":"the current implementation does not allow external implementation so we should limit this to the one supported by oslo.service actually.\n\nSo I\u0027d suggest adding choices arg.","commit_id":"0e783cebb2f3e41b24c46a15a6fa0d368fe74e82"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"685d9461843aef729798f006ca68a87bbbd8caf5","unresolved":true,"context_lines":[{"line_number":25,"context_line":"backend_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt("},{"line_number":27,"context_line":"        \u0027backend\u0027,"},{"line_number":28,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":29,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027,"},{"line_number":30,"context_line":"    ),"},{"line_number":31,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1883445a_f840630f","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":15},"in_reply_to":"0db053d9_46076661","updated":"2024-11-22 11:52:50.000000000","message":"Yes, you’re absolutely right. I’ll make that change and add the choices argument to limit it to the supported implementations. Thanks a lot for the review and the valuable feedback!","commit_id":"0e783cebb2f3e41b24c46a15a6fa0d368fe74e82"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"1c774525435858f8dc0eb62677ce778a8553fbcd","unresolved":false,"context_lines":[{"line_number":25,"context_line":"backend_opts \u003d ["},{"line_number":26,"context_line":"    cfg.StrOpt("},{"line_number":27,"context_line":"        \u0027backend\u0027,"},{"line_number":28,"context_line":"        default\u003d\u0027eventlet\u0027,"},{"line_number":29,"context_line":"        help\u003d\u0027Backend to use for oslo.service\u0027,"},{"line_number":30,"context_line":"    ),"},{"line_number":31,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"8ad1c0be_55e7ebc9","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":15},"in_reply_to":"1883445a_f840630f","updated":"2024-11-22 13:17:08.000000000","message":"Done","commit_id":"0e783cebb2f3e41b24c46a15a6fa0d368fe74e82"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        return _cached_backend"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # Determine backend name from environment variable or use default"},{"line_number":42,"context_line":"    backend_name \u003d os.getenv(ENV_BACKEND, \"eventlet\")"},{"line_number":43,"context_line":"    valid_backends \u003d [\"eventlet\", \"threading\"]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    if backend_name not in valid_backends:"}],"source_content_type":"text/x-python","patch_set":31,"id":"2d6057f8_fdc9e2de","line":42,"range":{"start_line":42,"start_character":43,"end_line":42,"end_character":51},"updated":"2025-01-17 09:41:33.000000000","message":"We should define the default value by the constant defined in the top scope so that services can switch their default according to their preference.\n\n```\nfrom oslo_service import backend\nbackend.DEFAULT_BACKEND \u003d \u0027threading\u0027\n\nfrom oslo_service import service\n```\n\nOr probably we should expose a method to override the default","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e7abda1abeb468710575b950e8d38d4a5425973c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        return _cached_backend"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # Determine backend name from environment variable or use default"},{"line_number":42,"context_line":"    backend_name \u003d os.getenv(ENV_BACKEND, \"eventlet\")"},{"line_number":43,"context_line":"    valid_backends \u003d [\"eventlet\", \"threading\"]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    if backend_name not in valid_backends:"}],"source_content_type":"text/x-python","patch_set":31,"id":"08bce18b_561f37c3","line":42,"range":{"start_line":42,"start_character":43,"end_line":42,"end_character":51},"in_reply_to":"2d6057f8_fdc9e2de","updated":"2025-01-20 14:09:13.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    backend_name \u003d os.getenv(ENV_BACKEND, \"eventlet\")"},{"line_number":43,"context_line":"    valid_backends \u003d [\"eventlet\", \"threading\"]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    if backend_name not in valid_backends:"},{"line_number":46,"context_line":"        LOG.error("},{"line_number":47,"context_line":"            f\"Invalid backend specified in {ENV_BACKEND}: {backend_name}\")"},{"line_number":48,"context_line":"        raise ValueError("}],"source_content_type":"text/x-python","patch_set":31,"id":"be05e508_b63e3907","line":45,"range":{"start_line":45,"start_character":4,"end_line":45,"end_character":42},"updated":"2025-01-17 09:41:33.000000000","message":"This check is probably redundant because wrong name may be caught in L62.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"8e0d06d7cc8e4833dec30830876b18fd6c63e320","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    backend_name \u003d os.getenv(ENV_BACKEND, \"eventlet\")"},{"line_number":43,"context_line":"    valid_backends \u003d [\"eventlet\", \"threading\"]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    if backend_name not in valid_backends:"},{"line_number":46,"context_line":"        LOG.error("},{"line_number":47,"context_line":"            f\"Invalid backend specified in {ENV_BACKEND}: {backend_name}\")"},{"line_number":48,"context_line":"        raise ValueError("}],"source_content_type":"text/x-python","patch_set":31,"id":"66b9b839_f369336b","line":45,"range":{"start_line":45,"start_character":4,"end_line":45,"end_character":42},"in_reply_to":"be05e508_b63e3907","updated":"2025-01-22 16:23:44.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"01961420e6048423e74095d906e245d59da5c418","unresolved":true,"context_lines":[{"line_number":28,"context_line":"_cached_components \u003d None  # Global cache for backend components"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def set_default_backend(backend_name):"},{"line_number":32,"context_line":"    \"\"\"Allow services to override the default backend globally.\"\"\""},{"line_number":33,"context_line":"    if backend_name not in VALID_BACKENDS:"},{"line_number":34,"context_line":"        LOG.error("}],"source_content_type":"text/x-python","patch_set":32,"id":"50030597_21996d7f","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":23},"updated":"2025-01-20 14:30:19.000000000","message":"(sorry for late pointing)\nI wonder if we also want get_backend_name function so that each services can use it to switch their implementation ?","commit_id":"a7bff537944abc6dfa2c9a24b616fddeb99441c9"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"2a9328910c8d9e33ec8a2734ce7311dbc6e25df5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"_cached_components \u003d None  # Global cache for backend components"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def set_default_backend(backend_name):"},{"line_number":32,"context_line":"    \"\"\"Allow services to override the default backend globally.\"\"\""},{"line_number":33,"context_line":"    if backend_name not in VALID_BACKENDS:"},{"line_number":34,"context_line":"        LOG.error("}],"source_content_type":"text/x-python","patch_set":32,"id":"292f639f_57931c98","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":23},"in_reply_to":"50030597_21996d7f","updated":"2025-01-20 15:19:53.000000000","message":"Done","commit_id":"a7bff537944abc6dfa2c9a24b616fddeb99441c9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"01961420e6048423e74095d906e245d59da5c418","unresolved":true,"context_lines":[{"line_number":39,"context_line":"            f\" Valid options: {VALID_BACKENDS}\")"},{"line_number":40,"context_line":"    global DEFAULT_BACKEND"},{"line_number":41,"context_line":"    DEFAULT_BACKEND \u003d backend_name"},{"line_number":42,"context_line":"    LOG.info(f\"Default backend updated to: {DEFAULT_BACKEND}\")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def get_backend():"}],"source_content_type":"text/x-python","patch_set":32,"id":"dcad0c3b_7de7eafd","line":42,"range":{"start_line":42,"start_character":8,"end_line":42,"end_character":12},"updated":"2025-01-20 14:30:19.000000000","message":"set_default_backend may be called befoe importing oslo_service.service. The import is highly likely executed BEFORE logger is initialized. So we should avoid calling logger here.","commit_id":"a7bff537944abc6dfa2c9a24b616fddeb99441c9"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"2a9328910c8d9e33ec8a2734ce7311dbc6e25df5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            f\" Valid options: {VALID_BACKENDS}\")"},{"line_number":40,"context_line":"    global DEFAULT_BACKEND"},{"line_number":41,"context_line":"    DEFAULT_BACKEND \u003d backend_name"},{"line_number":42,"context_line":"    LOG.info(f\"Default backend updated to: {DEFAULT_BACKEND}\")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def get_backend():"}],"source_content_type":"text/x-python","patch_set":32,"id":"8cabf54b_f273d10f","line":42,"range":{"start_line":42,"start_character":8,"end_line":42,"end_character":12},"in_reply_to":"dcad0c3b_7de7eafd","updated":"2025-01-20 15:19:53.000000000","message":"Done","commit_id":"a7bff537944abc6dfa2c9a24b616fddeb99441c9"},{"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":"d04ff4ab903742c572d5f58ec99d3afc0b78d5df","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Define constants"},{"line_number":23,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\""},{"line_number":24,"context_line":"ENV_BACKEND \u003d \"OSLO_SERVICE_BACKEND\""},{"line_number":25,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"}],"source_content_type":"text/x-python","patch_set":33,"id":"99c85518_e6c0e2ec","line":24,"updated":"2025-01-21 15:54:02.000000000","message":"Using environment variables to set backends means that operators can change what backend is used. This is an easy thing for them to screw up and will end up creating a large amount of operator pain and bug churn. I am -1 in the strongest terms to the use of operator-adjustable values to enable/disable backends.","commit_id":"a8fea94fa2b4458f7acb48676f05abaeba6f09c3"},{"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":"72e7186ff3d249e98cc984fc33375ddf321328db","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Define constants"},{"line_number":23,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\""},{"line_number":24,"context_line":"ENV_BACKEND \u003d \"OSLO_SERVICE_BACKEND\""},{"line_number":25,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"}],"source_content_type":"text/x-python","patch_set":33,"id":"7bfac148_2b17bf2e","line":24,"in_reply_to":"589ce2a8_a1d162aa","updated":"2025-01-21 16:04:11.000000000","message":"Yeah, the idea here is that \"does it support eventlet or not\" is a project decision, not an operator decision. Exposing that option to operators is just allowing them to configure their system to be broken. If a project wants to allow two modes of operation, they can introduce an option and wire it through to oslo.service.","commit_id":"a8fea94fa2b4458f7acb48676f05abaeba6f09c3"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"f2e4e5d2e8594f004959fee1bc990112e29693f6","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Define constants"},{"line_number":23,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\""},{"line_number":24,"context_line":"ENV_BACKEND \u003d \"OSLO_SERVICE_BACKEND\""},{"line_number":25,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"}],"source_content_type":"text/x-python","patch_set":33,"id":"1f2c010e_d8fa61c1","line":24,"in_reply_to":"7bfac148_2b17bf2e","updated":"2025-01-22 16:21:52.000000000","message":"Done","commit_id":"a8fea94fa2b4458f7acb48676f05abaeba6f09c3"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"59dc80e56332b3a1d8819fc1fbf0c0de7f5c3fad","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Define constants"},{"line_number":23,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\""},{"line_number":24,"context_line":"ENV_BACKEND \u003d \"OSLO_SERVICE_BACKEND\""},{"line_number":25,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"}],"source_content_type":"text/x-python","patch_set":33,"id":"589ce2a8_a1d162aa","line":24,"in_reply_to":"99c85518_e6c0e2ec","updated":"2025-01-21 15:56:40.000000000","message":"I would absolutely favor removing any external ability to change the backend","commit_id":"a8fea94fa2b4458f7acb48676f05abaeba6f09c3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"61bc085dc5a7971e877a69b49a155dc0a7700299","unresolved":true,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# Constants that can be overridden by the user at import time"},{"line_number":22,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\"  # Users can override this constant when importing"},{"line_number":23,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"}],"source_content_type":"text/x-python","patch_set":36,"id":"edf1b01c_8885bf1b","line":22,"updated":"2025-01-23 15:47:01.000000000","message":"how? we shoudl not be directly wriging to this\nit is ment to be a constant so the interface doe not seam to provier a way to set it.\n\ni would expect there to be an init funciton or set_backend function that takes the name of the backend as a parmater to allow callers to set this properly.","commit_id":"7b71a257fc35f8e8ad0579a8d972f4f50750c452"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# Constants that can be overridden by the user at import time"},{"line_number":22,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\"  # Users can override this constant when importing"},{"line_number":23,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"}],"source_content_type":"text/x-python","patch_set":36,"id":"8e2d7aec_813082d9","line":22,"in_reply_to":"8922c6a9_5428ebe4","updated":"2025-01-23 17:33:03.000000000","message":"implemented an init_backend() function used against an enumeration of backend types","commit_id":"7b71a257fc35f8e8ad0579a8d972f4f50750c452"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"b0a3e0478b64f214805cda3a477b7e9bca12c220","unresolved":true,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# Constants that can be overridden by the user at import time"},{"line_number":22,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\"  # Users can override this constant when importing"},{"line_number":23,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"}],"source_content_type":"text/x-python","patch_set":36,"id":"8922c6a9_5428ebe4","line":22,"in_reply_to":"edf1b01c_8885bf1b","updated":"2025-01-23 15:51:31.000000000","message":"agree\n\nalso since we aren\u0027t using CONF anymore should we use an Enum for the backends ?","commit_id":"7b71a257fc35f8e8ad0579a8d972f4f50750c452"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# Constants that can be overridden by the user at import time"},{"line_number":22,"context_line":"DEFAULT_BACKEND \u003d \"eventlet\"  # Users can override this constant when importing"},{"line_number":23,"context_line":"VALID_BACKENDS \u003d [\"eventlet\", \"threading\"]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"_cached_backend \u003d None  # Global cache for the loaded backend"},{"line_number":26,"context_line":"_cached_components \u003d None  # Global cache for backend components"}],"source_content_type":"text/x-python","patch_set":36,"id":"f6725952_65750388","line":23,"updated":"2025-01-23 17:33:03.000000000","message":"yah an enum works well here","commit_id":"7b71a257fc35f8e8ad0579a8d972f4f50750c452"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bee8b6e1bce4cf49653766f161142dbcb62a5bf5","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \"\"\"used by test functions to reset the selected backend\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    global _cached_backend, _cached_components, _cached_backend_type"},{"line_number":47,"context_line":"    _cached_backend_type \u003d _cached_backend \u003d _cached_components \u003d None"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def init_backend(type_: BackendType) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":37,"id":"65173521_e563c813","line":47,"updated":"2025-01-23 17:49:42.000000000","message":"+1 for adding rest,\nthis will make unit tests simpler to write, stubing module-level variables is kind of annoying but its trivial to call reset and init in setUp.","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bee8b6e1bce4cf49653766f161142dbcb62a5bf5","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    backend_name \u003d type_.value"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    LOG.info(f\"Loading backend: {backend_name}\")"},{"line_number":63,"context_line":"    try:"},{"line_number":64,"context_line":"        module_name \u003d f\"oslo_service.backend.{backend_name}\""}],"source_content_type":"text/x-python","patch_set":37,"id":"dc97858d_c69e7305","line":61,"updated":"2025-01-23 17:49:42.000000000","message":"+1 thansk\n\nthis is very similar to the partern we have for os-vif\n\nhttps://github.com/openstack/os-vif/blob/master/os_vif/__init__.py#L24\nhttps://opendev.org/openstack/nova/src/branch/master/nova/cmd/compute.py#L53\nor the os_brick setup fucntion.\n\nso this looks good to me.\n\nwe can set this once per console script/wsgi entry point based on whch backend we required.\n\nif project want to have this be configurable it also allows them to do that cleanly.","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bee8b6e1bce4cf49653766f161142dbcb62a5bf5","unresolved":true,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    global _cached_backend"},{"line_number":87,"context_line":"    if _cached_backend is None:"},{"line_number":88,"context_line":"        init_backend(DEFAULT_BACKEND_TYPE)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    assert _cached_backend is not None  # nosec B101 : this is for typing"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"266123f5_06e394ad","line":88,"updated":"2025-01-23 17:49:42.000000000","message":"+1 so since there is still a default, this prevent upgrade isseus as projects opt into the new backend by addign the call to init_backend explcity.\n\nit might be nice to add an example of callign init_backend to set the backend in \n\nhttps://github.com/openstack/oslo.service/blob/1.38.0/doc/source/user/usage.rst#when-using-osloservice\n\n```\nfrom oslo_config import cfg\nfrom oslo_service import service\nfrom oslo_service import backend\nbackend.init_backend(backend.BackendType.THREADING)\n\nCONF \u003d cfg.CONF\n\nlauncher \u003d service.launch(CONF, service.Service(), workers\u003d3)\n```\n\nthis could be in one of the later patches.","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"7d9306763a5c9df68ac42e341275c4c3fcd03fd0","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    global _cached_backend"},{"line_number":87,"context_line":"    if _cached_backend is None:"},{"line_number":88,"context_line":"        init_backend(DEFAULT_BACKEND_TYPE)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    assert _cached_backend is not None  # nosec B101 : this is for typing"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"77f52eb7_a9fda86f","line":88,"in_reply_to":"266123f5_06e394ad","updated":"2025-01-23 18:32:04.000000000","message":"yes the threaded backend hasnt been written yet, will do it there","commit_id":"795aad12aabea0997ac826d9e32a62ed5796089a"}],"oslo_service/backend/base.py":[{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"280b040245055882f24dad451e6062f6555d8e3b","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ComponentProxy:"},{"line_number":42,"context_line":"    \"\"\"A proxy class to handle access to backend components."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    This proxy ensures that attempting to access a missing component"}],"source_content_type":"text/x-python","patch_set":8,"id":"31506d36_ed016307","line":41,"updated":"2024-11-21 16:33:16.000000000","message":"this seems like more of a \"Registry\" rather than a \"Proxy\".  if we had a `__getattr__` here that proxied attributes and methods, then it would be more like a proxy.    so far it looks like this is just how you look up components from different backends is that accurate?","commit_id":"f27e6065db442abdf2ce0f44b87f1e6c323f0df7"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"cddf7fdce6d9ca8cd0164e632611717c51a6ed33","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ComponentProxy:"},{"line_number":42,"context_line":"    \"\"\"A proxy class to handle access to backend components."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    This proxy ensures that attempting to access a missing component"}],"source_content_type":"text/x-python","patch_set":8,"id":"5e660032_5c7b3449","line":41,"in_reply_to":"2ff1549e_34715fdf","updated":"2024-11-21 16:58:24.000000000","message":"OK good.    Agree a `__getattr__` proxy scheme could work here but I usually like to not use those if we have close control over the backends themselves","commit_id":"f27e6065db442abdf2ce0f44b87f1e6c323f0df7"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"ce02e8d2ff3f468281c2084ae337ae5b19aa87c6","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ComponentProxy:"},{"line_number":42,"context_line":"    \"\"\"A proxy class to handle access to backend components."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    This proxy ensures that attempting to access a missing component"}],"source_content_type":"text/x-python","patch_set":8,"id":"2ff1549e_34715fdf","line":41,"in_reply_to":"31506d36_ed016307","updated":"2024-11-21 16:55:21.000000000","message":"Thanks a lot for your feedback. You’re absolutely right, and I’ll rename the class accordingly. My initial idea was to implement a proxy with methods like __getattr__ and __contains__ to make it more dynamic and object-oriented. However, after some reflection, I think it’s better to keep things simple and use a registry instead. In our context, I don’t believe we need the added complexity of a proxy.","commit_id":"f27e6065db442abdf2ce0f44b87f1e6c323f0df7"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"43b24d4affabdb1fbb36f3e29c0660302d7a8885","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ComponentProxy:"},{"line_number":42,"context_line":"    \"\"\"A proxy class to handle access to backend components."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    This proxy ensures that attempting to access a missing component"}],"source_content_type":"text/x-python","patch_set":8,"id":"fe16ede7_23c816a1","line":41,"in_reply_to":"5e660032_5c7b3449","updated":"2024-11-21 17:00:47.000000000","message":"Exactly, that’s what I think as well. Since we have full control over the backends, a simple Registry is sufficient for our needs.","commit_id":"f27e6065db442abdf2ce0f44b87f1e6c323f0df7"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"8acf39265b0ff3e1a9f30ac0e4df6975e05e4f71","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ComponentProxy:"},{"line_number":42,"context_line":"    \"\"\"A proxy class to handle access to backend components."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    This proxy ensures that attempting to access a missing component"}],"source_content_type":"text/x-python","patch_set":8,"id":"ea62cb0f_79f45f04","line":41,"in_reply_to":"fe16ede7_23c816a1","updated":"2024-11-22 08:00:25.000000000","message":"Done","commit_id":"f27e6065db442abdf2ce0f44b87f1e6c323f0df7"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ComponentRegister:"},{"line_number":42,"context_line":"    \"\"\"A register to manage access to backend components."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    This class ensures that attempting to access a missing component"}],"source_content_type":"text/x-python","patch_set":9,"id":"3b2d001a_32bc704a","line":41,"range":{"start_line":41,"start_character":15,"end_line":41,"end_character":23},"updated":"2024-11-22 09:07:53.000000000","message":"I\u0027m not a native speaker so maybe I\u0027m wrong, but for me `Register` more reflect a verb and so an action rather than a kind a concept like `Registry`.\n\nShould we not name it `ComponentRegistry` rather than `ComponentRegister`?\n\nEven the pattern is named `registry` and not `register`.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"47541b89414c3ff3c2d4ed6bc6fa934bdcd90680","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ComponentRegister:"},{"line_number":42,"context_line":"    \"\"\"A register to manage access to backend components."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    This class ensures that attempting to access a missing component"}],"source_content_type":"text/x-python","patch_set":9,"id":"43a0398d_8ff0e7b0","line":41,"range":{"start_line":41,"start_character":15,"end_line":41,"end_character":23},"in_reply_to":"3b2d001a_32bc704a","updated":"2024-11-22 12:05:24.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"38f22249662f734d98680d45c6a98a3f8302fb42","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"23816a33_a7c01670","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"updated":"2024-11-22 08:59:27.000000000","message":"It will trigger a `KeyError` if `key` is not contained in `self._components`.\nIndeed as you use a `or` this condition (if X or Y) will check both parts independently, meaning that even if `key` is not in `self._components` it will still try to check if `self._components[key]` is `None`.\n\nSo, either you have to surround it with a try/except KeyError, or to prefer using `and` in place of `or`.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"04d5f13af26382be33d6175085be26f9883e3175","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"a2c243c3_aa7312c3","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"0a245b0c_c3d38242","updated":"2024-11-22 15:09:03.000000000","message":"I agree with Mike concerning the choice of `NotImplementedError` I don\u0027t think this is an appropriate exception kind for the scenario you are trying to implement.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"23fc30ecda699c3b0d5449932342f3172367b297","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"926817c7_8108cd70","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"0f189773_889e2f97","updated":"2024-11-26 16:57:20.000000000","message":"\u003e Regarding the NotImplementedError, I think it’s appropriate here because if the key is missing, it means the backend is not providing that component, which aligns with the intent of NotImplementedError.\n\nIs not the built-in `ValueError` esception better appropriate? https://docs.python.org/3/library/exceptions.html#ValueError","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"7c6fe4a1acc784c5060df2906659890eb6a3d8a8","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"49e00c09_0edc3fc0","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"23816a33_a7c01670","updated":"2024-11-22 10:54:13.000000000","message":"Thank a lot for the comment and code review! In this case, the behavior is intentional and correct. Python’s or operator uses short-circuit evaluation, meaning that if key not in self._components evaluates to True, the second condition (self._components[key] is None) won’t be evaluated. Therefore, replacing or with and would not achieve the intended logic. Additionally, we have unit tests that cover this behavior.\n\nRegarding the suggestion to use try/except, while it is a valid approach, I believe the if statement is more suitable here for several reasons:\n\t•\tIt explicitly checks for the presence of the key, making the code clearer and the intent easier to follow.\n\t•\ttry/except is generally more appropriate for handling truly exceptional cases, whereas here, a missing key is a normal part of the control flow.\n\t•\tUsing if is more efficient because it avoids the overhead of raising and handling an exception.\n\nLet me know if you have further thoughts!","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"955bca700eb73be3ada292a2403934d6634a720f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"0f189773_889e2f97","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"31989d11_63dfcf8f","updated":"2024-11-26 16:22:17.000000000","message":"Thanks a lot for your feedback! I believe the if statement works well in this context, as it explicitly checks for the presence of the key before attempting to access it. I understand that using try/except is another valid approach, but in this case, the if statement helps make the control flow clearer.\n\nRegarding the NotImplementedError, I think it’s appropriate here because if the key is missing, it means the backend is not providing that component, which aligns with the intent of NotImplementedError.\n\nAs for the None value, it was part of an initial implementation where I populated the dictionary with keys and set them to None until the components were fully implemented. This behavior might not be relevant now, but I appreciate your insight!","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"3ead7bb3b84fd3f47e7deec8a8c87b8f8cb54111","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"a2e384c9_abfec848","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"49e00c09_0edc3fc0","updated":"2024-11-22 11:36:14.000000000","message":"```\n\u003e\u003e\u003e t \u003d {}\n\u003e\u003e\u003e \"boom\" in t and t[\"boom\"] is not None\nFalse\n\u003e\u003e\u003e \"boom\" in t or t[\"boom\"] is not None\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nKeyError: \u0027boom\u0027\n```\n\nWith a `or` the second part of the statement is evaluated.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"0d3d1c3bb40661609f4fefc2f03fbb14f7aa6e1a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"0a245b0c_c3d38242","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"5185e4d7_84c6c67c","updated":"2024-11-22 13:49:18.000000000","message":"I would most prefer to use try/except here as the case where key is missing raises NotImplementedError in any case (not sure if I agree with NotImplementedError for the raise either, separate issue), and I disagree that it\u0027s not appropriate to use try/except for \"normal control flow\".   You definitely want to use try/except when the exception case is expected to be infrequent and especially if you are going to re-raise anyway.   However if the key is present with None, that seems odd, why would the key be present with None?","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"dd2d8ae0253ba75637d7f3339dc9b134882fa31e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"5185e4d7_84c6c67c","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"66796d88_43238e22","updated":"2024-11-22 12:51:51.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"58aa7c0b3660df72d7d6444690043b0597c0aa97","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"c97f7fe1_83e92bbb","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"926817c7_8108cd70","updated":"2024-11-27 08:17:50.000000000","message":"Thanks a a lot for your input! Again I chose NotImplementedError because the absence of a component here indicates that the backend does not provide the required functionality, which aligns with the semantics of “not implemented”. I believe this makes it the most appropriate choice in this context.\n\nThat said, I understand that ValueError could also be suitable, as it emphasizes that the requested key (component) is not valid for the current backend. If there’s a consensus favoring ValueError, I’d be happy to update it accordingly. Please let me know your thoughts!","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"57a89ae63c26840cbaa56335e59b697e5661dccb","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"d953a546_44ede9d3","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"a2c243c3_aa7312c3","updated":"2024-11-22 15:16:24.000000000","message":"Concerning the case where the `key` is present but equal to `None`, I agree that\u0027s its a weird use case... In opinion, something the design of that logic need some rework to avoid this kind of use case.\n\nAnd concerning the usage of `try/except` I find it more readable (I think my previous misread reflect that point), but I let you both decide which approach you want to follow.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"6e75fb0431145494d5f1915ed4b16b477245d797","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"adb9ce0e_c9838c03","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"a2e384c9_abfec848","updated":"2024-11-22 11:46:21.000000000","message":"Thank a lot for your follow-up! The example you provided highlights how or behaves when the first condition is False. However, in my code, the first condition is key not in self._components. If this evaluates to True, Python short-circuits and doesn’t evaluate the second condition (self._components[key] is None), which prevents any KeyError.\n\nIn other words, the potential issue you pointed out doesn’t apply here because the first condition explicitly guards against accessing a missing key. Additionally, we’ve included unit tests to cover this behavior, ensuring correctness.\n\nPlease let me know if you see any specific edge cases I might have overlooked, and thank you again for your thorough review!","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"10fb524f2821f8d87fc57f8c84a95eb005e41bed","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"b928a7fb_df2cf3a2","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"adb9ce0e_c9838c03","updated":"2024-11-22 12:49:36.000000000","message":"Ah yes indeed, sorry. I tested `\"boom\" in t` and not `\"boom\" not in t`, my bad.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"5264ba505dabbf65a6ac7a1697096e1c5dc0701d","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"603a9b6e_31e3b56e","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"adb9ce0e_c9838c03","updated":"2024-11-22 12:29:12.000000000","message":"I prefer the if or version for performance reasons. With the or condition, if the key is in self._components, the evaluation stops immediately. However, with and, both conditions need to be evaluated in all cases, which introduces unnecessary overhead.\n\nThis approach aligns with the principle of short-circuit evaluation in Python, ensuring both correctness and efficiency.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"7cf0248967e0a0b01d4fd79ef961cbd41e089838","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"66796d88_43238e22","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"b928a7fb_df2cf3a2","updated":"2024-11-22 12:51:28.000000000","message":"Ok, no problem. Let\u0027s continue with \"short-circuit evaluation\".","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"bc3d641999a9d13decb10ce2c700a56e2b19ed00","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises NotImplementedError: If the component is not available."},{"line_number":60,"context_line":"        :return: The requested component."},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":63,"context_line":"            raise NotImplementedError("},{"line_number":64,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":65,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":9,"id":"31989d11_63dfcf8f","line":62,"range":{"start_line":62,"start_character":39,"end_line":62,"end_character":41},"in_reply_to":"d953a546_44ede9d3","updated":"2024-11-22 17:31:54.000000000","message":"`NotImplementedError` are more reserved for abstract things. That\u0027s not our case here.","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"dd2fbf75b564389d04eccd45b98c8f8e098a869a","unresolved":true,"context_lines":[{"line_number":62,"context_line":"                                     not registered or available."},{"line_number":63,"context_line":"        :return: The requested component instance."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":66,"context_line":"            raise NotImplementedError("},{"line_number":67,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":68,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":18,"id":"6111fdd7_baa916d0","line":65,"updated":"2024-11-27 13:51:06.000000000","message":"if we dont actually expect None to be in this dictionary, can we use an assert instead?\n\n    assert self._components[key] is not None\n    \nas far as the NotImplementedError, I dont think it\u0027s entirely appropriate, however, this is an almost cosmetic detail.\n\nIMO a custom exception like BackendNotAvailable(Exception) is most appropriate here, but it\u0027s hard for me to say since I still dont have a sense of how this registry is actually going to be used in real world code.   Like maybe it ends up being called via the \"import\" codepath and it really should be ImportError.\n\nis the usage pattern here like this?\n\n\nmodule level code:\n\n    from oslo_service import service\n    \nthat import calls into this backend system, which looks at CONF, that then looks in the registry?\n\nWe dont want that raising NotImplementedError it would raise ImportError no ?\n\nThe test cases here are very unit-testy and dont really show how this registry is used in real world code","commit_id":"f8371f626aa715e8e3d5542f38030c20b766b5d7"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"2128abe200e26d97431e8ce6159999617715b5e6","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                                     not registered or available."},{"line_number":63,"context_line":"        :return: The requested component instance."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":66,"context_line":"            raise NotImplementedError("},{"line_number":67,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":68,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":18,"id":"b76cc3d6_50144627","line":65,"in_reply_to":"1a5e54b5_78e4f282","updated":"2025-01-16 15:40:30.000000000","message":"Done","commit_id":"f8371f626aa715e8e3d5542f38030c20b766b5d7"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"62d32dba8cdc26aa38491c0b16f9f9679cee2962","unresolved":true,"context_lines":[{"line_number":62,"context_line":"                                     not registered or available."},{"line_number":63,"context_line":"        :return: The requested component instance."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        if key not in self._components or self._components[key] is None:"},{"line_number":66,"context_line":"            raise NotImplementedError("},{"line_number":67,"context_line":"                f\"Component \u0027{key}\u0027 is not available in this backend.\")"},{"line_number":68,"context_line":"        return self._components[key]"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a5e54b5_78e4f282","line":65,"in_reply_to":"6111fdd7_baa916d0","updated":"2024-11-27 14:12:05.000000000","message":"Thanks a lot for the code review! I’ve added a new custom exception to replace the NotImplementedError, as suggested, and adjusted the code accordingly. I’ve also added a test to ensure this behavior is properly covered.\n\nRegarding the usage pattern, your understanding is mostly correct. The backend system dynamically selects and retrieves components based on CONF and the registry, ensuring modularity and flexibility. The new custom exception should make it clearer and more aligned with the intended behavior.","commit_id":"f8371f626aa715e8e3d5542f38030c20b766b5d7"}],"oslo_service/tests/backend/tests/test_backend_base.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f3d6c1b8dbff3fb278b71446bea96fe978935453","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"2e9d2abd_756d4f06","line":172,"updated":"2025-01-15 13:24:48.000000000","message":"I\u0027m unsure if you understand what I pointed out fully. This code explicitly overrides the option and it is apparently expected that the overridden value is honored.\n\nWhat I\u0027m saying is that CONF.__call__ which do this override is NOT CALLED BEFORE get_backend in current usage, and I don\u0027t think this really simulate that problem here.","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"f2e4e5d2e8594f004959fee1bc990112e29693f6","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"40123244_3a0af00f","line":172,"in_reply_to":"02bc430f_f5000beb","updated":"2025-01-22 16:21:52.000000000","message":"Done","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"51bed292_31907ada","line":172,"in_reply_to":"06438674_db6dc9f6","updated":"2025-01-17 09:41:33.000000000","message":"\u003e mod_wsgi itself certainly allows it\n\nUnfortunately, no. mod_wsgi or apache does not provide a way to override environment variables per vhost. They provide interfaces to inject additional \"environments\", and \"environments\" here are request environment associated the request object, and not \"environments\" we read from shell. You can add additional shell environments when you start httpd but the same environments are propagated to all applications hosted in the httpd (which means the same values are read by all api services hosted by httpd)\n\n\u003e Can we just reach out to the folks that had an opinion on the CONF thing and say, hey, this is really not that simple do you mind if we pull back to an env variable / hardcode approach\n\nYeah. I would ask any thoughts about the current implementation in mailing list to see if they change their minds.","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"cef7842b72a6337acedf7c933b1aaeaf3f986819","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a0395c9_94a9f9ab","line":172,"in_reply_to":"2e9d2abd_756d4f06","updated":"2025-01-15 13:29:02.000000000","message":"I agree this is a problem, Takashi if the \"we must support CONF\" is a requirement what is your proposed solution ?","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"7c135dc9b8865f418378c39b6f0bebbb3e106ae8","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"9da71fc5_c690e22a","line":172,"in_reply_to":"3a0395c9_94a9f9ab","updated":"2025-01-15 13:31:56.000000000","message":"should we say that CONF has to be *passed* to get_backend() ?   What about a check that ensures that once get_backend() has been called in the process, the backend *cannot* be switched else an assertion raises?  that would at least prevent the problem from happening and would indicate calling code where it must be addressed, though it seems like you are saying downstream apps like nova may have to be reorganized to support this.","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"4d1fd424d8f88f0cf5fcf4312eb5d85c300fb15f","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"be9ee9f3_4f5ddf27","line":172,"in_reply_to":"51bed292_31907ada","updated":"2025-01-21 15:31:33.000000000","message":"Correct me if I am wrong.\nWhat I understood reading the comments is that it\u0027s complex to load the CONF in this situation and you decided to use an ENV variable to switch the backend.\n\nIMHO, this is far from explicit for operator that they need to set ENV vars to configure a service. They are used to config files.\n\nI take my personal experience for this, one of my favorite page is the \"configuration reference\" for neutron / nova / etc, I mostly rely on that page to know / understand how to configure a service.\n\nIf now, I also need to set some ENV vars, I may struggle understand why and figure that out (even if it\u0027s in doc).\n\nDo you have an ex of services already doing this?","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"f7583ef3838122b8315a306350fa1ce706af892d","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"a77d698a_22f966ae","line":172,"in_reply_to":"631e2013_a7b398c0","updated":"2025-01-15 14:38:21.000000000","message":"\u003e One impact I\u0027m aware of is that if api services are deployed under httpd + mod_wsgi then it\u0027s not possible to override the environment for specific api (eg. nova-api) \n\nmod_wsgi itself certainly allows it, we would assume this is the result of the current deployment methods available for openstack\n\n\u003e I\u0027m wondering it makes sense to share this problem to wider audience as a good example of disadvantage of leaving the user-configurable option. \n\nCan we just reach out to the folks that had an opinion on the CONF thing and say, hey, this is really not that simple do you mind if we pull back to an env variable / hardcode approach","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"91b785f241bfff36301ded412b2fa2f7e79dc994","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"06438674_db6dc9f6","line":172,"in_reply_to":"631e2013_a7b398c0","updated":"2025-01-15 14:47:18.000000000","message":"So what we will do? I change the implementation to use environment variable instead?","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"482bd543e00a0d88ef7bd5cafe94cf357d6f65d0","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"affb68e1_df615071","line":172,"in_reply_to":"9da71fc5_c690e22a","updated":"2025-01-15 13:44:42.000000000","message":"The problem is that get_backend is called when the module is imported although it needs that CONF is already \"initialized\" when it\u0027s called. So passing the CONF does not resolve the problem and we need to call get_backend based on a different trigger.\nOne example solution is to create a wrapper class which determines the actual class when any of its method is called. (I\u0027m not aware of any know established pattern for this, though)\n\nAnother approach is to use environment variable instead of an option loaded by oslo.config. With this we are sure that the expected value is present when the module is loaded, though AFAIK using environment variables is not quite popular method for configuration in OpenStack services. (Some can be configured via environment variables but these usually also provide configurations via config files, AFAIK).","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"ab0ec53fbf700251b04859a97c40e318c8deb3d5","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"ce84273c_5c8cdfa6","line":172,"in_reply_to":"affb68e1_df615071","updated":"2025-01-15 14:06:42.000000000","message":"OK, when I previously mentioned, \"hey using CONF here is unnecessarily complicated\" it seemed like the sentiment was that this was a necessary requirement.\n\nAn environment variable would be a lot safer here and would eliminate all this difficulty.   how does that impact deployment ?   is it common practice that some elements of openstack applications are switched from environment variables rather than CONF ?","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"3666f3918f3b90c29fb39d7a1dba5dbdfd116401","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"02bc430f_f5000beb","line":172,"in_reply_to":"be9ee9f3_4f5ddf27","updated":"2025-01-21 15:36:11.000000000","message":"First off I think it is pure fantasy that an operator would ever be switching the backend from \"threaded\" to \"eventlet\" or vice versa.   When an application is modified to use a different backend, it\u0027s going to behave differently.  It will need to be tuned and modified to work correctly for threads, and it will no longer be the same application by just swapping in eventlet.\n\nsecondly, there is simply no way this backend approach can be made to work based on CONF without a complete re-think of how CONF is consumed vs. how imports in the target application work.\n\nThe goal of this entire change is to *remove eventlet* , that is, we will not have two backends, we will have just one, which is threaded, and then we\u0027d likely remove the backend concept completely again.     \n\nSo if operators are needing to switch implementations \"back from threaded to eventlet\", that\u0027s a bug.  they would want to temporarily downgrade the software to the eventlet version IMO.","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"92781593ed1972b155f43ee1295833aa8fe7d1f7","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        with mock.patch.object("},{"line_number":170,"context_line":"                self.mock_conf, \u0027__call__\u0027, return_value\u003dNone):"},{"line_number":171,"context_line":"            # Simulate setting the backend to \"eventlet2\""},{"line_number":172,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # Clear any cached backend to force reinitialization"},{"line_number":175,"context_line":"            backend_module._cached_backend \u003d None"}],"source_content_type":"text/x-python","patch_set":28,"id":"631e2013_a7b398c0","line":172,"in_reply_to":"ce84273c_5c8cdfa6","updated":"2025-01-15 14:18:11.000000000","message":"AFAIK it\u0027s not a very common approach. A few libraeis like etcd3gw or tooz has such mechanism but these libraries does not provide any oslo.config options directly. One impact I\u0027m aware of is that if api services are deployed under httpd + mod_wsgi then it\u0027s not possible to override the environment for specific api (eg. nova-api) but I don\u0027t feel like that is a huge blocker.\n\nI\u0027m wondering it makes sense to share this problem to wider audience as a good example of disadvantage of leaving the user-configurable option. Honestly I\u0027m not fully aware of any services actually implementing dual support yet and I expect similar problems in different modules. It might make sense to re-evaluate the tradeoff (like the requirement of using an environment variable) we pay for supporting the complicated knob.","commit_id":"44e2a37859dde692270d66a393be4f02e07ababf"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"b810abeae733ca733394280dba728e7cfe7a4a98","unresolved":true,"context_lines":[{"line_number":250,"context_line":"            )"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"            # Simulate loading the configuration and changing the backend"},{"line_number":253,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":254,"context_line":"            # Clear cache to reinitialize"},{"line_number":255,"context_line":"            backend_module._cached_backend \u003d None"},{"line_number":256,"context_line":"            updated_backend \u003d get_backend()"}],"source_content_type":"text/x-python","patch_set":29,"id":"448c02a1_3cf92809","line":253,"updated":"2025-01-15 13:47:35.000000000","message":"Again the problem I\u0027ve been insisting on here is that there are no actual trigger in real usage which set the option from config options. I\u0027m saying this line can\u0027t happen in any of the existing code using oslo_service.","commit_id":"071678b4e765e509d512f83e7bf1eaa9766bc60c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"88e9ddeb81dcdb83c15f46115b99aa466c77622f","unresolved":true,"context_lines":[{"line_number":250,"context_line":"            )"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"            # Simulate loading the configuration and changing the backend"},{"line_number":253,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":254,"context_line":"            # Clear cache to reinitialize"},{"line_number":255,"context_line":"            backend_module._cached_backend \u003d None"},{"line_number":256,"context_line":"            updated_backend \u003d get_backend()"}],"source_content_type":"text/x-python","patch_set":29,"id":"593e8956_dfc58363","line":253,"in_reply_to":"448c02a1_3cf92809","updated":"2025-01-15 14:08:39.000000000","message":"So if I create a sample script which checks a config value BEFORE/AFTER oslo_config.cfg.CONF is initialized\n\n```\n$ cat test.py\nfrom oslo_config import cfg\nfrom oslo_service import service\n\nCONF \u003d cfg.CONF\nprint(\"Before: \" + CONF.execution_backend)\n\nCONF(default_config_files\u003d[\u0027./test.conf\u0027], default_config_dirs\u003d[])\n\nprint(\"After: \" + CONF.execution_backend)\n```\n\nand prepare the sample config to change the option\n\n```\n$ cat test.conf \n[DEFAULT]\nexecution_backend \u003d \u0027eventlet2\u0027\n```\n\nI see the value is different BEFORE/AFTER `CONF.__call__` .\n```\n$ python test.py \nBefore: eventlet\nAfter: eventlet2\n```\n\nI create a script to check actual module loaded via oslo_service\n\n```\n$ cat test.py\nfrom oslo_config import cfg\nfrom oslo_service import service\n\nCONF \u003d cfg.CONF\nCONF(default_config_files\u003d[\u0027./test.conf\u0027], default_config_dirs\u003d[])\nprint(service.ServiceLauncher)\n```\n\nwhich shows that the configured value is not honored\n```\n$ python test.py \n\u003cclass \u0027oslo_service.backend.eventlet.service.ServiceLauncher\u0027\u003e\n```\n\nHowever if I import the service module AFTER `CONF.__init__`,\n```\n$ cat test.py \nfrom oslo_config import cfg\n\nCONF \u003d cfg.CONF\nCONF(default_config_files\u003d[\u0027./test.conf\u0027], default_config_dirs\u003d[])\n\nfrom oslo_service import service\nprint(service.ServiceLauncher)\n```\n\nthen it tries to load the module based on the configured value.\n```\n$ python test.py \nBackend class not found in module oslo_service.backend.eventlet2.\n...\nImportError: Backend class not found in module oslo_service.backend.eventlet2\n```\n\nMost of the existing projects import oslo_service.service BEFORE they call `CONF.__init__` so they hit the first behavior which completely ignored the configured value.","commit_id":"071678b4e765e509d512f83e7bf1eaa9766bc60c"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"b4efe7d3adca1e3dce1a4dfed9e84b4c928f76cb","unresolved":false,"context_lines":[{"line_number":250,"context_line":"            )"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"            # Simulate loading the configuration and changing the backend"},{"line_number":253,"context_line":"            self.mock_conf.execution_backend \u003d \"eventlet2\""},{"line_number":254,"context_line":"            # Clear cache to reinitialize"},{"line_number":255,"context_line":"            backend_module._cached_backend \u003d None"},{"line_number":256,"context_line":"            updated_backend \u003d get_backend()"}],"source_content_type":"text/x-python","patch_set":29,"id":"716e892b_29735e83","line":253,"in_reply_to":"593e8956_dfc58363","updated":"2025-01-22 16:20:05.000000000","message":"Done","commit_id":"071678b4e765e509d512f83e7bf1eaa9766bc60c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# Mock backend class for testing purposes"},{"line_number":25,"context_line":"class Eventlet2Backend:"},{"line_number":26,"context_line":"    name \u003d \"eventlet2\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def get_service_components(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"a538e1c2_88433bbd","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"updated":"2025-01-17 09:41:33.000000000","message":"This is no longer used.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e7abda1abeb468710575b950e8d38d4a5425973c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# Mock backend class for testing purposes"},{"line_number":25,"context_line":"class Eventlet2Backend:"},{"line_number":26,"context_line":"    name \u003d \"eventlet2\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def get_service_components(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"82f2da97_a6b6b03b","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"in_reply_to":"a538e1c2_88433bbd","updated":"2025-01-20 14:09:13.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":29,"context_line":"        return {\"ServiceLauncher\": \"mock_service_launcher\"}"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class TestBaseBackend(unittest.TestCase):"},{"line_number":33,"context_line":"    def test_base_backend_is_abstract(self):"},{"line_number":34,"context_line":"        \"\"\"Test that BaseBackend cannot be instantiated directly.\"\"\""},{"line_number":35,"context_line":"        with self.assertRaises(TypeError) as context:"}],"source_content_type":"text/x-python","patch_set":31,"id":"21155d7a_7ea73c0a","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":21},"updated":"2025-01-17 09:41:33.000000000","message":"I\u0027m not aware of any other existing test code which asserts how an abstract class may work. Maybe we can drop this to simplify the code.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e7abda1abeb468710575b950e8d38d4a5425973c","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        return {\"ServiceLauncher\": \"mock_service_launcher\"}"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class TestBaseBackend(unittest.TestCase):"},{"line_number":33,"context_line":"    def test_base_backend_is_abstract(self):"},{"line_number":34,"context_line":"        \"\"\"Test that BaseBackend cannot be instantiated directly.\"\"\""},{"line_number":35,"context_line":"        with self.assertRaises(TypeError) as context:"}],"source_content_type":"text/x-python","patch_set":31,"id":"e3c233c9_c59483d7","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":21},"in_reply_to":"21155d7a_7ea73c0a","updated":"2025-01-20 14:09:13.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # Validate BackendNotAvailable exception for unavailable components"},{"line_number":118,"context_line":"        with self.assertRaises(BackendNotAvailable):"},{"line_number":119,"context_line":"            _ \u003d registry[\"ProcessLauncher\"]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        with self.assertRaises(BackendNotAvailable):"},{"line_number":122,"context_line":"            _ \u003d registry[\"NonExistentComponent\"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"a8c8c87f_ca8fec76","line":119,"range":{"start_line":119,"start_character":12,"end_line":119,"end_character":15},"updated":"2025-01-17 09:41:33.000000000","message":"Can we remove this ?","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # Validate BackendNotAvailable exception for unavailable components"},{"line_number":118,"context_line":"        with self.assertRaises(BackendNotAvailable):"},{"line_number":119,"context_line":"            _ \u003d registry[\"ProcessLauncher\"]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        with self.assertRaises(BackendNotAvailable):"},{"line_number":122,"context_line":"            _ \u003d registry[\"NonExistentComponent\"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"9fb4f6de_f36f049b","line":119,"range":{"start_line":119,"start_character":12,"end_line":119,"end_character":15},"in_reply_to":"a8c8c87f_ca8fec76","updated":"2025-01-23 17:33:03.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":119,"context_line":"            _ \u003d registry[\"ProcessLauncher\"]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        with self.assertRaises(BackendNotAvailable):"},{"line_number":122,"context_line":"            _ \u003d registry[\"NonExistentComponent\"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"9e759892_1d6c6807","line":122,"range":{"start_line":122,"start_character":12,"end_line":122,"end_character":15},"updated":"2025-01-17 09:41:33.000000000","message":"ditto","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            _ \u003d registry[\"ProcessLauncher\"]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        with self.assertRaises(BackendNotAvailable):"},{"line_number":122,"context_line":"            _ \u003d registry[\"NonExistentComponent\"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"477eab11_4a7997e7","line":122,"range":{"start_line":122,"start_character":12,"end_line":122,"end_character":15},"in_reply_to":"9e759892_1d6c6807","updated":"2025-01-23 17:33:03.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"}],"oslo_service/tests/backend/tests/test_backend_init.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":40,"context_line":"                return mock.MagicMock(ThreadingBackend\u003dThreadingBackend)"},{"line_number":41,"context_line":"            raise ModuleNotFoundError(f\"No module named {module_name}\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.mock_import_module.side_effect \u003d fake_import_module"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def tearDown(self):"},{"line_number":46,"context_line":"        mock.patch.stopall()"}],"source_content_type":"text/x-python","patch_set":31,"id":"c7f3f63a_a6f3aa2b","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":64},"updated":"2025-01-17 09:41:33.000000000","message":"Wonder if we really need this mock ? Isn\u0027t this the exact behavior we expect for the current code ?","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"4c1ecf37367a1e0c242025b82d80b35ccea0b705","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                return mock.MagicMock(ThreadingBackend\u003dThreadingBackend)"},{"line_number":41,"context_line":"            raise ModuleNotFoundError(f\"No module named {module_name}\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.mock_import_module.side_effect \u003d fake_import_module"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def tearDown(self):"},{"line_number":46,"context_line":"        mock.patch.stopall()"}],"source_content_type":"text/x-python","patch_set":31,"id":"19303e7b_0309690f","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":64},"in_reply_to":"17e9629d_007f0179","updated":"2025-01-23 17:51:02.000000000","message":"Yeah the first backend (the eventlet one) comes with the follow up patch.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"b0a3e0478b64f214805cda3a477b7e9bca12c220","unresolved":true,"context_lines":[{"line_number":40,"context_line":"                return mock.MagicMock(ThreadingBackend\u003dThreadingBackend)"},{"line_number":41,"context_line":"            raise ModuleNotFoundError(f\"No module named {module_name}\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.mock_import_module.side_effect \u003d fake_import_module"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def tearDown(self):"},{"line_number":46,"context_line":"        mock.patch.stopall()"}],"source_content_type":"text/x-python","patch_set":31,"id":"915d822f_01fdbc7d","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":64},"in_reply_to":"1de144ed_bb94814e","updated":"2025-01-23 15:51:31.000000000","message":"this code should still be managing to import the eventlet backend in the absense of the threading backend and I dont see tests that are calling for the threading backend here so I am also +1 to remove this mock logic.  since we dont have CONF use anymore this should all be very simple","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                return mock.MagicMock(ThreadingBackend\u003dThreadingBackend)"},{"line_number":41,"context_line":"            raise ModuleNotFoundError(f\"No module named {module_name}\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.mock_import_module.side_effect \u003d fake_import_module"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def tearDown(self):"},{"line_number":46,"context_line":"        mock.patch.stopall()"}],"source_content_type":"text/x-python","patch_set":31,"id":"17e9629d_007f0179","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":64},"in_reply_to":"915d822f_01fdbc7d","updated":"2025-01-23 17:33:03.000000000","message":"OK we didnt add the \"eventlet\" backend here either (I thought we did).   so we can\u0027t test a real module here because there is none.\n\nso im going to add a stub eventlet backend.   Already there seems to be the issue that a real backend has no \"name\" attribute which is causing some failures","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"ab5c66b773ca9803399ee5d29d62944c4d40b211","unresolved":true,"context_lines":[{"line_number":40,"context_line":"                return mock.MagicMock(ThreadingBackend\u003dThreadingBackend)"},{"line_number":41,"context_line":"            raise ModuleNotFoundError(f\"No module named {module_name}\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.mock_import_module.side_effect \u003d fake_import_module"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def tearDown(self):"},{"line_number":46,"context_line":"        mock.patch.stopall()"}],"source_content_type":"text/x-python","patch_set":31,"id":"ec9e2a5f_f13a50f5","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":64},"in_reply_to":"c7f3f63a_a6f3aa2b","updated":"2025-01-20 14:13:37.000000000","message":"If it\u0027s ok I prefer keep the mock.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"01961420e6048423e74095d906e245d59da5c418","unresolved":true,"context_lines":[{"line_number":40,"context_line":"                return mock.MagicMock(ThreadingBackend\u003dThreadingBackend)"},{"line_number":41,"context_line":"            raise ModuleNotFoundError(f\"No module named {module_name}\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.mock_import_module.side_effect \u003d fake_import_module"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def tearDown(self):"},{"line_number":46,"context_line":"        mock.patch.stopall()"}],"source_content_type":"text/x-python","patch_set":31,"id":"fef6947e_9781a384","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":64},"in_reply_to":"ec9e2a5f_f13a50f5","updated":"2025-01-20 14:30:19.000000000","message":"mock shouldn\u0027t be done unless there is any specific reason. That allows us to test more realistic scenario. Unnecessary mock may hide actual problems.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"f2e4e5d2e8594f004959fee1bc990112e29693f6","unresolved":true,"context_lines":[{"line_number":40,"context_line":"                return mock.MagicMock(ThreadingBackend\u003dThreadingBackend)"},{"line_number":41,"context_line":"            raise ModuleNotFoundError(f\"No module named {module_name}\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.mock_import_module.side_effect \u003d fake_import_module"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def tearDown(self):"},{"line_number":46,"context_line":"        mock.patch.stopall()"}],"source_content_type":"text/x-python","patch_set":31,"id":"1de144ed_bb94814e","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":64},"in_reply_to":"fef6947e_9781a384","updated":"2025-01-22 16:21:52.000000000","message":"I would like to use the direct implementation when we will have implemented the backends if it\u0027s ok for you please?","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        os.environ[\"OSLO_SERVICE_BACKEND\"] \u003d \"threading\""},{"line_number":88,"context_line":"        backend2 \u003d get_backend()"},{"line_number":89,"context_line":"        self.assertNotEqual("},{"line_number":90,"context_line":"            backend1,"},{"line_number":91,"context_line":"            backend2,"},{"line_number":92,"context_line":"            \"The backend should update after clearing the cache.\")"},{"line_number":93,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":31,"id":"fed13df2_c4da78ee","line":90,"range":{"start_line":90,"start_character":12,"end_line":90,"end_character":20},"updated":"2025-01-17 09:41:33.000000000","message":"It\u0027d be more straigtfowrd to check type and name directly after get_backend.","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        os.environ[\"OSLO_SERVICE_BACKEND\"] \u003d \"threading\""},{"line_number":88,"context_line":"        backend2 \u003d get_backend()"},{"line_number":89,"context_line":"        self.assertNotEqual("},{"line_number":90,"context_line":"            backend1,"},{"line_number":91,"context_line":"            backend2,"},{"line_number":92,"context_line":"            \"The backend should update after clearing the cache.\")"},{"line_number":93,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":31,"id":"7c15b7cd_c0bada0d","line":90,"range":{"start_line":90,"start_character":12,"end_line":90,"end_character":20},"in_reply_to":"fed13df2_c4da78ee","updated":"2025-01-23 17:33:03.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ac8cd78da6c94a9e1e413c1bd52a6853fddc516","unresolved":true,"context_lines":[{"line_number":111,"context_line":"        \"\"\"Clean up mocks after each test.\"\"\""},{"line_number":112,"context_line":"        self.env_patcher.stop()"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @mock.patch(\"importlib.import_module\")"},{"line_number":115,"context_line":"    def test_default_backend(self, mock_import_module):"},{"line_number":116,"context_line":"        \"\"\"Test that the default backend."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"62483308_312abfc7","line":114,"range":{"start_line":114,"start_character":17,"end_line":114,"end_character":41},"updated":"2025-01-17 09:41:33.000000000","message":"ditto. Do we really need this mock ?","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        \"\"\"Clean up mocks after each test.\"\"\""},{"line_number":112,"context_line":"        self.env_patcher.stop()"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @mock.patch(\"importlib.import_module\")"},{"line_number":115,"context_line":"    def test_default_backend(self, mock_import_module):"},{"line_number":116,"context_line":"        \"\"\"Test that the default backend."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"2802f805_024432eb","line":114,"range":{"start_line":114,"start_character":17,"end_line":114,"end_character":41},"in_reply_to":"62483308_312abfc7","updated":"2025-01-23 17:33:03.000000000","message":"Done","commit_id":"216b7a7628b3e5da0543b833483876ff4bfab433"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"61bc085dc5a7971e877a69b49a155dc0a7700299","unresolved":true,"context_lines":[{"line_number":61,"context_line":"    def test_invalid_backend(self):"},{"line_number":62,"context_line":"        \"\"\"Test that an invalid DEFAULT_BACKEND raises ValueError.\"\"\""},{"line_number":63,"context_line":"        with self.assertRaises(ValueError):"},{"line_number":64,"context_line":"            backend_module.DEFAULT_BACKEND \u003d \"invalid_backend\""},{"line_number":65,"context_line":"            get_backend()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_cached_backend(self):"}],"source_content_type":"text/x-python","patch_set":36,"id":"ed66bfd5_c65a01a1","line":64,"updated":"2025-01-23 15:47:01.000000000","message":"this is very much not how we shoudl be doing this as a public api.","commit_id":"7b71a257fc35f8e8ad0579a8d972f4f50750c452"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def test_invalid_backend(self):"},{"line_number":62,"context_line":"        \"\"\"Test that an invalid DEFAULT_BACKEND raises ValueError.\"\"\""},{"line_number":63,"context_line":"        with self.assertRaises(ValueError):"},{"line_number":64,"context_line":"            backend_module.DEFAULT_BACKEND \u003d \"invalid_backend\""},{"line_number":65,"context_line":"            get_backend()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_cached_backend(self):"}],"source_content_type":"text/x-python","patch_set":36,"id":"f10e253a_ecabe66f","line":64,"in_reply_to":"ed66bfd5_c65a01a1","updated":"2025-01-23 17:33:03.000000000","message":"this has been replaced with an init_backend() function","commit_id":"7b71a257fc35f8e8ad0579a8d972f4f50750c452"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"544fa828b47a917a1badc03b611e051701e8c049","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def test_backend_components(self):"},{"line_number":85,"context_line":"        \"\"\"Test that components are retrieved from the backend.\"\"\""},{"line_number":86,"context_line":"        backend \u003d get_backend()"},{"line_number":87,"context_line":"        backend.get_service_components \u003d mock.MagicMock("},{"line_number":88,"context_line":"            return_value\u003d{\"example\": \"component\"})"},{"line_number":89,"context_line":"        components \u003d backend.get_service_components()"},{"line_number":90,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":36,"id":"38cebe1d_1c0448a4","line":87,"updated":"2025-01-23 17:33:03.000000000","message":"this test is assigning a mock to a function, then calling the mock.  it doesnt test any code.  will update","commit_id":"7b71a257fc35f8e8ad0579a8d972f4f50750c452"}],"oslo_service/tests/backend/tests/tests_backend_base.py":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":56,"context_line":"            components[\"ServiceLauncher\"], \"mock_service_launcher\")"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class TestComponentProxy(unittest.TestCase):"},{"line_number":60,"context_line":"    def setUp(self):"},{"line_number":61,"context_line":"        \"\"\"Set up components for testing.\"\"\""},{"line_number":62,"context_line":"        self.components \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"29504fb9_eb9b8304","line":59,"range":{"start_line":59,"start_character":19,"end_line":59,"end_character":24},"updated":"2024-11-22 09:07:53.000000000","message":"Should we not rename it to `Register/Registry` too?","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            components[\"ServiceLauncher\"], \"mock_service_launcher\")"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class TestComponentProxy(unittest.TestCase):"},{"line_number":60,"context_line":"    def setUp(self):"},{"line_number":61,"context_line":"        \"\"\"Set up components for testing.\"\"\""},{"line_number":62,"context_line":"        self.components \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"a0980e16_9c6b5197","line":59,"range":{"start_line":59,"start_character":19,"end_line":59,"end_character":24},"in_reply_to":"29504fb9_eb9b8304","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":63,"context_line":"            \"ServiceLauncher\": \"mock_service_launcher\","},{"line_number":64,"context_line":"            \"ProcessLauncher\": \"mock_process_launcher\","},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":"        self.proxy \u003d ComponentRegister(self.components)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def test_get_existing_component(self):"},{"line_number":69,"context_line":"        \"\"\"Test getting an existing component.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"a8912685_d8abd549","line":66,"range":{"start_line":66,"start_character":13,"end_line":66,"end_character":18},"updated":"2024-11-22 09:07:53.000000000","message":"register/registry?","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            \"ServiceLauncher\": \"mock_service_launcher\","},{"line_number":64,"context_line":"            \"ProcessLauncher\": \"mock_process_launcher\","},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":"        self.proxy \u003d ComponentRegister(self.components)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def test_get_existing_component(self):"},{"line_number":69,"context_line":"        \"\"\"Test getting an existing component.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"465496f3_af51570e","line":66,"range":{"start_line":66,"start_character":13,"end_line":66,"end_character":18},"in_reply_to":"a8912685_d8abd549","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":68,"context_line":"    def test_get_existing_component(self):"},{"line_number":69,"context_line":"        \"\"\"Test getting an existing component.\"\"\""},{"line_number":70,"context_line":"        self.assertEqual("},{"line_number":71,"context_line":"            self.proxy[\"ServiceLauncher\"], \"mock_service_launcher\")"},{"line_number":72,"context_line":"        self.assertEqual("},{"line_number":73,"context_line":"            self.proxy[\"ProcessLauncher\"], \"mock_process_launcher\")"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"f20c8010_2b1fe6a0","line":71,"range":{"start_line":71,"start_character":17,"end_line":71,"end_character":22},"updated":"2024-11-22 09:07:53.000000000","message":"Same thing","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def test_get_existing_component(self):"},{"line_number":69,"context_line":"        \"\"\"Test getting an existing component.\"\"\""},{"line_number":70,"context_line":"        self.assertEqual("},{"line_number":71,"context_line":"            self.proxy[\"ServiceLauncher\"], \"mock_service_launcher\")"},{"line_number":72,"context_line":"        self.assertEqual("},{"line_number":73,"context_line":"            self.proxy[\"ProcessLauncher\"], \"mock_process_launcher\")"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"0b6cd52b_284c4251","line":71,"range":{"start_line":71,"start_character":17,"end_line":71,"end_character":22},"in_reply_to":"f20c8010_2b1fe6a0","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":70,"context_line":"        self.assertEqual("},{"line_number":71,"context_line":"            self.proxy[\"ServiceLauncher\"], \"mock_service_launcher\")"},{"line_number":72,"context_line":"        self.assertEqual("},{"line_number":73,"context_line":"            self.proxy[\"ProcessLauncher\"], \"mock_process_launcher\")"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_get_missing_component(self):"},{"line_number":76,"context_line":"        \"\"\"Test accessing a missing component raises NotImplementedError.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"2b66847c_66f64b9a","line":73,"range":{"start_line":73,"start_character":17,"end_line":73,"end_character":22},"updated":"2024-11-22 09:07:53.000000000","message":"here too","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.assertEqual("},{"line_number":71,"context_line":"            self.proxy[\"ServiceLauncher\"], \"mock_service_launcher\")"},{"line_number":72,"context_line":"        self.assertEqual("},{"line_number":73,"context_line":"            self.proxy[\"ProcessLauncher\"], \"mock_process_launcher\")"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_get_missing_component(self):"},{"line_number":76,"context_line":"        \"\"\"Test accessing a missing component raises NotImplementedError.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"1f47471b_b5c5f9ec","line":73,"range":{"start_line":73,"start_character":17,"end_line":73,"end_character":22},"in_reply_to":"2b66847c_66f64b9a","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":75,"context_line":"    def test_get_missing_component(self):"},{"line_number":76,"context_line":"        \"\"\"Test accessing a missing component raises NotImplementedError.\"\"\""},{"line_number":77,"context_line":"        with self.assertRaises(NotImplementedError) as context:"},{"line_number":78,"context_line":"            _ \u003d self.proxy[\"LoopingCall\"]"},{"line_number":79,"context_line":"        self.assertIn("},{"line_number":80,"context_line":"            \"Component \u0027LoopingCall\u0027 is not available\","},{"line_number":81,"context_line":"            str(context.exception))"}],"source_content_type":"text/x-python","patch_set":9,"id":"25fc17eb_efdc3430","line":78,"range":{"start_line":78,"start_character":21,"end_line":78,"end_character":26},"updated":"2024-11-22 09:07:53.000000000","message":"register/registry","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def test_get_missing_component(self):"},{"line_number":76,"context_line":"        \"\"\"Test accessing a missing component raises NotImplementedError.\"\"\""},{"line_number":77,"context_line":"        with self.assertRaises(NotImplementedError) as context:"},{"line_number":78,"context_line":"            _ \u003d self.proxy[\"LoopingCall\"]"},{"line_number":79,"context_line":"        self.assertIn("},{"line_number":80,"context_line":"            \"Component \u0027LoopingCall\u0027 is not available\","},{"line_number":81,"context_line":"            str(context.exception))"}],"source_content_type":"text/x-python","patch_set":9,"id":"68def6b8_37bff41a","line":78,"range":{"start_line":78,"start_character":21,"end_line":78,"end_character":26},"in_reply_to":"25fc17eb_efdc3430","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":81,"context_line":"            str(context.exception))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_contains_existing_component(self):"},{"line_number":84,"context_line":"        \"\"\"Test checking if an existing component is in the proxy.\"\"\""},{"line_number":85,"context_line":"        self.assertIn(\"ServiceLauncher\", self.proxy)"},{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"cc353924_03a417a0","line":84,"range":{"start_line":84,"start_character":60,"end_line":84,"end_character":65},"updated":"2024-11-22 09:07:53.000000000","message":"register/registry","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            str(context.exception))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_contains_existing_component(self):"},{"line_number":84,"context_line":"        \"\"\"Test checking if an existing component is in the proxy.\"\"\""},{"line_number":85,"context_line":"        self.assertIn(\"ServiceLauncher\", self.proxy)"},{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"e2a4eefb_e30c9912","line":84,"range":{"start_line":84,"start_character":60,"end_line":84,"end_character":65},"in_reply_to":"cc353924_03a417a0","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_contains_existing_component(self):"},{"line_number":84,"context_line":"        \"\"\"Test checking if an existing component is in the proxy.\"\"\""},{"line_number":85,"context_line":"        self.assertIn(\"ServiceLauncher\", self.proxy)"},{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"dcf80972_cd6e8293","line":85,"range":{"start_line":85,"start_character":46,"end_line":85,"end_character":51},"updated":"2024-11-22 09:07:53.000000000","message":"register/registry","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_contains_existing_component(self):"},{"line_number":84,"context_line":"        \"\"\"Test checking if an existing component is in the proxy.\"\"\""},{"line_number":85,"context_line":"        self.assertIn(\"ServiceLauncher\", self.proxy)"},{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"228e3998_5be2d4ec","line":85,"range":{"start_line":85,"start_character":46,"end_line":85,"end_character":51},"in_reply_to":"dcf80972_cd6e8293","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    def test_contains_existing_component(self):"},{"line_number":84,"context_line":"        \"\"\"Test checking if an existing component is in the proxy.\"\"\""},{"line_number":85,"context_line":"        self.assertIn(\"ServiceLauncher\", self.proxy)"},{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"},{"line_number":89,"context_line":"        \"\"\"Test checking if a missing component is in the proxy.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7d23b2e3_65a96c55","line":86,"range":{"start_line":86,"start_character":46,"end_line":86,"end_character":51},"updated":"2024-11-22 09:07:53.000000000","message":"register/registry","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def test_contains_existing_component(self):"},{"line_number":84,"context_line":"        \"\"\"Test checking if an existing component is in the proxy.\"\"\""},{"line_number":85,"context_line":"        self.assertIn(\"ServiceLauncher\", self.proxy)"},{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"},{"line_number":89,"context_line":"        \"\"\"Test checking if a missing component is in the proxy.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"69be25e0_0f7d2054","line":86,"range":{"start_line":86,"start_character":46,"end_line":86,"end_character":51},"in_reply_to":"7d23b2e3_65a96c55","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"},{"line_number":89,"context_line":"        \"\"\"Test checking if a missing component is in the proxy.\"\"\""},{"line_number":90,"context_line":"        self.assertNotIn(\"LoopingCall\", self.proxy)"}],"source_content_type":"text/x-python","patch_set":9,"id":"537fde6b_22557b81","line":89,"range":{"start_line":89,"start_character":58,"end_line":89,"end_character":63},"updated":"2024-11-22 09:07:53.000000000","message":"register/registry","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.assertIn(\"ProcessLauncher\", self.proxy)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"},{"line_number":89,"context_line":"        \"\"\"Test checking if a missing component is in the proxy.\"\"\""},{"line_number":90,"context_line":"        self.assertNotIn(\"LoopingCall\", self.proxy)"}],"source_content_type":"text/x-python","patch_set":9,"id":"4ec77749_90672e67","line":89,"range":{"start_line":89,"start_character":58,"end_line":89,"end_character":63},"in_reply_to":"537fde6b_22557b81","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"090619ca6f0a4086fc33d7bb728ae61ae1b9b240","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"},{"line_number":89,"context_line":"        \"\"\"Test checking if a missing component is in the proxy.\"\"\""},{"line_number":90,"context_line":"        self.assertNotIn(\"LoopingCall\", self.proxy)"}],"source_content_type":"text/x-python","patch_set":9,"id":"f08cd968_5c5ffce1","line":90,"range":{"start_line":90,"start_character":45,"end_line":90,"end_character":50},"updated":"2024-11-22 09:07:53.000000000","message":"register/registry","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cb038d8473d4c7d0cea30fb9016e8ef8b6624607","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_contains_missing_component(self):"},{"line_number":89,"context_line":"        \"\"\"Test checking if a missing component is in the proxy.\"\"\""},{"line_number":90,"context_line":"        self.assertNotIn(\"LoopingCall\", self.proxy)"}],"source_content_type":"text/x-python","patch_set":9,"id":"d7a22f94_006842c5","line":90,"range":{"start_line":90,"start_character":45,"end_line":90,"end_character":50},"in_reply_to":"f08cd968_5c5ffce1","updated":"2024-11-22 11:07:48.000000000","message":"Done","commit_id":"22d73a4236489d416b4994cc24bfd659003edbdf"}],"setup.cfg":[{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"2128abe200e26d97431e8ce6159999617715b5e6","unresolved":true,"context_lines":[{"line_number":32,"context_line":"    oslo.service.service \u003d oslo_service.service:list_opts"},{"line_number":33,"context_line":"    oslo.service.sslutils \u003d oslo_service.sslutils:list_opts"},{"line_number":34,"context_line":"    oslo.service.wsgi \u003d oslo_service.wsgi:list_opts"},{"line_number":35,"context_line":"    oslo.service.backend \u003d oslo_service.backend:list_opts"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"[upload_sphinx]"},{"line_number":38,"context_line":"upload-dir \u003d doc/build/html"}],"source_content_type":"text/x-ttcn-cfg","patch_set":30,"id":"310c9c49_cd294bd2","line":35,"updated":"2025-01-16 15:40:30.000000000","message":"also remove this","commit_id":"5ed3089e2a2455c2be31ad138f216000d7673e39"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"85678565cba22fd0a6881233eaf1be391d232ae7","unresolved":true,"context_lines":[{"line_number":32,"context_line":"    oslo.service.service \u003d oslo_service.service:list_opts"},{"line_number":33,"context_line":"    oslo.service.sslutils \u003d oslo_service.sslutils:list_opts"},{"line_number":34,"context_line":"    oslo.service.wsgi \u003d oslo_service.wsgi:list_opts"},{"line_number":35,"context_line":"    oslo.service.backend \u003d oslo_service.backend:list_opts"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"[upload_sphinx]"},{"line_number":38,"context_line":"upload-dir \u003d doc/build/html"}],"source_content_type":"text/x-ttcn-cfg","patch_set":30,"id":"f429d021_9b75ec65","line":35,"in_reply_to":"310c9c49_cd294bd2","updated":"2025-01-16 18:15:34.000000000","message":"Right.","commit_id":"5ed3089e2a2455c2be31ad138f216000d7673e39"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"fbfc9b13bd451a7a5cccf5f8841410ed0d09b05a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    oslo.service.service \u003d oslo_service.service:list_opts"},{"line_number":33,"context_line":"    oslo.service.sslutils \u003d oslo_service.sslutils:list_opts"},{"line_number":34,"context_line":"    oslo.service.wsgi \u003d oslo_service.wsgi:list_opts"},{"line_number":35,"context_line":"    oslo.service.backend \u003d oslo_service.backend:list_opts"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"[upload_sphinx]"},{"line_number":38,"context_line":"upload-dir \u003d doc/build/html"}],"source_content_type":"text/x-ttcn-cfg","patch_set":30,"id":"3ef27a11_69129b46","line":35,"in_reply_to":"f429d021_9b75ec65","updated":"2025-01-16 18:17:36.000000000","message":"Done","commit_id":"5ed3089e2a2455c2be31ad138f216000d7673e39"}]}
