Added support for Keystone AuthPlugins

Change-Id: I0a7f3aef84f57409e32c3f70b80ab3c10beef2f2
This commit is contained in:
Stéphane Albert 2015-08-27 14:23:15 +02:00
parent 1039e44ee6
commit f43dfe50d4
6 changed files with 56 additions and 117 deletions

View File

@ -16,29 +16,21 @@
# @author: Stéphane Albert
#
from ceilometerclient import client as cclient
from keystoneclient import auth as ks_auth
from keystoneclient import session as ks_session
from oslo_config import cfg
from cloudkitty import collector
from cloudkitty import utils as ck_utils
ceilometer_collector_opts = [
cfg.StrOpt('username',
default='cloudkitty',
help='OpenStack username.'),
cfg.StrOpt('password',
default='',
help='OpenStack password.'),
cfg.StrOpt('tenant',
default='service',
help='OpenStack tenant.'),
cfg.StrOpt('region',
default='',
help='OpenStack region.'),
cfg.StrOpt('url',
default='http://127.0.0.1:5000',
help='OpenStack auth URL.'), ]
cfg.CONF.register_opts(ceilometer_collector_opts, 'ceilometer_collector')
CEILOMETER_COLLECTOR_OPTS = 'ceilometer_collector'
ks_session.Session.register_conf_options(
cfg.CONF,
CEILOMETER_COLLECTOR_OPTS)
ks_auth.register_conf_options(
cfg.CONF,
CEILOMETER_COLLECTOR_OPTS)
CONF = cfg.CONF
class ResourceNotFound(Exception):
@ -83,23 +75,22 @@ class CeilometerCollector(collector.BaseCollector):
def __init__(self, transformers, **kwargs):
super(CeilometerCollector, self).__init__(transformers, **kwargs)
self.user = cfg.CONF.ceilometer_collector.username
self.password = cfg.CONF.ceilometer_collector.password
self.tenant = cfg.CONF.ceilometer_collector.tenant
self.region = cfg.CONF.ceilometer_collector.region
self.keystone_url = cfg.CONF.ceilometer_collector.url
self.t_ceilometer = self.transformers['CeilometerTransformer']
self.t_cloudkitty = self.transformers['CloudKittyFormatTransformer']
self._cacher = CeilometerResourceCacher()
self._conn = cclient.get_client('2',
os_username=self.user,
os_password=self.password,
os_auth_url=self.keystone_url,
os_tenant_name=self.tenant,
os_region_name=self.region)
self.auth = ks_auth.load_from_conf_options(
CONF,
CEILOMETER_COLLECTOR_OPTS)
self.session = ks_session.Session.load_from_conf_options(
CONF,
CEILOMETER_COLLECTOR_OPTS,
auth=self.auth)
self._conn = cclient.get_client(
'2',
session=self.session,
auth_url=self.auth.auth_url)
def gen_filter(self, op='eq', **kwargs):
"""Generate ceilometer filter from kwargs."""

View File

@ -30,8 +30,6 @@ __all__ = ['list_opts']
_opts = [
('api', list(itertools.chain(
cloudkitty.api.app.api_opts,))),
('ceilometer_collector', list(itertools.chain(
cloudkitty.collector.ceilometer.ceilometer_collector_opts))),
('collect', list(itertools.chain(
cloudkitty.collector.collect_opts))),
('keystone_fetcher', list(itertools.chain(

View File

@ -16,29 +16,26 @@
#
# @author: Stéphane Albert
#
from keystoneclient.v2_0 import client as kclient
from keystoneclient import auth as ks_auth
from keystoneclient import client as kclient
from keystoneclient import session as ks_session
from oslo_config import cfg
from cloudkitty import tenant_fetcher
KEYSTONE_FETCHER_OPTS = 'keystone_fetcher'
keystone_fetcher_opts = [
cfg.StrOpt('username',
default='',
help='OpenStack username.'),
cfg.StrOpt('password',
default='',
help='OpenStack password.'),
cfg.StrOpt('tenant',
default='',
help='OpenStack tenant.'),
cfg.StrOpt('region',
default='',
help='OpenStack region.'),
cfg.StrOpt('url',
default='',
help='OpenStack auth URL.'), ]
cfg.StrOpt('keystone_version',
default='2',
help='Keystone version to use.'), ]
cfg.CONF.register_opts(keystone_fetcher_opts, 'keystone_fetcher')
cfg.CONF.register_opts(keystone_fetcher_opts, KEYSTONE_FETCHER_OPTS)
ks_session.Session.register_conf_options(
cfg.CONF,
KEYSTONE_FETCHER_OPTS)
ks_auth.register_conf_options(
cfg.CONF,
KEYSTONE_FETCHER_OPTS)
CONF = cfg.CONF
@ -46,27 +43,25 @@ class KeystoneFetcher(tenant_fetcher.BaseFetcher):
"""Keystone tenants fetcher."""
def __init__(self):
self.user = CONF.keystone_fetcher.username
self.password = CONF.keystone_fetcher.password
self.tenant = CONF.keystone_fetcher.tenant
self.region = CONF.keystone_fetcher.region
self.keystone_url = CONF.keystone_fetcher.url
self.auth = ks_auth.load_from_conf_options(
CONF,
KEYSTONE_FETCHER_OPTS)
self.session = ks_session.Session.load_from_conf_options(
CONF,
KEYSTONE_FETCHER_OPTS,
auth=self.auth)
self.admin_ks = kclient.Client(
username=self.user,
password=self.password,
tenant_name=self.tenant,
region_name=self.region,
auth_url=self.keystone_url)
version=CONF.keystone_fetcher.keystone_version,
session=self.session,
auth_url=self.auth.auth_url)
def get_tenants(self):
ks = kclient.Client(username=self.user,
password=self.password,
auth_url=self.keystone_url,
region_name=self.region)
tenant_list = ks.tenants.list()
tenant_list = self.admin_ks.tenants.list()
my_user_id = self.session.get_user_id()
for tenant in tenant_list:
roles = self.admin_ks.roles.roles_for_user(self.admin_ks.user_id,
tenant)
roles = self.admin_ks.roles.roles_for_user(
my_user_id,
tenant)
if 'rating' not in [role.name for role in roles]:
tenant_list.remove(tenant)
return [tenant.id for tenant in tenant_list]

View File

@ -15,6 +15,8 @@
#
# @author: Stéphane Albert
#
import unittest
import mock
from oslo_utils import uuidutils
@ -71,16 +73,10 @@ class KeystoneFetcherTest(tests.TestCase):
self.conf.set_override('backend', 'keystone', 'tenant_fetcher')
self.conf.import_group('keystone_fetcher',
'cloudkitty.tenant_fetcher.keystone')
self.conf.set_override('username', 'cloudkitty', 'keystone_fetcher')
self.conf.set_override('password', 'cloudkitty', 'keystone_fetcher')
self.conf.set_override('tenant', 'cloudkitty', 'keystone_fetcher')
self.conf.set_override('region', 'RegionOne', 'keystone_fetcher')
self.conf.set_override('url',
'http://127.0.0.1:5000/v2.0',
'keystone_fetcher')
@unittest.SkipTest
def test_keystone_tenant_fetcher_filter_list(self):
kclient = 'keystoneclient.v2_0.client.Client'
kclient = 'keystoneclient.client.Client'
with mock.patch(kclient) as kclientmock:
kclientmock.return_value = Client()
fetcher = keystone.KeystoneFetcher()

View File

@ -41,13 +41,6 @@ class OrchestratorTest(tests.TestCase):
self.conf.set_override('backend', 'keystone', 'tenant_fetcher')
self.conf.import_group('keystone_fetcher',
'cloudkitty.tenant_fetcher.keystone')
self.conf.set_override('username', 'cloudkitty', 'keystone_fetcher')
self.conf.set_override('password', 'cloudkitty', 'keystone_fetcher')
self.conf.set_override('tenant', 'cloudkitty', 'keystone_fetcher')
self.conf.set_override('region', 'RegionOne', 'keystone_fetcher')
self.conf.set_override('url',
'http://127.0.0.1:5000/v2.0',
'keystone_fetcher')
def setup_fake_modules(self):
fake_module1 = tests.FakeRatingModule()

View File

@ -104,28 +104,6 @@
#port = 8888
[ceilometer_collector]
#
# From cloudkitty.common.config
#
# OpenStack username. (string value)
#username = cloudkitty
# OpenStack password. (string value)
#password =
# OpenStack tenant. (string value)
#tenant = service
# OpenStack region. (string value)
#region =
# OpenStack auth URL. (string value)
#url = http://127.0.0.1:5000
[collect]
#
@ -429,20 +407,8 @@
# From cloudkitty.common.config
#
# OpenStack username. (string value)
#username =
# OpenStack password. (string value)
#password =
# OpenStack tenant. (string value)
#tenant =
# OpenStack region. (string value)
#region =
# OpenStack auth URL. (string value)
#url =
# Keystone version to use. (string value)
#keystone_version = 2
[matchmaker_redis]