
Updated pep8 requirements and fixed resulting codes to fix broken pep8 job. Updated docker image build process to use roles to ensure docker rather than using manual docker install process to fix broken ranger image job. Co-Authored-By: Jeremy Houser <jeremyhouser@protonmail.com> Co-Authored-By: Chi Lo <cl566n@att.com> Change-Id: I28df0a27e4b354dd53c17fbb1a9468cb7ff5bc16
472 lines
16 KiB
Python
Executable File
472 lines
16 KiB
Python
Executable File
import requests
|
|
import sqlalchemy
|
|
|
|
from orm.services.customer_manager.cms_rest.controllers.v1.orm.customer import root
|
|
from orm.services.customer_manager.cms_rest.logic.error_base import ErrorStatus
|
|
from orm.services.customer_manager.cms_rest.model import Models
|
|
from orm.tests.unit.cms import FunctionalTest, test_utils
|
|
from unittest import mock
|
|
from wsme.exc import ClientSideError
|
|
|
|
customer_logic_mock = None
|
|
|
|
|
|
class TestCustomerController(FunctionalTest):
|
|
def setUp(self):
|
|
FunctionalTest.setUp(self)
|
|
|
|
root.authentication = mock.MagicMock()
|
|
|
|
root.CustomerLogic = get_mock_customer_logic
|
|
root.CustomerLogic.return_error = 0
|
|
|
|
root.utils = mock.MagicMock()
|
|
root.utils.make_transid.return_value = 'some_trans_id'
|
|
root.utils.audit_trail.return_value = None
|
|
root.utils.create_or_validate_uuid.return_value = 'some_uuid'
|
|
|
|
root.err_utils = mock.MagicMock()
|
|
|
|
def tearDown(self):
|
|
FunctionalTest.tearDown(self)
|
|
|
|
def test_create_customer(self):
|
|
# given
|
|
requests.post = mock.MagicMock(return_value=ResponseMock(201))
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON)
|
|
|
|
# assert
|
|
assert response.status_int == 201
|
|
assert root.utils.audit_trail.called
|
|
assert root.utils.create_or_validate_uuid.called
|
|
assert customer_logic_mock.create_customer.called
|
|
|
|
def test_create_customer_fail(self):
|
|
# given
|
|
requests.post = mock.MagicMock()
|
|
|
|
root.CustomerLogic.return_error = 1
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
500))
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON, expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
@mock.patch.object(root, 'CustomerLogic')
|
|
def test_create_flavor_duplicate_name(self, mock_customerlogic):
|
|
my_mock = mock.MagicMock()
|
|
my_mock.create_customer = mock.MagicMock(
|
|
side_effect=sqlalchemy.exc.IntegrityError(
|
|
'a', 'b',
|
|
'Duplicate entry \'customer\' for key \'name_idx\''))
|
|
mock_customerlogic.return_value = my_mock
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
409))
|
|
|
|
response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON,
|
|
expect_errors=True)
|
|
self.assertEqual(response.status_int, 409)
|
|
|
|
def test_create_flavor_duplicate_uuid(self):
|
|
CUSTOMER_JSON['uuid'] = 'test'
|
|
create_or_validate_uuid = root.utils.create_or_validate_uuid
|
|
|
|
root.utils.create_or_validate_uuid = mock.MagicMock(side_effect=TypeError('test'))
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
409))
|
|
response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON,
|
|
expect_errors=True)
|
|
|
|
root.utils.ccreate_or_validate_uuid = create_or_validate_uuid
|
|
del CUSTOMER_JSON['uuid']
|
|
|
|
self.assertEqual(response.status_int, 409)
|
|
|
|
@mock.patch.object(root, 'CustomerLogic')
|
|
def test_create_flavor_other_error(self, mock_customerlogic):
|
|
my_mock = mock.MagicMock()
|
|
my_mock.create_customer = mock.MagicMock(
|
|
side_effect=sqlalchemy.exc.IntegrityError(
|
|
'a', 'b',
|
|
'test \'customer\' for key \'name_idx\''))
|
|
mock_customerlogic.return_value = my_mock
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
500))
|
|
|
|
response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON,
|
|
expect_errors=True)
|
|
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
def test_create_customer_fail_bad_request(self):
|
|
# given
|
|
requests.post = mock.MagicMock()
|
|
|
|
root.CustomerLogic.return_error = 2
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
404))
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON, expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 404)
|
|
|
|
def test_update_customer(self):
|
|
# given
|
|
requests.put = mock.MagicMock(return_value=ResponseMock(200))
|
|
|
|
# when
|
|
response = self.app.put_json('/v1/orm/customers/some_id', CUSTOMER_JSON)
|
|
|
|
# assert
|
|
assert response.status_int == 200
|
|
assert root.utils.audit_trail.called
|
|
assert customer_logic_mock.update_customer.called
|
|
|
|
def test_update_customer_fail(self):
|
|
# given
|
|
requests.put = mock.MagicMock()
|
|
|
|
root.CustomerLogic.return_error = 1
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
500))
|
|
|
|
# when
|
|
response = self.app.put_json('/v1/orm/customers/some_id', CUSTOMER_JSON, expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
def test_update_customer_fail_bad_request(self):
|
|
# given
|
|
requests.put = mock.MagicMock()
|
|
|
|
root.CustomerLogic.return_error = 2
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
404))
|
|
|
|
# when
|
|
response = self.app.put_json('/v1/orm/customers/some_id', CUSTOMER_JSON, expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 404)
|
|
|
|
def test_get_customer(self):
|
|
# given
|
|
requests.get = mock.MagicMock(return_value=ResponseMock(200))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/customers/some_id')
|
|
|
|
# assert
|
|
assert response.status_int == 200
|
|
assert customer_logic_mock.get_customer.called
|
|
|
|
def test_get_customer_fail_bad_request(self):
|
|
# given
|
|
requests.put = mock.MagicMock()
|
|
|
|
root.CustomerLogic.return_error = 1
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
500))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/customers/some_id', expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
assert customer_logic_mock.get_customer.called
|
|
|
|
def test_get_customer_fail(self):
|
|
# given
|
|
requests.put = mock.MagicMock()
|
|
|
|
root.CustomerLogic.return_error = 2
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
404))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/customers/some_id', expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 404)
|
|
assert customer_logic_mock.get_customer.called
|
|
|
|
def test_get_list_customer(self):
|
|
# given
|
|
requests.get = mock.MagicMock(return_value=ResponseMock(200))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/customers?region=SAN1')
|
|
|
|
# assert
|
|
assert customer_logic_mock.get_customer_list_by_criteria.called
|
|
|
|
def test_get_list_customer_fail(self):
|
|
# given
|
|
requests.get = mock.MagicMock()
|
|
root.CustomerLogic.return_error = 1
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
500))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/customers?region=region', expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
def test_get_list_customer_bad_request(self):
|
|
# given
|
|
requests.get = mock.MagicMock()
|
|
root.CustomerLogic.return_error = 2
|
|
|
|
root.err_utils.get_error = mock.MagicMock(return_value=ClientSideError("blabla",
|
|
500))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/customers?region=region', expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
@mock.patch.object(root, 'authentication')
|
|
def test_delete_customer_success(self, mock_auth):
|
|
response = self.app.delete('/v1/orm/customers/test')
|
|
self.assertEqual(response.status_int, 204)
|
|
|
|
@mock.patch.object(root, 'authentication')
|
|
def test_delete_customer_conflict(self, mock_auth):
|
|
root.CustomerLogic.return_error = 2
|
|
root.err_utils.get_error = test_utils.get_error
|
|
response = self.app.delete('/v1/orm/customers/test', expect_errors=True)
|
|
|
|
self.assertEqual(response.status_int, 409)
|
|
|
|
@mock.patch.object(root, 'authentication')
|
|
def test_delete_customer_error(self, mock_auth):
|
|
root.CustomerLogic.return_error = 1
|
|
root.err_utils.get_error = test_utils.get_error
|
|
response = self.app.delete('/v1/orm/customers/test', expect_errors=True)
|
|
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
|
|
def get_mock_customer_logic():
|
|
global customer_logic_mock
|
|
customer_logic_mock = mock.MagicMock()
|
|
|
|
if root.CustomerLogic.return_error == 0:
|
|
res = Models.CustomerResultWrapper(transaction_id='1',
|
|
id='1',
|
|
links={},
|
|
updated=None,
|
|
created='1')
|
|
|
|
list_res = Models.CustomerSummaryResponse()
|
|
list_res.customers.append(Models.CustomerSummary(name='1', id='1', description='1'))
|
|
|
|
customer_logic_mock.create_customer.return_value = res
|
|
customer_logic_mock.update_customer.return_value = res
|
|
customer_logic_mock.get_customer.return_value = Models.Customer(**RET_CUSTOMER_JSON)
|
|
customer_logic_mock.get_customer_list_by_criteria.return_value = list_res
|
|
|
|
elif root.CustomerLogic.return_error == 1:
|
|
customer_logic_mock.create_customer.side_effect = SystemError()
|
|
customer_logic_mock.update_customer.side_effect = SystemError()
|
|
customer_logic_mock.get_customer.side_effect = SystemError()
|
|
customer_logic_mock.delete_customer_by_uuid.side_effect = SystemError()
|
|
customer_logic_mock.get_customer_list_by_criteria.side_effect = SystemError()
|
|
|
|
else:
|
|
customer_logic_mock.create_customer.side_effect = ErrorStatus(status_code=404)
|
|
customer_logic_mock.update_customer.side_effect = ErrorStatus(status_code=404)
|
|
customer_logic_mock.get_customer.side_effect = ErrorStatus(status_code=404)
|
|
customer_logic_mock.delete_customer_by_uuid.side_effect = ErrorStatus(
|
|
status_code=409)
|
|
customer_logic_mock.get_customer_list_by_criteria.side_effect = ErrorStatus(status_code=404)
|
|
|
|
return customer_logic_mock
|
|
|
|
|
|
class ResponseMock:
|
|
def __init__(self, status_code=200):
|
|
self.status_code = status_code
|
|
|
|
|
|
CUSTOMER_JSON = {
|
|
"description": "Customer description",
|
|
"enabled": True,
|
|
"name": "myDomain",
|
|
"metadata": {
|
|
"my_server_name": "Apache1",
|
|
"ocx_cust": "123456889"
|
|
},
|
|
"regions": [
|
|
{
|
|
"name": "SAN1",
|
|
"type": "single",
|
|
"quotas": [
|
|
{
|
|
"compute": [
|
|
{
|
|
"instances": "10",
|
|
"key-pairs": "10",
|
|
"ram": "10"
|
|
}
|
|
],
|
|
"storage": [
|
|
{
|
|
"gigabytes": "10",
|
|
"snapshots": "10",
|
|
"volumes": "10"
|
|
}
|
|
],
|
|
"network": [
|
|
{
|
|
"floating-ips": "10",
|
|
"networks": "10",
|
|
"ports": "10",
|
|
"routers": "10",
|
|
"subnets": "10"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "AIC_MEDIUM",
|
|
"type": "group",
|
|
"quotas": [
|
|
{
|
|
"compute": [
|
|
{
|
|
"instances": "10",
|
|
"key-pairs": "10",
|
|
"ram": "10"
|
|
}
|
|
],
|
|
"storage": [
|
|
{
|
|
"gigabytes": "10",
|
|
"snapshots": "10",
|
|
"volumes": "10"
|
|
}
|
|
],
|
|
"network": [
|
|
{
|
|
"floating-ips": "10",
|
|
"networks": "10",
|
|
"ports": "10",
|
|
"routers": "10",
|
|
"subnets": "10"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"users": [
|
|
{
|
|
"id": "userId1",
|
|
"role": [
|
|
"admin",
|
|
"other"
|
|
]
|
|
},
|
|
{
|
|
"id": "userId2",
|
|
"role": [
|
|
"storage"
|
|
]
|
|
}
|
|
],
|
|
"defaultQuotas": [
|
|
{
|
|
"compute": [
|
|
{
|
|
"instances": "10",
|
|
"key-pairs": "10",
|
|
"ram": "10"
|
|
}
|
|
],
|
|
"storage": [
|
|
{
|
|
"gigabytes": "10",
|
|
"snapshots": "10",
|
|
"volumes": "10"
|
|
}
|
|
],
|
|
"network": [
|
|
{
|
|
"floating-ips": "10",
|
|
"networks": "10",
|
|
"ports": "10",
|
|
"routers": "10",
|
|
"subnets": "10"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
|
|
RET_CUSTOMER_JSON = {
|
|
"description": "Customer description",
|
|
"enabled": True,
|
|
"name": "myDomain",
|
|
"metadata": {
|
|
"my_server_name": "Apache1",
|
|
"ocx_cust": "123456889"
|
|
},
|
|
"regions": [Models.Region(**{"name": "SAN1", "type": "single", "quotas": [Models.Quota(**{
|
|
"compute": [Models.Compute(instances='1', key_pairs='1', ram='1',
|
|
vcpus='1', metadata_items='1',
|
|
floating_ips='1', fixed_ips='1',
|
|
server_groups='1', server_group_members='1')],
|
|
"storage": [Models.Storage(gigabytes='1', snapshots='1', volumes='1')],
|
|
"network": [Models.Network(floating_ips='1', networks='1', ports='1', routers='1', subnets='1',
|
|
security_groups='1', security_group_rules='1', health_monitors='1',
|
|
members='1', pools='1', nat_instance='1', route_table='1', vips='1',
|
|
loadbalancer='1', listener='1')]
|
|
})]})],
|
|
"users": [Models.User(
|
|
**{"id": "userId1", "role": ["admin", "other"]})
|
|
],
|
|
"defaultQuotas": [Models.Quota(**{
|
|
"compute": [Models.Compute(instances='1', key_pairs='1', ram='1',
|
|
vcpus='1', metadata_items='1',
|
|
floating_ips='1', fixed_ips='1',
|
|
server_groups='1', server_group_members='1')],
|
|
"storage": [Models.Storage(gigabytes='1', snapshots='1', volumes='1')],
|
|
"network": [Models.Network(floating_ips='1', networks='1', ports='1', routers='1', subnets='1',
|
|
security_groups='1', security_group_rules='1', health_monitors='1',
|
|
members='1', pools='1', nat_instance='1', route_table='1', vips='1',
|
|
loadbalancer='1', listener='1')]
|
|
})]
|
|
}
|
|
|
|
INVALID_CREATE_CUSTOMER_DATA = {
|
|
"descriptionInvalid": "Customer description",
|
|
"enabled": True,
|
|
"name": "myDomain",
|
|
"metadata": {
|
|
"my_server_name": "Apache1",
|
|
"ocx_cust": "123456889"
|
|
}
|
|
}
|