@@ -331,7 +331,7 @@ def _on_topic_requested(self, event: TopicRequestedEvent):
331331
332332# Increment this PATCH version before using `charmcraft publish-lib` or reset
333333# to 0 if you are raising the major API version
334- LIBPATCH = 34
334+ LIBPATCH = 38
335335
336336PYDEPS = ["ops>=2.0.0" ]
337337
@@ -642,22 +642,26 @@ def _move_to_new_label_if_needed(self):
642642 return
643643
644644 # Create a new secret with the new label
645- old_meta = self ._secret_meta
646645 content = self ._secret_meta .get_content ()
646+ self ._secret_uri = None
647647
648648 # I wish we could just check if we are the owners of the secret...
649649 try :
650650 self ._secret_meta = self .add_secret (content , label = self .label )
651651 except ModelError as err :
652652 if "this unit is not the leader" not in str (err ):
653653 raise
654- old_meta . remove_all_revisions ()
654+ self . current_label = None
655655
656656 def set_content (self , content : Dict [str , str ]) -> None :
657657 """Setting cached secret content."""
658658 if not self .meta :
659659 return
660660
661+ # DPE-4182: do not create new revision if the content stay the same
662+ if content == self .get_content ():
663+ return
664+
661665 if content :
662666 self ._move_to_new_label_if_needed ()
663667 self .meta .set_content (content )
@@ -1586,7 +1590,7 @@ def _register_secret_to_relation(
15861590 """
15871591 label = self ._generate_secret_label (relation_name , relation_id , group )
15881592
1589- # Fetchin the Secret's meta information ensuring that it's locally getting registered with
1593+ # Fetching the Secret's meta information ensuring that it's locally getting registered with
15901594 CachedSecret (self ._model , self .component , label , secret_id ).meta
15911595
15921596 def _register_secrets_to_relation (self , relation : Relation , params_name_list : List [str ]):
@@ -2309,7 +2313,7 @@ def _secrets(self) -> dict:
23092313 return self ._cached_secrets
23102314
23112315 def _get_secret (self , group ) -> Optional [Dict [str , str ]]:
2312- """Retrieveing secrets."""
2316+ """Retrieving secrets."""
23132317 if not self .app :
23142318 return
23152319 if not self ._secrets .get (group ):
@@ -2602,6 +2606,14 @@ def set_version(self, relation_id: int, version: str) -> None:
26022606 """
26032607 self .update_relation_data (relation_id , {"version" : version })
26042608
2609+ def set_subordinated (self , relation_id : int ) -> None :
2610+ """Raises the subordinated flag in the application relation databag.
2611+
2612+ Args:
2613+ relation_id: the identifier for a particular relation.
2614+ """
2615+ self .update_relation_data (relation_id , {"subordinated" : "true" })
2616+
26052617
26062618class DatabaseProviderEventHandlers (EventHandlers ):
26072619 """Provider-side of the database relation handlers."""
@@ -2838,6 +2850,21 @@ def _on_relation_created_event(self, event: RelationCreatedEvent) -> None:
28382850
28392851 def _on_relation_changed_event (self , event : RelationChangedEvent ) -> None :
28402852 """Event emitted when the database relation has changed."""
2853+ is_subordinate = False
2854+ remote_unit_data = None
2855+ for key in event .relation .data .keys ():
2856+ if isinstance (key , Unit ) and not key .name .startswith (self .charm .app .name ):
2857+ remote_unit_data = event .relation .data [key ]
2858+ elif isinstance (key , Application ) and key .name != self .charm .app .name :
2859+ is_subordinate = event .relation .data [key ].get ("subordinated" ) == "true"
2860+
2861+ if is_subordinate :
2862+ if not remote_unit_data :
2863+ return
2864+
2865+ if remote_unit_data .get ("state" ) != "ready" :
2866+ return
2867+
28412868 # Check which data has changed to emit customs events.
28422869 diff = self ._diff (event )
28432870
@@ -3016,7 +3043,7 @@ class KafkaRequiresEvents(CharmEvents):
30163043# Kafka Provides and Requires
30173044
30183045
3019- class KafkaProvidesData (ProviderData ):
3046+ class KafkaProviderData (ProviderData ):
30203047 """Provider-side of the Kafka relation."""
30213048
30223049 def __init__ (self , model : Model , relation_name : str ) -> None :
@@ -3059,12 +3086,12 @@ def set_zookeeper_uris(self, relation_id: int, zookeeper_uris: str) -> None:
30593086 self .update_relation_data (relation_id , {"zookeeper-uris" : zookeeper_uris })
30603087
30613088
3062- class KafkaProvidesEventHandlers (EventHandlers ):
3089+ class KafkaProviderEventHandlers (EventHandlers ):
30633090 """Provider-side of the Kafka relation."""
30643091
30653092 on = KafkaProvidesEvents () # pyright: ignore [reportAssignmentType]
30663093
3067- def __init__ (self , charm : CharmBase , relation_data : KafkaProvidesData ) -> None :
3094+ def __init__ (self , charm : CharmBase , relation_data : KafkaProviderData ) -> None :
30683095 super ().__init__ (charm , relation_data )
30693096 # Just to keep lint quiet, can't resolve inheritance. The same happened in super().__init__() above
30703097 self .relation_data = relation_data
@@ -3086,15 +3113,15 @@ def _on_relation_changed_event(self, event: RelationChangedEvent) -> None:
30863113 )
30873114
30883115
3089- class KafkaProvides (KafkaProvidesData , KafkaProvidesEventHandlers ):
3116+ class KafkaProvides (KafkaProviderData , KafkaProviderEventHandlers ):
30903117 """Provider-side of the Kafka relation."""
30913118
30923119 def __init__ (self , charm : CharmBase , relation_name : str ) -> None :
3093- KafkaProvidesData .__init__ (self , charm .model , relation_name )
3094- KafkaProvidesEventHandlers .__init__ (self , charm , self )
3120+ KafkaProviderData .__init__ (self , charm .model , relation_name )
3121+ KafkaProviderEventHandlers .__init__ (self , charm , self )
30953122
30963123
3097- class KafkaRequiresData (RequirerData ):
3124+ class KafkaRequirerData (RequirerData ):
30983125 """Requirer-side of the Kafka relation."""
30993126
31003127 def __init__ (
@@ -3124,12 +3151,12 @@ def topic(self, value):
31243151 self ._topic = value
31253152
31263153
3127- class KafkaRequiresEventHandlers (RequirerEventHandlers ):
3154+ class KafkaRequirerEventHandlers (RequirerEventHandlers ):
31283155 """Requires-side of the Kafka relation."""
31293156
31303157 on = KafkaRequiresEvents () # pyright: ignore [reportAssignmentType]
31313158
3132- def __init__ (self , charm : CharmBase , relation_data : KafkaRequiresData ) -> None :
3159+ def __init__ (self , charm : CharmBase , relation_data : KafkaRequirerData ) -> None :
31333160 super ().__init__ (charm , relation_data )
31343161 # Just to keep lint quiet, can't resolve inheritance. The same happened in super().__init__() above
31353162 self .relation_data = relation_data
@@ -3142,10 +3169,13 @@ def _on_relation_created_event(self, event: RelationCreatedEvent) -> None:
31423169 return
31433170
31443171 # Sets topic, extra user roles, and "consumer-group-prefix" in the relation
3145- relation_data = {
3146- f : getattr (self , f .replace ("-" , "_" ), "" )
3147- for f in ["consumer-group-prefix" , "extra-user-roles" , "topic" ]
3148- }
3172+ relation_data = {"topic" : self .relation_data .topic }
3173+
3174+ if self .relation_data .extra_user_roles :
3175+ relation_data ["extra-user-roles" ] = self .relation_data .extra_user_roles
3176+
3177+ if self .relation_data .consumer_group_prefix :
3178+ relation_data ["consumer-group-prefix" ] = self .relation_data .consumer_group_prefix
31493179
31503180 self .relation_data .update_relation_data (event .relation .id , relation_data )
31513181
@@ -3188,7 +3218,7 @@ def _on_relation_changed_event(self, event: RelationChangedEvent) -> None:
31883218 return
31893219
31903220
3191- class KafkaRequires (KafkaRequiresData , KafkaRequiresEventHandlers ):
3221+ class KafkaRequires (KafkaRequirerData , KafkaRequirerEventHandlers ):
31923222 """Provider-side of the Kafka relation."""
31933223
31943224 def __init__ (
@@ -3200,7 +3230,7 @@ def __init__(
32003230 consumer_group_prefix : Optional [str ] = None ,
32013231 additional_secret_fields : Optional [List [str ]] = [],
32023232 ) -> None :
3203- KafkaRequiresData .__init__ (
3233+ KafkaRequirerData .__init__ (
32043234 self ,
32053235 charm .model ,
32063236 relation_name ,
@@ -3209,7 +3239,7 @@ def __init__(
32093239 consumer_group_prefix ,
32103240 additional_secret_fields ,
32113241 )
3212- KafkaRequiresEventHandlers .__init__ (self , charm , self )
3242+ KafkaRequirerEventHandlers .__init__ (self , charm , self )
32133243
32143244
32153245# Opensearch related events
0 commit comments