From e7e36a1fbd06ba1aef6c1e24939896fe0bae02e2 Mon Sep 17 00:00:00 2001 From: Lisa Zangrando Date: Wed, 25 Jan 2017 12:17:54 +0100 Subject: [PATCH] Add support for Keystone domains This feature fixes even the bug #1659246 Change-Id: I189455f5b1c546304e4b9b3ce9f6c17ebdf0d133 Sem-Ver: feature --- synergy_scheduler_manager/common/domain.py | 34 +++++++++++++ synergy_scheduler_manager/keystone_manager.py | 49 +++++++++++++++++++ synergy_scheduler_manager/quota_manager.py | 9 +++- .../scheduler_manager.py | 30 +++++++----- 4 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 synergy_scheduler_manager/common/domain.py diff --git a/synergy_scheduler_manager/common/domain.py b/synergy_scheduler_manager/common/domain.py new file mode 100644 index 0000000..fd5f625 --- /dev/null +++ b/synergy_scheduler_manager/common/domain.py @@ -0,0 +1,34 @@ +from synergy.common.serializer import SynergyObject + + +__author__ = "Lisa Zangrando" +__email__ = "lisa.zangrando[AT]pd.infn.it" +__copyright__ = """Copyright (c) 2015 INFN - INDIGO-DataCloud +All Rights Reserved + +Licensed under the Apache License, Version 2.0; +you may not use this file except in compliance with the +License. You may obtain a copy of the License at: + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. +See the License for the specific language governing +permissions and limitations under the License.""" + + +class Domain(SynergyObject): + + def __init__(self): + super(Domain, self).__init__() + + self.set("enabled", False) + + def isEnabled(self): + return self.get("enabled") + + def setEnabled(self, enabled=True): + self.set("enabled", enabled) diff --git a/synergy_scheduler_manager/keystone_manager.py b/synergy_scheduler_manager/keystone_manager.py index 4ee4e59..84736ac 100644 --- a/synergy_scheduler_manager/keystone_manager.py +++ b/synergy_scheduler_manager/keystone_manager.py @@ -2,6 +2,7 @@ import json import logging import requests +from common.domain import Domain from common.endpoint import Endpoint from common.project import Project from common.role import Role @@ -298,6 +299,54 @@ class KeystoneManager(Manager): return roles + def getDomain(self, id): + try: + response = self.getResource("/domains/%s" % id, "GET") + except requests.exceptions.HTTPError as ex: + response = ex.response.json() + raise Exception( + "error on retrieving the domain (id=%r, msg=%s)." % + (id, response["error"]["message"])) + + domain = None + + if response: + info = response["domain"] + + domain = Domain() + domain.setId(info["id"]) + domain.setName(info["name"]) + domain.setEnabled(info["enabled"]) + + return domain + + def getDomains(self, name=None, enabled=True): + try: + data = {"enabled": enabled} + if name: + data["name"] = name + + response = self.getResource("/domains", "GET", data=data) + except requests.exceptions.HTTPError as ex: + response = ex.response.json() + raise Exception("error on retrieving the domains list: %s" + % response["error"]["message"]) + + domains = [] + + if response: + domains_info = response["domains"] + + for info in domains_info: + domain = Domain() + domain.setId(info["id"]) + domain.setName(info["name"]) + domain.setEnabled(info["enabled"]) + + domains.append(domain) + + return domains + def getProject(self, id): try: response = self.getResource("/projects/%s" % id, "GET") diff --git a/synergy_scheduler_manager/quota_manager.py b/synergy_scheduler_manager/quota_manager.py index b5ec0ab..750c628 100644 --- a/synergy_scheduler_manager/quota_manager.py +++ b/synergy_scheduler_manager/quota_manager.py @@ -250,7 +250,14 @@ class QuotaManager(Manager): total_memory *= float(ram_ratio) total_vcpus *= float(cpu_ratio) - kprojects = self.keystone_manager.getProjects(domain_id="default") + domain = self.keystone_manager.getDomains(name="default") + if not domain: + raise Exception("domain 'default' not found!") + + domain = domain[0] + dom_id = domain.getId() + + kprojects = self.keystone_manager.getProjects(domain_id=dom_id) for kproject in kprojects: project = self.getProject(kproject.getId()) diff --git a/synergy_scheduler_manager/scheduler_manager.py b/synergy_scheduler_manager/scheduler_manager.py index e3564a7..9e9f7bf 100644 --- a/synergy_scheduler_manager/scheduler_manager.py +++ b/synergy_scheduler_manager/scheduler_manager.py @@ -418,8 +418,24 @@ class SchedulerManager(Manager): raise Exception("command=%r not supported!" % command) def task(self): - if not self.configured: - for project in self.keystone_manager.getProjects(): + if self.configured: + for project in self.projects.values(): + users = self.keystone_manager.getUsers(prj_id=project.getId()) + + 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 = 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) @@ -505,16 +521,6 @@ class SchedulerManager(Manager): self.listener.start() self.configured = True - return - - for project in self.projects.values(): - users = self.keystone_manager.getUsers(prj_id=project.getId()) - - for user in users: - try: - project.addUser(user) - except Exception: - pass def destroy(self): for queue_worker in self.workers: