X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fdevops.git;a=blobdiff_plain;f=installers%2Fcharm%2Fpla%2Fsrc%2Fcharm.py;h=f90b407a0a90d5a7ad7d9c2079595783daacfbc4;hp=b94d62bdbeb441a8545ed7c90cb75c9580629909;hb=5863d3e8d8dca5108d89b993d5eb019ab16df587;hpb=b1862b1f88d51b3bb123dff9719fcec0bba874e1 diff --git a/installers/charm/pla/src/charm.py b/installers/charm/pla/src/charm.py index b94d62bd..f90b407a 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,49 +40,76 @@ 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) + self.state.set_default(mysql_host=None) + self.state.set_default(mysql_port=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 + ) + self.framework.observe( + self.on.mysql_relation_changed, self.on_mysql_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 + if not self.state.mysql_host or not self.state.mysql_port: + unit.status = WaitingStatus("Waiting for MySQL") + 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 + mysql_uri = "mysql://root:{}@{}:{}/{}".format( + self.state.mysql_root_password, + self.state.mysql_host, + self.state.mysql_port, + self.state.mysql_database, + ) ports = [ {"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_SQL_DATABASE_URI": mysql_uri, + "OSMPLA_DATABASE_COMMONKEY": config["database_common_key"], } spec = { @@ -89,9 +117,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 +128,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 +140,34 @@ 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() + + def on_mysql_relation_changed(self, event): + unit = self.model.unit + if not unit.is_leader(): + return + unit_data = event.relation.data[event.unit] + self.state.mysql_host = unit_data.get("host") + self.state.mysql_port = unit_data.get("port") + self.state.mysql_root_password = unit_data.get("root_password") + self.state.mysql_database = self.model.config["database"] + self._apply_spec() + if __name__ == "__main__": main(PLACharm)