Esempio n. 1
0
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
Esempio n. 2
0
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"
Esempio n. 3
0
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)
    ]
Esempio n. 4
0
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'
            }
        }
    }
Esempio n. 5
0
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])
Esempio n. 6
0
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 == []
Esempio n. 7
0
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'])
Esempio n. 8
0
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