)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"16e03cbcc9882506d8e040c825804cc1e714d9e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"72ab6c96_eac31dd2","updated":"2022-03-18 09:15:02.000000000","message":"Thanks for your patch 😊\n\nOption all_projects has to be applied in function _wait as well, see below.","commit_id":"2b2fbb82c999471b9008e1b909bbb856519d0dd6"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"f0d74fca3ebbb1c5464539d417038178a98338ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f359ae82_a0e8b04d","updated":"2022-02-27 21:45:55.000000000","message":"recheck","commit_id":"2b2fbb82c999471b9008e1b909bbb856519d0dd6"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"c0911fef5df1625e73210dd0e610382a3828e932","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"479d5665_aef41088","updated":"2022-03-24 13:40:16.000000000","message":"recheck","commit_id":"ba629d1fb53b7b50c5cfba81f1db6b0961874b0e"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"ea5f3fdc6fbdf30af009f785be12808761e756c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9de5a450_7956bd78","in_reply_to":"479d5665_aef41088","updated":"2022-03-24 13:48:04.000000000","message":"CI jobs are failing because I am currently reworking our Zuul config. Atm most important job for your patch is ansible-collections-openstack-functional-devstack-releases and this is not failing.","commit_id":"ba629d1fb53b7b50c5cfba81f1db6b0961874b0e"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"6921157f909a72218d4c8d2095b301960838f735","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9f2649c6_8963f990","updated":"2022-03-28 12:09:27.000000000","message":"I added some tests (fixed in the latest patch). I\u0027m a bit suprised the last Zuul job did not run them.","commit_id":"23fb5fafe29bf97d3ded1c5b76c4d443e978833b"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"b5129a7161fb57739bab9a80a5a069fba212ebf0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f6812cc0_06a1822a","in_reply_to":"9f2649c6_8963f990","updated":"2022-03-28 18:48:14.000000000","message":"That is because i am still reworking .zuul.yaml, non-common branches like stable/1.0.0 are no fun with Zuul 🙈 Better dont give to much about Zuul jobs for now. I will recheck once i am done.","commit_id":"23fb5fafe29bf97d3ded1c5b76c4d443e978833b"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"260a7f2b5d2d4dcef037ec48ad1f4b23f70a0d31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0856672c_c618212b","updated":"2022-03-30 10:11:23.000000000","message":"Documented the CLOUD_ALT parameter and fixed the cloud name in the last patchset. Should be ready for merge now. Lets see what Zuul thinks ^^","commit_id":"748fca99e969d356cef89b5aac0ee31ff4ab1e34"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"7595fc2b8b80ca5b1efc899fadc546f1ee02d4c5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"08eddc7a_ca0e86c0","updated":"2022-03-30 14:44:06.000000000","message":"Patchset 8 did not work because there is no network private in devstack-alt on xena+wallaby+train, refert to Zuul output on cherry-pick to stable/1.0.0.\n\nPatchset 9 did not work because \"Server reached ACTIVE state without being allocated an IP address\".\n\nHmm...","commit_id":"6750e61baf98b1131bd8ad0bfc1bca3bed509a52"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"24b706799a9bd9d95004800e81b3d28e034c3899","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"e457313e_27420a74","in_reply_to":"08eddc7a_ca0e86c0","updated":"2022-03-30 14:44:53.000000000","message":"*thinking about a solution*","commit_id":"6750e61baf98b1131bd8ad0bfc1bca3bed509a52"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"1e83cfa1ee73e4e412e73a4fa35e953056056716","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"69381e3d_0622e358","in_reply_to":"e457313e_27420a74","updated":"2022-03-31 12:17:27.000000000","message":"Done","commit_id":"6750e61baf98b1131bd8ad0bfc1bca3bed509a52"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"bd586c72f0419c1262eb13f9480fc942311046f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1840a8e4_184ef18e","updated":"2022-03-31 08:04:07.000000000","message":"Patchset 10 works for sdk master and older sdk releases such as train.\n\nWhat do you think, Gaudenz? Okay for you?","commit_id":"c5a3c4846a7849d7d21b7ef62a85dd53fa42f259"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"4f1e609cfe43f18921a7e20a4c143b9746631d24","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"fe710c4d_0636030e","in_reply_to":"1840a8e4_184ef18e","updated":"2022-03-31 09:42:06.000000000","message":"Looks good to me. Thanks for your work and your fixes.","commit_id":"c5a3c4846a7849d7d21b7ef62a85dd53fa42f259"}],"ci/roles/server/tasks/server_actions.yml":[{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"4d1b8c87175d76328bdf83617442ee180027e17d","unresolved":true,"context_lines":[{"line_number":568,"context_line":""},{"line_number":569,"context_line":"- name: Get info about server in alternate project"},{"line_number":570,"context_line":"  openstack.cloud.server_info:"},{"line_number":571,"context_line":"    cloud: \"{{ cloud }}\""},{"line_number":572,"context_line":"    server: \"{{ server_name }}-alt\""},{"line_number":573,"context_line":"  register: info26"},{"line_number":574,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9569bbbe_332ef672","line":571,"updated":"2022-03-30 08:18:12.000000000","message":"{{ cloud }} \u003d\u003e {{ cloud_alt }} ?","commit_id":"a27e1e1fefb099c3d6271f87c0c088d8863d0c3a"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"260a7f2b5d2d4dcef037ec48ad1f4b23f70a0d31","unresolved":false,"context_lines":[{"line_number":568,"context_line":""},{"line_number":569,"context_line":"- name: Get info about server in alternate project"},{"line_number":570,"context_line":"  openstack.cloud.server_info:"},{"line_number":571,"context_line":"    cloud: \"{{ cloud }}\""},{"line_number":572,"context_line":"    server: \"{{ server_name }}-alt\""},{"line_number":573,"context_line":"  register: info26"},{"line_number":574,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"e7e53096_441db983","line":571,"in_reply_to":"9569bbbe_332ef672","updated":"2022-03-30 10:11:23.000000000","message":"Fixed that for you :)","commit_id":"a27e1e1fefb099c3d6271f87c0c088d8863d0c3a"}],"plugins/modules/server_action.py":[{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"16e03cbcc9882506d8e040c825804cc1e714d9e1","unresolved":true,"context_lines":[{"line_number":48,"context_line":"        type: str"},{"line_number":49,"context_line":"    all_projects:"},{"line_number":50,"context_line":"        description:"},{"line_number":51,"context_line":"        - Wheter to search for server from all projects or just the current"},{"line_number":52,"context_line":"          auth scoped project."},{"line_number":53,"context_line":"        type: bool"},{"line_number":54,"context_line":"        default: \u0027no\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"d64edb7f_48204c5e","line":51,"updated":"2022-03-18 09:15:02.000000000","message":"\"_Whether_ to search for server _in_ all projects...\"?","commit_id":"2b2fbb82c999471b9008e1b909bbb856519d0dd6"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"6921157f909a72218d4c8d2095b301960838f735","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        type: str"},{"line_number":49,"context_line":"    all_projects:"},{"line_number":50,"context_line":"        description:"},{"line_number":51,"context_line":"        - Wheter to search for server from all projects or just the current"},{"line_number":52,"context_line":"          auth scoped project."},{"line_number":53,"context_line":"        type: bool"},{"line_number":54,"context_line":"        default: \u0027no\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9425bca2_c7737bea","line":51,"in_reply_to":"d64edb7f_48204c5e","updated":"2022-03-28 12:09:27.000000000","message":"Done","commit_id":"2b2fbb82c999471b9008e1b909bbb856519d0dd6"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"16e03cbcc9882506d8e040c825804cc1e714d9e1","unresolved":true,"context_lines":[{"line_number":204,"context_line":"    def _wait(self, os_server):"},{"line_number":205,"context_line":"        \"\"\"Wait for the server to reach the desired state for the given action.\"\"\""},{"line_number":206,"context_line":"        # Using Server object for wait_for_server function"},{"line_number":207,"context_line":"        server \u003d self.conn.compute.find_server(self.params[\u0027server\u0027])"},{"line_number":208,"context_line":"        states \u003d _action_map[self.params[\u0027action\u0027]]"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"b6c719cd_f2e6b742","line":207,"updated":"2022-03-18 09:15:02.000000000","message":"find_server has no option to search in all projects and thus will only search in current project. For example, replace it with something like:\n\n  server \u003d self.conn.compute.get_server(server\u003dos_server.id)\n\nOr\n\n  server \u003d self.conn.compute.servers(name\u003dself.params[\u0027server\u0027], all_projects\u003dself.params[\u0027all_projects\u0027])\n\nOr maybe we can even get rid of the whole api call and just use os_server object in wait_for_server?","commit_id":"2b2fbb82c999471b9008e1b909bbb856519d0dd6"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"6921157f909a72218d4c8d2095b301960838f735","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def _wait(self, os_server):"},{"line_number":205,"context_line":"        \"\"\"Wait for the server to reach the desired state for the given action.\"\"\""},{"line_number":206,"context_line":"        # Using Server object for wait_for_server function"},{"line_number":207,"context_line":"        server \u003d self.conn.compute.find_server(self.params[\u0027server\u0027])"},{"line_number":208,"context_line":"        states \u003d _action_map[self.params[\u0027action\u0027]]"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"8a5ed003_aa2dbe6a","line":207,"in_reply_to":"b6c719cd_f2e6b742","updated":"2022-03-28 12:09:27.000000000","message":"Done","commit_id":"2b2fbb82c999471b9008e1b909bbb856519d0dd6"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"84d1c768c4fa33f571b4809d395dfd14a426ac8c","unresolved":true,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        try:"},{"line_number":209,"context_line":"            self.conn.compute.wait_for_server("},{"line_number":210,"context_line":"                os_server,"},{"line_number":211,"context_line":"                status\u003dstates[0],"},{"line_number":212,"context_line":"                wait\u003dself.params[\u0027timeout\u0027])"},{"line_number":213,"context_line":"        except self.sdk.exceptions.ResourceTimeout:"}],"source_content_type":"text/x-python","patch_set":2,"id":"87aa8ee5_35eef01e","line":210,"updated":"2022-03-23 19:25:58.000000000","message":"Okay, looks like passing os_server directly that did not work 🙈","commit_id":"98fb685418b23ca263b6efbe208ef8325bfb7433"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"6921157f909a72218d4c8d2095b301960838f735","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        try:"},{"line_number":209,"context_line":"            self.conn.compute.wait_for_server("},{"line_number":210,"context_line":"                os_server,"},{"line_number":211,"context_line":"                status\u003dstates[0],"},{"line_number":212,"context_line":"                wait\u003dself.params[\u0027timeout\u0027])"},{"line_number":213,"context_line":"        except self.sdk.exceptions.ResourceTimeout:"}],"source_content_type":"text/x-python","patch_set":2,"id":"310d56dd_796110eb","line":210,"in_reply_to":"87aa8ee5_35eef01e","updated":"2022-03-28 12:09:27.000000000","message":"Done","commit_id":"98fb685418b23ca263b6efbe208ef8325bfb7433"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"ea5f3fdc6fbdf30af009f785be12808761e756c3","unresolved":true,"context_lines":[{"line_number":205,"context_line":"        \"\"\"Wait for the server to reach the desired state for the given action.\"\"\""},{"line_number":206,"context_line":"        # The wait_for_server function needs a Server object instead of"},{"line_number":207,"context_line":"        # Munch object returned by get_server"},{"line_number":208,"context_line":"        server \u003d self.conn.compute.find_server(os_server[\u0027id\u0027])"},{"line_number":209,"context_line":"        states \u003d _action_map[self.params[\u0027action\u0027]]"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"40faa20d_5f8d6a9a","line":208,"updated":"2022-03-24 13:48:04.000000000","message":"See my previous comment about find_server please. It only searches in current project. Use get_server or servers instead.","commit_id":"1221a448807d0b4a6d9914ebda813cf24f5b8d9e"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"b0a1be83b8f211420bd7628ba5a87f2bbedb6166","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        \"\"\"Wait for the server to reach the desired state for the given action.\"\"\""},{"line_number":206,"context_line":"        # The wait_for_server function needs a Server object instead of"},{"line_number":207,"context_line":"        # Munch object returned by get_server"},{"line_number":208,"context_line":"        server \u003d self.conn.compute.find_server(os_server[\u0027id\u0027])"},{"line_number":209,"context_line":"        states \u003d _action_map[self.params[\u0027action\u0027]]"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9018c75e_e94d214d","line":208,"in_reply_to":"40faa20d_5f8d6a9a","updated":"2022-03-24 16:32:31.000000000","message":"In my testing it finds all servers if the argument is a server UUID. If the argument is a server name you are right and it only search in the current project. So I think the current version is correct.\n\nAs I tried to clarify in the code comment, get_server is not applicable as it returns the wrong kind of object. An alternative would be to use\nself.conn.compute.servers(name\u003dself.params[\u0027server\u0027], all_projects\u003dTrue)\n\nBut that looks less efficient as it probably has to search through all servers.\n\nIs there an easy way to add a test using two projects or would I have to extend the tests to setup multiple projects?","commit_id":"1221a448807d0b4a6d9914ebda813cf24f5b8d9e"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"b81920c493f88dce1d3eff2df36e1af044e83a90","unresolved":true,"context_lines":[{"line_number":205,"context_line":"        \"\"\"Wait for the server to reach the desired state for the given action.\"\"\""},{"line_number":206,"context_line":"        # The wait_for_server function needs a Server object instead of"},{"line_number":207,"context_line":"        # Munch object returned by get_server"},{"line_number":208,"context_line":"        server \u003d self.conn.compute.find_server(os_server[\u0027id\u0027])"},{"line_number":209,"context_line":"        states \u003d _action_map[self.params[\u0027action\u0027]]"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"b0aae847_63dedbd5","line":208,"in_reply_to":"9018c75e_e94d214d","updated":"2022-03-24 20:00:34.000000000","message":"\u003e In my testing it finds all servers if the argument is a server UUID. If the argument is a server name you are right and it only search in the current project. So I think the current version is correct.\n\nHow can it be correct, if it does not respect the all_projects keyword in this case? If the user specifies a server name from a server in a different project, sets all_projects to true and wait to true, then the user expects the module to wait until the server reaches the desired state. Without handling this case in _wait(), the server will not be found and the code might return before the server has reached the desired state.\n\n\u003e As I tried to clarify in the code comment, get_server is not applicable as it returns the wrong kind of object.\n\nMy proposal to pass os_server to wait_for_server directly was flawed, because os_server comes from self.conn.get_server (SDK\u0027s cloud layer). You are correct in that it does not return a Server object which is what wait_for_server expects. But my other two suggestions use SDK\u0027s proxy layer which indeed do return Server objects.\n\nRef.: https://docs.openstack.org/openstacksdk/latest/user/proxies/compute.html\n\n\u003e An alternative would be to use\n\u003e self.conn.compute.servers(name\u003dself.params[\u0027server\u0027], all_projects\u003dTrue)\n\nYes, this is similar to what i suggested previously, but please do not use all_projects\u003dTrue but all_projects\u003dself.params[\u0027all_projects\u0027] instead.\n\n\u003e But that looks less efficient as it probably has to search through all servers.\n\nProbably true, I would prefer this instead:\n\n  server \u003d self.conn.compute.get_server(server\u003dos_server.id)\n\nThe difference from the current code is hard to spot: It uses self.conn.compute.get_server (SDK proxy layer) instead of self.conn.get_server (SDK cloud layer).\n\nRef.: https://docs.openstack.org/openstacksdk/latest/user/proxies/compute.html\n\n\u003e Is there an easy way to add a test using two projects or would I have to extend the tests to setup multiple projects?\n\nCI jobs install devstack instances including default projects in keystone. For example, look at each successful ci job output, go to \u0027Logs\u0027 tab and then navigate to controller \u003e logs \u003e etc \u003e openstack \u003e clouds.yaml, there you will find something like this:\n\nhttps://e1b18cfae082c482941d-9c3ff8aa7dcabcee88b15fa3c77a7faa.ssl.cf1.rackcdn.com/830871/4/check/ansible-collections-openstack-functional-devstack-releases/afd91e7/controller/logs/etc/openstack/clouds.yaml\n\nA nice overview can be find in devstack\u0027s sources:\n\nhttps://opendev.org/openstack/devstack/src/commit/14779fc992a7df41e6a1a093bf2aa4a7d248a6bd/lib/keystone#L275\n\nAnd yes, please add tests!!! 😊👍","commit_id":"1221a448807d0b4a6d9914ebda813cf24f5b8d9e"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"99d824e308681a9f4c59e8cb3c0cb226df1e8062","unresolved":true,"context_lines":[{"line_number":205,"context_line":"        \"\"\"Wait for the server to reach the desired state for the given action.\"\"\""},{"line_number":206,"context_line":"        # The wait_for_server function needs a Server object instead of"},{"line_number":207,"context_line":"        # Munch object returned by get_server"},{"line_number":208,"context_line":"        server \u003d self.conn.compute.find_server(os_server[\u0027id\u0027])"},{"line_number":209,"context_line":"        states \u003d _action_map[self.params[\u0027action\u0027]]"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"d797b468_837290f0","line":208,"in_reply_to":"b0aae847_63dedbd5","updated":"2022-03-24 20:16:20.000000000","message":"Forget about my first paragraph. You are right, we already have a UUID from os_server. I blame the night for this oversight, sorry 🙈\n\nTests would be great though 😊","commit_id":"1221a448807d0b4a6d9914ebda813cf24f5b8d9e"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"6921157f909a72218d4c8d2095b301960838f735","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        \"\"\"Wait for the server to reach the desired state for the given action.\"\"\""},{"line_number":206,"context_line":"        # The wait_for_server function needs a Server object instead of"},{"line_number":207,"context_line":"        # Munch object returned by get_server"},{"line_number":208,"context_line":"        server \u003d self.conn.compute.find_server(os_server[\u0027id\u0027])"},{"line_number":209,"context_line":"        states \u003d _action_map[self.params[\u0027action\u0027]]"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"a0393629_f4406bc7","line":208,"in_reply_to":"d797b468_837290f0","updated":"2022-03-28 12:09:27.000000000","message":"I did not fully understand the difference between the cloud layer and proxy layer before. I changed the code to use `get_server` from the proxy layer with the UUID as argument as this does not support `all_projects` either. I think this is the cleanest solution as it directly gets the server by UUID instead of doing a search.","commit_id":"1221a448807d0b4a6d9914ebda813cf24f5b8d9e"}]}
