383 lines
13 KiB
Python
383 lines
13 KiB
Python
|
# Copyright (c) 2015 Hewlett-Packard Development Company, L.P.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# 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.
|
||
|
|
||
|
"""
|
||
|
test_cloud_endpoints
|
||
|
----------------------------------
|
||
|
|
||
|
Tests Keystone endpoints commands.
|
||
|
"""
|
||
|
|
||
|
import uuid
|
||
|
|
||
|
from testtools import matchers
|
||
|
|
||
|
from openstack.tests.unit import base
|
||
|
|
||
|
|
||
|
class TestCloudEndpoints(base.TestCase):
|
||
|
def get_mock_url(
|
||
|
self,
|
||
|
service_type='identity',
|
||
|
interface='public',
|
||
|
resource='endpoints',
|
||
|
append=None,
|
||
|
base_url_append='v3',
|
||
|
):
|
||
|
return super(TestCloudEndpoints, self).get_mock_url(
|
||
|
service_type, interface, resource, append, base_url_append
|
||
|
)
|
||
|
|
||
|
def _dummy_url(self):
|
||
|
return 'https://%s.example.com/' % uuid.uuid4().hex
|
||
|
|
||
|
def test_create_endpoint_v3(self):
|
||
|
service_data = self._get_service_data()
|
||
|
public_endpoint_data = self._get_endpoint_v3_data(
|
||
|
service_id=service_data.service_id,
|
||
|
interface='public',
|
||
|
url=self._dummy_url(),
|
||
|
)
|
||
|
public_endpoint_data_disabled = self._get_endpoint_v3_data(
|
||
|
service_id=service_data.service_id,
|
||
|
interface='public',
|
||
|
url=self._dummy_url(),
|
||
|
enabled=False,
|
||
|
)
|
||
|
admin_endpoint_data = self._get_endpoint_v3_data(
|
||
|
service_id=service_data.service_id,
|
||
|
interface='admin',
|
||
|
url=self._dummy_url(),
|
||
|
region=public_endpoint_data.region_id,
|
||
|
)
|
||
|
internal_endpoint_data = self._get_endpoint_v3_data(
|
||
|
service_id=service_data.service_id,
|
||
|
interface='internal',
|
||
|
url=self._dummy_url(),
|
||
|
region=public_endpoint_data.region_id,
|
||
|
)
|
||
|
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(resource='services'),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [service_data.json_response_v3['service']]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='POST',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json=public_endpoint_data_disabled.json_response,
|
||
|
validate=dict(
|
||
|
json=public_endpoint_data_disabled.json_request
|
||
|
),
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(resource='services'),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [service_data.json_response_v3['service']]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='POST',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json=public_endpoint_data.json_response,
|
||
|
validate=dict(json=public_endpoint_data.json_request),
|
||
|
),
|
||
|
dict(
|
||
|
method='POST',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json=internal_endpoint_data.json_response,
|
||
|
validate=dict(json=internal_endpoint_data.json_request),
|
||
|
),
|
||
|
dict(
|
||
|
method='POST',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json=admin_endpoint_data.json_response,
|
||
|
validate=dict(json=admin_endpoint_data.json_request),
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
endpoints = self.cloud.create_endpoint(
|
||
|
service_name_or_id=service_data.service_id,
|
||
|
region=public_endpoint_data_disabled.region_id,
|
||
|
url=public_endpoint_data_disabled.url,
|
||
|
interface=public_endpoint_data_disabled.interface,
|
||
|
enabled=False,
|
||
|
)
|
||
|
|
||
|
# Test endpoint values
|
||
|
self.assertThat(
|
||
|
endpoints[0].id,
|
||
|
matchers.Equals(public_endpoint_data_disabled.endpoint_id),
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].url,
|
||
|
matchers.Equals(public_endpoint_data_disabled.url),
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].interface,
|
||
|
matchers.Equals(public_endpoint_data_disabled.interface),
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].region_id,
|
||
|
matchers.Equals(public_endpoint_data_disabled.region_id),
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].region_id,
|
||
|
matchers.Equals(public_endpoint_data_disabled.region_id),
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].is_enabled,
|
||
|
matchers.Equals(public_endpoint_data_disabled.enabled),
|
||
|
)
|
||
|
|
||
|
endpoints_2on3 = self.cloud.create_endpoint(
|
||
|
service_name_or_id=service_data.service_id,
|
||
|
region=public_endpoint_data.region_id,
|
||
|
public_url=public_endpoint_data.url,
|
||
|
internal_url=internal_endpoint_data.url,
|
||
|
admin_url=admin_endpoint_data.url,
|
||
|
)
|
||
|
|
||
|
# Three endpoints should be returned, public, internal, and admin
|
||
|
self.assertThat(len(endpoints_2on3), matchers.Equals(3))
|
||
|
|
||
|
# test keys and values are correct for each endpoint created
|
||
|
for result, reference in zip(
|
||
|
endpoints_2on3,
|
||
|
[
|
||
|
public_endpoint_data,
|
||
|
internal_endpoint_data,
|
||
|
admin_endpoint_data,
|
||
|
],
|
||
|
):
|
||
|
self.assertThat(result.id, matchers.Equals(reference.endpoint_id))
|
||
|
self.assertThat(result.url, matchers.Equals(reference.url))
|
||
|
self.assertThat(
|
||
|
result.interface, matchers.Equals(reference.interface)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
result.region_id, matchers.Equals(reference.region_id)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
result.is_enabled, matchers.Equals(reference.enabled)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_update_endpoint_v3(self):
|
||
|
service_data = self._get_service_data()
|
||
|
dummy_url = self._dummy_url()
|
||
|
endpoint_data = self._get_endpoint_v3_data(
|
||
|
service_id=service_data.service_id,
|
||
|
interface='admin',
|
||
|
enabled=False,
|
||
|
)
|
||
|
reference_request = endpoint_data.json_request.copy()
|
||
|
reference_request['endpoint']['url'] = dummy_url
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='PATCH',
|
||
|
uri=self.get_mock_url(append=[endpoint_data.endpoint_id]),
|
||
|
status_code=200,
|
||
|
json=endpoint_data.json_response,
|
||
|
validate=dict(json=reference_request),
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
endpoint = self.cloud.update_endpoint(
|
||
|
endpoint_data.endpoint_id,
|
||
|
service_name_or_id=service_data.service_id,
|
||
|
region=endpoint_data.region_id,
|
||
|
url=dummy_url,
|
||
|
interface=endpoint_data.interface,
|
||
|
enabled=False,
|
||
|
)
|
||
|
|
||
|
# test keys and values are correct
|
||
|
self.assertThat(
|
||
|
endpoint.id, matchers.Equals(endpoint_data.endpoint_id)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoint.service_id, matchers.Equals(service_data.service_id)
|
||
|
)
|
||
|
self.assertThat(endpoint.url, matchers.Equals(endpoint_data.url))
|
||
|
self.assertThat(
|
||
|
endpoint.interface, matchers.Equals(endpoint_data.interface)
|
||
|
)
|
||
|
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_list_endpoints(self):
|
||
|
endpoints_data = [self._get_endpoint_v3_data() for e in range(1, 10)]
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'endpoints': [
|
||
|
e.json_response['endpoint'] for e in endpoints_data
|
||
|
]
|
||
|
},
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
|
||
|
endpoints = self.cloud.list_endpoints()
|
||
|
# test we are getting exactly len(self.mock_endpoints) elements
|
||
|
self.assertThat(len(endpoints), matchers.Equals(len(endpoints_data)))
|
||
|
|
||
|
# test keys and values are correct
|
||
|
for i, ep in enumerate(endpoints_data):
|
||
|
self.assertThat(endpoints[i].id, matchers.Equals(ep.endpoint_id))
|
||
|
self.assertThat(
|
||
|
endpoints[i].service_id, matchers.Equals(ep.service_id)
|
||
|
)
|
||
|
self.assertThat(endpoints[i].url, matchers.Equals(ep.url))
|
||
|
self.assertThat(
|
||
|
endpoints[i].interface, matchers.Equals(ep.interface)
|
||
|
)
|
||
|
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_search_endpoints(self):
|
||
|
endpoints_data = [
|
||
|
self._get_endpoint_v3_data(region='region1') for e in range(0, 2)
|
||
|
]
|
||
|
endpoints_data.extend(
|
||
|
[self._get_endpoint_v3_data() for e in range(1, 8)]
|
||
|
)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'endpoints': [
|
||
|
e.json_response['endpoint'] for e in endpoints_data
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'endpoints': [
|
||
|
e.json_response['endpoint'] for e in endpoints_data
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'endpoints': [
|
||
|
e.json_response['endpoint'] for e in endpoints_data
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'endpoints': [
|
||
|
e.json_response['endpoint'] for e in endpoints_data
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# Search by id
|
||
|
endpoints = self.cloud.search_endpoints(
|
||
|
id=endpoints_data[-1].endpoint_id
|
||
|
)
|
||
|
# # test we are getting exactly 1 element
|
||
|
self.assertEqual(1, len(endpoints))
|
||
|
self.assertThat(
|
||
|
endpoints[0].id, matchers.Equals(endpoints_data[-1].endpoint_id)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].service_id,
|
||
|
matchers.Equals(endpoints_data[-1].service_id),
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].url, matchers.Equals(endpoints_data[-1].url)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
endpoints[0].interface,
|
||
|
matchers.Equals(endpoints_data[-1].interface),
|
||
|
)
|
||
|
|
||
|
# Not found
|
||
|
endpoints = self.cloud.search_endpoints(id='!invalid!')
|
||
|
self.assertEqual(0, len(endpoints))
|
||
|
|
||
|
# Multiple matches
|
||
|
endpoints = self.cloud.search_endpoints(
|
||
|
filters={'region_id': 'region1'}
|
||
|
)
|
||
|
# # test we are getting exactly 2 elements
|
||
|
self.assertEqual(2, len(endpoints))
|
||
|
|
||
|
# test we are getting the correct response for region/region_id compat
|
||
|
endpoints = self.cloud.search_endpoints(
|
||
|
filters={'region_id': 'region1'}
|
||
|
)
|
||
|
# # test we are getting exactly 2 elements, this is v3
|
||
|
self.assertEqual(2, len(endpoints))
|
||
|
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_delete_endpoint(self):
|
||
|
endpoint_data = self._get_endpoint_v3_data()
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'endpoints': [endpoint_data.json_response['endpoint']]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='DELETE',
|
||
|
uri=self.get_mock_url(append=[endpoint_data.endpoint_id]),
|
||
|
status_code=204,
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# Delete by id
|
||
|
self.cloud.delete_endpoint(id=endpoint_data.endpoint_id)
|
||
|
self.assert_calls()
|