diff --git a/lib/charms/data_platform_libs/v0/data_interfaces.py b/lib/charms/data_platform_libs/v0/data_interfaces.py index f4a65fdd..8d4e7bf3 100644 --- a/lib/charms/data_platform_libs/v0/data_interfaces.py +++ b/lib/charms/data_platform_libs/v0/data_interfaces.py @@ -458,7 +458,7 @@ def _on_subject_requested(self, event: SubjectRequestedEvent): # Increment this PATCH version before using `charmcraft publish-lib` or reset # to 0 if you are raising the major API version -LIBPATCH = 59 +LIBPATCH = 60 PYDEPS = ["ops>=2.0.0"] @@ -5422,6 +5422,8 @@ def __init__( extra_group_roles: Optional[str] = None, entity_type: Optional[str] = None, entity_permissions: Optional[str] = None, + requested_entity_name: Optional[str] = None, + requested_entity_password: Optional[str] = None, ): """Manager of OpenSearch client relations.""" super().__init__( @@ -5432,6 +5434,9 @@ def __init__( extra_group_roles, entity_type, entity_permissions, + None, + requested_entity_name, + requested_entity_password, ) self.index = index @@ -5466,6 +5471,18 @@ def _on_relation_created_event(self, event: RelationCreatedEvent) -> None: if self.relation_data.entity_permissions: data["entity-permissions"] = self.relation_data.entity_permissions + if self.relation_data.requested_entity_name: + content = {"entity-name": self.relation_data.requested_entity_name} + if self.relation_data.requested_entity_password: + content["password"] = self.relation_data.requested_entity_password + secret = self.charm.app.add_secret( + content, label=f"{self.model.uuid}-{event.relation.id}-requested-entity" + ) + secret.grant(event.relation) + if not secret.id: + raise SecretError("Secret helper missing Id") + data["requested-entity-secret"] = secret.id + self.relation_data.update_relation_data(event.relation.id, data) def _on_secret_changed_event(self, event: SecretChangedEvent): @@ -5545,6 +5562,17 @@ def _on_relation_changed_event(self, event: RelationChangedEvent) -> None: event.relation, app=event.app, unit=event.unit ) + if ( + self.relation_data.local_unit.is_leader() + and self.relation_data.requested_entity_name + and (secret_uri := app_databag.get("requested-entity-secret")) + ): + try: + secret = self.framework.model.get_secret(id=secret_uri) + secret.remove_all_revisions() + except ModelError: + logger.debug("Unable to remove helper secret") + # To avoid unnecessary application restarts do not trigger other events. return @@ -5574,6 +5602,8 @@ def __init__( extra_group_roles: Optional[str] = None, entity_type: Optional[str] = None, entity_permissions: Optional[str] = None, + requested_entity_name: Optional[str] = None, + requested_entity_password: Optional[str] = None, ) -> None: OpenSearchRequiresData.__init__( self, @@ -5585,6 +5615,8 @@ def __init__( extra_group_roles, entity_type, entity_permissions, + requested_entity_name, + requested_entity_password, ) OpenSearchRequiresEventHandlers.__init__(self, charm, self) diff --git a/tests/v0/integration/application-charm/src/charm.py b/tests/v0/integration/application-charm/src/charm.py index 94b5ce96..c9ad37b1 100755 --- a/tests/v0/integration/application-charm/src/charm.py +++ b/tests/v0/integration/application-charm/src/charm.py @@ -271,11 +271,14 @@ def __init__(self, *args): # OpenSearch events + _entity_name, _entity_password = self.requested_entities_secret_content self.opensearch = OpenSearchRequires( charm=self, relation_name="opensearch-client-index", index="test-index", extra_user_roles=EXTRA_USER_ROLES_OPENSEARCH, + requested_entity_name=_entity_name, + requested_entity_password=_entity_password, ) self.framework.observe(self.opensearch.on.index_created, self._on_opensearch_index_created) self.framework.observe(