X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=installers%2Fcharm%2Fpla%2Fsrc%2Fcharm.py;h=16e7303f89b0fe1209ba4eabf8bc46d7089c665b;hb=b46cc8f7d76eb8032b3b4b9236b8b6accc86967d;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..16e7303f 100755 --- a/installers/charm/pla/src/charm.py +++ b/installers/charm/pla/src/charm.py @@ -13,10 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys +from glob import glob import logging - -sys.path.append("lib") +from pathlib import Path +from string import Template +import sys from ops.charm import CharmBase from ops.framework import StoredState, Object @@ -24,11 +25,9 @@ from ops.main import main from ops.model import ( ActiveStatus, MaintenanceStatus, + WaitingStatus, ) -from glob import glob -from pathlib import Path -from string import Template logger = logging.getLogger(__name__) @@ -39,49 +38,65 @@ 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 ports = [ - {"name": "port", "containerPort": config["port"], "protocol": "TCP",}, + { + "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 +104,12 @@ class PLACharm(CharmBase): "containers": [ { "name": self.framework.model.app.name, - "image": "{}".format(config["image"]), + "imageDetails": { + "imagePath": config["image"], + "username": config["image_username"], + "password": config["image_password"], + }, "ports": ports, - "kubernetes": kubernetes, "config": config_spec, } ], @@ -101,23 +119,32 @@ 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.""" unit = self.model.unit unit.status = MaintenanceStatus("Upgrading charm") - self.on_start(event) + 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() if __name__ == "__main__":