def test_load_and_exec(): """ it returns new namespace with service file exec result classes """ services = [ structures.ServiceDef( name='pydock', build={ 'context': '.', 'args': { 'app_name': 'pydock' } }, volumes=['.:/pydock'], deps=['redis'] ), structures.ServiceDef( name='redis', image='redis:alpine', ) ] code = service_template.generate_service_file(services) ns = docker_compose._load_and_exec(code) assert inspect.isclass(ns['Pydock']) == True assert inspect.isclass(ns['Redis']) == True
def test_validate_dependencies_raises_on_missing_dependencies(): """ it detects missing dependencies and raises """ services = [ structures.ServiceDef( name='pydock', build={ 'context': '.', 'args': { 'app_name': 'pydock' } }, volumes=['.:/pydock'], deps=['redis'] ), ] source = service_template.generate_service_file(services) ns = docker_compose._load_and_exec(source) with pytest.raises(exceptions.PydockException) as execinfo: docker_compose._validate_dependencies(ns) assert str(execinfo.value) == "missing dependencies {'redis'} for service Pydock"
def test_service_dependency_def(): """ it correctly generates service dependency definitions """ service_defs = pydock._service_dependency_def(['redis', 'postgres:latest']) assert service_defs == [ structures.ServiceDef(name='redis', build=None, image='redis', volumes=None, deps=None), structures.ServiceDef(name='postgres', build=None, image='postgres:latest', volumes=None, deps=None) ]
def test_generates_docker_compose(): """ given valid service definitions, it generates correct docker compose file """ services = [ structures.ServiceDef( name='pydock', build={ 'context': '.', 'args': { 'app_name': 'pydock' } }, volumes=['.:/pydock'], deps=['redis'] ), structures.ServiceDef( name='redis', image='redis:alpine', ) ] code = service_template.generate_service_file(services) compose_yaml = docker_compose.generate_docker_compose(code) assert compose_yaml == { 'version': '3', 'services': { 'pydock': { 'build': { 'context': '.', 'args': { 'app_name': 'pydock' } }, 'volumes': ['.:/pydock'], 'depends_on': ['redis'] }, 'redis': { 'image': 'redis:alpine' } } }
def _app_service_def(app_name, service_dependencies): return structures.ServiceDef(name=app_name, image=f'{app_name}:${{TAG}}', build={ 'context': '.', 'args': { 'app_name': pathlib.Path('.').absolute().name } }, volumes=[f'.:/{app_name}'], deps=[s.name for s in service_dependencies])
def test_service_template(): """ it generates the correct service file """ services = [ structures.ServiceDef(name='pydock', build={ 'context': '.', 'args': { 'app_name': 'pydock' } }, volumes=['.:/pydock'], deps=['redis']), structures.ServiceDef( name='redis', image='redis:alpine', ) ] code = service_template.generate_service_file(services) namespace = {} exec(code, namespace) assert namespace['Pydock'].BUILD == { 'context': '.', 'args': { 'app_name': 'pydock' } } assert namespace['Pydock'].IMAGE == None assert namespace['Pydock'].VOLUMES == ['.:/pydock'] assert namespace['Pydock'].DEPENDS_ON == ['redis'] assert namespace['Redis'].BUILD == None assert namespace['Redis'].IMAGE == 'redis:alpine' assert namespace['Redis'].VOLUMES == None assert namespace['Redis'].DEPENDS_ON == []
def test_app_service_def(): """ Given an app name, it generates the correct service definition """ service_def = pydock._app_service_def( 'pydock', pydock._service_dependency_def(['redis', 'postgres:latest'])) assert service_def == structures.ServiceDef(name='pydock', build={ 'context': '.', 'args': { 'app_name': 'pydock' } }, image='pydock:${TAG}', volumes=['.:/pydock'], deps=['redis', 'postgres'])
def _service_dependency_def(dependencies): services = [] for d in dependencies: name = d.split(':')[0] if ':' in d else d services.append(structures.ServiceDef(name=name, image=d)) return services