1- # Copyright 2023 Canonical Ltd.
1+ # Copyright 2024 Canonical Ltd.
22# See LICENSE file for licensing details.
33
44"""Relation to TLS certificate provider"""
1717import relations .secrets
1818
1919if typing .TYPE_CHECKING :
20- import charm
20+ import abstract_charm
2121
2222logger = logging .getLogger (__name__ )
2323
24- _PEER_RELATION_ENDPOINT_NAME = "mysql-router-peers "
24+ _PEER_RELATION_ENDPOINT_NAME = "tls "
2525
2626_TLS_REQUESTED_CSR = "tls-requested-csr"
2727_TLS_ACTIVE_CSR = "tls-active-csr"
@@ -48,7 +48,7 @@ def _generate_private_key() -> str:
4848class _Relation :
4949 """Relation to TLS certificate provider"""
5050
51- _charm : "charm.KubernetesRouterCharm "
51+ _charm : "abstract_charm.MySQLRouterCharm "
5252 _interface : tls_certificates .TLSCertificatesRequiresV2
5353 _secrets : relations .secrets .RelationSecrets
5454
@@ -110,56 +110,35 @@ def save_certificate(self, event: tls_certificates.CertificateAvailableEvent) ->
110110 logger .debug (f"Saved TLS certificate { event = } " )
111111 self ._charm .reconcile (event = None )
112112
113- def _generate_csr (self , key : bytes ) -> bytes :
113+ def _generate_csr (self , * , event , key : bytes ) -> bytes :
114114 """Generate certificate signing request (CSR)."""
115- service_name = self ._charm .service_name
116- unit_name = self ._charm .unit .name .replace ("/" , "-" )
117- extra_hosts , extra_ips = self ._charm .get_all_k8s_node_hostnames_and_ips ()
118115 return tls_certificates .generate_csr (
119116 private_key = key ,
120117 # X.509 CommonName has a limit of 64 characters
121118 # (https://github.com/pyca/cryptography/issues/10553)
122119 subject = socket .getfqdn ()[:64 ],
123120 organization = self ._charm .app .name ,
124- sans_dns = [
125- socket .getfqdn (),
126- service_name ,
127- f"{ service_name } .{ self ._charm .model_service_domain } " ,
128- unit_name ,
129- f"{ unit_name } .{ self ._charm .app .name } -endpoints" ,
130- f"{ unit_name } .{ self ._charm .app .name } -endpoints.{ self ._charm .model_service_domain } " ,
131- self ._charm .app .name ,
132- f"{ self ._charm .app .name } .{ self ._charm .app .name } -endpoints" ,
133- f"{ self ._charm .app .name } .{ self ._charm .app .name } -endpoints.{ self ._charm .model_service_domain } "
134- f"{ self ._charm .app .name } -endpoints" ,
135- f"{ self ._charm .app .name } -endpoints.{ self ._charm .model_service_domain } " ,
136- f"{ self ._charm .app .name } .{ self ._charm .model_service_domain } " ,
137- * extra_hosts ,
138- ],
139- sans_ip = [
140- str (self ._charm .model .get_binding ("juju-info" ).network .bind_address ),
141- "127.0.0.1" ,
142- * extra_ips ,
143- ],
121+ sans_ip = self ._charm .tls_sans_ip (event = event ),
122+ sans_dns = self ._charm .tls_sans_dns (event = event ),
144123 )
145124
146- def request_certificate_creation (self ):
125+ def request_certificate_creation (self , * , event ):
147126 """Request new TLS certificate from related provider charm."""
148127 logger .debug ("Requesting TLS certificate creation" )
149- csr = self ._generate_csr (self .key .encode ("utf-8" ))
128+ csr = self ._generate_csr (event = event , key = self .key .encode ("utf-8" ))
150129 self ._interface .request_certificate_creation (certificate_signing_request = csr )
151130 self ._secrets .set_value (
152131 relations .secrets .UNIT_SCOPE , _TLS_REQUESTED_CSR , csr .decode ("utf-8" )
153132 )
154133 logger .debug ("Requested TLS certificate creation" )
155134
156- def request_certificate_renewal (self ):
135+ def request_certificate_renewal (self , * , event ):
157136 """Request TLS certificate renewal from related provider charm."""
158137 logger .debug ("Requesting TLS certificate renewal" )
159138 old_csr = self ._secrets .get_value (relations .secrets .UNIT_SCOPE , _TLS_ACTIVE_CSR ).encode (
160139 "utf-8"
161140 )
162- new_csr = self ._generate_csr (self .key .encode ("utf-8" ))
141+ new_csr = self ._generate_csr (event = event , key = self .key .encode ("utf-8" ))
163142 self ._interface .request_certificate_renewal (
164143 old_certificate_signing_request = old_csr , new_certificate_signing_request = new_csr
165144 )
@@ -174,13 +153,15 @@ class RelationEndpoint(ops.Object):
174153
175154 NAME = "certificates"
176155
177- def __init__ (self , charm_ : "charm.KubernetesRouterCharm " ) -> None :
156+ def __init__ (self , charm_ : "abstract_charm.MySQLRouterCharm " ) -> None :
178157 super ().__init__ (charm_ , self .NAME )
179158 self ._charm = charm_
180159 self ._interface = tls_certificates .TLSCertificatesRequiresV2 (self ._charm , self .NAME )
181160
182161 self ._secrets = relations .secrets .RelationSecrets (
183- charm_ , self ._interface .relationship_name , unit_secret_fields = [_TLS_PRIVATE_KEY ]
162+ charm_ ,
163+ _PEER_RELATION_ENDPOINT_NAME ,
164+ unit_secret_fields = [_TLS_PRIVATE_KEY ],
184165 )
185166
186167 self .framework .observe (
@@ -269,7 +250,7 @@ def _on_set_tls_private_key(self, event: ops.ActionEvent) -> None:
269250 logger .debug ("No TLS certificate relation active. Skipped certificate request" )
270251 else :
271252 try :
272- self ._relation .request_certificate_creation ()
253+ self ._relation .request_certificate_creation (event = event )
273254 except Exception as e :
274255 event .fail (f"Failed to request certificate: { e } " )
275256 logger .exception (
@@ -278,9 +259,9 @@ def _on_set_tls_private_key(self, event: ops.ActionEvent) -> None:
278259 raise
279260 logger .debug ("Handled set TLS private key action" )
280261
281- def _on_tls_relation_created (self , _ ) -> None :
262+ def _on_tls_relation_created (self , event ) -> None :
282263 """Request certificate when TLS relation created."""
283- self ._relation .request_certificate_creation ()
264+ self ._relation .request_certificate_creation (event = event )
284265
285266 def _on_tls_relation_broken (self , _ ) -> None :
286267 """Delete TLS certificate."""
@@ -300,4 +281,4 @@ def _on_certificate_expiring(self, event: tls_certificates.CertificateExpiringEv
300281 logger .warning ("Unknown certificate expiring" )
301282 return
302283
303- self ._relation .request_certificate_renewal ()
284+ self ._relation .request_certificate_renewal (event = event )
0 commit comments