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_name(constituent_vnfd
['vnfd-id-ref'])
73 # If there are metrics, create dashboard (if exists)
74 if vnfd
and 'monitoring-param' in vnfd
:
75 if nsr_id
not in dashboard_uids
:
76 nsr_name
= nsr
['name']
77 project_id
= nsr
["_admin"]["projects_read"][0]
78 project_details
= self
.common_db
.get_project(project_id
)
79 project_name
= project_details
["name"]
80 self
.grafana
.create_dashboard(nsr_id
, nsr_name
,
81 dashboard_path
, project_name
)
82 log
.debug('Created dashboard for NS: %s', nsr_id
)
84 log
.debug('Dashboard already exists')
87 log
.debug('NS does not has metrics')
89 log
.exception("VNFD is not valid or has been renamed")
92 # Delete obsolete dashboards
93 for dashboard_uid
in dashboard_uids
:
94 if dashboard_uid
not in osm_resource_uids
:
95 self
.grafana
.delete_dashboard(dashboard_uid
)
96 log
.debug('Deleted obsolete dashboard: %s', dashboard_uid
)
98 log
.debug('All dashboards in use')
100 def create_grafana_user(self
, user
):
101 self
.grafana
.create_grafana_users(user
)
103 def create_grafana_team_member(self
, project_data
, userid
):
104 user
= self
.common_db
.get_user_by_id(userid
)
105 user_name
= user
["username"]
107 for project
in project_data
:
108 proj_list
.append(project
["project"])
109 for proj
in project_data
:
110 role_obj
= self
.common_db
.get_role_by_name(proj
["role"])
111 is_admin
= role_obj
["permissions"].get("admin")
112 self
.grafana
.create_grafana_teams_members(proj
["project"], user_name
, is_admin
, proj_list
)
114 def create_grafana_team(self
, team_name
):
115 self
.grafana
.create_grafana_teams(team_name
)
117 def delete_grafana_user(self
, user_name
):
118 self
.grafana
.delete_grafana_users(user_name
)
120 def delete_grafana_team(self
, project_name
):
121 self
.grafana
.delete_grafana_team(project_name
)
123 def update_grafana_team(self
, project_new_name
, project_old_name
):
124 self
.grafana
.update_grafana_teams(project_new_name
, project_old_name
)