From 120c8bb42d33eac7c150eb67301ee4830b616909 Mon Sep 17 00:00:00 2001
From: stedif <stefano.difrischia@inaf.it>
Date: Thu, 28 Jul 2022 11:45:20 +0200
Subject: [PATCH] L2SS-777: update archiver-policy devices

---
 .../code/tango-prometheus-client.py           | 51 +++++++++++++------
 .../lofar2-policy.json                        |  4 ++
 2 files changed, 40 insertions(+), 15 deletions(-)

diff --git a/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py b/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py
index 505c89c5a..cb3953412 100644
--- a/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py
+++ b/docker-compose/tango-prometheus-exporter/code/tango-prometheus-client.py
@@ -6,6 +6,7 @@ from tango import Database, DeviceProxy, CmdArgType as ArgType, AttrDataFormat,
 import logging
 import json
 import fnmatch
+import re
 from logstash_async.handler import AsynchronousLogstashHandler, LogstashFormatter
 
 logger = logging.getLogger()
@@ -37,8 +38,42 @@ class ArchiverPolicy(object):
     def __init__(self, config: dict = None):
         self.config = config or self.EMPTY_POLICY
 
+    def device_list(self) -> list:
+        """ Retrieve the device list from TangoDB """
+        device_list = []
+        db = Database()
+        server_list = db.get_server_list()  # e.g. SDP/STAT, RECV/STAT
+        for i in range(0, len(server_list)):
+            # https://pytango.readthedocs.io/en/stable/database.html#tango.Database.get_device_class_list
+            class_list = db.get_device_class_list(server_list[i])
+            for j in range(0, len(class_list), 2):
+                if "dserver" in class_list[j]:
+                    continue
+                device_list.append(class_list[j].lower())
+        return device_list
+    
+    def multimember_device_list(config_devices: list) -> list:
+        """ Retrieve multimember devices if there are any regulare expressions in the policy file """
+        multimember_devices = []
+        for device in config_devices:
+            if re.match('.*/.*/[*]', device):
+                members = Database().get_device_member(device)
+                retrieved_devices = [f"{device[:-1]}{m}" for m in members]
+                multimember_devices += retrieved_devices
+        return multimember_devices
+
     def devices(self) -> list:
-        return list(self.config["devices"].keys())
+        """ Filter the device list from TangoDB following the lofar2-policy file """
+        # Devices list from TangoDB
+        db_devices = self.device_list()
+        # Devices listed in policy file
+        config_devices = list(k.lower() for k in self.config["devices"].keys())
+        # Multimember device list
+        multimember_devices = self.multimember_device_list
+        # Filter devices following policy file
+        devices = [x for x in db_devices if x in config_devices]
+        devices += multimember_devices
+        return devices
 
     def attribute_list(self, device_name: str, attribute_list: list) -> dict:
         """ Return the full set of archiving policy for the given device. """
@@ -176,20 +211,6 @@ class CustomCollector(object):
 
         return metrics
 
-    def device_list(self) -> list:
-        """ Retrieve the device list from TangoDB """
-        device_list = []
-        db = Database()
-        server_list = db.get_server_list()  # e.g. SDP/STAT, RECV/STAT
-        for i in range(0, len(server_list)):
-            # https://pytango.readthedocs.io/en/stable/database.html#tango.Database.get_device_class_list
-            class_list = db.get_device_class_list(server_list[i])
-            for j in range(0, len(class_list), 2):
-                if "dserver" in class_list[j]:
-                    continue
-                device_list.append(class_list[j].lower())
-        return device_list
-    
     def collect(self):
         """ Yield all scraped metrics from all devices, as configured. """
 
diff --git a/docker-compose/tango-prometheus-exporter/lofar2-policy.json b/docker-compose/tango-prometheus-exporter/lofar2-policy.json
index 5c7d49b01..06a1febb3 100644
--- a/docker-compose/tango-prometheus-exporter/lofar2-policy.json
+++ b/docker-compose/tango-prometheus-exporter/lofar2-policy.json
@@ -29,6 +29,10 @@
         },
         "STAT/Docker/1": {
         },
+        "STAT/Observation/*":{
+        },
+        "STAT/ObservationControl/1":{
+        },
         "STAT/PSOC/1": {
         },
         "STAT/RECV/1": {
-- 
GitLab