From 018ca895e7ee9586266c329fadd62be58570cc66 Mon Sep 17 00:00:00 2001 From: liusheng Date: Thu, 3 Aug 2017 09:16:06 +0800 Subject: [PATCH] Add API tests for server group This change add some tests for server groups Partially Implements: bp server-group-api-extension Change-Id: Ib532d401a5e421a1bebe286a4eda83601a06c7fe --- .../functional/api/v1/test_server_groups.py | 79 +++++++++++++++++++ mogan/tests/tempest/api/test_server_groups.py | 75 ++++++++++++++++++ mogan/tests/tempest/service/client.py | 30 +++++++ mogan/tests/unit/objects/test_server_group.py | 75 ++++++++++++++++++ 4 files changed, 259 insertions(+) create mode 100644 mogan/tests/functional/api/v1/test_server_groups.py create mode 100644 mogan/tests/tempest/api/test_server_groups.py create mode 100644 mogan/tests/unit/objects/test_server_group.py diff --git a/mogan/tests/functional/api/v1/test_server_groups.py b/mogan/tests/functional/api/v1/test_server_groups.py new file mode 100644 index 00000000..dc9c4130 --- /dev/null +++ b/mogan/tests/functional/api/v1/test_server_groups.py @@ -0,0 +1,79 @@ +# Copyright 2017 Huawei Technologies Co., Ltd. +# +# 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 random +import six + +from mogan.tests.functional.api import v1 as v1_test + + +class TestServerGroup(v1_test.APITestV1): + def setUp(self): + super(TestServerGroup, self).setUp() + self.headers = self.gen_headers(self.context, roles="admin") + + def _prepare_server_groups(self): + server_groups = [] + for i in six.moves.xrange(4): + body = {"name": "test_sg" + str(i), + "policies": [random.choice(['anti-affinity', 'affinity'])]} + resp = self.post_json('/server_groups', body, + headers=self.headers, + status=201) + server_groups.append(resp.json) + return server_groups + + def test_server_group_post(self): + body = {"name": "test_server_group", + "policies": ['anti-affinity']} + resp = self.post_json( + '/server_groups', body, headers=self.headers, status=201) + resp = resp.json + self.assertEqual('test_server_group', resp['name']) + self.assertEqual(['anti-affinity'], resp['policies']) + self.assertEqual([], resp['members']) + self.assertIn('uuid', resp) + self.assertIn('links', resp) + self.assertIn('project_id', resp) + self.assertIn('user_id', resp) + self.assertIn('updated_at', resp) + self.assertIn('created_at', resp) + + def test_server_group_get_all(self): + self._prepare_server_groups() + resp = self.get_json('/server_groups', headers=self.headers) + self.assertEqual(4, len(resp['server_groups'])) + + def test_server_group_get_one(self): + sgs = self._prepare_server_groups() + resp = self.get_json('/server_groups/' + sgs[0]['uuid'], + headers=self.headers) + self.assertEqual('test_sg0', resp['name']) + self.assertEqual([], resp['members']) + self.assertIn('policies', resp) + self.assertIn('uuid', resp) + self.assertIn('links', resp) + self.assertIn('project_id', resp) + self.assertIn('user_id', resp) + self.assertIn('updated_at', resp) + self.assertIn('created_at', resp) + + def test_server_group_delete(self): + sgs = self._prepare_server_groups() + resp = self.get_json('/server_groups', headers=self.headers) + self.assertEqual(4, len(resp['server_groups'])) + self.delete('/server_groups/' + sgs[0]['uuid'], + headers=self.headers, status=204) + resp = self.get_json('/server_groups', headers=self.headers) + self.assertEqual(3, len(resp['server_groups'])) diff --git a/mogan/tests/tempest/api/test_server_groups.py b/mogan/tests/tempest/api/test_server_groups.py new file mode 100644 index 00000000..dcd18cbe --- /dev/null +++ b/mogan/tests/tempest/api/test_server_groups.py @@ -0,0 +1,75 @@ +# Copyright 2017 Huawei Technologies Co., Ltd. +# +# 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. +from tempest.lib import decorators +from tempest.lib import exceptions as lib_exc + +from mogan.tests.tempest.api import base + + +class BaremetalComputeAPIServerGroupsTest(base.BaseBaremetalComputeTest): + @classmethod + def resource_setup(cls): + super(BaremetalComputeAPIServerGroupsTest, cls).resource_setup() + sg_body = { + "name": "tempest-test-server_group", + "policies": ["anti-affinity"] + } + cls.server_group = cls.baremetal_compute_client.create_server_group( + **sg_body) + + @classmethod + def resource_cleanup(cls): + super(BaremetalComputeAPIServerGroupsTest, cls).resource_cleanup() + cls.baremetal_compute_client.delete_server_group( + cls.server_group['uuid']) + + @decorators.idempotent_id('7fd1b48d-54ad-4848-8653-02d313e99cb7') + def test_server_group_create(self): + sg_body = { + "name": "test-server-group", + "policies": ["anti-affinity"] + } + server_group = self.baremetal_compute_client.create_server_group( + **sg_body) + self.assertEqual("test-server-group", server_group['name']) + self.assertItemsEqual(["anti-affinity"], server_group['policies']) + self.baremetal_compute_client.delete_server_group(server_group['uuid']) + + @decorators.idempotent_id('e174bcb7-d7fc-467a-8343-a27dd8b2e13c') + def test_server_group_show(self): + server_group = self.baremetal_compute_client.show_server_group( + self.server_group['uuid']) + self.assertEqual("tempest-test-server_group", server_group['name']) + self.assertItemsEqual(["anti-affinity"], server_group['policies']) + + @decorators.idempotent_id('b71d790b-92da-4625-8fea-eb79ff4a7a57') + def test_server_groups_list(self): + server_groups = self.baremetal_compute_client.list_server_groups() + self.assertEqual(1, len(server_groups)) + server_group = server_groups[0] + self.assertEqual("tempest-test-server_group", server_group['name']) + self.assertItemsEqual(["anti-affinity"], server_group['policies']) + + @decorators.idempotent_id('d14b8011-ce6e-4454-b94d-06b5d5c1ed83') + def test_server_group_delete(self): + sg_body = { + "name": "test-server-group-delete", + "policies": ["anti-affinity"] + } + server_group = self.baremetal_compute_client.create_server_group( + **sg_body) + self.baremetal_compute_client.delete_server_group(server_group['uuid']) + self.assertRaises(lib_exc.NotFound, + self.baremetal_compute_client.show_server_group, + server_group['uuid']) diff --git a/mogan/tests/tempest/service/client.py b/mogan/tests/tempest/service/client.py index b6d2a088..88ef5414 100644 --- a/mogan/tests/tempest/service/client.py +++ b/mogan/tests/tempest/service/client.py @@ -264,6 +264,36 @@ class BaremetalComputeClient(rest_client.RestClient): body = self.deserialize(body) return rest_client.ResponseBody(resp, body) + def list_server_groups(self): + uri = '%s/server_groups' % self.uri_prefix + resp, body = self.get(uri) + self.expected_success(200, resp.status) + body = self.deserialize(body)['server_groups'] + return rest_client.ResponseBodyList(resp, body) + + def show_server_group(self, sg_uuid): + uri = '%s/server_groups/%s' % (self.uri_prefix, sg_uuid) + resp, body = self.get(uri) + self.expected_success(200, resp.status) + body = self.deserialize(body) + return rest_client.ResponseBody(resp, body) + + def delete_server_group(self, sg_uuid): + uri = "%s/server_groups/%s" % (self.uri_prefix, sg_uuid) + resp, body = self.delete(uri) + self.expected_success(204, resp.status) + if body: + body = self.deserialize(body) + return rest_client.ResponseBody(resp, body) + + def create_server_group(self, **kwargs): + uri = "%s/server_groups" % self.uri_prefix + body = self.serialize(kwargs) + resp, body = self.post(uri, body) + self.expected_success(201, resp.status) + body = self.deserialize(body) + return rest_client.ResponseBody(resp, body) + class BaremetalNodeClient(rest_client.RestClient): version = '1' diff --git a/mogan/tests/unit/objects/test_server_group.py b/mogan/tests/unit/objects/test_server_group.py new file mode 100644 index 00000000..a965d984 --- /dev/null +++ b/mogan/tests/unit/objects/test_server_group.py @@ -0,0 +1,75 @@ +# +# 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 mock +from oslo_context import context + +from mogan import objects +from mogan.tests.unit.db import base +from mogan.tests.unit.db import utils + + +class TestServerGroupObject(base.DbTestCase): + + def setUp(self): + super(TestServerGroupObject, self).setUp() + self.ctxt = context.get_admin_context() + self.fake_db_server_group = utils.get_test_server_group( + user_id=None, project_id=None) + + def test_get_by_uuid(self): + uuid = self.fake_db_server_group['uuid'] + with mock.patch.object(self.dbapi, 'server_group_get', + autospec=True) as mock_server_group_get: + mock_server_group_get.return_value = self.fake_db_server_group + server_group = objects.ServerGroup.get_by_uuid(self.context, uuid) + mock_server_group_get.assert_called_once_with(self.context, uuid) + self.assertEqual(self.context, server_group._context) + + def test_create(self): + with mock.patch.object(self.dbapi, 'server_group_create', + autospec=True) as mock_server_group_create: + mock_server_group_create.return_value = self.fake_db_server_group + server_group = objects.ServerGroup(self.context, + **self.fake_db_server_group) + values = server_group.obj_get_changes() + policies = values.pop('policies', None) + members = values.pop('members', None) + server_group.create() + mock_server_group_create.assert_called_once_with( + self.context, values, policies=policies, members=members) + self.assertEqual(self.fake_db_server_group['uuid'], + server_group['uuid']) + + def test_delete(self): + sg_uuid = self.fake_db_server_group['uuid'] + with mock.patch.object(self.dbapi, 'server_group_delete', + autospec=True) as mock_server_group_delete: + server_group = objects.ServerGroup(self.context, + **self.fake_db_server_group) + server_group.destroy() + mock_server_group_delete.assert_called_once_with( + self.context, sg_uuid) + + def test_save(self): + sg_uuid = self.fake_db_server_group['uuid'] + with mock.patch.object(self.dbapi, 'server_group_update', + autospec=True) as mock_server_group_update: + server_group = objects.ServerGroup(self.context, + **self.fake_db_server_group) + server_group.name = 'new_sg' + updates = server_group.obj_get_changes() + server_group.save(self.context) + mock_server_group_update.return_value = self.fake_db_server_group + mock_server_group_update.assert_called_once_with( + self.context, sg_uuid, updates)