mirror of
				https://github.com/datahub-project/datahub.git
				synced 2025-11-04 04:39:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			151 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import pathlib
 | 
						|
from unittest.mock import MagicMock
 | 
						|
 | 
						|
import pytest
 | 
						|
 | 
						|
from datahub.cli.docker_check import (
 | 
						|
    MIN_DISK_SPACE_NEEDED,
 | 
						|
    MIN_MEMORY_NEEDED,
 | 
						|
    ContainerStatus,
 | 
						|
    DockerContainerStatus,
 | 
						|
    DockerLowDiskSpaceError,
 | 
						|
    DockerLowMemoryError,
 | 
						|
    QuickstartStatus,
 | 
						|
    check_upgrade_supported,
 | 
						|
    run_quickstart_preflight_checks,
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def mock_docker_client():
 | 
						|
    client = MagicMock()
 | 
						|
    return client
 | 
						|
 | 
						|
 | 
						|
def test_run_quickstart_preflight_checks_success(mock_docker_client):
 | 
						|
    # Mock Docker info to return sufficient memory
 | 
						|
    mock_docker_client.info.return_value = {
 | 
						|
        "MemTotal": int(MIN_MEMORY_NEEDED * 1024 * 1024 * 1000)  # Convert GB to bytes
 | 
						|
    }
 | 
						|
 | 
						|
    # Mock container run to return sufficient disk space
 | 
						|
    mock_container = MagicMock()
 | 
						|
    mock_container.decode.return_value = f"{MIN_DISK_SPACE_NEEDED * 1024**3} {MIN_DISK_SPACE_NEEDED * 1024**3}"  # total, available in bytes
 | 
						|
    mock_docker_client.containers.run.return_value = mock_container
 | 
						|
 | 
						|
    # Test should pass without raising any exceptions
 | 
						|
    run_quickstart_preflight_checks(mock_docker_client)
 | 
						|
 | 
						|
 | 
						|
def test_run_quickstart_preflight_checks_insufficient_memory(mock_docker_client):
 | 
						|
    # Mock Docker info to return insufficient memory
 | 
						|
    mock_docker_client.info.return_value = {
 | 
						|
        "MemTotal": int(
 | 
						|
            (MIN_MEMORY_NEEDED - 1) * 1024 * 1024 * 1000
 | 
						|
        )  # 1GB less than required
 | 
						|
    }
 | 
						|
 | 
						|
    # Test should raise DockerLowMemoryError
 | 
						|
    with pytest.raises(DockerLowMemoryError) as exc_info:
 | 
						|
        run_quickstart_preflight_checks(mock_docker_client)
 | 
						|
 | 
						|
    assert "Total Docker memory configured" in str(exc_info.value)
 | 
						|
 | 
						|
 | 
						|
def test_run_quickstart_preflight_checks_insufficient_disk_space(mock_docker_client):
 | 
						|
    # Mock Docker info to return sufficient memory
 | 
						|
    mock_docker_client.info.return_value = {
 | 
						|
        "MemTotal": int(MIN_MEMORY_NEEDED * 1024 * 1024 * 1000)
 | 
						|
    }
 | 
						|
 | 
						|
    # Mock container run to return insufficient disk space
 | 
						|
    mock_container = MagicMock()
 | 
						|
    mock_container.decode.return_value = f"{MIN_DISK_SPACE_NEEDED * 1024**3} {(MIN_DISK_SPACE_NEEDED - 1) * 1024**3}"  # total, available in bytes
 | 
						|
    mock_docker_client.containers.run.return_value = mock_container
 | 
						|
 | 
						|
    # Test should raise DockerLowDiskSpaceError
 | 
						|
    with pytest.raises(DockerLowDiskSpaceError) as exc_info:
 | 
						|
        run_quickstart_preflight_checks(mock_docker_client)
 | 
						|
 | 
						|
    assert "Total Docker disk space available" in str(exc_info.value)
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def mock_compose_file(tmp_path):
 | 
						|
    compose_file = tmp_path / "docker-compose.yml"
 | 
						|
    compose_file.write_text("""
 | 
						|
services:
 | 
						|
  datahub-gms:
 | 
						|
    image: datahub-gms
 | 
						|
  datahub-frontend:
 | 
						|
    image: datahub-frontend
 | 
						|
volumes:
 | 
						|
  datahub_volume1:
 | 
						|
  datahub_volume2:
 | 
						|
    """)
 | 
						|
    return compose_file
 | 
						|
 | 
						|
 | 
						|
def test_check_upgrade_supported_no_containers(mock_compose_file):
 | 
						|
    # Test when no containers are running
 | 
						|
    quickstart_status = QuickstartStatus([], [], running_unsupported_version=False)
 | 
						|
    assert check_upgrade_supported([mock_compose_file], quickstart_status) is True
 | 
						|
 | 
						|
 | 
						|
def test_check_upgrade_supported_legacy_version():
 | 
						|
    # Test when running legacy version
 | 
						|
    quickstart_status = QuickstartStatus(
 | 
						|
        [DockerContainerStatus("zookeeper", ContainerStatus.OK)],
 | 
						|
        [],
 | 
						|
        running_unsupported_version=True,
 | 
						|
    )
 | 
						|
    assert (
 | 
						|
        check_upgrade_supported([pathlib.Path("dummy.yml")], quickstart_status) is False
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def test_check_upgrade_supported_matching_services(mock_compose_file):
 | 
						|
    # Test when services and volumes match
 | 
						|
    quickstart_status = QuickstartStatus(
 | 
						|
        [
 | 
						|
            DockerContainerStatus("datahub-gms", ContainerStatus.OK),
 | 
						|
            DockerContainerStatus("datahub-frontend", ContainerStatus.OK),
 | 
						|
        ],
 | 
						|
        ["datahub_volume1", "datahub_volume2"],
 | 
						|
        running_unsupported_version=False,
 | 
						|
    )
 | 
						|
    assert check_upgrade_supported([mock_compose_file], quickstart_status) is True
 | 
						|
 | 
						|
 | 
						|
def test_check_upgrade_supported_mismatched_services(mock_compose_file):
 | 
						|
    # Test when services don't match
 | 
						|
    quickstart_status = QuickstartStatus(
 | 
						|
        [
 | 
						|
            DockerContainerStatus("datahub-gms", ContainerStatus.OK),
 | 
						|
            DockerContainerStatus("datahub-frontend", ContainerStatus.OK),
 | 
						|
            DockerContainerStatus(
 | 
						|
                "zookeeper", ContainerStatus.OK
 | 
						|
            ),  # Extra service not in compose
 | 
						|
        ],
 | 
						|
        ["datahub_volume1", "datahub_volume2"],
 | 
						|
        running_unsupported_version=False,
 | 
						|
    )
 | 
						|
    assert check_upgrade_supported([mock_compose_file], quickstart_status) is False
 | 
						|
 | 
						|
 | 
						|
def test_check_upgrade_supported_mismatched_volumes(mock_compose_file):
 | 
						|
    # Test when volumes don't match
 | 
						|
    quickstart_status = QuickstartStatus(
 | 
						|
        [
 | 
						|
            DockerContainerStatus("datahub-gms", ContainerStatus.OK),
 | 
						|
            DockerContainerStatus("datahub-frontend", ContainerStatus.OK),
 | 
						|
        ],
 | 
						|
        [
 | 
						|
            "datahub_volume1",
 | 
						|
            "datahub_volume2",
 | 
						|
            "zookeeper_volume",
 | 
						|
        ],  # Extra volume not in compose
 | 
						|
        running_unsupported_version=False,
 | 
						|
    )
 | 
						|
    assert check_upgrade_supported([mock_compose_file], quickstart_status) is False
 |