6565
6666LIBID = "b5cd5cd580f3428fa5f59a8876dcbe6a"
6767LIBAPI = 1
68- LIBPATCH = 5
68+ LIBPATCH = 6
6969
7070
7171def is_ip_address (value : str ) -> bool :
@@ -92,6 +92,10 @@ class CertHandler(Object):
9292
9393 on = CertHandlerEvents () # pyright: ignore
9494
95+ _ca_cert_chain_secret_label = "ca-certificate-chain"
96+ _csr_secret_id = "csr-secret-id"
97+ _privkey_secret_id = "private-key-secret-id"
98+
9599 def __init__ (
96100 self ,
97101 charm : CharmBase ,
@@ -199,7 +203,7 @@ def _generate_privkey(self):
199203 private_key = generate_private_key ()
200204 secret = self .charm .unit .add_secret ({"private-key" : private_key .decode ()})
201205 secret .grant (relation )
202- relation .data [self .charm .unit ]["private-key-secret-id" ] = secret .id # pyright: ignore
206+ relation .data [self .charm .unit ][self . _privkey_secret_id ] = secret .id # pyright: ignore
203207
204208 def _on_config_changed (self , _ ):
205209 relation = self .charm .model .get_relation (self .certificates_relation_name )
@@ -265,7 +269,7 @@ def _generate_csr(
265269
266270 if clear_cert :
267271 try :
268- secret = self .model .get_secret (label = "ca-certificate-chain" )
272+ secret = self .model .get_secret (label = self . _ca_cert_chain_secret_label )
269273 secret .remove_all_revisions ()
270274 except SecretNotFoundError :
271275 logger .debug ("Secret with label: 'ca-certificate-chain' not found" )
@@ -287,19 +291,22 @@ def _on_certificate_available(self, event: CertificateAvailableEvent) -> None:
287291 "chain" : event .chain_as_pem (),
288292 "csr" : event_csr ,
289293 }
294+ if not (relation := self .charm .model .get_relation (self .certificates_relation_name )):
295+ logger .error ("Relation %s not found" , self .certificates_relation_name )
296+ return
297+
298+ # if we have a secret from a previous certificates relation already, keep it and reuse it.
290299 try :
291- secret = self .model .get_secret (label = "ca-certificate-chain" )
300+ secret = self .model .get_secret (label = self ._ca_cert_chain_secret_label )
301+ secret .set_content (content )
292302 except SecretNotFoundError :
293- if not (
294- relation := self .charm .model .get_relation (self .certificates_relation_name )
295- ):
296- logger .error ("Relation %s not found" , self .certificates_relation_name )
297- return
303+ secret = self .charm .unit .add_secret (
304+ content , label = self ._ca_cert_chain_secret_label
305+ )
298306
299- secret = self .charm .unit .add_secret (content , label = "ca-certificate-chain" )
300- secret .grant (relation )
301- relation .data [self .charm .unit ]["secret-id" ] = secret .id # pyright: ignore
302- self .on .cert_changed .emit () # pyright: ignore
307+ secret .grant (relation )
308+ relation .data [self .charm .unit ]["secret-id" ] = secret .id # pyright: ignore
309+ self .on .cert_changed .emit () # pyright: ignore
303310
304311 def _retrieve_secret_id (self , secret_id_name : str ) -> Optional [str ]:
305312 if not (relation := self .charm .model .get_relation (self .certificates_relation_name )):
@@ -323,26 +330,26 @@ def _retrieve_from_secret(self, value: str, secret_id_name: str) -> Optional[str
323330 @property
324331 def private_key (self ) -> Optional [str ]:
325332 """Private key."""
326- return self ._retrieve_from_secret ("private-key" , "private-key-secret-id" )
333+ return self ._retrieve_from_secret ("private-key" , self . _privkey_secret_id )
327334
328335 @property
329336 def private_key_secret_id (self ) -> Optional [str ]:
330337 """ID of the Juju Secret for the Private key."""
331- return self ._retrieve_secret_id ("private-key-secret-id" )
338+ return self ._retrieve_secret_id (self . _privkey_secret_id )
332339
333340 @property
334341 def _csr (self ) -> Optional [str ]:
335- return self ._retrieve_from_secret ("csr" , "csr-secret-id" )
342+ return self ._retrieve_from_secret ("csr" , self . _csr_secret_id )
336343
337344 @_csr .setter
338345 def _csr (self , value : str ):
339346 if not (relation := self .charm .model .get_relation (self .certificates_relation_name )):
340347 return
341348
342- if not (secret_id := relation .data [self .charm .unit ].get ("csr-secret-id" , None )):
349+ if not (secret_id := relation .data [self .charm .unit ].get (self . _csr_secret_id , None )):
343350 secret = self .charm .unit .add_secret ({"csr" : value })
344351 secret .grant (relation )
345- relation .data [self .charm .unit ]["csr-secret-id" ] = secret .id # pyright: ignore
352+ relation .data [self .charm .unit ][self . _csr_secret_id ] = secret .id # pyright: ignore
346353 return
347354
348355 secret = self .model .get_secret (id = secret_id )
@@ -403,12 +410,12 @@ def _on_all_certificates_invalidated(self, _: AllCertificatesInvalidatedEvent) -
403410 self .on .cert_changed .emit () # pyright: ignore
404411
405412 def _on_certificates_relation_broken (self , _ : RelationBrokenEvent ) -> None :
406- """Clear the certificates data when removing the relation."""
413+ """Clear all secrets data when removing the relation."""
407414 try :
408- secret = self .model .get_secret (label = "csr-secret-id" )
415+ secret = self .model .get_secret (label = self . _ca_cert_chain_secret_label )
409416 secret .remove_all_revisions ()
410417 except SecretNotFoundError :
411- logger .debug ("Secret 'csr-scret-id ' not found" )
418+ logger .debug (f "Secret { self . _ca_cert_chain_secret_label !r } ' not found" )
412419 self .on .cert_changed .emit () # pyright: ignore
413420
414421 def _check_juju_supports_secrets (self ) -> None :
0 commit comments