Merge "Add support for multi-region deployments"

This commit is contained in:
Zuul 2017-10-16 03:08:02 +00:00 committed by Gerrit Code Review
commit e42d8c6599
6 changed files with 63 additions and 7 deletions

View File

@ -27,6 +27,7 @@ class TestBaseStackUtils(tests.TestCase):
self.service_type = 'fake_service'
self.url = 'http://%s-net.com'
self.url_region_two = 'http://%s-net-two.com'
def test_url_for_good_v3(self):
# TODO(n.s.):Can't find v3 endpoint example. Fix it later.
@ -76,3 +77,33 @@ class TestBaseStackUtils(tests.TestCase):
self.assertRaises(exceptions.EndpointsNotFound, self.base.url_for,
service_catalog, self.service_type)
def test_url_for_good_v2_region(self):
service_catalog = (
[{"endpoints": [{"adminURL": self.url % 'admin',
"region": "RegionOne",
"internalURL": self.url % 'internal',
"publicURL": self.url % 'public'},
{"adminURL": self.url_region_two % 'admin',
"region": "RegionTwo",
"internalURL": self.url_region_two % 'internal',
"publicURL": self.url_region_two % 'public'}],
"type": "fake_service",
"name": "foo"}])
url = self.base.url_for(service_catalog, self.service_type,
os_region_name='RegionTwo')
self.assertEqual(url, self.url_region_two % 'public')
def test_url_for_no_endpoint_in_region(self):
service_catalog = (
[{"endpoints": [{"adminURL": self.url % 'admin',
"region": "RegionOne",
"internalURL": self.url % 'internal',
"publicURL": self.url % 'public'}],
"type": "fake_service",
"name": "foo"}])
self.assertRaises(exceptions.EndpointsNotFound, self.base.url_for,
service_catalog, self.service_type,
os_region_name='RegionTwo')

View File

@ -17,7 +17,8 @@ from blazar.manager import exceptions
def url_for(service_catalog, service_type, admin=False,
endpoint_interface=None):
endpoint_interface=None,
os_region_name=None):
"""Description
Gets url of the service to communicate through.
@ -40,6 +41,13 @@ def url_for(service_catalog, service_type, admin=False,
except KeyError:
raise exceptions.EndpointsNotFound(
"No endpoints for %s" % service['type'])
if os_region_name:
endpoints = [e for e in endpoints if e['region'] == os_region_name]
if not endpoints:
raise exceptions.EndpointsNotFound("No endpoints for %s in "
"region %s" %
(service['type'],
os_region_name))
try:
# if Keystone API v3 endpoints returned
endpoint = [e for e in endpoints

View File

@ -28,7 +28,17 @@ from blazar.utils.openstack import base
opts = [
cfg.StrOpt('identity_service',
default='identity',
help='Identity service to use.')
help='Identity service to use.'),
cfg.StrOpt('os_region_name',
default=None,
help="""
Region name of this node. This is used when picking the URL in the service
catalog.
Possible values:
* Any string representing region name
""")
]
keystone_opts = [
@ -94,12 +104,14 @@ class BlazarKeystoneClient(object):
kwargs.setdefault('tenant_name', ctx.project_name)
if not kwargs.get('auth_url'):
kwargs['auth_url'] = base.url_for(
ctx.service_catalog, CONF.identity_service)
ctx.service_catalog, CONF.identity_service,
os_region_name=CONF.os_region_name)
if not kwargs.get('trust_id'):
try:
kwargs.setdefault('endpoint', base.url_for(
ctx.service_catalog, CONF.identity_service,
endpoint_interface='admin'))
endpoint_interface='admin',
os_region_name=CONF.os_region_name))
except AttributeError:
raise manager_exceptions.NoManagementUrl()
if not kwargs.get('password'):

View File

@ -120,8 +120,10 @@ class BlazarNovaClient(object):
auth_token = auth_token or ctx.auth_token
endpoint_override = endpoint_override or \
base.url_for(ctx.service_catalog,
CONF.nova.compute_service)
auth_url = base.url_for(ctx.service_catalog, CONF.identity_service)
CONF.nova.compute_service,
os_region_name=CONF.os_region_name)
auth_url = base.url_for(ctx.service_catalog, CONF.identity_service,
os_region_name=CONF.os_region_name)
if auth_url is None:
auth_url = "%s://%s:%s/v3" % (CONF.os_auth_protocol,

View File

@ -44,12 +44,14 @@ function configure_blazar {
touch $BLAZAR_CONF_FILE
iniset $BLAZAR_CONF_FILE DEFAULT os_auth_version v3
iniset $BLAZAR_CONF_FILE DEFAULT os_auth_host $KEYSTONE_AUTH_HOST
iniset $BLAZAR_CONF_FILE DEFAULT os_auth_port 80
iniset $BLAZAR_CONF_FILE DEFAULT os_auth_prefix identity
iniset $BLAZAR_CONF_FILE DEFAULT os_admin_password $SERVICE_PASSWORD
iniset $BLAZAR_CONF_FILE DEFAULT os_admin_username blazar
iniset $BLAZAR_CONF_FILE DEFAULT os_admin_project_name $SERVICE_TENANT_NAME
iniset $BLAZAR_CONF_FILE DEFAULT identity_service $BLAZAR_IDENTITY_SERVICE_NAME
iniset $BLAZAR_CONF_FILE DEFAULT os_region_name $REGION_NAME
# Keystone authtoken
_blazar_setup_keystone $BLAZAR_CONF_FILE keystone_authtoken
@ -127,7 +129,7 @@ function create_blazar_cache_dir {
# create_blazar_aggregate_freepool() - Create a Nova aggregate to use as freepool (for host reservation)
function create_blazar_aggregate_freepool {
openstack aggregate create $BLAZAR_FREEPOOL_NAME
openstack --os-region $REGION_NAME aggregate create $BLAZAR_FREEPOOL_NAME
}
# create_blazar_accounts() - Set up common required Blazar accounts

View File

@ -121,6 +121,7 @@ Then edit */etc/blazar/blazar.conf* using the following example:
os_admin_password=<password>
os_admin_project_name=<project_name>
identity_service=<identity_service_name>
os_region_name=<region_name>
[manager]
plugins=physical.host.plugin,virtual.instance.plugin