-class RelationDefinition:
- def __init__(self, relation_name: str, keys: List, source_type):
- if source_type != Application and source_type != Unit:
- raise TypeError(
- "source_type should be ops.model.Application or ops.model.Unit"
- )
- self.relation_name = relation_name
- self.keys = keys
- self.source_type = source_type
-
-
-def check_missing_relation_data(
- data: Dict,
- expected_relations_data: List[RelationDefinition],
-):
- missing_relations = []
- for relation_data in expected_relations_data:
- if not all(
- f"{relation_data.relation_name}_{k}" in data for k in relation_data.keys
- ):
- missing_relations.append(relation_data.relation_name)
- if missing_relations:
- raise RelationsMissing(missing_relations)
-
-
-def get_relation_data(
- charm: CharmBase,
- relation_data: RelationDefinition,
-) -> Dict:
- data = {}
- relation = charm.model.get_relation(relation_data.relation_name)
- if relation:
- self_app_unit = (
- charm.app if relation_data.source_type == Application else charm.unit
- )
- expected_type = relation_data.source_type
- for app_unit in relation.data:
- if app_unit != self_app_unit and isinstance(app_unit, expected_type):
- if all(k in relation.data[app_unit] for k in relation_data.keys):
- for k in relation_data.keys:
- data[f"{relation_data.relation_name}_{k}"] = relation.data[
- app_unit
- ].get(k)
- break
- return data
-
+ @validator("site_url")
+ def validate_site_url(cls, v):
+ if v:
+ parsed = urlparse(v)
+ if not parsed.scheme.startswith("http"):
+ raise ValueError("value must start with http")
+ return v