Collect null project_ids as empty strings
[osm/MON.git] / osm_mon / collector / vnf_collectors / juju.py
index 6c5e314..1ca8bf5 100644 (file)
@@ -40,13 +40,24 @@ class VCACollector(BaseCollector):
         super().__init__(config)
         self.common_db = CommonDbClient(config)
         self.loop = asyncio.get_event_loop()
-        self.n2vc = N2VC(server=config.get('vca', 'host'), user=config.get('vca', 'user'),
-                         secret=config.get('vca', 'secret'))
+        self.n2vc = N2VC(server=config.get('vca', 'host'),
+                         user=config.get('vca', 'user'),
+                         secret=config.get('vca', 'secret'),
+                         ca_cert=config.get('vca', 'cacert'))
 
     def collect(self, vnfr: dict) -> List[Metric]:
         nsr_id = vnfr['nsr-id-ref']
         vnf_member_index = vnfr['member-vnf-index-ref']
         vnfd = self.common_db.get_vnfd(vnfr['vnfd-id'])
+
+        # Populate extra tags for metrics
+        tags = {}
+        tags['ns_name'] = self.common_db.get_nsr(nsr_id)['name']
+        if vnfr['_admin']['projects_read']:
+            tags['project_id'] = vnfr['_admin']['projects_read'][0]
+        else:
+            tags['project_id'] = ''
+
         metrics = []
         for vdur in vnfr['vdur']:
             # This avoids errors when vdur records have not been completely filled
@@ -57,8 +68,10 @@ class VCACollector(BaseCollector):
             )
             if 'vdu-configuration' in vdu and 'metrics' in vdu['vdu-configuration']:
                 try:
-                    vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, vdur['name'])
-                except VcaDeploymentInfoNotFound:
+                    vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, vdur['vdu-id-ref'],
+                                                                       vdur['count-index'])
+                except VcaDeploymentInfoNotFound as e:
+                    log.warning(repr(e))
                     continue
                 measures = self.loop.run_until_complete(self.n2vc.GetMetrics(vca_deployment_info['model'],
                                                                              vca_deployment_info['application']))
@@ -67,28 +80,46 @@ class VCACollector(BaseCollector):
                     for measure in measure_list:
                         log.debug("Measure: %s", measure)
                         metric = VnfMetric(nsr_id, vnf_member_index, vdur['name'], measure['key'],
-                                           float(measure['value']))
+                                           float(measure['value']), tags)
                         metrics.append(metric)
         if 'vnf-configuration' in vnfd and 'metrics' in vnfd['vnf-configuration']:
             try:
-                vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, None)
-            except VcaDeploymentInfoNotFound:
+                vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index)
+            except VcaDeploymentInfoNotFound as e:
+                log.warning(repr(e))
                 return metrics
             measures = self.loop.run_until_complete(self.n2vc.GetMetrics(vca_deployment_info['model'],
                                                                          vca_deployment_info['application']))
+            # Search for Mgmt VDU name, needed to query Prometheus based on alarm tags
+            # TODO: check a better way to look for Mgmt VDU
+            for vdur in vnfr['vdur']:
+                for interface in vdur['interfaces']:
+                    if 'mgmt-vnf' in interface:
+                        vdu_name = vdur['name']
+                        break
             log.debug('Measures: %s', measures)
             for measure_list in measures.values():
                 for measure in measure_list:
                     log.debug("Measure: %s", measure)
-                    metric = VnfMetric(nsr_id, vnf_member_index, '', measure['key'], float(measure['value']))
+                    metric = VnfMetric(nsr_id, vnf_member_index, vdu_name,
+                                       measure['key'], float(measure['value']), tags)
                     metrics.append(metric)
         return metrics
 
-    def get_vca_deployment_info(self, nsr_id, vnf_member_index, vdur_name):
+    def get_vca_deployment_info(self, nsr_id, vnf_member_index, vdu_id=None, vdu_count=0):
         nsr = self.common_db.get_nsr(nsr_id)
         for vca_deployment in nsr["_admin"]["deployed"]["VCA"]:
             if vca_deployment:
-                if vca_deployment['member-vnf-index'] == vnf_member_index and vca_deployment['vdu_name'] == vdur_name:
-                    return vca_deployment
-        raise VcaDeploymentInfoNotFound("VCA deployment info for nsr_id {}, index {} and vdur_name {} not found."
-                                        .format(nsr_id, vnf_member_index, vdur_name))
+                if vdu_id is None:
+                    if vca_deployment['member-vnf-index'] == vnf_member_index and vca_deployment['vdu_id'] is None:
+                        return vca_deployment
+                else:
+                    if vca_deployment['member-vnf-index'] == vnf_member_index and \
+                            vca_deployment['vdu_id'] == vdu_id and vca_deployment['vdu_count_index'] == vdu_count:
+                        return vca_deployment
+        raise VcaDeploymentInfoNotFound(
+            "VCA deployment info for nsr_id {}, index {}, vdu_id {} and vdu_count_index {} not found.".format(
+                nsr_id,
+                vnf_member_index,
+                vdu_id,
+                vdu_count))