Neutron pass-through
Network federation preliminary work Depends-On: I9dcd30fe6669bdf570149ed317b16005c21f6291 Change-Id: Ic5e694259544c2c6ffe717d560fc18391f64a1a0
This commit is contained in:
parent
4e18ef34c9
commit
c23c48fe8e
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue