Add missing vca_id parameter in juju.py
[osm/MON.git] / osm_mon / dashboarder / backends / grafana.py
index ff87507..73459f7 100644 (file)
@@ -75,8 +75,16 @@ class GrafanaBackend:
                 dashboard_json_data["folderId"] = folder_id
                 dashboard_json_data["overwrite"] = False
 
-            response = requests.request(
-                "POST", self.url + "/api/dashboards/db/", data=json.dumps(dashboard_json_data), headers=self.headers)
+            response = self.send_request_for_creating_dashboard(dashboard_json_data)
+
+            # Admin dashboard will be created if already exists. Rest will remain same.
+            if json.loads(response.text).get("status") == "name-exists":
+                # Delete any previous project-admin dashboard if it already exist.
+                if name == 'admin':
+                    self.delete_admin_dashboard()
+                    response = self.send_request_for_creating_dashboard(dashboard_json_data)
+                else:
+                    return
 
             # Get team id
             if project_name is not None:
@@ -84,19 +92,10 @@ class GrafanaBackend:
             response_team = requests.request(
                 "GET", self.url + "/api/teams/search?name={}".format(name), headers=self.headers)
 
-            # Check if team informaiton is available
-            if len(json.loads(response_team.text)["teams"]) > 0:
-                # As team information is available so it is a non-admin user
-                team_id = json.loads(response_team.text)["teams"][0]["id"]
-                permission_data = {"items": [{"teamId": team_id, "permission": 2}, ]}
-                # Give required permission to the team's folder
-                response = requests.request(
-                    "POST", self.url + "/api/folders/{}/permissions".format(project_name), json=permission_data,
-                    headers=self.headers)
-            else:
+            # Remove default permissions of admin user's dashboard so that it is not visible to non-admin users
+            if len(json.loads(response_team.text)["teams"]) == 0:
                 # As team information is not available so it is admin user
                 dahboard_id = json.loads(response.text)["id"]
-                # Remove dashboard's default permissions so that it is only visible to admin user
                 requests.request(
                     "POST", self.url + "/api/dashboards/id/{}/permissions".format(dahboard_id),
                     headers=self.headers)
@@ -106,11 +105,21 @@ class GrafanaBackend:
         except Exception:
             log.exception("Exception processing message: ")
 
+    def send_request_for_creating_dashboard(self, dashboard_data):
+        response = requests.request(
+            "POST", self.url + "/api/dashboards/db/", data=json.dumps(dashboard_data), headers=self.headers)
+        return response
+
     def delete_dashboard(self, uid):
         response = requests.request("DELETE", self.url + "/api/dashboards/uid/" + uid, headers=self.headers)
         log.debug("Dashboard %s deleted from Grafana", uid)
         return response
 
+    def delete_admin_dashboard(self):
+        requests.request(
+            "DELETE", self.url + "/api/dashboards/db/osm-project-status-admin", headers=self.headers)
+        log.debug("Dashboard osm-project-status-admin deleted from Grafana")
+
     def create_grafana_users(self, user):
         email = "{}@osm.etsi.org".format(user)
         user_payload = {
@@ -199,6 +208,20 @@ class GrafanaBackend:
         requests.request("POST", self.url + "/api/folders", json=folder_payload, headers=self.headers)
         log.info("Dashboard folder %s created", folder_name)
 
+        response_team = requests.request("GET", self.url + "/api/teams/search?name={}".format(folder_name),
+                                         headers=self.headers)
+        # Create team if it doesn't already exists
+        if len(json.loads(response_team.text)["teams"]) == 0:
+            self.create_grafana_teams(folder_name)
+            response_team = requests.request("GET", self.url + "/api/teams/search?name={}".format(folder_name),
+                                             headers=self.headers)
+        # Assign required permission to the team's folder
+        team_id = json.loads(response_team.text)["teams"][0]["id"]
+        permission_data = {"items": [{"teamId": team_id, "permission": 2}, ]}
+        requests.request("POST", self.url + "/api/folders/{}/permissions".format(folder_name),
+                         json=permission_data, headers=self.headers)
+
+    # delete user from grafana
     def delete_grafana_users(self, user_name):
         # Get user id
         response_id = requests.request("GET", self.url + "/api/users/lookup?loginOrEmail={}".format(user_name),
@@ -212,6 +235,7 @@ class GrafanaBackend:
         log.info("User %s deleted in Grafana", user_name)
         return response
 
+    # delete team from grafana
     def delete_grafana_team(self, project_name):
         # Delete Grafana folder
         requests.request("DELETE", self.url + "/api/folders/{}".format(project_name),
@@ -224,6 +248,7 @@ class GrafanaBackend:
         log.info("Team %s deleted in Grafana", project_name)
         return response
 
+    # update grafana team
     def update_grafana_teams(self, project_new_name, project_old_name):
         team_obj = requests.request("GET", self.url + "/api/teams/search?name={}".format(project_old_name),
                                     headers=self.headers)
@@ -232,3 +257,18 @@ class GrafanaBackend:
         response = requests.request("PUT", self.url + "/api/teams/{}".format(team_id), json=data, headers=self.headers)
         log.info("Grafana team updated %s", response.text)
         return response
+
+    # remove member from grafana team
+    def remove_grafana_team_member(self, user_name, project_data):
+        # Get user id
+        response_id = requests.request("GET", self.url + "/api/users/lookup?loginOrEmail={}".format(user_name),
+                                       headers=self.headers)
+        user_id = json.loads(response_id.text)["id"]
+        for project in project_data:
+            # Get team id
+            team_obj = requests.request("GET", self.url + "/api/teams/search?name={}".format(project['project']),
+                                        headers=self.headers)
+            team_id = json.loads(team_obj.text)["teams"][0]["id"]
+            response = requests.request("DELETE", self.url + "/api/teams/{}/members/{}".format(team_id, user_id),
+                                        headers=self.headers)
+        return response