X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=installers%2Fcharm%2Fpla%2Fsrc%2Fcharm.py;fp=installers%2Fcharm%2Fpla%2Fsrc%2Fcharm.py;h=1fc6386fa64270e98667e97fc0abf40115a917ed;hb=a4a37f7f9f5410ff2c7833b76bdc85f752c74849;hp=0000000000000000000000000000000000000000;hpb=1a423a467dca38dab970ea9e0f7480be1f2dfc83;p=osm%2Fdevops.git diff --git a/installers/charm/pla/src/charm.py b/installers/charm/pla/src/charm.py new file mode 100755 index 00000000..1fc6386f --- /dev/null +++ b/installers/charm/pla/src/charm.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import logging + +sys.path.append("lib") + +from ops.charm import CharmBase +from ops.framework import StoredState, Object +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__) + + +class PLACharm(CharmBase): + state = StoredState() + + 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. + 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.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)