276 lines
9.5 KiB
Python
276 lines
9.5 KiB
Python
|
# 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.
|
||
|
|
||
|
import uuid
|
||
|
|
||
|
import testtools
|
||
|
from testtools import matchers
|
||
|
|
||
|
import openstack.cloud
|
||
|
import openstack.cloud._utils
|
||
|
from openstack.tests.unit import base
|
||
|
|
||
|
|
||
|
class TestProject(base.TestCase):
|
||
|
def get_mock_url(
|
||
|
self,
|
||
|
service_type='identity',
|
||
|
interface='public',
|
||
|
resource=None,
|
||
|
append=None,
|
||
|
base_url_append=None,
|
||
|
v3=True,
|
||
|
qs_elements=None,
|
||
|
):
|
||
|
if v3 and resource is None:
|
||
|
resource = 'projects'
|
||
|
elif not v3 and resource is None:
|
||
|
resource = 'tenants'
|
||
|
if base_url_append is None and v3:
|
||
|
base_url_append = 'v3'
|
||
|
return super(TestProject, self).get_mock_url(
|
||
|
service_type=service_type,
|
||
|
interface=interface,
|
||
|
resource=resource,
|
||
|
append=append,
|
||
|
base_url_append=base_url_append,
|
||
|
qs_elements=qs_elements,
|
||
|
)
|
||
|
|
||
|
def test_create_project_v3(
|
||
|
self,
|
||
|
):
|
||
|
project_data = self._get_project_data(
|
||
|
description=self.getUniqueString('projectDesc'),
|
||
|
parent_id=uuid.uuid4().hex,
|
||
|
)
|
||
|
reference_req = project_data.json_request.copy()
|
||
|
reference_req['project']['enabled'] = True
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='POST',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json=project_data.json_response,
|
||
|
validate=dict(json=reference_req),
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
project = self.cloud.create_project(
|
||
|
name=project_data.project_name,
|
||
|
description=project_data.description,
|
||
|
domain_id=project_data.domain_id,
|
||
|
parent_id=project_data.parent_id,
|
||
|
)
|
||
|
self.assertThat(project.id, matchers.Equals(project_data.project_id))
|
||
|
self.assertThat(
|
||
|
project.name, matchers.Equals(project_data.project_name)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
project.description, matchers.Equals(project_data.description)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
project.domain_id, matchers.Equals(project_data.domain_id)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_delete_project_v3(self):
|
||
|
project_data = self._get_project_data(v3=False)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(append=[project_data.project_id]),
|
||
|
status_code=200,
|
||
|
json=project_data.json_response,
|
||
|
),
|
||
|
dict(
|
||
|
method='DELETE',
|
||
|
uri=self.get_mock_url(append=[project_data.project_id]),
|
||
|
status_code=204,
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
self.cloud.delete_project(project_data.project_id)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_update_project_not_found(self):
|
||
|
project_data = self._get_project_data()
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(append=[project_data.project_id]),
|
||
|
status_code=404,
|
||
|
),
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(
|
||
|
qs_elements=['name=' + project_data.project_id]
|
||
|
),
|
||
|
status_code=200,
|
||
|
json={'projects': []},
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
# NOTE(notmorgan): This test (and shade) does not represent a case
|
||
|
# where the project is in the project list but a 404 is raised when
|
||
|
# the PATCH is issued. This is a bug in shade and should be fixed,
|
||
|
# shade will raise an attribute error instead of the proper
|
||
|
# project not found exception.
|
||
|
with testtools.ExpectedException(
|
||
|
openstack.cloud.OpenStackCloudException,
|
||
|
"Project %s not found." % project_data.project_id,
|
||
|
):
|
||
|
self.cloud.update_project(project_data.project_id)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_update_project_v3(self):
|
||
|
project_data = self._get_project_data(
|
||
|
description=self.getUniqueString('projectDesc')
|
||
|
)
|
||
|
reference_req = project_data.json_request.copy()
|
||
|
# Remove elements not actually sent in the update
|
||
|
reference_req['project'].pop('domain_id')
|
||
|
reference_req['project'].pop('name')
|
||
|
reference_req['project'].pop('enabled')
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(
|
||
|
append=[project_data.project_id],
|
||
|
qs_elements=['domain_id=' + project_data.domain_id],
|
||
|
),
|
||
|
status_code=200,
|
||
|
json={'projects': [project_data.json_response['project']]},
|
||
|
),
|
||
|
dict(
|
||
|
method='PATCH',
|
||
|
uri=self.get_mock_url(append=[project_data.project_id]),
|
||
|
status_code=200,
|
||
|
json=project_data.json_response,
|
||
|
validate=dict(json=reference_req),
|
||
|
),
|
||
|
]
|
||
|
)
|
||
|
project = self.cloud.update_project(
|
||
|
project_data.project_id,
|
||
|
description=project_data.description,
|
||
|
domain_id=project_data.domain_id,
|
||
|
)
|
||
|
self.assertThat(project.id, matchers.Equals(project_data.project_id))
|
||
|
self.assertThat(
|
||
|
project.name, matchers.Equals(project_data.project_name)
|
||
|
)
|
||
|
self.assertThat(
|
||
|
project.description, matchers.Equals(project_data.description)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_list_projects_v3(self):
|
||
|
project_data = self._get_project_data(
|
||
|
description=self.getUniqueString('projectDesc')
|
||
|
)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(
|
||
|
resource=(
|
||
|
'projects?domain_id=%s' % project_data.domain_id
|
||
|
)
|
||
|
),
|
||
|
status_code=200,
|
||
|
json={'projects': [project_data.json_response['project']]},
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
projects = self.cloud.list_projects(project_data.domain_id)
|
||
|
self.assertThat(len(projects), matchers.Equals(1))
|
||
|
self.assertThat(
|
||
|
projects[0].id, matchers.Equals(project_data.project_id)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_list_projects_v3_kwarg(self):
|
||
|
project_data = self._get_project_data(
|
||
|
description=self.getUniqueString('projectDesc')
|
||
|
)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(
|
||
|
resource=(
|
||
|
'projects?domain_id=%s' % project_data.domain_id
|
||
|
)
|
||
|
),
|
||
|
status_code=200,
|
||
|
json={'projects': [project_data.json_response['project']]},
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
projects = self.cloud.list_projects(domain_id=project_data.domain_id)
|
||
|
self.assertThat(len(projects), matchers.Equals(1))
|
||
|
self.assertThat(
|
||
|
projects[0].id, matchers.Equals(project_data.project_id)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_list_projects_search_compat(self):
|
||
|
project_data = self._get_project_data(
|
||
|
description=self.getUniqueString('projectDesc')
|
||
|
)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(),
|
||
|
status_code=200,
|
||
|
json={'projects': [project_data.json_response['project']]},
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
projects = self.cloud.search_projects(project_data.project_id)
|
||
|
self.assertThat(len(projects), matchers.Equals(1))
|
||
|
self.assertThat(
|
||
|
projects[0].id, matchers.Equals(project_data.project_id)
|
||
|
)
|
||
|
self.assert_calls()
|
||
|
|
||
|
def test_list_projects_search_compat_v3(self):
|
||
|
project_data = self._get_project_data(
|
||
|
description=self.getUniqueString('projectDesc')
|
||
|
)
|
||
|
self.register_uris(
|
||
|
[
|
||
|
dict(
|
||
|
method='GET',
|
||
|
uri=self.get_mock_url(
|
||
|
resource=(
|
||
|
'projects?domain_id=%s' % project_data.domain_id
|
||
|
)
|
||
|
),
|
||
|
status_code=200,
|
||
|
json={'projects': [project_data.json_response['project']]},
|
||
|
)
|
||
|
]
|
||
|
)
|
||
|
projects = self.cloud.search_projects(domain_id=project_data.domain_id)
|
||
|
self.assertThat(len(projects), matchers.Equals(1))
|
||
|
self.assertThat(
|
||
|
projects[0].id, matchers.Equals(project_data.project_id)
|
||
|
)
|
||
|
self.assert_calls()
|