Allow using emails of Project member to send report

Try to get project member email to report when no `project_receiver_domain`
and `receiver` configured in `notification` group
diff --git a/staffeln/common/openstack.py b/staffeln/common/openstack.py
index b6329a2..13dc05d 100644
--- a/staffeln/common/openstack.py
+++ b/staffeln/common/openstack.py
@@ -35,6 +35,24 @@
             user = self.conn.get_user(name_or_id=user_name)

         return user.id

 

+    def get_role_assignments(self, project_id, user_id=None):

+        filters = {"project": project_id}

+        if user_id:

+            filters["user"] = user_id

+        return self.conn.list_role_assignments(filters=filters)

+

+    def get_user(self, user_id):

+        return self.conn.get_user(name_or_id=user_id)

+

+    def get_project_member_emails(self, project_id):

+        members = self.get_role_assignments(project_id)

+        emails = []

+        for member in members:

+            user = self.get_user(member.user)

+            if user and user.email:

+                emails.append(user.email)

+        return emails

+

     def get_projects(self):

         return self.conn.list_projects()

 

diff --git a/staffeln/conductor/result.py b/staffeln/conductor/result.py
index 38e289d..c185d5e 100644
--- a/staffeln/conductor/result.py
+++ b/staffeln/conductor/result.py
@@ -13,7 +13,7 @@
 

 class BackupResult(object):

     def __init__(self):

-        pass

+        self.backup_mgt = backup.Backup()

 

     def initialize(self):

         self.content = ""

@@ -22,7 +22,7 @@
     def add_project(self, project_id, project_name):

         self.project_list.add((project_id, project_name))

 

-    def send_result_email(self, subject=None, project_name=None):

+    def send_result_email(self, project_id, subject=None, project_name=None):

         if not CONF.notification.sender_email:

             LOG.info(

                 "Directly record report in log as sender email "

@@ -35,12 +35,23 @@
             # Found receiver in config, override report receiver.

             receiver = CONF.notification.receiver

         elif not CONF.notification.project_receiver_domain:

-            LOG.info(

-                "Directly record report in log as no receiver email "

-                "or project receiver domain are not configed. "

-                f"Report: {self.content}"

-            )

-            return

+            try:

+                receiver = self.backup_mgt.openstacksdk.get_project_member_emails(

+                    project_id

+                )

+                if not receiver:

+                    LOG.warn(

+                        f"No email can be found from members of project {project_id}. "

+                        "Skip report now and will try to report later."

+                    )

+                    return

+            except Exception as ex:

+                LOG.warn(

+                    f"Failed to fetch emails from project members with exception: {ex}"

+                    "As also no receiver email or project receiver domain are "

+                    "configured. Will try to report later."

+                )

+                return

         else:

             receiver_domain = CONF.notification.project_receiver_domain

             receiver = f"{project_name}@{receiver_domain}"

@@ -70,14 +81,13 @@
         # 1. get quota

         self.content = "<h3>${TIME}</h3><br>"

         self.content = self.content.replace("${TIME}", xtime.get_current_strtime())

-        backup_mgt = backup.Backup()

-        success_tasks = backup_mgt.get_queues(

+        success_tasks = self.backup_mgt.get_queues(

             filters={

                 "backup_status": constants.BACKUP_COMPLETED,

                 "project_id": project_id,

             }

         )

-        failed_tasks = backup_mgt.get_queues(

+        failed_tasks = self.backup_mgt.get_queues(

             filters={

                 "backup_status": constants.BACKUP_FAILED,

                 "project_id": project_id,

@@ -87,7 +97,7 @@
             return False

 

         html = ""

-        quota = backup_mgt.get_backup_quota(project_id)

+        quota = self.backup_mgt.get_backup_quota(project_id)

 

         html += (

             "<h3>Project: ${PROJECT} (ID: ${PROJECT_ID})</h3><h3>Quota Usage</h3>"

@@ -145,5 +155,5 @@
         html = html.replace("${PROJECT_ID}", project_id)

         self.content += html

         subject = f"Staffeln Backup result: {project_id}"

-        self.send_result_email(subject=subject, project_name=project_name)

+        self.send_result_email(project_id, subject=subject, project_name=project_name)

         return True