@@ -104,6 +104,14 @@ def create_database_and_user(
104
104
) -> None :
105
105
"""Create database & user and update databag."""
106
106
username = self ._get_username (shell .username )
107
+ # Delete user if exists
108
+ # (If the user was previously created by this charm—but the hook failed—the user will
109
+ # persist in MySQL but will not persist in the databag. Therefore, we lose the user's
110
+ # password and need to re-create the user.)
111
+ logger .debug ("Deleting user if exists before creating user" )
112
+ shell .delete_user (username , must_exist = False )
113
+ logger .debug ("Deleted user if exists before creating user" )
114
+
107
115
password = shell .create_application_database_and_user (
108
116
username = username , database = self ._database
109
117
)
@@ -115,11 +123,11 @@ def create_database_and_user(
115
123
)
116
124
117
125
118
- class _UserNotCreated (Exception ):
126
+ class _UserNotShared (Exception ):
119
127
"""Database & user has not been provided to related application charm"""
120
128
121
129
122
- class _RelationWithCreatedUser (_Relation ):
130
+ class _RelationWithSharedUser (_Relation ):
123
131
"""Related application charm that has been provided with a database & user"""
124
132
125
133
def __init__ (
@@ -130,7 +138,7 @@ def __init__(
130
138
self ._local_databag = self ._interface .fetch_my_relation_data ([relation .id ])[relation .id ]
131
139
for key in ("database" , "username" , "password" , "endpoints" , "read-only-endpoints" ):
132
140
if key not in self ._local_databag :
133
- raise _UserNotCreated
141
+ raise _UserNotShared
134
142
135
143
def delete_databag (self ) -> None :
136
144
"""Remove connection information from databag."""
@@ -141,7 +149,10 @@ def delete_databag(self) -> None:
141
149
def delete_user (self , * , shell : mysql_shell .Shell ) -> None :
142
150
"""Delete user and update databag."""
143
151
self .delete_databag ()
144
- shell .delete_user (self ._get_username (shell .username ))
152
+ # Delete user if exists
153
+ # (If the user was previously deleted by this charm—but the hook failed—the user will be
154
+ # deleted in MySQL but will persist in the databag.)
155
+ shell .delete_user (self ._get_username (shell .username ), must_exist = False )
145
156
146
157
147
158
class RelationEndpoint :
@@ -157,16 +168,16 @@ def __init__(self, charm_: "abstract_charm.MySQLRouterCharm") -> None:
157
168
158
169
@property
159
170
# TODO python3.10 min version: Use `list` instead of `typing.List`
160
- def _created_users (self ) -> typing .List [_RelationWithCreatedUser ]:
161
- created_users = []
171
+ def _shared_users (self ) -> typing .List [_RelationWithSharedUser ]:
172
+ shared_users = []
162
173
for relation in self ._interface .relations :
163
174
try :
164
- created_users .append (
165
- _RelationWithCreatedUser (relation = relation , interface = self ._interface )
175
+ shared_users .append (
176
+ _RelationWithSharedUser (relation = relation , interface = self ._interface )
166
177
)
167
- except _UserNotCreated :
178
+ except _UserNotShared :
168
179
pass
169
- return created_users
180
+ return shared_users
170
181
171
182
def reconcile_users (
172
183
self ,
@@ -199,15 +210,15 @@ def reconcile_users(
199
210
_UnsupportedExtraUserRole ,
200
211
):
201
212
pass
202
- logger .debug (f"State of reconcile users { requested_users = } , { self ._created_users = } " )
213
+ logger .debug (f"State of reconcile users { requested_users = } , { self ._shared_users = } " )
203
214
for relation in requested_users :
204
- if relation not in self ._created_users :
215
+ if relation not in self ._shared_users :
205
216
relation .create_database_and_user (
206
217
router_read_write_endpoint = router_read_write_endpoint ,
207
218
router_read_only_endpoint = router_read_only_endpoint ,
208
219
shell = shell ,
209
220
)
210
- for relation in self ._created_users :
221
+ for relation in self ._shared_users :
211
222
if relation not in requested_users :
212
223
relation .delete_user (shell = shell )
213
224
logger .debug (
@@ -223,7 +234,7 @@ def delete_all_databags(self) -> None:
223
234
will need to be created.
224
235
"""
225
236
logger .debug ("Deleting all application databags" )
226
- for relation in self ._created_users :
237
+ for relation in self ._shared_users :
227
238
# MySQL charm will delete user; just delete databag
228
239
relation .delete_databag ()
229
240
logger .debug ("Deleted all application databags" )
0 commit comments