Adding backup action to prometheus charm
[osm/devops.git] / installers / charm / prometheus / src / charm.py
index 47533dd..5cd163d 100755 (executable)
@@ -27,6 +27,7 @@ import logging
 from typing import NoReturn, Optional
 from urllib.parse import urlparse
 
+from oci_image import OCIImageResource
 from ops.framework import EventBase
 from ops.main import main
 from opslib.osm.charm import CharmedOsmBase
@@ -41,6 +42,7 @@ from opslib.osm.validator import (
     ModelValidator,
     validator,
 )
+import requests
 
 
 logger = logging.getLogger(__name__)
@@ -99,9 +101,24 @@ class PrometheusCharm(CharmedOsmBase):
             self._publish_prometheus_info,
         )
 
+        # Registering actions
+        self.framework.observe(
+            self.on.backup_action,  # pylint: disable=E1101
+            self._on_backup_action,
+        )
+
     def _publish_prometheus_info(self, event: EventBase) -> NoReturn:
         self.prometheus.publish_info(self.app.name, PORT)
 
+    def _on_backup_action(self, event: EventBase) -> NoReturn:
+        url = f"http://{self.model.app.name}:{PORT}/api/v2/admin/tsdb/snapshot"
+        result = requests.post(url)
+
+        if result.status_code == 200:
+            event.set_results({"backup-name": result.json()["name"]})
+        else:
+            event.fail(f"status-code: {result.status_code}, result: {result.json()}")
+
     def _build_files(self, config: ConfigModel):
         files_builder = FilesV3Builder()
         files_builder.add_file(
@@ -128,6 +145,15 @@ class PrometheusCharm(CharmedOsmBase):
         config = ConfigModel(**dict(self.config))
         # Create Builder for the PodSpec
         pod_spec_builder = PodSpecV3Builder()
+
+        # Build Backup Container
+        backup_image = OCIImageResource(self, "backup-image")
+        backup_image_info = backup_image.fetch()
+        backup_container_builder = ContainerV3Builder("prom-backup", backup_image_info)
+        backup_container = backup_container_builder.build()
+        # Add backup container to pod spec
+        pod_spec_builder.add_container(backup_container)
+
         # Build Container
         container_builder = ContainerV3Builder(self.app.name, image_info)
         container_builder.add_port(name=self.app.name, port=PORT)