456 lines
14 KiB
Python
Executable File
456 lines
14 KiB
Python
Executable File
import copy
|
|
import requests
|
|
|
|
from orm.common.orm_common.injector import injector
|
|
from orm.services.flavor_manager.fms_rest.controllers.v1.orm.flavors import flavors
|
|
from orm.services.flavor_manager.fms_rest.data.wsme import models
|
|
from orm.services.flavor_manager.fms_rest.logic.error_base import ErrorStatus
|
|
from orm.tests.unit.fms import FunctionalTest
|
|
from orm.tests.unit.fms import test_utils
|
|
|
|
from mock import MagicMock, patch
|
|
|
|
utils_mock = None
|
|
flavor_logic_mock = None
|
|
|
|
return_error = 0
|
|
|
|
|
|
class TestFlavorController(FunctionalTest):
|
|
def setUp(self):
|
|
FunctionalTest.setUp(self)
|
|
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
injector.override_injected_dependency(('utils', get_utils_mock()))
|
|
|
|
def tearDown(self):
|
|
FunctionalTest.tearDown(self)
|
|
|
|
def test_create_flavor(self):
|
|
# given
|
|
requests.post = MagicMock(return_value=ResponseMock(201, "created"))
|
|
|
|
global return_error
|
|
return_error = 0
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON)
|
|
|
|
# assert
|
|
assert response.status_int == 201
|
|
assert utils_mock.audit_trail.called
|
|
assert flavor_logic_mock.create_flavor.called
|
|
|
|
def test_create_flavor_predefined_id(self):
|
|
# given
|
|
requests.post = MagicMock(return_value=ResponseMock(201, "created"))
|
|
test_json = copy.deepcopy(FLAVOR_JSON)
|
|
test_json['flavor']['id'] = 'test'
|
|
global return_error
|
|
return_error = 0
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
injector.override_injected_dependency(('utils', get_utils_mock()))
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/flavors', test_json)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 201)
|
|
|
|
def test_create_flavor_existing_predefined_id(self):
|
|
# given
|
|
requests.post = MagicMock(return_value=ResponseMock(201, "created"))
|
|
test_json = copy.deepcopy(FLAVOR_JSON)
|
|
test_json['flavor']['id'] = 'test'
|
|
global return_error
|
|
return_error = 1
|
|
injector.override_injected_dependency(('utils', get_utils_mock()))
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/flavors', test_json,
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
# self.assertEqual(response.status_int, 409)
|
|
|
|
def test_create_flavor_fail(self):
|
|
# given
|
|
global return_error
|
|
return_error = 1
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.post = MagicMock(return_value=ResponseMock(400, "failed"))
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 409)
|
|
|
|
# Following tests not providing consistent results
|
|
# @patch.object(flavors, 'di')
|
|
# def test_create_flavor_duplicate_entry(self, mock_di):
|
|
# my_mock = MagicMock()
|
|
# my_mock.create_flavor = MagicMock(
|
|
# side_effect=sqlalchemy.exc.IntegrityError(
|
|
# 'a', 'b',
|
|
# 'Duplicate entry \'flavor\' for key \'name_idx\''))
|
|
# mock_di.resolver.unpack = MagicMock(
|
|
# return_value=(my_mock, MagicMock(),))
|
|
#
|
|
# response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
|
|
# expect_errors=True)
|
|
#
|
|
# self.assertEqual(response.status_int, 409)
|
|
#
|
|
# @patch.object(flavors, 'di')
|
|
# def test_create_flavor_other_error(self, mock_di):
|
|
# my_mock = MagicMock()
|
|
# my_mock.create_flavor = MagicMock(
|
|
# side_effect=sqlalchemy.exc.IntegrityError(
|
|
# 'a', 'b',
|
|
# 'test \'flavor\' for key \'name_idx\''))
|
|
# mock_di.resolver.unpack = MagicMock(
|
|
# return_value=(my_mock, MagicMock(),))
|
|
#
|
|
# response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
|
|
# expect_errors=True)
|
|
#
|
|
# self.assertEqual(response.status_int, 409)
|
|
|
|
@patch.object(flavors, 'err_utils')
|
|
def test_create_flavor_bad_request(self, mock_err_utils):
|
|
# given
|
|
global return_error
|
|
return_error = 2
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.post = MagicMock(return_value=ResponseMock(400, "failed"))
|
|
mock_err_utils.get_error = test_utils.get_error
|
|
|
|
# when
|
|
response = self.app.post_json('/v1/orm/flavors', FLAVOR_JSON,
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 409)
|
|
|
|
def test_update_flavor(self):
|
|
# given
|
|
|
|
global return_error
|
|
return_error = 1
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.put = MagicMock()
|
|
|
|
# when
|
|
response = self.app.put_json('/v1/orm/flavors/some_id', FLAVOR_JSON,
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
# self.assertEqual(response.status_int, 405)
|
|
|
|
def test_get_flavor(self):
|
|
# given
|
|
|
|
global return_error
|
|
return_error = 0
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock(return_value=ResponseMock(200, "updated"))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors/some_id')
|
|
|
|
# assert
|
|
assert flavor_logic_mock.get_flavor_by_uuid_or_name.called
|
|
|
|
def test_get_flavor_fail(self):
|
|
# given
|
|
global return_error
|
|
return_error = 1
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock()
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors/some_id', expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
def test_get_flavor_bad_request(self):
|
|
# given
|
|
global return_error
|
|
return_error = 2
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock()
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors/some_id', expect_errors=True)
|
|
|
|
# assert
|
|
# self.assertEqual(response.status_int, 404)
|
|
|
|
# 8/8/16 Bug DE226006 - This bug fix is to return 405 for every attempt
|
|
# to delete flavor.
|
|
def test_delete_flavor(self):
|
|
# given
|
|
global return_error
|
|
return_error = 0
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.delete = MagicMock()
|
|
|
|
# when
|
|
response = self.app.delete('/v1/orm/flavors/some_id',
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 204)
|
|
|
|
def test_delete_flavor_fail(self):
|
|
# given
|
|
global return_error
|
|
return_error = 1
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.delete = MagicMock()
|
|
|
|
# when
|
|
response = self.app.delete('/v1/orm/flavors/some_id',
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
@patch.object(flavors, 'err_utils')
|
|
def test_delete_flavor_bad_request(self, mock_err_utils):
|
|
# given
|
|
global return_error
|
|
return_error = 2
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.delete = MagicMock()
|
|
mock_err_utils.get_error = test_utils.get_error
|
|
|
|
# when
|
|
response = self.app.delete('/v1/orm/flavors/some_id',
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 409)
|
|
|
|
def test_get_all_flavor(self):
|
|
# given
|
|
|
|
global return_error
|
|
return_error = 0
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock(return_value=ResponseMock(200, "updated"))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors?region=SAN1')
|
|
|
|
# assert
|
|
assert flavor_logic_mock.get_flavor_list_by_params.called
|
|
|
|
def test_get_all_flavor_fail(self):
|
|
# given
|
|
global return_error
|
|
return_error = 1
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock()
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors?region=region',
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
self.assertEqual(response.status_int, 500)
|
|
|
|
def test_get_by_vm_type(self):
|
|
# given
|
|
|
|
global return_error
|
|
return_error = 0
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock(return_value=ResponseMock(200, "updated"))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors?vm_type=TEST_VM_TYPE')
|
|
|
|
# assert
|
|
assert flavor_logic_mock.get_flavor_list_by_params.called
|
|
|
|
def test_get_by_vnf_name(self):
|
|
# given
|
|
|
|
global return_error
|
|
return_error = 0
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock(return_value=ResponseMock(200, "updated"))
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors?vnf_name=TEST_VNF_NAME')
|
|
|
|
# assert
|
|
assert flavor_logic_mock.get_flavor_list_by_params.called
|
|
|
|
def test_get_all_flavor_bad_request(self):
|
|
# given
|
|
global return_error
|
|
return_error = 2
|
|
injector.override_injected_dependency(
|
|
('flavor_logic', get_flavor_logic_mock()))
|
|
requests.get = MagicMock()
|
|
|
|
# when
|
|
response = self.app.get('/v1/orm/flavors?region=region',
|
|
expect_errors=True)
|
|
|
|
# assert
|
|
# self.assertEqual(response.status_int, 404)
|
|
|
|
|
|
class ResponseMock:
|
|
def __init__(self, status_code=200, message=""):
|
|
self.status_code = status_code
|
|
self.message = message
|
|
|
|
def json(self):
|
|
return {'uuid': 'test'}
|
|
|
|
|
|
def get_flavor_logic_mock():
|
|
global flavor_logic_mock
|
|
flavor_logic_mock = MagicMock()
|
|
|
|
if return_error == 0:
|
|
flavor_logic_mock.update_flavor.return_value = RET_FLAVOR_JSON
|
|
flavor_logic_mock.create_flavor.return_value = RET_FLAVOR_JSON
|
|
flavor_logic_mock.get_flavor_by_uuid.return_value = RET_FLAVOR_JSON
|
|
flavor_logic_mock.get_flavor_by_uuid_or_name.return_value = \
|
|
RET_FLAVOR_JSON
|
|
flavor_logic_mock.get_flavor_list_by_params.return_value = FILTER_RET
|
|
elif return_error == 1:
|
|
flavor_logic_mock.update_flavor.side_effect = SystemError()
|
|
flavor_logic_mock.create_flavor.side_effect = SystemError()
|
|
flavor_logic_mock.get_flavor_by_uuid.side_effect = SystemError()
|
|
flavor_logic_mock.get_flavor_by_uuid_or_name.side_effect = \
|
|
SystemError()
|
|
flavor_logic_mock.get_flavor_list_by_params.side_effect = SystemError()
|
|
flavor_logic_mock.delete_flavor_by_uuid.side_effect = SystemError()
|
|
else:
|
|
flavor_logic_mock.update_flavor.side_effect = ErrorStatus(
|
|
status_code=404)
|
|
flavor_logic_mock.create_flavor.side_effect = ErrorStatus(
|
|
status_code=404)
|
|
flavor_logic_mock.get_flavor_by_uuid.side_effect = ErrorStatus(
|
|
status_code=404)
|
|
flavor_logic_mock.get_flavor_list_by_params.side_effect = ErrorStatus(
|
|
status_code=404)
|
|
flavor_logic_mock.delete_flavor_by_uuid.side_effect = ErrorStatus(
|
|
status_code=409)
|
|
flavor_logic_mock.get_flavor_by_uuid_or_name.side_effect = ErrorStatus(
|
|
status_code=404)
|
|
|
|
return flavor_logic_mock
|
|
|
|
|
|
def get_utils_mock():
|
|
global utils_mock
|
|
utils_mock = MagicMock()
|
|
|
|
utils_mock.make_transid.return_value = 'some_trans_id'
|
|
utils_mock.audit_trail.return_value = None
|
|
utils_mock.make_uuid.return_value = 'some_uuid'
|
|
|
|
if return_error:
|
|
utils_mock.create_existing_uuid.side_effect = TypeError('test')
|
|
else:
|
|
utils_mock.create_existing_uuid.return_value = 'some_uuid'
|
|
|
|
return utils_mock
|
|
|
|
|
|
FLAVOR_JSON = {
|
|
"flavor": {
|
|
"description": "A standard 2GB Ram 2 vCPUs 50GB Disk, Flavor",
|
|
"series": "nv",
|
|
"ram": "05",
|
|
"vcpus": "2",
|
|
"disk": "50",
|
|
"swap": "1024",
|
|
"ephemeral": "0",
|
|
"extra-specs": {
|
|
"key1": "value1",
|
|
"key2": "value2",
|
|
"key3": "value3"
|
|
},
|
|
"options": {
|
|
"option2": "valueoption2",
|
|
"option3": "valueoption3",
|
|
"option1": "valueoption1"
|
|
},
|
|
"tag": {
|
|
"tags1": "valuetags1",
|
|
"tags2": "valuetags2",
|
|
"tags3": "valuetags3"
|
|
},
|
|
"regions": [
|
|
{"name": "0", "type": "single"},
|
|
{"name": "1", "type": "single"}
|
|
],
|
|
"visibility": "private",
|
|
"tenants": [
|
|
"4f7b9561-af8b-4cc0-87e2-319270dad49e",
|
|
"070be05e-26e2-4519-a46d-224cbf8558f4"
|
|
],
|
|
"status": "complete"
|
|
}
|
|
}
|
|
|
|
RET_FLAVOR_JSON = models.FlavorWrapper(
|
|
models.Flavor(
|
|
description="A standard 2GB Ram 2 vCPUs 50GB Disk, Flavor",
|
|
series="nv",
|
|
ram="05",
|
|
vcpus="2",
|
|
disk="50",
|
|
swap="1024",
|
|
ephemeral="0",
|
|
extra_specs={
|
|
"key1": "value1"
|
|
},
|
|
tag={
|
|
"tags1": "valuetags1"
|
|
},
|
|
options={
|
|
"option1": "valueoption1"
|
|
},
|
|
regions=[models.Region(name='1')],
|
|
visibility="private",
|
|
tenants=[
|
|
"4f7b9561-af8b-4cc0-87e2-319270dad49e",
|
|
"070be05e-26e2-4519-a46d-224cbf8558f4"
|
|
],
|
|
status="complete"
|
|
)
|
|
)
|
|
|
|
# FILTER_RET = [models.Flavor()]
|
|
|
|
FILTER_RET = models.FlavorListFullResponse()
|
|
FILTER_RET.flavors.append(
|
|
models.Flavor(name='1', id='1', description='1'))
|