11
11
12
12
from charms .data_platform_libs .v0 .data_interfaces import (
13
13
DatabaseProvides ,
14
+ DatabaseRequestedEvent ,
14
15
DatabaseRequires ,
15
16
)
16
17
from charms .mongodb .v1 .mongos import MongosConnection
17
- from ops .charm import CharmBase , EventBase , RelationBrokenEvent
18
+ from ops .charm import CharmBase , EventBase , RelationBrokenEvent , RelationChangedEvent
18
19
from ops .framework import Object
19
20
from ops .model import (
20
21
ActiveStatus ,
42
43
43
44
# Increment this PATCH version before using `charmcraft publish-lib` or reset
44
45
# to 0 if you are raising the major API version
45
- LIBPATCH = 9
46
+ LIBPATCH = 12
46
47
47
48
48
49
class ClusterProvider (Object ):
@@ -57,6 +58,9 @@ def __init__(
57
58
self .database_provides = DatabaseProvides (self .charm , relation_name = self .relation_name )
58
59
59
60
super ().__init__ (charm , self .relation_name )
61
+ self .framework .observe (
62
+ self .database_provides .on .database_requested , self ._on_database_requested
63
+ )
60
64
self .framework .observe (
61
65
charm .on [self .relation_name ].relation_changed , self ._on_relation_changed
62
66
)
@@ -105,8 +109,14 @@ def is_valid_mongos_integration(self) -> bool:
105
109
106
110
return True
107
111
108
- def _on_relation_changed (self , event ) -> None :
109
- """Handles providing mongos with KeyFile and hosts."""
112
+ def _on_database_requested (self , event : DatabaseRequestedEvent | RelationChangedEvent ) -> None :
113
+ """Handles the database requested event.
114
+
115
+ The first time secrets are written to relations should be on this event.
116
+
117
+ Note: If secrets are written for the first time on other events we risk
118
+ the chance of writing secrets in plain sight.
119
+ """
110
120
if not self .pass_hook_checks (event ):
111
121
if not self .is_valid_mongos_integration ():
112
122
self .charm .status .set_and_share_status (
@@ -116,12 +126,9 @@ def _on_relation_changed(self, event) -> None:
116
126
)
117
127
logger .info ("Skipping relation joined event: hook checks did not pass" )
118
128
return
119
-
120
129
config_server_db = self .generate_config_server_db ()
121
-
122
130
# create user and set secrets for mongos relation
123
131
self .charm .client_relations .oversee_users (None , None )
124
-
125
132
relation_data = {
126
133
KEYFILE_KEY : self .charm .get_secret (
127
134
Config .Relations .APP_SCOPE , Config .Secrets .SECRET_KEYFILE_NAME
@@ -135,9 +142,20 @@ def _on_relation_changed(self, event) -> None:
135
142
)
136
143
if int_tls_ca :
137
144
relation_data [INT_TLS_CA_KEY ] = int_tls_ca
138
-
139
145
self .database_provides .update_relation_data (event .relation .id , relation_data )
140
146
147
+ def _on_relation_changed (self , event : RelationChangedEvent ) -> None :
148
+ """Handles providing mongos with KeyFile and hosts."""
149
+ # First we need to ensure that the database requested event has run
150
+ # otherwise we risk the chance of writing secrets in plain sight.
151
+ if not self .database_provides .fetch_relation_field (event .relation .id , "database" ):
152
+ logger .info ("Database Requested has not run yet, skipping." )
153
+ event .defer ()
154
+ return
155
+
156
+ # TODO : This workflow is a fix until we have time for a better and complete fix (DPE-5513)
157
+ self ._on_database_requested (event )
158
+
141
159
def _on_relation_broken (self , event ) -> None :
142
160
if self .charm .upgrade_in_progress :
143
161
logger .warning (
@@ -328,6 +346,8 @@ def _on_relation_broken(self, event: RelationBrokenEvent) -> None:
328
346
# K8s charm have a 1:Many client scheme and share connection info in a different manner.
329
347
if self .substrate == Config .Substrate .VM :
330
348
self .charm .remove_connection_info ()
349
+ else :
350
+ self .db_initialised = False
331
351
332
352
# BEGIN: helper functions
333
353
def pass_hook_checks (self , event ):
@@ -371,7 +391,7 @@ def is_mongos_running(self) -> bool:
371
391
connection_uri = f"mongodb://{ self .charm .get_mongos_host ()} "
372
392
373
393
# use the mongos port for k8s charms and external connections on VM
374
- if self .charm . is_external_client or self . substrate == Config .K8S_SUBSTRATE :
394
+ if self .substrate == Config .Substrate . K8S or self . charm . is_external_client :
375
395
connection_uri = connection_uri + f":{ Config .MONGOS_PORT } "
376
396
377
397
with MongosConnection (None , connection_uri ) as mongo :
0 commit comments