119 lines
4.0 KiB
Python
119 lines
4.0 KiB
Python
import fixtures
|
|
import mock
|
|
import testscenarios
|
|
|
|
from fuel_ccp.tests import base
|
|
from fuel_ccp.validation import base as base_validation
|
|
from fuel_ccp.validation import deploy as deploy_validation
|
|
from fuel_ccp.validation import service as service_validation
|
|
|
|
|
|
COMPONENTS_MAP = {
|
|
'service1': {
|
|
'some_field': True
|
|
},
|
|
'service2': {
|
|
'another_field': False
|
|
},
|
|
'service3': {
|
|
'new_field': None
|
|
}
|
|
}
|
|
|
|
|
|
class TestBaseValidation(base.TestCase):
|
|
def test_validate_components_names(self):
|
|
# validations succeeded
|
|
base_validation.validate_components_names(
|
|
{'service1'}, COMPONENTS_MAP)
|
|
|
|
base_validation.validate_components_names(
|
|
{'service1', 'service2'}, COMPONENTS_MAP)
|
|
|
|
# validations failed
|
|
self.assertRaisesRegexp(
|
|
RuntimeError,
|
|
"Following components do not match any definitions: srv3",
|
|
base_validation.validate_components_names,
|
|
{'srv3'}, COMPONENTS_MAP)
|
|
|
|
self.assertRaisesRegexp(
|
|
RuntimeError,
|
|
"Following components do not match any definitions: service4",
|
|
base_validation.validate_components_names,
|
|
{'service1', 'service4'}, COMPONENTS_MAP)
|
|
|
|
|
|
class TestDeployValidation(base.TestCase):
|
|
@mock.patch('fuel_ccp.common.utils.get_deployed_components')
|
|
@mock.patch('fuel_ccp.dependencies.get_deps')
|
|
def test_validate_requested_components(self, m_get_deps, m_get_deployed):
|
|
# validations succeeded
|
|
# no dependencies and nothing is deployed
|
|
m_get_deps.return_value = set()
|
|
m_get_deployed.return_value = set()
|
|
deploy_validation.validate_requested_components(
|
|
{'service1', 'service2'}, COMPONENTS_MAP)
|
|
|
|
# all dependencies requested
|
|
m_get_deps.return_value = {'service1'}
|
|
m_get_deployed.return_value = set()
|
|
deploy_validation.validate_requested_components(
|
|
{'service1', 'service2'}, COMPONENTS_MAP)
|
|
|
|
# all dependencies deployed
|
|
m_get_deps.return_value = {'service1', 'service2'}
|
|
m_get_deployed.return_value = {'service2'}
|
|
deploy_validation.validate_requested_components(
|
|
{'service1'}, COMPONENTS_MAP)
|
|
|
|
# some dependencies requested and some deployed
|
|
m_get_deps.return_value = {'service1', 'service2', 'service3'}
|
|
m_get_deployed.return_value = {'service3'}
|
|
deploy_validation.validate_requested_components(
|
|
{'service1', 'service2'}, COMPONENTS_MAP)
|
|
|
|
# validations failed
|
|
# requirements are not requested and are not deployed
|
|
m_get_deps.return_value = {'service1', 'service2'}
|
|
m_get_deployed.return_value = set()
|
|
self.assertRaisesRegexp(
|
|
RuntimeError,
|
|
'Following components are also required for successful '
|
|
'deployment: service2',
|
|
deploy_validation.validate_requested_components,
|
|
{'service1'}, COMPONENTS_MAP)
|
|
|
|
|
|
class TestServiceValidation(testscenarios.WithScenarios, base.TestCase):
|
|
scenarios = (
|
|
('incompatible', {'version': '0.3.0', 'raises': RuntimeError}),
|
|
('incompatible_major', {'version': '1.0.0', 'raises': RuntimeError}),
|
|
('compatible', {'version': '0.1.0'}),
|
|
('larget_but_compatible', {'version': '0.1.0'})
|
|
)
|
|
raises = None
|
|
|
|
def setUp(self):
|
|
super(TestServiceValidation, self).setUp()
|
|
self.useFixture(fixtures.MockPatch("fuel_ccp.dsl_version",
|
|
"0.2.0"))
|
|
|
|
def test_validation(self):
|
|
components_map = {
|
|
"test": {
|
|
"service_content": {
|
|
"dsl_version": self.version
|
|
}
|
|
}
|
|
}
|
|
if self.raises:
|
|
self.assertRaises(
|
|
self.raises, service_validation.validate_service_versions,
|
|
components_map, ['test']
|
|
)
|
|
else:
|
|
service_validation.validate_service_versions(
|
|
components_map, ['test']
|
|
)
|