예제 #1
0
def test_to_monitor_exception(mocker, caplog):
    mock_client = mocker.Mock(spec=docker.APIClient)
    mock_client.base_url = ouroboros.defaults.LOCAL_UNIX_SOCKET
    mock_client.containers.side_effect = BaseException('I blew up!!')

    container.to_monitor(monitor='test', api_client=mock_client)
    assert 'connect to Docker API' in caplog.text
예제 #2
0
def test_to_monitor(mocker):
    mock_client = mocker.Mock(spec=docker.APIClient)
    mock_client.base_url = ouroboros.defaults.LOCAL_UNIX_SOCKET
    mock_client.containers.return_value = []

    result = container.to_monitor(monitor='test', api_client=mock_client)
    assert result == []
    mock_client.containers.assert_called_once()
예제 #3
0
def test_to_monitor(mocker, caplog):
    mock_client = mocker.Mock(spec=docker.APIClient)
    mock_client.base_url = ouroboros.defaults.LOCAL_UNIX_SOCKET
    mock_client.containers.return_value = []
    caplog.set_level(logging.INFO)
    result = container.to_monitor(monitor=['test'],
                                  ignore=['boop'],
                                  api_client=mock_client)
    assert result == []
    assert 'Ignoring container(s): boop' in caplog.text
    mock_client.containers.assert_called_once()
예제 #4
0
def main(args, api_client):
    """Find running containers and update them with images using latest tag"""
    log = logging.getLogger(__name__)
    if not container.running(api_client=api_client):
        log.info('No containers are running')
    else:
        updated_count = 0
        for running_container in container.to_monitor(monitor=args.monitor,
                                                      ignore=args.ignore,
                                                      api_client=api_client):
            current_image = api_client.inspect_image(
                running_container['Config']['Image'])

            try:
                latest_image = image.pull_latest(image=current_image,
                                                 keep_tag=args.keep_tag,
                                                 api_client=api_client)
            except docker.errors.APIError as e:
                log.error(e)
                continue

            # If current running container is running latest image
            if not image.is_up_to_date(old_sha=current_image['Id'],
                                       new_sha=latest_image['Id']):
                log.info(
                    f'{container.get_name(container_object=running_container)} will be updated'
                )

                # new container dict to create new container from
                new_config = container.new_container_properties(
                    old_container=running_container,
                    new_image=latest_image['RepoTags'][0])

                container.stop(container_object=running_container,
                               api_client=api_client)

                container.remove(container_object=running_container,
                                 api_client=api_client)

                new_container = container.create_new(config=new_config,
                                                     api_client=api_client)

                container.start(container_object=new_container,
                                api_client=api_client)

                if args.cleanup:
                    image.remove(old_image=current_image,
                                 api_client=api_client)
                updated_count += 1
        log.info(f'{updated_count} container(s) updated')
        if args.run_once:
            exit(0)