343 lines
12 KiB
Python
343 lines
12 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_services
|
||
|
----------------------------------
|
||
|
|
||
|
Tests Keystone services commands.
|
||
|
"""
|
||
|
|
||
|
from testtools import matchers
|
||
|
|
||
|
from openstack.cloud.exc import OpenStackCloudException
|
||
|
from openstack.tests.unit import base
|
||
|
|
||
|
|
||
|
class CloudServices(base.TestCase):
|
||
|
def setUp(self, cloud_config_fixture='clouds.yaml'):
|
||
|
super(CloudServices, self).setUp(cloud_config_fixture)
|
||
|
|
||
|
def get_mock_url(
|
||
|
self,
|
||
|
service_type='identity',
|
||
|
interface='public',
|
||
|
resource='services',
|
||
|
append=None,
|
||
|
base_url_append='v3',
|
||
|
):
|
||
|
return super(CloudServices, self).get_mock_url(
|
||
|
service_type, interface, resource, append, base_url_append
|
||
|
)
|
||
|
|
||
|
def test_create_service_v3(self):
|
||
|
service_data = self._get_service_data(
|
||
|
name='a service', type='network', description='A test service'
|
||
|
)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='POST',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json=service_data.json_response_v3,
|
||
|
validate=dict(json={'service': service_data.json_request}),
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
|
||
|
service = self.cloud.create_service(
|
||
|
name=service_data.service_name,
|
||
|
service_type=service_data.service_type,
|
||
|
description=service_data.description,
|
||
|
)
|
||
|
self.assertThat(
|
||
|
service.name, matchers.Equals(service_data.service_name)
|
||
|
)
|
||
|
self.assertThat(service.id, matchers.Equals(service_data.service_id))
|
||
|
self.assertThat(
|
||
|
service.description, matchers.Equals(service_data.description)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
service.type, matchers.Equals(service_data.service_type)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_update_service_v3(self):
|
||
|
service_data = self._get_service_data(
|
||
|
name='a service', type='network', description='A test service'
|
||
|
)
|
||
|
request = service_data.json_request.copy()
|
||
|
request['enabled'] = False
|
||
|
resp = service_data.json_response_v3.copy()
|
||
|
resp['enabled'] = False
|
||
|
request.pop('description')
|
||
|
request.pop('name')
|
||
|
request.pop('type')
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={'services': [resp['service']]},
|
||
|
),
|
||
|
dict(
|
||
|
method='PATCH',
|
||
|
uri=self.get_mock_url(append=[service_data.service_id]),
|
||
|
status_code=200,
|
||
|
json=resp,
|
||
|
validate=dict(json={'service': request}),
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
service = self.cloud.update_service(
|
||
|
service_data.service_id, enabled=False
|
||
|
)
|
||
|
self.assertThat(
|
||
|
service.name, matchers.Equals(service_data.service_name)
|
||
|
)
|
||
|
self.assertThat(service.id, matchers.Equals(service_data.service_id))
|
||
|
self.assertThat(
|
||
|
service.description, matchers.Equals(service_data.description)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
service.type, matchers.Equals(service_data.service_type)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_list_services(self):
|
||
|
service_data = self._get_service_data()
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [service_data.json_response_v3['service']]
|
||
|
},
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
services = self.cloud.list_services()
|
||
|
self.assertThat(len(services), matchers.Equals(1))
|
||
|
self.assertThat(
|
||
|
services[0].id, matchers.Equals(service_data.service_id)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
services[0].name, matchers.Equals(service_data.service_name)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
services[0].type, matchers.Equals(service_data.service_type)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_get_service(self):
|
||
|
service_data = self._get_service_data()
|
||
|
service2_data = self._get_service_data()
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [
|
||
|
service_data.json_response_v3['service'],
|
||
|
service2_data.json_response_v3['service'],
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [
|
||
|
service_data.json_response_v3['service'],
|
||
|
service2_data.json_response_v3['service'],
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [
|
||
|
service_data.json_response_v3['service'],
|
||
|
service2_data.json_response_v3['service'],
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(method='GET', uri=self.get_mock_url(), status_code=400),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# Search by id
|
||
|
service = self.cloud.get_service(name_or_id=service_data.service_id)
|
||
|
self.assertThat(service.id, matchers.Equals(service_data.service_id))
|
||
|
|
||
|
# Search by name
|
||
|
service = self.cloud.get_service(name_or_id=service_data.service_name)
|
||
|
# test we are getting exactly 1 element
|
||
|
self.assertThat(service.id, matchers.Equals(service_data.service_id))
|
||
|
|
||
|
# Not found
|
||
|
service = self.cloud.get_service(name_or_id='INVALID SERVICE')
|
||
|
self.assertIs(None, service)
|
||
|
|
||
|
# Multiple matches
|
||
|
# test we are getting an Exception
|
||
|
self.assertRaises(
|
||
|
OpenStackCloudException,
|
||
|
self.cloud.get_service,
|
||
|
name_or_id=None,
|
||
|
filters={'type': 'type2'},
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_search_services(self):
|
||
|
service_data = self._get_service_data()
|
||
|
service2_data = self._get_service_data(type=service_data.service_type)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [
|
||
|
service_data.json_response_v3['service'],
|
||
|
service2_data.json_response_v3['service'],
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [
|
||
|
service_data.json_response_v3['service'],
|
||
|
service2_data.json_response_v3['service'],
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [
|
||
|
service_data.json_response_v3['service'],
|
||
|
service2_data.json_response_v3['service'],
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [
|
||
|
service_data.json_response_v3['service'],
|
||
|
service2_data.json_response_v3['service'],
|
||
|
]
|
||
|
},
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# Search by id
|
||
|
services = self.cloud.search_services(
|
||
|
name_or_id=service_data.service_id
|
||
|
)
|
||
|
# test we are getting exactly 1 element
|
||
|
self.assertThat(len(services), matchers.Equals(1))
|
||
|
self.assertThat(
|
||
|
services[0].id, matchers.Equals(service_data.service_id)
|
||
|
)
|
||
|
|
||
|
# Search by name
|
||
|
services = self.cloud.search_services(
|
||
|
name_or_id=service_data.service_name
|
||
|
)
|
||
|
# test we are getting exactly 1 element
|
||
|
self.assertThat(len(services), matchers.Equals(1))
|
||
|
self.assertThat(
|
||
|
services[0].name, matchers.Equals(service_data.service_name)
|
||
|
)
|
||
|
|
||
|
# Not found
|
||
|
services = self.cloud.search_services(name_or_id='!INVALID!')
|
||
|
self.assertThat(len(services), matchers.Equals(0))
|
||
|
|
||
|
# Multiple matches
|
||
|
services = self.cloud.search_services(
|
||
|
filters={'type': service_data.service_type}
|
||
|
)
|
||
|
# test we are getting exactly 2 elements
|
||
|
self.assertThat(len(services), matchers.Equals(2))
|
||
|
self.assertThat(
|
||
|
services[0].id, matchers.Equals(service_data.service_id)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
services[1].id, matchers.Equals(service2_data.service_id)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_delete_service(self):
|
||
|
service_data = self._get_service_data()
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [service_data.json_response_v3['service']]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='DELETE',
|
||
|
uri=self.get_mock_url(append=[service_data.service_id]),
|
||
|
status_code=204,
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={
|
||
|
'services': [service_data.json_response_v3['service']]
|
||
|
},
|
||
|
),
|
||
|
dict(
|
||
|
method='DELETE',
|
||
|
uri=self.get_mock_url(append=[service_data.service_id]),
|
||
|
status_code=204,
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# Delete by name
|
||
|
self.cloud.delete_service(name_or_id=service_data.service_name)
|
||
|
|
||
|
# Delete by id
|
||
|
self.cloud.delete_service(service_data.service_id)
|
||
|
|
||
|
self.assert_calls()
|