Add support for Keystone domains

This feature fixes even the bug #1659246

Change-Id: I189455f5b1c546304e4b9b3ce9f6c17ebdf0d133
Sem-Ver: feature
This commit is contained in:
Lisa Zangrando 2017-01-25 12:17:54 +01:00
parent a858311eb9
commit e7e36a1fbd
4 changed files with 109 additions and 13 deletions

View File

@ -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)

View File

@ -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")

View File

@ -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())

View File

@ -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: