- super().__init__(*args)
- self.state.set_default(spec=None)
- self.state.set_default(kafka_host=None)
- self.state.set_default(kafka_port=None)
- self.state.set_default(mongodb_uri=None)
-
- # Observe Charm related events
- self.framework.observe(self.on.config_changed, self.on_config_changed)
- self.framework.observe(self.on.start, self.on_start)
- self.framework.observe(self.on.upgrade_charm, self.on_upgrade_charm)
-
- # Relations
- self.framework.observe(
- self.on.kafka_relation_changed, self.on_kafka_relation_changed
- )
- self.framework.observe(
- self.on.mongo_relation_changed, self.on_mongo_relation_changed
+ super().__init__(*args, oci_image="image")
+
+ self.kafka = KafkaRequires(self)
+ self.framework.observe(self.on.kafka_available, self.configure_pod)
+ self.framework.observe(self.on.kafka_broken, self.configure_pod)
+
+ self.mongodb_client = MongoClient(self, "mongodb")
+ self.framework.observe(self.on["mongodb"].relation_changed, self.configure_pod)
+ self.framework.observe(self.on["mongodb"].relation_broken, self.configure_pod)
+
+ def _check_missing_dependencies(self, config: ConfigModel):
+ missing_relations = []
+
+ if not self.kafka.host or not self.kafka.port:
+ missing_relations.append("kafka")
+ if not config.mongodb_uri and self.mongodb_client.is_missing_data_in_unit():
+ missing_relations.append("mongodb")
+
+ if missing_relations:
+ raise RelationsMissing(missing_relations)
+
+ def build_pod_spec(self, image_info):
+ # Validate config
+ config = ConfigModel(**dict(self.config))
+
+ if config.mongodb_uri and not self.mongodb_client.is_missing_data_in_unit():
+ raise Exception("Mongodb data cannot be provided via config and relation")
+
+ # Check relations
+ self._check_missing_dependencies(config)
+
+ # Create Builder for the PodSpec
+ pod_spec_builder = PodSpecV3Builder(
+ enable_security_context=config.security_context