diff --git a/messages/v1/messages/old/config.configuration.server.updated.yml b/messages/v1/messages/config.configuration.server.updated.yml similarity index 100% rename from messages/v1/messages/old/config.configuration.server.updated.yml rename to messages/v1/messages/config.configuration.server.updated.yml diff --git a/tests/fake_services/__init__.py b/tests/fake_services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/fake_services/server/__init__.py b/tests/fake_services/server/__init__.py new file mode 100644 index 0000000..3e60340 --- /dev/null +++ b/tests/fake_services/server/__init__.py @@ -0,0 +1 @@ +from .server import Risotto diff --git a/tests/fake_services/server/server.py b/tests/fake_services/server/server.py new file mode 100644 index 0000000..9782c8d --- /dev/null +++ b/tests/fake_services/server/server.py @@ -0,0 +1,8 @@ +from risotto.controller import Controller +from risotto.register import register + + +class Risotto(Controller): + @register('v1.server.list', None) + async def server_list(self): + return [{'server_id': 3, 'servername': 'one', 'serverdescription': 'the first', 'servermodelid': 1}] diff --git a/tests/fake_services/servermodel/__init__.py b/tests/fake_services/servermodel/__init__.py new file mode 100644 index 0000000..058fd52 --- /dev/null +++ b/tests/fake_services/servermodel/__init__.py @@ -0,0 +1 @@ +from .servermodel import Risotto diff --git a/tests/fake_services/servermodel/servermodel.py b/tests/fake_services/servermodel/servermodel.py new file mode 100644 index 0000000..ad94b65 --- /dev/null +++ b/tests/fake_services/servermodel/servermodel.py @@ -0,0 +1,71 @@ +from risotto.controller import Controller +from risotto.register import register + +class Risotto(Controller): + @register('v1.servermodel.list', None) + async def servermodel_list(self, sourceid): + return [{'servermodelid': 1, + 'servermodelname': 'name1', + 'subreleasename': 'name1', + 'sourceid': 1, + 'servermodeldescription': 'description1'}, + {'servermodelid': 2, + 'servermodelname': 'name2', + 'subreleasename': 'name2', + 'sourceid': 2, + 'servermodeldescription': 'description2', + 'servermodelparentsid': [1]}] + + @register('v1.servermodel.describe', None) + async def servermodel_describe(self, inheritance, creolefuncs, servermodelid, schema, conffiles, resolvdepends, probes): + schema = """ + + + + + + + False + + + /etc/mailname + + + False + + + mailname + + + True + + + + basic + + + + + normal + + oui + non + mandatory + normal + non + + + normal + + + normal + + + normal + + + + + +""" + return {'servermodelid': 1, 'servermodelname': 'name', 'servermodeldescription': 'description', 'subreleasename': 'name', 'sourceid': 1, 'schema': schema, 'creolefuncs': ''} diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..6f818b1 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,335 @@ +from importlib import import_module +import pytest +from tiramisu import Storage, list_sessions, delete_session + +from risotto.context import Context +from risotto.services import load_services +from risotto.dispatcher import dispatcher +from risotto.config import DATABASE_DIR + + +def setup_module(module): + load_services(['config'], + validate=False) + config_module = dispatcher.get_service('config') + config_module.save_storage = Storage(engine='sqlite3', dir_database=DATABASE_DIR, name='test') + config_module.save_persistent = False + dispatcher.set_module('server', import_module(f'.server', 'fake_services')) + dispatcher.set_module('servermodel', import_module(f'.servermodel', 'fake_services')) + + +def setup_function(function): + config_module = dispatcher.get_service('config') + config_module.server = {} + config_module.servermodel = {} + + +def teardown_function(function): + # delete all sessions + config_module = dispatcher.get_service('config') + for session in list_sessions(storage=config_module.save_storage): + delete_session(storage=config_module.save_storage, session_id=session) + + +def get_fake_context(module_name): + risotto_context = Context() + risotto_context.username = 'test' + risotto_context.paths.append(f'{module_name}.on_join') + risotto_context.type = None + return risotto_context + + +@pytest.mark.asyncio +async def test_on_join(): + config_module = dispatcher.get_service('config') + assert config_module.servermodel == {} + assert config_module.server == {} + # + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + assert list(config_module.servermodel.keys()) == [1, 2] + assert list(config_module.server) == [3] + assert set(config_module.server[3]) == {'server', 'server_to_deploy', 'funcs_file'} + assert config_module.server[3]['funcs_file'] == 'cache/1.creolefuncs' + + +@pytest.mark.asyncio +async def test_server_created(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + assert list(config_module.server) == [3] + await dispatcher.publish('v1', + 'server.created', + fake_context, + server_id=4, + servername='name3', + serverdescription='description3', + servermodelid=2) + assert list(config_module.server) == [3, 4] + assert set(config_module.server[4]) == {'server', 'server_to_deploy', 'funcs_file'} + assert config_module.server[4]['funcs_file'] == 'cache/2.creolefuncs' + + +@pytest.mark.asyncio +async def test_server_deleted(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + assert list(config_module.server) == [3] + await dispatcher.publish('v1', + 'server.created', + fake_context, + server_id=4, + servername='name4', + serverdescription='description4', + servermodelid=2) + assert list(config_module.server) == [3, 4] + await dispatcher.publish('v1', + 'server.deleted', + fake_context, + server_id=4) + assert list(config_module.server) == [3] + + +@pytest.mark.asyncio +async def test_servermodel_created(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + assert list(config_module.servermodel) == [1, 2] + servermodel = {'servermodeid': 3, + 'servermodelname': 'name3'} + await dispatcher.publish('v1', + 'servermodel.created', + fake_context, + servermodelid=3, + servermodeldescription='name3', + subreleasename='2.7.0', + sourceid=1, + servermodelname='name3') + assert list(config_module.servermodel) == [1, 2, 3] + assert not list(config_module.servermodel[3].config.parents()) + + +@pytest.mark.asyncio +async def test_servermodel_herited_created(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + assert list(config_module.servermodel) == [1, 2] + await dispatcher.publish('v1', + 'servermodel.created', + fake_context, + servermodelid=3, + servermodelname='name3', + subreleasename='2.7.0', + sourceid=1, + servermodeldescription='name3', + servermodelparentsid=[1]) + assert list(config_module.servermodel) == [1, 2, 3] + assert len(list(config_module.servermodel[3].config.parents())) == 1 + + +@pytest.mark.asyncio +async def test_servermodel_multi_herited_created(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + assert list(config_module.servermodel) == [1, 2] + await dispatcher.publish('v1', + 'servermodel.created', + fake_context, + servermodelid=3, + servermodelname='name3', + subreleasename='2.7.0', + sourceid=1, + servermodeldescription='name3', + servermodelparentsid=[1, 2]) + assert list(config_module.servermodel) == [1, 2, 3] + assert len(list(config_module.servermodel[3].config.parents())) == 2 + + +@pytest.mark.asyncio +async def test_servermodel_updated_not_exists(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + assert list(config_module.servermodel) == [1, 2] + await dispatcher.publish('v1', + 'servermodel.updated', + fake_context, + servermodelid=3, + servermodelname='name3', + subreleasename='2.7.0', + sourceid=1, + servermodeldescription='name3', + servermodelparentsid=[1, 2]) + assert list(config_module.servermodel) == [1, 2, 3] + assert len(list(config_module.servermodel[3].config.parents())) == 2 + + +@pytest.mark.asyncio +async def test_servermodel_updated1(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + assert list(config_module.servermodel) == [1, 2] + metaconfig1 = config_module.servermodel[1] + metaconfig2 = config_module.servermodel[2] + mixconfig1 = next(metaconfig1.config.list()) + mixconfig2 = next(metaconfig2.config.list()) + assert len(list(metaconfig1.config.parents())) == 0 + assert len(list(metaconfig2.config.parents())) == 1 + assert len(list(mixconfig1.config.list())) == 1 + assert len(list(mixconfig2.config.list())) == 0 + # + await dispatcher.publish('v1', + 'servermodel.updated', + fake_context, + servermodelid=1, + servermodelname='name1-1', + subreleasename='2.7.0', + sourceid=1, + servermodeldescription='name1-1') + assert set(config_module.servermodel) == {1, 2} + assert config_module.servermodel[1].information.get('servermodel_name') == 'name1-1' + assert metaconfig1 != config_module.servermodel[1] + assert metaconfig2 == config_module.servermodel[2] + metaconfig1 = config_module.servermodel[1] + assert mixconfig1 != next(metaconfig1.config.list()) + mixconfig1 = next(metaconfig1.config.list()) + # + assert len(list(metaconfig1.config.parents())) == 0 + assert len(list(metaconfig2.config.parents())) == 1 + assert len(list(mixconfig1.config.list())) == 1 + assert len(list(mixconfig2.config.list())) == 0 + + +@pytest.mark.asyncio +async def test_servermodel_updated2(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # create a new servermodel + assert list(config_module.servermodel) == [1, 2] + mixconfig1 = next(config_module.servermodel[1].config.list()) + mixconfig2 = next(config_module.servermodel[2].config.list()) + assert len(list(mixconfig1.config.list())) == 1 + assert len(list(mixconfig2.config.list())) == 0 + await dispatcher.publish('v1', + 'servermodel.created', + fake_context, + servermodelid=3, + servermodelname='name3', + subreleasename='2.7.0', + sourceid=1, + servermodeldescription='name3', + servermodelparentsid=[1]) + assert list(config_module.servermodel) == [1, 2, 3] + assert len(list(config_module.servermodel[3].config.parents())) == 1 + assert config_module.servermodel[3].information.get('servermodel_name') == 'name3' + assert len(list(mixconfig1.config.list())) == 2 + assert len(list(mixconfig2.config.list())) == 0 + # + await dispatcher.publish('v1', + 'servermodel.updated', + fake_context, + servermodelid=3, + servermodelname='name3-1', + subreleasename='2.7.0', + sourceid=1, + servermodeldescription='name3-1', + servermodelparentsid=[1, 2]) + assert list(config_module.servermodel) == [1, 2, 3] + assert config_module.servermodel[3].information.get('servermodel_name') == 'name3-1' + assert len(list(mixconfig1.config.list())) == 2 + assert len(list(mixconfig2.config.list())) == 1 + + +@pytest.mark.asyncio +async def test_servermodel_updated_config(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + config_module.servermodel[1].property.read_write() + assert config_module.servermodel[1].option('creole.general.mode_conteneur_actif').value.get() == 'non' + config_module.servermodel[1].option('creole.general.mode_conteneur_actif').value.set('oui') + assert config_module.servermodel[1].option('creole.general.mode_conteneur_actif').value.get() == 'oui' + # + await dispatcher.publish('v1', + 'servermodel.updated', + fake_context, + servermodelid=1, + servermodelname='name1-1', + subreleasename='2.7.0', + sourceid=1, + servermodeldescription='name1-1') + assert config_module.servermodel[1].option('creole.general.mode_conteneur_actif').value.get() == 'oui' + + +@pytest.mark.asyncio +async def test_server_configuration_get(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + config_module.server[3]['server_to_deploy'].property.read_write() + assert config_module.server[3]['server_to_deploy'].option('creole.general.mode_conteneur_actif').value.get() == 'non' + config_module.server[3]['server_to_deploy'].option('creole.general.mode_conteneur_actif').value.set('oui') + assert config_module.server[3]['server_to_deploy'].option('creole.general.mode_conteneur_actif').value.get() == 'oui' + assert config_module.server[3]['server'].option('creole.general.mode_conteneur_actif').value.get() == 'non' + # + values = await dispatcher.call('v1', + 'config.configuration.server.get', + fake_context, + server_id=3) + configuration = {'configuration': + {'creole.general.mode_conteneur_actif': 'non', + 'creole.general.master.master': [], + 'creole.general.master.slave1': [], + 'creole.general.master.slave2': [], + 'containers.container0.files.file0.mkdir': False, + 'containers.container0.files.file0.name': '/etc/mailname', + 'containers.container0.files.file0.rm': False, + 'containers.container0.files.file0.source': 'mailname', + 'containers.container0.files.file0.activate': True}, + 'server_id': 3, + 'deployed': True} + assert values == configuration + # + values = await dispatcher.call('v1', + 'config.configuration.server.get', + fake_context, + server_id=3, + deployed=False) + configuration['configuration']['creole.general.mode_conteneur_actif'] = 'oui' + configuration['deployed'] = False + assert values == configuration + + +@pytest.mark.asyncio +async def test_config_deployed(): + config_module = dispatcher.get_service('config') + fake_context = get_fake_context('config') + await config_module.on_join(fake_context) + # + config_module.server[3]['server_to_deploy'].property.read_write() + assert config_module.server[3]['server_to_deploy'].option('creole.general.mode_conteneur_actif').value.get() == 'non' + config_module.server[3]['server_to_deploy'].option('creole.general.mode_conteneur_actif').value.set('oui') + assert config_module.server[3]['server_to_deploy'].option('creole.general.mode_conteneur_actif').value.get() == 'oui' + assert config_module.server[3]['server'].option('creole.general.mode_conteneur_actif').value.get() == 'non' + values = await dispatcher.publish('v1', + 'config.configuration.server.deploy', + fake_context, + server_id=3) + assert config_module.server[3]['server_to_deploy'].option('creole.general.mode_conteneur_actif').value.get() == 'oui' + assert config_module.server[3]['server'].option('creole.general.mode_conteneur_actif').value.get() == 'oui'