)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"5cdaced673fd965b0e25c9629de7373450420bcf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"164f9ae7_bbaf93f1","updated":"2025-07-09 17:12:29.000000000","message":"I\u0027ve seen this issue in our system, but I haven\u0027t debugged it yet. I think it\u0027s due to the service account not properly getting loaded. k8s access to jobs uses a different mechanism.\n\nhttps://zuul.opendev.org/t/zuul/build/84de666b3cee40aba9227096165ad557/log/containers/default--zuul-operator-5cc8c4f97f-rv5rf--operator.txt","commit_id":"a1bd3873ea68d6d954dac13a8c408bad032e7d8d"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"25f0c3787cb5e75465170219ddc27dd17cf193ee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2d6e8d3a_610d4e0f","updated":"2025-07-10 00:18:15.000000000","message":"Apologies for sending up a badly tested experiment up!","commit_id":"0c7782ce90d1711c3b7d86e0340311d13ecbb4b4"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"ffced9f885da39d00da7018a0d638eb3c9379ba5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"207f842d_18ad77e8","updated":"2025-07-10 06:58:29.000000000","message":"recheck","commit_id":"bc2895377b095676b5a27d8f1b0d2c0107e1388c"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"837d4a1074c42ecf8cf8f52ec18a68d66050614c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3d5eafea_817c60a9","updated":"2025-07-10 16:10:21.000000000","message":"Finally, looks like it\u0027s working as intended now:\n\n    2025-07-10T16:00:17.963903570Z [2025-07-10 16:00:17,960] kopf.objects         [INFO    ] [default/zuul] Waiting for StatefulSet zuul-scheduler to finish rollout\n    2025-07-10T16:00:27.978118453Z [2025-07-10 16:00:27,976] kopf.objects         [INFO    ] [default/zuul] StatefulSet zuul-scheduler completed rollout\n    2025-07-10T16:00:27.978677211Z [2025-07-10 16:00:27,978] kopf.objects         [INFO    ] [default/zuul] Smart reconfigure\n    2025-07-10T16:00:27.992478413Z [2025-07-10 16:00:27,992] kopf.objects         [INFO    ] [default/zuul] Waiting for config to update on zuul-scheduler-0\n    2025-07-10T16:00:28.165034362Z [2025-07-10 16:00:28,163] kopf.objects         [INFO    ] [default/zuul] Issuing smart-reconfigure on zuul-scheduler-0","commit_id":"a7521adc755a713f6b457111167401cd8f204dc4"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"6d5ace3a06b6b457cce1129ffef544bd5491238c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"c901b1f6_3467d770","updated":"2025-07-11 15:10:03.000000000","message":"Thanks, also, I definitely approve of the bits I didn\u0027t write and just shamelessly nicked.","commit_id":"a9858a5b77b7c2b2219950bc457de1d79d3cd7b5"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"b9000b73_3aab6510","updated":"2025-07-11 15:17:51.000000000","message":"just resolving all unresolved comments...","commit_id":"a9858a5b77b7c2b2219950bc457de1d79d3cd7b5"}],"zuul_operator/operator.py":[{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"25f0c3787cb5e75465170219ddc27dd17cf193ee","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    if conf_changed:"},{"line_number":171,"context_line":"        spec_changed \u003d True"},{"line_number":172,"context_line":"        zuul.write_zuul_conf()"},{"line_number":173,"context_line":"        zuul.smart_reconfigure()"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if spec_changed:"},{"line_number":176,"context_line":"        zuul.create_zuul()"}],"source_content_type":"text/x-python","patch_set":4,"id":"cf2537a7_17497a00","line":173,"range":{"start_line":173,"start_character":8,"end_line":173,"end_character":32},"updated":"2025-07-10 00:18:15.000000000","message":"I\u0027m not quite sure this is the place. Running it here does a smart-reconfigure _before_ the rest of the topology changes (and could include changing the version of zuul, for example).","commit_id":"0c7782ce90d1711c3b7d86e0340311d13ecbb4b4"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    if conf_changed:"},{"line_number":171,"context_line":"        spec_changed \u003d True"},{"line_number":172,"context_line":"        zuul.write_zuul_conf()"},{"line_number":173,"context_line":"        zuul.smart_reconfigure()"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if spec_changed:"},{"line_number":176,"context_line":"        zuul.create_zuul()"}],"source_content_type":"text/x-python","patch_set":4,"id":"44acc3a7_15729d29","line":173,"range":{"start_line":173,"start_character":8,"end_line":173,"end_character":32},"in_reply_to":"cf2537a7_17497a00","updated":"2025-07-11 15:17:51.000000000","message":"resolved in later patchset by moving after the spec_changed branch.","commit_id":"0c7782ce90d1711c3b7d86e0340311d13ecbb4b4"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"6b00039097ed440515007e5b3434ba629213f5c6","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        zuul.create_zuul()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    if conf_changed:"},{"line_number":178,"context_line":"        zuul.smart_reconfigure()"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    memoize_secrets(memo, logger)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"11750d80_48958ec1","line":178,"range":{"start_line":178,"start_character":8,"end_line":178,"end_character":12},"updated":"2025-07-10 07:56:58.000000000","message":"When we reach here, the system is still in flux and has not settled yet. The scheduler pods are still running, but about to be killed. So the pod_exec runs in the old pod.","commit_id":"bc2895377b095676b5a27d8f1b0d2c0107e1388c"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        zuul.create_zuul()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    if conf_changed:"},{"line_number":178,"context_line":"        zuul.smart_reconfigure()"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    memoize_secrets(memo, logger)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"4b1362da_6bf3528d","line":178,"range":{"start_line":178,"start_character":8,"end_line":178,"end_character":12},"in_reply_to":"11750d80_48958ec1","updated":"2025-07-11 15:17:51.000000000","message":"Resolved in later patchset by introducing a wait on the statefulset rollout.","commit_id":"bc2895377b095676b5a27d8f1b0d2c0107e1388c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"29c30d3d61d20cb09faf83c1b59a323f461ef034","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        zuul.create_zuul()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    if conf_changed:"},{"line_number":178,"context_line":"        zuul.wait_for_statefulset(\u0027zuul-scheduler\u0027)"},{"line_number":179,"context_line":"        zuul.smart_reconfigure()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    memoize_secrets(memo, logger)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3c426c4a_ef4512da","line":178,"updated":"2025-07-10 13:27:55.000000000","message":"I think we should have an \"if spec_changed\" before the wait.","commit_id":"f7ae8734924ca840c7f6579d4cdec5ccbc3aa083"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"5c76a1101218191df546d8e42d066cf86f012eaf","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        zuul.create_zuul()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    if conf_changed:"},{"line_number":178,"context_line":"        zuul.wait_for_statefulset(\u0027zuul-scheduler\u0027)"},{"line_number":179,"context_line":"        zuul.smart_reconfigure()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    memoize_secrets(memo, logger)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5610e6b5_2d075d7f","line":178,"in_reply_to":"3c426c4a_ef4512da","updated":"2025-07-10 15:08:26.000000000","message":"I think that\u0027s a good one, let me add that.","commit_id":"f7ae8734924ca840c7f6579d4cdec5ccbc3aa083"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        zuul.create_zuul()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    if conf_changed:"},{"line_number":178,"context_line":"        zuul.wait_for_statefulset(\u0027zuul-scheduler\u0027)"},{"line_number":179,"context_line":"        zuul.smart_reconfigure()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    memoize_secrets(memo, logger)"}],"source_content_type":"text/x-python","patch_set":10,"id":"84fdb902_0f7c1f6e","line":178,"in_reply_to":"5610e6b5_2d075d7f","updated":"2025-07-11 15:17:51.000000000","message":"Done","commit_id":"f7ae8734924ca840c7f6579d4cdec5ccbc3aa083"}],"zuul_operator/utils.py":[{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"209787a9912fde0ffb5130f736c1b755e684a4fe","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def pod_exec(namespace, name, command):"},{"line_number":85,"context_line":"    kubernetes.config.incluster_config.load_incluster_config()"},{"line_number":86,"context_line":"    try:"},{"line_number":87,"context_line":"        c \u003d Configuration().get_default_copy()"},{"line_number":88,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fadab43a_1f20d52a","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":62},"updated":"2025-07-10 07:01:07.000000000","message":"Also see https://review.opendev.org/c/zuul/zuul-operator/+/861279","commit_id":"bc2895377b095676b5a27d8f1b0d2c0107e1388c"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def pod_exec(namespace, name, command):"},{"line_number":85,"context_line":"    kubernetes.config.incluster_config.load_incluster_config()"},{"line_number":86,"context_line":"    try:"},{"line_number":87,"context_line":"        c \u003d Configuration().get_default_copy()"},{"line_number":88,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"6d42b938_398a9be1","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":62},"in_reply_to":"fadab43a_1f20d52a","updated":"2025-07-11 15:17:51.000000000","message":"Done","commit_id":"bc2895377b095676b5a27d8f1b0d2c0107e1388c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"29c30d3d61d20cb09faf83c1b59a323f461ef034","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def pod_exec(namespace, name, command):"},{"line_number":85,"context_line":"    kubernetes.config.incluster_config.load_incluster_config()"},{"line_number":86,"context_line":"    try:"},{"line_number":87,"context_line":"        c \u003d Configuration().get_default_copy()"},{"line_number":88,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ca73ac9e_c1d59afb","line":85,"updated":"2025-07-10 13:27:55.000000000","message":"Changing this may break running outside the cluster, and the the operator is designed to run outside the cluster.","commit_id":"f7ae8734924ca840c7f6579d4cdec5ccbc3aa083"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"34e30cad3d3d1146a539a51f3df73c5ec3a2291f","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def pod_exec(namespace, name, command):"},{"line_number":85,"context_line":"    kubernetes.config.incluster_config.load_incluster_config()"},{"line_number":86,"context_line":"    try:"},{"line_number":87,"context_line":"        c \u003d Configuration().get_default_copy()"},{"line_number":88,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fc2e379e_351d7620","line":85,"in_reply_to":"ca73ac9e_c1d59afb","updated":"2025-07-10 13:36:55.000000000","message":"I\u0027m not that familiar with the idea of running outside the cluster, but we could try running both, or not running it at all - if it works in the other patchiest @github@jangutter.com mentioned.","commit_id":"f7ae8734924ca840c7f6579d4cdec5ccbc3aa083"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def pod_exec(namespace, name, command):"},{"line_number":85,"context_line":"    kubernetes.config.incluster_config.load_incluster_config()"},{"line_number":86,"context_line":"    try:"},{"line_number":87,"context_line":"        c \u003d Configuration().get_default_copy()"},{"line_number":88,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ddd1c44a_10da6438","line":85,"in_reply_to":"fc2e379e_351d7620","updated":"2025-07-11 15:17:51.000000000","message":"A later revision was confirmed not to break this.","commit_id":"f7ae8734924ca840c7f6579d4cdec5ccbc3aa083"}],"zuul_operator/zuul.py":[{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"25f0c3787cb5e75465170219ddc27dd17cf193ee","unresolved":true,"context_lines":[{"line_number":409,"context_line":"        }"},{"line_number":410,"context_line":"        utils.apply_file(self.api, \u0027zuul.yaml\u0027, namespace\u003dself.namespace, **kw)"},{"line_number":411,"context_line":"        self.create_nodepool()"},{"line_number":412,"context_line":"        self.smart_reconfigure()"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def smart_reconfigure(self):"},{"line_number":415,"context_line":"        self.log.info(\"Smart reconfigure\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"8c57c7a6_29169362","line":412,"range":{"start_line":412,"start_character":8,"end_line":412,"end_character":32},"updated":"2025-07-10 00:18:15.000000000","message":"I _think_ this is too early. When zuul bootstraps first time, it doesn\u0027t need to do smart-reconfigure. At this point, the container isn\u0027t running yet.","commit_id":"4e6519d116084bc18d962040e228ecb805533b50"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        }"},{"line_number":410,"context_line":"        utils.apply_file(self.api, \u0027zuul.yaml\u0027, namespace\u003dself.namespace, **kw)"},{"line_number":411,"context_line":"        self.create_nodepool()"},{"line_number":412,"context_line":"        self.smart_reconfigure()"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"    def smart_reconfigure(self):"},{"line_number":415,"context_line":"        self.log.info(\"Smart reconfigure\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"ea07c83b_f4d19e48","line":412,"range":{"start_line":412,"start_character":8,"end_line":412,"end_character":32},"in_reply_to":"8c57c7a6_29169362","updated":"2025-07-11 15:17:51.000000000","message":"Done","commit_id":"4e6519d116084bc18d962040e228ecb805533b50"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"25f0c3787cb5e75465170219ddc27dd17cf193ee","unresolved":true,"context_lines":[{"line_number":436,"context_line":"            self.log.info(\"Waiting for config to update on %s\","},{"line_number":437,"context_line":"                          obj.name)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"            delay \u003d 10"},{"line_number":440,"context_line":"            retries \u003d 60"},{"line_number":441,"context_line":"            timeout \u003d delay * retries"},{"line_number":442,"context_line":"            command \u003d ["}],"source_content_type":"text/x-python","patch_set":4,"id":"a82b665c_f8d99a8d","line":439,"range":{"start_line":439,"start_character":12,"end_line":439,"end_character":22},"updated":"2025-07-10 00:18:15.000000000","message":"it\u0027s possible we might just need to poll until the container is running here. The errors from the previous run is because the pod\u0027s still getting created.","commit_id":"0c7782ce90d1711c3b7d86e0340311d13ecbb4b4"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":436,"context_line":"            self.log.info(\"Waiting for config to update on %s\","},{"line_number":437,"context_line":"                          obj.name)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"            delay \u003d 10"},{"line_number":440,"context_line":"            retries \u003d 60"},{"line_number":441,"context_line":"            timeout \u003d delay * retries"},{"line_number":442,"context_line":"            command \u003d ["}],"source_content_type":"text/x-python","patch_set":4,"id":"6e6cfd24_5c77e15c","line":439,"range":{"start_line":439,"start_character":12,"end_line":439,"end_character":22},"in_reply_to":"57524015_d66940a3","updated":"2025-07-11 15:17:51.000000000","message":"Done","commit_id":"0c7782ce90d1711c3b7d86e0340311d13ecbb4b4"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"6b00039097ed440515007e5b3434ba629213f5c6","unresolved":true,"context_lines":[{"line_number":436,"context_line":"            self.log.info(\"Waiting for config to update on %s\","},{"line_number":437,"context_line":"                          obj.name)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"            delay \u003d 10"},{"line_number":440,"context_line":"            retries \u003d 60"},{"line_number":441,"context_line":"            timeout \u003d delay * retries"},{"line_number":442,"context_line":"            command \u003d ["}],"source_content_type":"text/x-python","patch_set":4,"id":"57524015_d66940a3","line":439,"range":{"start_line":439,"start_character":12,"end_line":439,"end_character":22},"in_reply_to":"a82b665c_f8d99a8d","updated":"2025-07-10 07:56:58.000000000","message":"And even worse, this might get called at the point where new pods are getting rolled out: so we are execing into a pod scheduled for deletion. The check gets terminated before either the config map is updated or the timeout is reached.\n\nThe clue is in the timings - we get a very quick response saying \"Tenant config file never updated\".\n\nAnother caution - if the pod is scheduled for deletion and we kick off smart-reconfigure, it could be deleted while it\u0027s still in progress, so it never completes.","commit_id":"0c7782ce90d1711c3b7d86e0340311d13ecbb4b4"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"5c76a1101218191df546d8e42d066cf86f012eaf","unresolved":true,"context_lines":[{"line_number":427,"context_line":"                spec[\u0027replicas\u0027] \u003d\u003d status.get(\u0027currentReplicas\u0027, None) and"},{"line_number":428,"context_line":"                spec[\u0027replicas\u0027] \u003d\u003d status.get(\u0027readyReplicas\u0027, None) and"},{"line_number":429,"context_line":"                (status.get(\u0027updateRevision\u0027, None) \u003d\u003d"},{"line_number":430,"context_line":"                 status(\u0027currentRevision\u0027, None))):"},{"line_number":431,"context_line":"                self.log.info(\"StatefulSet %s completed rollout\", set_name)"},{"line_number":432,"context_line":"                break"},{"line_number":433,"context_line":"            time.sleep(delay)"}],"source_content_type":"text/x-python","patch_set":11,"id":"4b8fd297_4fa641bb","line":430,"range":{"start_line":430,"start_character":23,"end_line":430,"end_character":24},"updated":"2025-07-10 15:08:26.000000000","message":"note to self: missing something obvious here!","commit_id":"f41780036f0d2173d608fe651ea98e17ef610860"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"590e354fb7f0dc6d732a03b74fea717573f43e87","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                spec[\u0027replicas\u0027] \u003d\u003d status.get(\u0027currentReplicas\u0027, None) and"},{"line_number":428,"context_line":"                spec[\u0027replicas\u0027] \u003d\u003d status.get(\u0027readyReplicas\u0027, None) and"},{"line_number":429,"context_line":"                (status.get(\u0027updateRevision\u0027, None) \u003d\u003d"},{"line_number":430,"context_line":"                 status(\u0027currentRevision\u0027, None))):"},{"line_number":431,"context_line":"                self.log.info(\"StatefulSet %s completed rollout\", set_name)"},{"line_number":432,"context_line":"                break"},{"line_number":433,"context_line":"            time.sleep(delay)"}],"source_content_type":"text/x-python","patch_set":11,"id":"e3e42b7e_563f401b","line":430,"range":{"start_line":430,"start_character":23,"end_line":430,"end_character":24},"in_reply_to":"4b8fd297_4fa641bb","updated":"2025-07-11 15:17:51.000000000","message":"Done","commit_id":"f41780036f0d2173d608fe651ea98e17ef610860"}]}
