@@ -67,7 +67,7 @@ def _configure_auth_proxy(self):
6767import logging
6868import re
6969from dataclasses import asdict , dataclass , field
70- from typing import Dict , List , Mapping , Optional
70+ from typing import Any , Dict , List , Mapping , Optional
7171
7272import jsonschema
7373from ops .charm import CharmBase , RelationBrokenEvent , RelationChangedEvent , RelationCreatedEvent
@@ -82,7 +82,7 @@ def _configure_auth_proxy(self):
8282
8383# Increment this PATCH version before using `charmcraft publish-lib` or reset
8484# to 0 if you are raising the major API version
85- LIBPATCH = 3
85+ LIBPATCH = 4
8686
8787RELATION_NAME = "auth-proxy"
8888INTERFACE_NAME = "auth_proxy"
@@ -377,22 +377,62 @@ def get_app_names(self) -> List[str]:
377377
378378 return app_names
379379
380+ def get_decoded_relations_data (self ) -> List [Dict ]:
381+ """Return decoded app databags for all auth-proxy relations.
382+ """
383+ decoded : List [Dict ] = []
384+ relations = self ._charm .model .relations .get (self ._relation_name , [])
385+
386+ for relation in relations :
387+ if relation .app is None :
388+ continue
389+
390+ if not (raw_data := relation .data .get (relation .app )):
391+ continue
392+
393+ try :
394+ decoded .append (_load_data (raw_data ))
395+ except DataValidationError :
396+ continue
397+
398+ return decoded
399+
400+ def _normalize_relation_value (self , key : str , value : Any ) -> Optional [List [str ]]:
401+ """Normalize a relation value into list[str], filtering empty values.
402+ """
403+ if value is None :
404+ return []
405+
406+ if isinstance (value , str ):
407+ values = [value ]
408+ elif isinstance (value , list ):
409+ values = value
410+ else :
411+ logger .error (
412+ "Invalid relation data for key '%s': expected list[str] or str, got %s" ,
413+ key ,
414+ type (value ).__name__ ,
415+ )
416+ return None
417+
418+ return [
419+ v .strip () for v in values
420+ if isinstance (v , str ) and v .strip ()
421+ ]
422+
380423 def get_relations_data (self , key : str ) -> Optional [List [str ]]:
381- """Returns a list of key values from all auth-proxy relations."""
424+ """Returns a list of key values from all auth-proxy relations or None.
425+ """
382426 if not self ._charm .model .relations [self ._relation_name ]:
383427 return None
384428
385- relations_data = set ()
386- for relation in self ._charm .model .relations [self ._relation_name ]:
387- if relation .data [relation .app ]:
388- if values := json .loads (relation .data [relation .app ][key ]):
389- for v in values :
390- relations_data .add (v )
391- else :
392- return None
429+ relations_data : set [str ] = set ()
393430
394- return list (relations_data )
431+ for data in self .get_decoded_relations_data ():
432+ if normalized := self ._normalize_relation_value (key , data .get (key )):
433+ relations_data .update (normalized )
395434
435+ return list (relations_data )
396436
397437class InvalidAuthProxyConfigEvent (EventBase ):
398438 """Event to notify the charm that the auth proxy configuration is invalid."""
0 commit comments