- def _apply_spec(self):
- # Only apply the spec if this unit is a leader.
- unit = self.model.unit
- if not unit.is_leader():
- unit.status = ActiveStatus("ready")
- return
- if not self.state.kafka_host or not self.state.kafka_port:
- unit.status = WaitingStatus("Waiting for Kafka")
- return
- if not self.state.mongodb_uri:
- unit.status = WaitingStatus("Waiting for MongoDB")
- return
-
- unit.status = MaintenanceStatus("Applying new pod spec")
-
- new_spec = self.make_pod_spec()
- if new_spec == self.state.spec:
- unit.status = ActiveStatus("ready")
- return
- self.framework.model.pod.set_spec(new_spec)
- self.state.spec = new_spec
- unit.status = ActiveStatus("ready")
-
- def make_pod_spec(self):
- config = self.framework.model.config
-
- ports = [
- {"name": "port", "containerPort": config["port"], "protocol": "TCP", },
- ]
-
- config_spec = {
- "OSMPLA_MESSAGE_DRIVER": "kafka",
- "OSMPLA_MESSAGE_HOST": self.state.kafka_host,
- "OSMPLA_MESSAGE_PORT": self.state.kafka_port,
- "OSMPLA_DATABASE_DRIVER": "mongo",
- "OSMPLA_DATABASE_URI": self.state.mongodb_uri,
- "OSMPLA_GLOBAL_LOG_LEVEL": config["log_level"],
- "OSMPLA_DATABASE_COMMONKEY": config["database_common_key"],
- }
-
- spec = {
- "version": 2,
- "containers": [
- {
- "name": self.framework.model.app.name,
- "image": config["image"],
- "ports": ports,
- "config": config_spec,
- }
- ],
- }
-
- return spec
-
- def on_config_changed(self, event):
- """Handle changes in configuration"""
- self._apply_spec()
-
- def on_start(self, event):
- """Called when the charm is being installed"""
- self._apply_spec()
-
- def on_upgrade_charm(self, event):
- """Upgrade the charm."""
- unit = self.model.unit
- unit.status = MaintenanceStatus("Upgrading charm")
- self._apply_spec()
-
- def on_kafka_relation_changed(self, event):
- kafka_host = event.relation.data[event.unit].get("host")
- kafka_port = event.relation.data[event.unit].get("port")
- if kafka_host and self.state.kafka_host != kafka_host:
- self.state.kafka_host = kafka_host
- if kafka_port and self.state.kafka_port != kafka_port:
- self.state.kafka_port = kafka_port
- self._apply_spec()
-
- def on_mongo_relation_changed(self, event):
- mongodb_uri = event.relation.data[event.unit].get(
- "connection_string"
- )
- if mongodb_uri and self.state.mongodb_uri != mongodb_uri:
- self.state.mongodb_uri = mongodb_uri
- self._apply_spec()