Fix bug 1246
[osm/MON.git] / osm_mon / dashboarder / dashboarder.py
index a6ff5bc..3b454b8 100644 (file)
@@ -25,6 +25,7 @@ import logging
 import time
 import socket
 import asyncio
+from urllib.parse import urlparse
 
 from osm_mon.dashboarder.service import DashboarderService
 from osm_mon.core.config import Config
@@ -48,15 +49,40 @@ class Dashboarder:
 
     async def start(self):
         topics = ["users", "project"]
-        await self.msg_bus.aioread(topics, self._user_msg)
+        try:
+            await self.msg_bus.aioread(topics, self._user_msg)
+        except Exception as e:
+            # Failed to subscribe to kafka topics
+            log.error("Error when subscribing to topics %s", str(topics))
+            log.exception("Exception %s", str(e))
 
     async def _user_msg(self, topic, key, values):
         log.debug("Message from kafka bus received: topic: %s and values: %s and key: %s", topic, values, key)
         try:
             if topic == "users" and key == "created":
                 log.debug("Received message from kafka for creating user")
-                user = values['username']
+                if values.get('username'):
+                    user = values['username']
+                else:
+                    user = values['changes']['username']
                 self.service.create_grafana_user(user)
+                # user-created and mapping is done with osm cli
+                if values.get('changes'):
+                    # user-project-role mapping is included in change
+                    if values['changes'].get('project_role_mappings'):
+                        user_id = values["_id"]
+                        project_data = values["changes"]["project_role_mappings"]
+                        project_list = values["changes"].get("projects")
+                        self.service.create_grafana_team_member(project_data, user_id, project_list)
+                elif values.get('project_role_mappings'):
+                    # for fresh project-role-mapping
+                    user_id = values.get("_id")
+                    project_data = values["project_role_mappings"]
+                    if user_id:
+                        self.service.create_grafana_team_member(project_data, user_id)
+                    else:
+                        # for keystone we will get username
+                        self.service.create_grafana_team_member(project_data, user=values['username'])
             elif topic == "users" and key == "deleted":
                 log.debug("Received message from kafka for deleting user")
                 user = values['username']
@@ -64,8 +90,18 @@ class Dashboarder:
             elif topic == "users" and key == "edited":
                 log.debug("Received message from kafka for associating user to team")
                 user_id = values["_id"]
-                project_data = values["changes"]["project_role_mappings"]
-                self.service.create_grafana_team_member(project_data, user_id)
+                if values["changes"].get("remove_project_role_mappings") and not \
+                        values["changes"].get("add_project_role_mappings"):
+                    # Removing user-project role mapping
+                    self.service.remove_grafana_team_members(user_id,
+                                                             values["changes"].get("remove_project_role_mappings"))
+                else:
+                    # Changing user project role mapping
+                    if values["changes"].get("project_role_mappings"):
+                        project_data = values["changes"]["project_role_mappings"]
+                    else:
+                        project_data = values["changes"]["add_project_role_mappings"]
+                    self.service.create_grafana_team_member(project_data, user_id)
             elif topic == "project" and key == "created":
                 log.debug("Received message from kafka for creating team")
                 team_name = values["name"]
@@ -84,9 +120,10 @@ class Dashboarder:
 
     def dashboard_forever(self):
         log.debug('dashboard_forever')
+        grafana_parsed_uri = urlparse(self.conf.get('grafana', 'url'))
         while True:
             try:
-                socket.gethostbyname("grafana")
+                socket.gethostbyname(grafana_parsed_uri.hostname)
                 log.debug("Dashboard backend is running")
             except socket.error:
                 log.debug("Dashboard backend is not available")