From 92892640d75199aa9f87c9e6bc751c48bee00026 Mon Sep 17 00:00:00 2001 From: Lisa Zangrando Date: Thu, 23 Feb 2017 15:28:20 +0100 Subject: [PATCH] Fix the bug concerning the user which is still showed after deletion Bug: #1663639 Change-Id: Ifc0278076913475282c15d2092caa57354145487 Sem-Ver: bugfix --- synergy_scheduler_manager/common/project.py | 3 + .../fairshare_manager.py | 39 ++++- .../scheduler_manager.py | 140 ++++++++---------- 3 files changed, 102 insertions(+), 80 deletions(-) diff --git a/synergy_scheduler_manager/common/project.py b/synergy_scheduler_manager/common/project.py index b4f9e9c..8ae0b70 100644 --- a/synergy_scheduler_manager/common/project.py +++ b/synergy_scheduler_manager/common/project.py @@ -70,5 +70,8 @@ class Project(SynergyObject): def isEnabled(self): return self.get("enabled") + def removeUser(self, user_id): + return self.get("users").pop(user_id, None) + def setEnabled(self, enabled=True): self.set("enabled", enabled) diff --git a/synergy_scheduler_manager/fairshare_manager.py b/synergy_scheduler_manager/fairshare_manager.py index fa911a9..174cb0f 100644 --- a/synergy_scheduler_manager/fairshare_manager.py +++ b/synergy_scheduler_manager/fairshare_manager.py @@ -109,6 +109,7 @@ class FairShareManager(Manager): def task(self): with self.fs_condition: try: + self.checkUsers() self.calculateFairShare() except Exception as ex: LOG.error(ex) @@ -147,7 +148,7 @@ class FairShareManager(Manager): def addProject(self, project): if self.projects.get(project.getId(), None): - raise Exception("project %r already exists!" % (project.getId())) + raise Exception("project %s already exists!" % (project.getId())) prj_share = project.getShare() if prj_share.getValue() == 0: @@ -170,6 +171,42 @@ class FairShareManager(Manager): del self.projects[prj_id] self.fs_condition.notifyAll() + def checkUsers(self): + if not self.projects: + return + + for project in self.projects.values(): + k_users = self.keystone_manager.getUsers(prj_id=project.getId()) + k_users_ids = [user.getId() for user in k_users] + + p_users = project.getUsers() + p_users_ids = [user.getId() for user in p_users] + + new_user_ids = list(set(k_users_ids) - set(p_users_ids)) + + deleted_user_ids = list(set(p_users_ids) - set(k_users_ids)) + for id in deleted_user_ids: + LOG.info("deleting user %s" % id) + project.removeUser(id) + + for user in k_users: + if user.getId() in new_user_ids: + LOG.info("found new user %s" % user.getName()) + date = datetime.utcnow() + + data = user.getData() + data["vcpus"] = float(0) + data["memory"] = float(0) + data["actual_memory"] = float(0) + data["actual_vcpus"] = float(0) + data["time_window_from_date"] = date + data["time_window_to_date"] = date + + try: + project.addUser(user) + except Exception: + pass + def calculateFairShare(self): if not self.projects: return diff --git a/synergy_scheduler_manager/scheduler_manager.py b/synergy_scheduler_manager/scheduler_manager.py index 4db1523..155020a 100644 --- a/synergy_scheduler_manager/scheduler_manager.py +++ b/synergy_scheduler_manager/scheduler_manager.py @@ -385,108 +385,90 @@ class SchedulerManager(Manager): def task(self): if self.configured: - for project in self.projects.values(): - users = self.keystone_manager.getUsers(prj_id=project.getId()) + return - for user in users: - try: - project.addUser(user) - except Exception: - pass - else: - domain = self.keystone_manager.getDomains(name="default") - if not domain: - raise Exception("domain'default' not found!") + domain = self.keystone_manager.getDomains(name="default") + if not domain: + raise Exception("domain 'default' not found!") - domain = domain[0] - dom_id = domain.getId() + domain = domain[0] + dom_id = domain.getId() - for project in self.keystone_manager.getProjects(domain_id=dom_id): - if project.getName() in CONF.SchedulerManager.projects: - CONF.SchedulerManager.projects.remove(project.getName()) - project.setTTL(self.default_TTL) + for project in self.keystone_manager.getProjects(domain_id=dom_id): + if project.getName() in CONF.SchedulerManager.projects: + CONF.SchedulerManager.projects.remove(project.getName()) + project.setTTL(self.default_TTL) - try: - users = self.keystone_manager.getUsers( - prj_id=project.getId()) + self.projects[project.getName()] = project + else: + quota = self.nova_manager.getQuota(project.getId()) - for user in users: - project.addUser(user) - except Exception as ex: - LOG.error("Exception has occured", exc_info=1) - LOG.error(ex) + if quota.getSize("vcpus") <= -1 and \ + quota.getSize("memory") <= -1 and \ + quota.getSize("instances") <= -1: - self.projects[project.getName()] = project - else: - quota = self.nova_manager.getQuota(project.getId()) + qc = self.nova_manager.getQuota(project.getId(), + is_class=True) - if quota.getSize("vcpus") <= -1 and \ - quota.getSize("memory") <= -1 and \ - quota.getSize("instances") <= -1: + self.nova_manager.updateQuota(qc) - qc = self.nova_manager.getQuota(project.getId(), - is_class=True) + if len(CONF.SchedulerManager.projects) > 0: + raise Exception("projects %s not found, please check the syn" + "ergy.conf" % CONF.SchedulerManager.projects) - self.nova_manager.updateQuota(qc) + self.quota_manager.updateSharedQuota() - if len(CONF.SchedulerManager.projects) > 0: - raise Exception("projects %s not found, please check the syn" - "ergy.conf" % CONF.SchedulerManager.projects) + for prj_ttl in CONF.SchedulerManager.TTLs: + prj_name, TTL = self.parseAttribute(prj_ttl) + self.projects[prj_name].setTTL(TTL) - self.quota_manager.updateSharedQuota() + for prj_share in CONF.SchedulerManager.shares: + prj_name, share_value = self.parseAttribute(prj_share) + p_share = self.projects[prj_name].getShare() + p_share.setValue(share_value) - for prj_ttl in CONF.SchedulerManager.TTLs: - prj_name, TTL = self.parseAttribute(prj_ttl) - self.projects[prj_name].setTTL(TTL) + for prj_name, project in self.projects.items(): + del self.projects[prj_name] + self.projects[project.getId()] = project - for prj_share in CONF.SchedulerManager.shares: - prj_name, share_value = self.parseAttribute(prj_share) - p_share = self.projects[prj_name].getShare() - p_share.setValue(share_value) + self.quota_manager.addProject(project) + self.fairshare_manager.addProject(project) - for prj_name, project in self.projects.items(): - del self.projects[prj_name] - self.projects[project.getId()] = project + self.quota_manager.updateSharedQuota() + self.fairshare_manager.checkUsers() + self.fairshare_manager.calculateFairShare() - self.quota_manager.addProject(project) + try: + self.dynamic_queue = self.queue_manager.createQueue("DYNAMIC") + except Exception as ex: + LOG.error("Exception has occured", exc_info=1) + LOG.error(ex) - self.fairshare_manager.addProject(project) + self.dynamic_queue = self.queue_manager.getQueue("DYNAMIC") - self.quota_manager.updateSharedQuota() - self.fairshare_manager.calculateFairShare() + dynamic_worker = Worker("DYNAMIC", + self.dynamic_queue, + self.projects, + self.nova_manager, + self.keystone_manager, + self.backfill_depth) + dynamic_worker.start() - try: - self.dynamic_queue = self.queue_manager.createQueue("DYNAMIC") - except Exception as ex: - LOG.error("Exception has occured", exc_info=1) - LOG.error(ex) + self.workers.append(dynamic_worker) - self.dynamic_queue = self.queue_manager.getQueue("DYNAMIC") + self.notifications = Notifications(self.projects, self.nova_manager) - dynamic_worker = Worker("DYNAMIC", - self.dynamic_queue, - self.projects, - self.nova_manager, - self.keystone_manager, - self.backfill_depth) - dynamic_worker.start() + target = self.nova_manager.getTarget(topic=self.notification_topic, + exchange="nova") - self.workers.append(dynamic_worker) + self.listener = self.nova_manager.getNotificationListener( + targets=[target], + endpoints=[self.notifications]) - self.notifications = Notifications(self.projects, - self.nova_manager) + self.quota_manager.deleteExpiredServers() - target = self.nova_manager.getTarget( - topic=self.notification_topic, exchange="nova") - - self.listener = self.nova_manager.getNotificationListener( - targets=[target], - endpoints=[self.notifications]) - - self.quota_manager.deleteExpiredServers() - - self.listener.start() - self.configured = True + self.listener.start() + self.configured = True def destroy(self): for queue_worker in self.workers: