X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=installers%2Fcharm%2Fpla%2Fsrc%2Fcharm.py;h=2e199b36652d9eb0017003e1cab59cf4ac068bf5;hb=de4c92944d0e639458321896e3f58a8ba1f4b2a4;hp=b94d62bdbeb441a8545ed7c90cb75c9580629909;hpb=18c7a8b4367c8190a19327a421bdfa0ea9b2cb51;p=osm%2Fdevops.git diff --git a/installers/charm/pla/src/charm.py b/installers/charm/pla/src/charm.py index b94d62bd..2e199b36 100755 --- a/installers/charm/pla/src/charm.py +++ b/installers/charm/pla/src/charm.py @@ -24,6 +24,7 @@ from ops.main import main from ops.model import ( ActiveStatus, MaintenanceStatus, + WaitingStatus, ) from glob import glob @@ -39,21 +40,45 @@ class PLACharm(CharmBase): def __init__(self, framework, key): super().__init__(framework, key) 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 + ) + def _apply_spec(self): # Only apply the spec if this unit is a leader. - if not self.framework.model.unit.is_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 @@ -62,26 +87,14 @@ class PLACharm(CharmBase): {"name": "port", "containerPort": config["port"], "protocol": "TCP",}, ] - kubernetes = { - "readinessProbe": { - "tcpSocket": {"port": config["port"]}, - "timeoutSeconds": 5, - "periodSeconds": 5, - "initialDelaySeconds": 10, - }, - "livenessProbe": { - "tcpSocket": {"port": config["port"]}, - "timeoutSeconds": 5, - "initialDelaySeconds": 45, - }, - } config_spec = { "OSMPLA_MESSAGE_DRIVER": "kafka", - "OSMPLA_MESSAGE_HOST": config["kafka_host"], - "OSMPLA_MESSAGE_PORT": config["kafka_port"], + "OSMPLA_MESSAGE_HOST": self.state.kafka_host, + "OSMPLA_MESSAGE_PORT": self.state.kafka_port, "OSMPLA_DATABASE_DRIVER": "mongo", - "OSMPLA_DATABASE_URI": config["mongo_uri"], + "OSMPLA_DATABASE_URI": self.state.mongodb_uri, "OSMPLA_GLOBAL_LOG_LEVEL": config["log_level"], + "OSMPLA_DATABASE_COMMONKEY": config["database_common_key"], } spec = { @@ -89,9 +102,8 @@ class PLACharm(CharmBase): "containers": [ { "name": self.framework.model.app.name, - "image": "{}".format(config["image"]), + "image": config["image"], "ports": ports, - "kubernetes": kubernetes, "config": config_spec, } ], @@ -101,17 +113,11 @@ class PLACharm(CharmBase): def on_config_changed(self, event): """Handle changes in configuration""" - unit = self.model.unit - unit.status = MaintenanceStatus("Applying new pod spec") self._apply_spec() - unit.status = ActiveStatus("Ready") def on_start(self, event): """Called when the charm is being installed""" - unit = self.model.unit - unit.status = MaintenanceStatus("Applying pod spec") self._apply_spec() - unit.status = ActiveStatus("Ready") def on_upgrade_charm(self, event): """Upgrade the charm.""" @@ -119,6 +125,23 @@ class PLACharm(CharmBase): unit.status = MaintenanceStatus("Upgrading charm") self.on_start(event) + def on_kafka_relation_changed(self, event): + unit = self.model.unit + if not unit.is_leader(): + return + self.state.kafka_host = event.relation.data[event.unit].get("host") + self.state.kafka_port = event.relation.data[event.unit].get("port") + self._apply_spec() + + def on_mongo_relation_changed(self, event): + unit = self.model.unit + if not unit.is_leader(): + return + self.state.mongodb_uri = event.relation.data[event.unit].get( + "connection_string" + ) + self._apply_spec() + if __name__ == "__main__": main(PLACharm)