From 0f4ca0abd26942d34b97e63aa5071b1b8cecc066 Mon Sep 17 00:00:00 2001 From: hosingh000 Date: Mon, 13 May 2019 12:43:25 -0700 Subject: [PATCH] SUpport for add group Region Change-Id: Ic46046bda95d827e04425e35ba4fefa815255518 --- .../cms_rest/logic/group_logic.py | 50 ++++++ orm/tests/unit/cms/test_group_regions.py | 170 ++++++++++++++++++ 2 files changed, 220 insertions(+) create mode 100755 orm/tests/unit/cms/test_group_regions.py diff --git a/orm/services/customer_manager/cms_rest/logic/group_logic.py b/orm/services/customer_manager/cms_rest/logic/group_logic.py index 4a0bafc0..91fa4e5c 100755 --- a/orm/services/customer_manager/cms_rest/logic/group_logic.py +++ b/orm/services/customer_manager/cms_rest/logic/group_logic.py @@ -15,6 +15,7 @@ from orm.services.customer_manager.cms_rest.model.GroupModels import ( GroupResultWrapper, GroupSummary, GroupSummaryResponse, + RegionResultWrapper, RoleResultWrapper, UserResultWrapper) @@ -279,6 +280,55 @@ class GroupLogic(object): datamanager.rollback() raise + def add_regions(self, group_id, regions, transaction_id): + datamanager = DataManager() + group_region = datamanager.get_record('groups_region') + try: + sql_group = datamanager.get_group_by_uuid_or_name(group_id) + if sql_group is None: + raise ErrorStatus( + 404, + "group with id {} does not exist".format(group_id)) + default_users = [] + + self.add_regions_to_db(regions, group_id, datamanager, + default_users) + + datamanager.commit() + + datamanager.session.expire(sql_group) + + sql_group = datamanager.get_group_by_uuid_or_name(group_id) + + group_dict = sql_group.get_proxy_dict() + + for region in group_dict["regions"]: + new_region = next((r for r in regions + if r.name == region["name"]), None) + if new_region: + region["action"] = "create" + else: + region["action"] = "modify" + + timestamp = utils.get_time_human() + RdsProxy.send_group_dict(group_dict, transaction_id, "POST") + + base_link = '{0}{1}/'.format(conf.server.host_ip, + request.path) + + result_regions = [{'id': region.name, 'added': timestamp, + 'links': {'self': base_link + region.name}} for + region in regions] + region_result_wrapper = RegionResultWrapper( + transaction_id=transaction_id, regions=result_regions) + + return region_result_wrapper + except Exception as exp: + datamanager.rollback() + raise + finally: + datamanager.close() + def delete_region(self, group_id, region_id, transaction_id, on_success_by_rds, force_delete): datamanager = DataManager() diff --git a/orm/tests/unit/cms/test_group_regions.py b/orm/tests/unit/cms/test_group_regions.py new file mode 100755 index 00000000..dd2959bf --- /dev/null +++ b/orm/tests/unit/cms/test_group_regions.py @@ -0,0 +1,170 @@ +import mock +import requests + +from wsme.exc import ClientSideError + +from orm.services.customer_manager.cms_rest.controllers.v1.orm.group \ + import regions +from orm.services.customer_manager.cms_rest.logic.error_base import ErrorStatus +from orm.services.customer_manager.cms_rest.model import GroupModels +from orm.tests.unit.cms import FunctionalTest + +group_logic_mock = None + + +class TestRegionController(FunctionalTest): + def setUp(self): + FunctionalTest.setUp(self) + + regions.authentication = mock.MagicMock() + + regions.GroupLogic = get_mock_group_logic + + regions.GroupLogic.return_error = 0 + + regions.utils = mock.MagicMock() + regions.utils.make_transid.return_value = 'some_trans_id' + regions.utils.audit_trail.return_value = None + regions.utils.make_uuid.return_value = 'some_uuid' + + regions.err_utils = mock.MagicMock() + + def tearDown(self): + FunctionalTest.tearDown(self) + + def test_add_regions(self): + # given + requests.post = mock.MagicMock(return_value=ResponseMock(200)) + + # when + response = self.app.post_json('/v1/orm/groups/{group id}/regions/', + REGION_JSON) + + # assert + assert response.status_int == 200 + assert regions.utils.audit_trail.called + assert group_logic_mock.add_regions.called + + def test_add_regions_fail(self): + # given + requests.post = mock.MagicMock() + + regions.GroupLogic.return_error = 1 + + regions.err_utils.get_error = mock.MagicMock( + return_value=ClientSideError("blabla", 500)) + + # when + response = self.app.post_json('/v1/orm/groups/{group id}/regions/', + REGION_JSON, expect_errors=True) + + # assert + self.assertEqual(response.status_int, 500) + + def test_add_regions_fail_bad(self): + # given + requests.post = mock.MagicMock() + + regions.GroupLogic.return_error = 2 + + regions.err_utils.get_error = mock.MagicMock( + return_value=ClientSideError("blabla", 404)) + + # when + response = self.app.post_json('/v1/orm/groups/{group id}/regions/', + REGION_JSON, expect_errors=True) + + # assert + self.assertEqual(response.status_int, 404) + + @mock.patch.object(regions, 'request') + def test_delete_regions(self, request): + # given + requests.delete = mock.MagicMock(return_value=ResponseMock(200)) + request.headers = {'X-RANGER-Requester': "rds_resource_service_proxy"} + # when + response = self.app.delete( + '/v1/orm/groups/{group id}/regions/{region_id}') + + # assert + assert response.status_int == 204 + assert regions.utils.audit_trail.called + assert group_logic_mock.delete_region.called + + def test_delete_regions_fail_bad(self): + # given + requests.delete = mock.MagicMock() + + regions.GroupLogic.return_error = 1 + + regions.err_utils.get_error = mock.MagicMock( + return_value=ClientSideError("blabla", 500)) + + # when + response = self.app.delete( + '/v1/orm/groups/{group id}/regions/{region_id}', + expect_errors=True) + + # assert + self.assertEqual(response.status_int, 500) + + @mock.patch.object(regions, 'request') + def test_delete_regions_fail(self, request): + # given + requests.delete = mock.MagicMock() + + regions.GroupLogic.return_error = 2 + request.headers = {'X-RANGER-Requester': "rds_resource_service_proxy"} + regions.err_utils.get_error = mock.MagicMock( + return_value=ClientSideError("blabla", 404)) + + # when + response = self.app.delete( + '/v1/orm/groups/{group id}/regions/{region_id}', + expect_errors=True) + + # assert + self.assertEqual(response.status_int, 404) + + def test_get(self): + # given + requests.get = mock.MagicMock(return_value=ResponseMock(200)) + + # when + response = self.app.get('/v1/orm/groups/some_id/regions/some_id') + + # assert + assert response.status_int == 200 + + +def get_mock_group_logic(): + global group_logic_mock + group_logic_mock = mock.MagicMock() + + if regions.GroupLogic.return_error == 0: + res = GroupModels.RegionResultWrapper(transaction_id='1', regions=[]) + group_logic_mock.add_regions.return_value = res + + elif regions.CustomerLogic.return_error == 1: + group_logic_mock.add_regions.side_effect = SystemError() + group_logic_mock.delete_region.side_effect = SystemError() + + else: + group_logic_mock.add_regions.side_effect = ErrorStatus(status_code=404) + group_logic_mock.delete_region.side_effect = ErrorStatus( + status_code=404) + + return group_logic_mock + + +class ResponseMock: + def __init__(self, status_code=200): + self.status_code = status_code + + +REGION_JSON = [ + { + "name": "SAN1", + "type": "single", + } +]