diff --git a/patroni/dcs/kubernetes.py b/patroni/dcs/kubernetes.py index 47ba4e7a..a88f4b23 100644 --- a/patroni/dcs/kubernetes.py +++ b/patroni/dcs/kubernetes.py @@ -1140,6 +1140,13 @@ class Kubernetes(AbstractDCS): """Unused""" raise NotImplementedError # pragma: no cover + def write_leader_optime(self, last_lsn: int) -> None: + """Write value for WAL LSN to ``optime`` annotation of the leader object. + + :param last_lsn: absolute WAL LSN in bytes. + """ + self.patch_or_create(self.leader_path, {self._OPTIME: str(last_lsn)}, patch=True, retry=False) + def _update_leader_with_retry(self, annotations: Dict[str, Any], resource_version: Optional[str], ips: List[str]) -> bool: retry = self._retry.copy() diff --git a/tests/test_kubernetes.py b/tests/test_kubernetes.py index c33bbecc..4f9f418c 100644 --- a/tests/test_kubernetes.py +++ b/tests/test_kubernetes.py @@ -436,6 +436,10 @@ class TestKubernetesEndpoints(BaseTestKubernetes): mock_logger_exception.assert_called_once() self.assertEqual(('create_config_service failed',), mock_logger_exception.call_args[0]) + @patch.object(k8s_client.CoreV1Api, 'patch_namespaced_endpoints', mock_namespaced_kind, create=True) + def test_write_leader_optime(self): + self.k.write_leader_optime(12345) + def mock_watch(*args): return urllib3.HTTPResponse()