Skip to content

Commit d12515f

Browse files
committed
Use peer addrs directly
1 parent 03e5031 commit d12515f

File tree

3 files changed

+45
-47
lines changed

3 files changed

+45
-47
lines changed

.github/workflows/ci.yaml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,16 @@ jobs:
3636
steps:
3737
- name: Checkout
3838
uses: actions/checkout@v4
39-
# - name: Install tox & poetry
40-
# run: |
41-
# pipx install tox
42-
# pipx install poetry
43-
# - name: Run tests
44-
# run: tox run -e unit
45-
# - name: Upload Coverage to Codecov
46-
# uses: codecov/codecov-action@v5
47-
# env:
48-
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
39+
- name: Install tox & poetry
40+
run: |
41+
pipx install tox
42+
pipx install poetry
43+
- name: Run tests
44+
run: tox run -e unit
45+
- name: Upload Coverage to Codecov
46+
uses: codecov/codecov-action@v5
47+
env:
48+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
4949

5050
build:
5151
name: Build charm

src/charm.py

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -618,16 +618,6 @@ def primary_endpoint(self) -> str | None:
618618
else:
619619
return primary_endpoint
620620

621-
def get_hostname_by_unit(self, _) -> str:
622-
"""Create a DNS name for a PostgreSQL unit.
623-
624-
Returns:
625-
A string representing the hostname of the PostgreSQL unit.
626-
"""
627-
# For now, as there is no DNS hostnames on VMs, and it would also depend on
628-
# the underlying provider (LXD, MAAS, etc.), the unit IP is returned.
629-
return self._unit_ip
630-
631621
def _on_get_primary(self, event: ActionEvent) -> None:
632622
"""Get primary instance."""
633623
try:
@@ -1011,7 +1001,7 @@ def _update_member_ip(self) -> bool:
10111001
# hook, the configuration is updated and the service is started - or only
10121002
# reloaded in the other units).
10131003
stored_ip = self.unit_peer_data.get("ip")
1014-
current_ip = self.get_hostname_by_unit(None)
1004+
current_ip = self._unit_ip
10151005
if stored_ip is None:
10161006
self.unit_peer_data.update({"ip": current_ip})
10171007
return False
@@ -1584,7 +1574,7 @@ def _on_start(self, event: StartEvent) -> None:
15841574
if not self.get_secret(UNIT_SCOPE, "internal-cert"):
15851575
self.tls.generate_internal_peer_cert()
15861576

1587-
self.unit_peer_data.update({"ip": self.get_hostname_by_unit(None)})
1577+
self.unit_peer_data.update({"ip": self._unit_ip})
15881578

15891579
# Open port
15901580
try:
@@ -1980,10 +1970,6 @@ def _can_run_on_update_status(self) -> bool:
19801970
logger.debug("on_update_status early exit: Unit is in Blocked status")
19811971
return False
19821972

1983-
# Don't update this member before it's part of the members list.
1984-
if self._unit_ip not in self.members_ips:
1985-
logger.debug("on_update_status early exit: Unit not in the members list")
1986-
return False
19871973
return True
19881974

19891975
def _handle_processes_failures(self) -> bool:
@@ -2334,6 +2320,7 @@ def update_config(
23342320
logger.debug(
23352321
"Early exit update_config: patroni not responding but TLS is enabled."
23362322
)
2323+
self._handle_postgresql_restart_need()
23372324
return True
23382325
logger.debug("Early exit update_config: Patroni not started yet")
23392326
return False

src/relations/tls.py

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,36 +49,47 @@ class TLS(Object):
4949

5050
refresh_tls_certificates_event = EventSource(RefreshTLSCertificatesEvent)
5151

52+
def _get_client_addrs(self):
53+
client_addrs = {
54+
self.charm.unit_peer_data.get("database-address"),
55+
}
56+
client_addrs -= {None}
57+
return client_addrs
58+
59+
def _get_peer_addrs(self):
60+
peer_addrs = {
61+
self.charm.unit_peer_data.get("database-peers-address"),
62+
self.charm.unit_peer_data.get("replication-address"),
63+
self.charm.unit_peer_data.get("replication-offer-address"),
64+
self.charm.unit_peer_data.get("private-address"),
65+
}
66+
peer_addrs -= {None}
67+
return peer_addrs
68+
69+
def _get_common_name(self):
70+
return self.charm.unit_peer_data.get("database-address") or self.host
71+
5272
def __init__(self, charm: "PostgresqlOperatorCharm", peer_relation: str):
5373
super().__init__(charm, "client-relations")
5474
self.charm = charm
5575
self.peer_relation = peer_relation
5676
unit_id = self.charm.unit.name.split("/")[1]
5777
self.host = f"{self.charm.app.name}-{unit_id}"
5878
if self.charm.unit_peer_data:
59-
self.common_name = self.charm.unit_peer_data.get("database-address") or self.host
60-
client_addresses = {
61-
self.charm.unit_peer_data.get("database-address"),
62-
}
63-
self.peer_addresses = {
64-
self.charm.unit_peer_data.get("database-peers-address"),
65-
self.charm.unit_peer_data.get("replication-address"),
66-
self.charm.unit_peer_data.get("replication-offer-address"),
67-
self.charm.unit_peer_data.get("private-address"),
68-
}
69-
client_addresses -= {None}
70-
self.peer_addresses -= {None}
79+
common_name = self._get_common_name()
80+
client_addresses = self._get_client_addrs()
81+
peer_addresses = self._get_peer_addrs()
7182
else:
72-
self.common_name = self.host
83+
common_name = self.host
7384
client_addresses = set()
74-
self.peer_addresses = set()
85+
peer_addresses = set()
7586

7687
self.client_certificate = TLSCertificatesRequiresV4(
7788
self.charm,
7889
TLS_CLIENT_RELATION,
7990
certificate_requests=[
8091
CertificateRequestAttributes(
81-
common_name=self.common_name,
92+
common_name=common_name,
8293
sans_ip=frozenset(client_addresses),
8394
sans_dns=frozenset({
8495
self.host,
@@ -96,14 +107,14 @@ def __init__(self, charm: "PostgresqlOperatorCharm", peer_relation: str):
96107
TLS_PEER_RELATION,
97108
certificate_requests=[
98109
CertificateRequestAttributes(
99-
common_name=self.common_name,
100-
sans_ip=frozenset(self.peer_addresses),
110+
common_name=common_name,
111+
sans_ip=frozenset(self._get_peer_addrs()),
101112
sans_dns=frozenset({
102113
self.host,
103114
socket.getfqdn(),
104115
# IP address need to be part of the DNS SANs list due to
105116
# https://github.com/pgbackrest/pgbackrest/issues/1977.
106-
*self.peer_addresses,
117+
*peer_addresses,
107118
}),
108119
),
109120
],
@@ -219,14 +230,14 @@ def generate_internal_peer_cert(self) -> None:
219230
private_key = generate_private_key()
220231
csr = generate_csr(
221232
private_key,
222-
common_name=self.common_name,
223-
sans_ip=frozenset(self.peer_addresses),
233+
common_name=self._get_common_name(),
234+
sans_ip=frozenset(self._get_peer_addrs()),
224235
sans_dns=frozenset({
225236
self.host,
226237
socket.getfqdn(),
227238
# IP address need to be part of the DNS SANs list due to
228239
# https://github.com/pgbackrest/pgbackrest/issues/1977.
229-
*self.peer_addresses,
240+
*self._get_peer_addrs(),
230241
}),
231242
)
232243
cert = generate_certificate(csr, ca, ca_key, validity=timedelta(days=7300))

0 commit comments

Comments
 (0)