1
- # Copyright 2023 Canonical Ltd.
1
+ # Copyright 2024 Canonical Ltd.
2
2
# See LICENSE file for licensing details.
3
3
4
4
"""Relation to TLS certificate provider"""
17
17
import relations .secrets
18
18
19
19
if typing .TYPE_CHECKING :
20
- import charm
20
+ import abstract_charm
21
21
22
22
logger = logging .getLogger (__name__ )
23
23
24
- _PEER_RELATION_ENDPOINT_NAME = "mysql-router-peers "
24
+ _PEER_RELATION_ENDPOINT_NAME = "tls "
25
25
26
26
_TLS_REQUESTED_CSR = "tls-requested-csr"
27
27
_TLS_ACTIVE_CSR = "tls-active-csr"
@@ -48,7 +48,7 @@ def _generate_private_key() -> str:
48
48
class _Relation :
49
49
"""Relation to TLS certificate provider"""
50
50
51
- _charm : "charm.KubernetesRouterCharm "
51
+ _charm : "abstract_charm.MySQLRouterCharm "
52
52
_interface : tls_certificates .TLSCertificatesRequiresV2
53
53
_secrets : relations .secrets .RelationSecrets
54
54
@@ -110,56 +110,35 @@ def save_certificate(self, event: tls_certificates.CertificateAvailableEvent) ->
110
110
logger .debug (f"Saved TLS certificate { event = } " )
111
111
self ._charm .reconcile (event = None )
112
112
113
- def _generate_csr (self , key : bytes ) -> bytes :
113
+ def _generate_csr (self , * , event , key : bytes ) -> bytes :
114
114
"""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 ()
118
115
return tls_certificates .generate_csr (
119
116
private_key = key ,
120
117
# X.509 CommonName has a limit of 64 characters
121
118
# (https://github.com/pyca/cryptography/issues/10553)
122
119
subject = socket .getfqdn ()[:64 ],
123
120
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 ),
144
123
)
145
124
146
- def request_certificate_creation (self ):
125
+ def request_certificate_creation (self , * , event ):
147
126
"""Request new TLS certificate from related provider charm."""
148
127
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" ))
150
129
self ._interface .request_certificate_creation (certificate_signing_request = csr )
151
130
self ._secrets .set_value (
152
131
relations .secrets .UNIT_SCOPE , _TLS_REQUESTED_CSR , csr .decode ("utf-8" )
153
132
)
154
133
logger .debug ("Requested TLS certificate creation" )
155
134
156
- def request_certificate_renewal (self ):
135
+ def request_certificate_renewal (self , * , event ):
157
136
"""Request TLS certificate renewal from related provider charm."""
158
137
logger .debug ("Requesting TLS certificate renewal" )
159
138
old_csr = self ._secrets .get_value (relations .secrets .UNIT_SCOPE , _TLS_ACTIVE_CSR ).encode (
160
139
"utf-8"
161
140
)
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" ))
163
142
self ._interface .request_certificate_renewal (
164
143
old_certificate_signing_request = old_csr , new_certificate_signing_request = new_csr
165
144
)
@@ -174,13 +153,15 @@ class RelationEndpoint(ops.Object):
174
153
175
154
NAME = "certificates"
176
155
177
- def __init__ (self , charm_ : "charm.KubernetesRouterCharm " ) -> None :
156
+ def __init__ (self , charm_ : "abstract_charm.MySQLRouterCharm " ) -> None :
178
157
super ().__init__ (charm_ , self .NAME )
179
158
self ._charm = charm_
180
159
self ._interface = tls_certificates .TLSCertificatesRequiresV2 (self ._charm , self .NAME )
181
160
182
161
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 ],
184
165
)
185
166
186
167
self .framework .observe (
@@ -269,7 +250,7 @@ def _on_set_tls_private_key(self, event: ops.ActionEvent) -> None:
269
250
logger .debug ("No TLS certificate relation active. Skipped certificate request" )
270
251
else :
271
252
try :
272
- self ._relation .request_certificate_creation ()
253
+ self ._relation .request_certificate_creation (event = event )
273
254
except Exception as e :
274
255
event .fail (f"Failed to request certificate: { e } " )
275
256
logger .exception (
@@ -278,9 +259,9 @@ def _on_set_tls_private_key(self, event: ops.ActionEvent) -> None:
278
259
raise
279
260
logger .debug ("Handled set TLS private key action" )
280
261
281
- def _on_tls_relation_created (self , _ ) -> None :
262
+ def _on_tls_relation_created (self , event ) -> None :
282
263
"""Request certificate when TLS relation created."""
283
- self ._relation .request_certificate_creation ()
264
+ self ._relation .request_certificate_creation (event = event )
284
265
285
266
def _on_tls_relation_broken (self , _ ) -> None :
286
267
"""Delete TLS certificate."""
@@ -300,4 +281,4 @@ def _on_certificate_expiring(self, event: tls_certificates.CertificateExpiringEv
300
281
logger .warning ("Unknown certificate expiring" )
301
282
return
302
283
303
- self ._relation .request_certificate_renewal ()
284
+ self ._relation .request_certificate_renewal (event = event )
0 commit comments