1 # -*- coding: utf-8 -*-
3 # Copyright 2018 Whitestack, LLC
4 # *************************************************************
6 # This file is part of OSM Monitoring module
7 # All Rights Reserved to Whitestack, LLC
9 # Licensed under the Apache License, Version 2.0 (the "License"); you may
10 # not use this file except in compliance with the License. You may obtain
11 # a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18 # License for the specific language governing permissions and limitations
20 # For those usages not covered by the Apache License, Version 2.0 please
21 # contact: glavado@whitestack.com
25 from osm_mon
.core
.common_db
import CommonDbClient
26 from osm_mon
.core
.config
import Config
27 from osm_mon
.dashboarder
.backends
.grafana
import GrafanaBackend
28 from osm_mon
import __path__
as mon_path
30 log
= logging
.getLogger(__name__
)
33 class DashboarderService
:
34 def __init__(self
, config
: Config
):
36 self
.common_db
= CommonDbClient(self
.conf
)
37 self
.grafana
= GrafanaBackend(self
.conf
)
39 def create_dashboards(self
):
40 # TODO lavado: migrate these methods to mongo change streams
41 # Lists all dashboards and OSM resources for later comparisons
42 dashboard_uids
= self
.grafana
.get_all_dashboard_uids()
43 osm_resource_uids
= []
45 # Reads existing project list and creates a dashboard for each
46 projects
= self
.common_db
.get_projects()
47 for project
in projects
:
48 project_id
= project
['_id']
49 # Collect Project IDs for periodical dashboard clean-up
50 osm_resource_uids
.append(project_id
)
51 dashboard_path
= '{}/dashboarder/templates/project_scoped.json'.format(mon_path
[0])
52 if project_id
not in dashboard_uids
:
53 project_name
= project
['name']
54 self
.grafana
.create_dashboard(project_id
, project_name
,
56 log
.debug('Created dashboard for Project: %s', project_id
)
58 log
.debug('Dashboard already exists')
60 # Reads existing NS list and creates a dashboard for each
61 # TODO lavado: only create for ACTIVE NSRs
62 nsrs
= self
.common_db
.get_nsrs()
65 dashboard_path
= '{}/dashboarder/templates/ns_scoped.json'.format(mon_path
[0])
66 # Collect NS IDs for periodical dashboard clean-up
67 osm_resource_uids
.append(nsr_id
)
68 # Check if the NSR's VNFDs contain metrics
69 constituent_vnfds
= nsr
['nsd']['constituent-vnfd']
70 for constituent_vnfd
in constituent_vnfds
:
72 vnfd
= self
.common_db
.get_vnfd_by_id(constituent_vnfd
['vnfd-id-ref'])
73 # If there are metrics, create dashboard (if exists)
74 if 'monitoring-param' in vnfd
:
75 if nsr_id
not in dashboard_uids
:
76 nsr_name
= nsr
['name']
77 self
.grafana
.create_dashboard(nsr_id
, nsr_name
,
79 log
.debug('Created dashboard for NS: %s', nsr_id
)
81 log
.debug('Dashboard already exists')
84 log
.debug('NS does not has metrics')
86 log
.exception("VNFD is not valid or has been renamed")
89 # Delete obsolete dashboards
90 for dashboard_uid
in dashboard_uids
:
91 if dashboard_uid
not in osm_resource_uids
:
92 self
.grafana
.delete_dashboard(dashboard_uid
)
93 log
.debug('Deleted obsolete dashboard: %s', dashboard_uid
)
95 log
.debug('All dashboards in use')