Merge "Add support for Keystone domains"

This commit is contained in:
Jenkins 2017-01-25 16:29:51 +00:00 committed by Gerrit Code Review
commit 80ef20c334
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

@ -426,8 +426,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)
@ -513,16 +529,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: