Neutron pass-through

Network federation preliminary work

Depends-On: I9dcd30fe6669bdf570149ed317b16005c21f6291
Change-Id: Ic5e694259544c2c6ffe717d560fc18391f64a1a0
This commit is contained in:
Jeremy Freudberg 2017-07-10 18:33:16 +00:00
parent 4e18ef34c9
commit c23c48fe8e
7 changed files with 60 additions and 12 deletions

View File

@ -47,11 +47,15 @@ function configure_mixmatch {
fi fi
iniset $MIXMATCH_CONF sp_default volume_endpoint $CINDER_URL iniset $MIXMATCH_CONF sp_default volume_endpoint $CINDER_URL
iniset $MIXMATCH_CONF sp_default network_endpoint \
"$NEUTRON_SERVICE_PROTOCOL://$NEUTRON_SERVICE_HOST:$NEUTRON_SERVICE_PORT"
iniset $MIXMATCH_CONF sp_default enabled_services "image, volume, network"
run_process mixmatch "$MIXMATCH_DIR/run_proxy.sh" run_process mixmatch "$MIXMATCH_DIR/run_proxy.sh"
# Nova # Nova
iniset $NOVA_CONF glance api_servers "$MIXMATCH_SERVICE_PROTOCOL://$HOST_IP:$MIXMATCH_SERVICE_PORT/image" iniset $NOVA_CONF glance api_servers "$MIXMATCH_SERVICE_PROTOCOL://$HOST_IP:$MIXMATCH_SERVICE_PORT/image"
iniset $NOVA_CONF neutron url "$MIXMATCH_SERVICE_PROTOCOL://$HOST_IP:$MIXMATCH_SERVICE_PORT/network"
# Cinder # Cinder
iniset $CINDER_CONF DEFAULT glance_api_servers \ iniset $CINDER_CONF DEFAULT glance_api_servers \
@ -75,6 +79,7 @@ function register_mixmatch {
openstack endpoint delete `get_endpoint_ids volume` openstack endpoint delete `get_endpoint_ids volume`
openstack endpoint delete `get_endpoint_ids volumev2` openstack endpoint delete `get_endpoint_ids volumev2`
openstack endpoint delete `get_endpoint_ids volumev3` openstack endpoint delete `get_endpoint_ids volumev3`
openstack endpoint delete `get_endpoint_ids network`
get_or_create_endpoint \ get_or_create_endpoint \
"image" \ "image" \
@ -103,5 +108,12 @@ function register_mixmatch {
"http://$HOST_IP:5001/volume/v3/\$(project_id)s" \ "http://$HOST_IP:5001/volume/v3/\$(project_id)s" \
"http://$HOST_IP:5001/volume/v3/\$(project_id)s" \ "http://$HOST_IP:5001/volume/v3/\$(project_id)s" \
"http://$HOST_IP:5001/volume/v3/\$(project_id)s" "http://$HOST_IP:5001/volume/v3/\$(project_id)s"
get_or_create_endpoint \
"network" \
"$REGION_NAME" \
"http://$HOST_IP:5001/network" \
"http://$HOST_IP:5001/network" \
"http://$HOST_IP:5001/network"
fi fi
} }

View File

@ -40,6 +40,10 @@ OPTS = [
cfg.ListOpt('volume_api_versions', cfg.ListOpt('volume_api_versions',
default=['v3.0', 'v2.0', 'v1.0'], default=['v3.0', 'v2.0', 'v1.0'],
help='List of supported volume api versions'), help='List of supported volume api versions'),
cfg.ListOpt('network_api_versions',
default=['v2.0'],
help='List of supported network api versions'),
] ]

View File

@ -38,6 +38,10 @@ SP_OPTS = [
default=None, default=None,
help="Volume Endpoint for Service Provider"), help="Volume Endpoint for Service Provider"),
cfg.StrOpt('network_endpoint',
default=None,
help='Network Endpoint for Service Provider'),
cfg.ListOpt('enabled_services', cfg.ListOpt('enabled_services',
default=['image', 'volume'], default=['image', 'volume'],
help="Services to enable for Service Provider") help="Services to enable for Service Provider")

View File

@ -46,7 +46,7 @@ def get_service(a):
return 'image' return 'image'
else: else:
service = a.pop(0) service = a.pop(0)
if service in ['image', 'volume']: if service in ['image', 'volume', 'network']:
return service return service
else: else:
abort(404) abort(404)
@ -260,7 +260,7 @@ class RequestHandler(object):
self.details['action'][0], self.details['action'][0],
self.details['service'], self.details['service'],
version=self.details['version'], version=self.details['version'],
params=request.args.to_dict(), params=dict(request.args),
path=request.base_url, path=request.base_url,
strip_details=self.strip_details), strip_details=self.strip_details),
200, 200,
@ -305,7 +305,7 @@ class RequestHandler(object):
This is because the id of the marker will only be present in one of This is because the id of the marker will only be present in one of
the service providers. the service providers.
""" """
args = user_args.copy() args = dict(user_args)
if CONF.aggregation: if CONF.aggregation:
args.pop('limit', None) args.pop('limit', None)
args.pop('marker', None) args.pop('marker', None)

View File

@ -18,6 +18,7 @@ import operator
from six.moves.urllib import parse from six.moves.urllib import parse
from mixmatch import config from mixmatch import config
from mixmatch import utils
from oslo_serialization import jsonutils from oslo_serialization import jsonutils
@ -39,6 +40,10 @@ def construct_url(service_provider, service_type,
url = '%s/%s' % (url, version) url = '%s/%s' % (url, version)
if project_id: if project_id:
url = '%s/%s' % (url, project_id) url = '%s/%s' % (url, project_id)
elif service_type == 'network':
url = conf.network_endpoint
if version:
url = '%s/%s' % (url, version)
if action: if action:
url = '%s/%s' % (url, os.path.join(*action)) url = '%s/%s' % (url, os.path.join(*action))
@ -50,12 +55,12 @@ def aggregate(responses, key, service_type, version=None,
params=None, path=None, strip_details=True): params=None, path=None, strip_details=True):
"""Combine responses from several clusters into one response.""" """Combine responses from several clusters into one response."""
if params: if params:
limit = int(params.get('limit', 0)) limit = int(utils.flatten(params.get('limit', 0)))
sort = params.get('sort', None) sort = utils.flatten(params.get('sort', None))
marker = params.get('marker', None) marker = utils.flatten(params.get('marker', None))
sort_key = params.get('sort_key', None) sort_key = utils.flatten(params.get('sort_key', None))
sort_dir = params.get('sort_dir', None) sort_dir = utils.flatten(params.get('sort_dir', None))
if sort and not sort_key: if sort and not sort_key:
sort_key, sort_dir = sort.split(':') sort_key, sort_dir = sort.split(':')
@ -108,14 +113,14 @@ def aggregate(responses, key, service_type, version=None,
# Inject the pagination URIs # Inject the pagination URIs
if start > 0: if start > 0:
params.pop('marker', None) params.pop('marker', None)
response['start'] = '%s?%s' % (path, parse.urlencode(params)) response['start'] = '%s?%s' % (path, parse.urlencode(params, True))
if end < last: if end < last:
params['marker'] = response[key][-1]['id'] params['marker'] = response[key][-1]['id']
if service_type == 'image': if service_type == 'image':
response['next'] = '%s?%s' % (path, parse.urlencode(params)) response['next'] = '%s?%s' % (path, parse.urlencode(params, True))
elif service_type == 'volume': elif service_type == 'volume':
response['volumes_links'] = [ response['volumes_links'] = [
{"href": '%s?%s' % (path, parse.urlencode(params)), {"href": '%s?%s' % (path, parse.urlencode(params, True)),
"rel": "next"} "rel": "next"}
] ]
@ -184,6 +189,22 @@ def list_api_versions(service_type, url):
api_versions.append(info) api_versions.append(info)
return json.dumps({'versions': api_versions}) return json.dumps({'versions': api_versions})
elif service_type == 'network':
supported_versions = CONF.network_api_versions
for version in supported_versions:
info = dict()
if version == supported_versions[0]:
info.update({'status': 'CURRENT'})
else:
info.update({'status': 'SUPPORTED'})
info.update({'id': version,
'links': [{'href': '%s/%s/' % (url, version[:-2]),
'rel': 'self'}]})
api_versions.append(info)
return json.dumps({'versions': api_versions})
else: else:
raise ValueError raise ValueError

View File

@ -37,5 +37,5 @@ fi
sudo chown -R jenkins:stack $BASE/new/tempest sudo chown -R jenkins:stack $BASE/new/tempest
sudo chown -R jenkins:stack /opt/stack/data/tempest sudo chown -R jenkins:stack /opt/stack/data/tempest
ostestr -r '(^tempest.api.compute|^tempest.api.image|^tempest.api.volume|^tempest.scenario)' \ ostestr -r '(^tempest.api.compute|^tempest.api.image|^tempest.api.volume|^tempest.api.network|^tempest.scenario)' \
--blacklist-file $BASE/new/mixmatch/mixmatch/tests/functional/tempest_blacklist.txt --blacklist-file $BASE/new/mixmatch/mixmatch/tests/functional/tempest_blacklist.txt

View File

@ -76,3 +76,10 @@ def pop_if_uuid(a):
return safe_pop(a) return safe_pop(a)
else: else:
return None return None
def flatten(item):
"""Return the first element if list-like, otherwise the item itself"""
if isinstance(item, list):
return item[0]
return item