Skip to content

Commit 006d3cf

Browse files
chore: update charm libraries (#338)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent e6382a8 commit 006d3cf

1 file changed

Lines changed: 52 additions & 12 deletions

File tree

lib/charms/oauth2_proxy_k8s/v0/auth_proxy.py

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def _configure_auth_proxy(self):
6767
import logging
6868
import re
6969
from dataclasses import asdict, dataclass, field
70-
from typing import Dict, List, Mapping, Optional
70+
from typing import Any, Dict, List, Mapping, Optional
7171

7272
import jsonschema
7373
from 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

8787
RELATION_NAME = "auth-proxy"
8888
INTERFACE_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

397437
class InvalidAuthProxyConfigEvent(EventBase):
398438
"""Event to notify the charm that the auth proxy configuration is invalid."""

0 commit comments

Comments
 (0)