Esempio n. 1
0
def test_bad_source_structure():
    volume_dict = {"name": "my_volume", "configMap": "my_config_map"}

    with pytest.raises(
            Exception,
            match=
            "Attribute configMap of type V1ConfigMapVolumeSource must be a dict, received my_config_map instead",
    ):
        k8s_model_from_dict(kubernetes.client.V1Volume, volume_dict)
Esempio n. 2
0
def test_extra_key():
    volume_dict = {
        "name": "my_volume",
        "configMap": {
            "name": "my_config_map",
        },
        "extraKey": "extra_val",
    }
    with pytest.raises(
            Exception,
            match="Unexpected keys in model class V1Volume: {'extraKey'}"):
        k8s_model_from_dict(kubernetes.client.V1Volume, volume_dict)
Esempio n. 3
0
def test_incorrect_list_value_type():
    volume_dict = {
        "name": "my_volume",
        "configMap": {
            "items": [{
                "key": "my_key",
                "path": "my_path"
            }, "foobar"],
        },
    }
    with pytest.raises(
            Exception,
            match=re.escape(
                "Attribute items[1] of type V1KeyToPath must be a dict, received foobar instead"
            ),
    ):
        k8s_model_from_dict(kubernetes.client.V1Volume, volume_dict)
Esempio n. 4
0
def test_deserialize_volume():
    volume_dict = {
        "name": "my_volume",
        "configMap": {
            "name": "my_config_map",
        },
    }

    model = k8s_model_from_dict(kubernetes.client.V1Volume, volume_dict)
    assert model.name == "my_volume"
    assert model.config_map.name == "my_config_map"
Esempio n. 5
0
def test_dict_type():
    volume_dict = {
        "name": "my_volume",
        "csi": {
            "driver": "my_driver",
            "volumeAttributes": {
                "foo_key": "foo_val",
                "bar_key": "bar_val"
            },
        },
    }
    model = k8s_model_from_dict(kubernetes.client.V1Volume, volume_dict)
    assert model.csi.volume_attributes == {
        "foo_key": "foo_val",
        "bar_key": "bar_val"
    }
Esempio n. 6
0
def test_list_type():
    volume_dict = {
        "name": "my_volume",
        "cephfs": {
            "monitors": [
                "ip1",
                "ip2",
            ],
            "path": "my_path",
            "secretRef": {
                "name": "my_secret"
            },
            "user": "******",
        },
    }
    model = k8s_model_from_dict(kubernetes.client.V1Volume, volume_dict)
    assert model.cephfs.monitors == ["ip1", "ip2"]
Esempio n. 7
0
def test_user_deployment_volumes(template: HelmTemplate):

    name = "foo"

    volumes = [
        {
            "name": "test-volume",
            "configMap": {
                "name": "test-volume-configmap"
            }
        },
        {
            "name": "test-pvc",
            "persistentVolumeClaim": {
                "claimName": "my_claim",
                "readOnly": False
            }
        },
    ]

    volume_mounts = [{
        "name": "test-volume",
        "mountPath": "/opt/dagster/test_mount_path/volume_mounted_file.yaml",
        "subPath": "volume_mounted_file.yaml",
    }]

    deployment = UserDeployment(
        name=name,
        image=kubernetes.Image(repository=f"repo/{name}",
                               tag="tag1",
                               pullPolicy="Always"),
        dagsterApiGrpcArgs=["-m", name],
        port=3030,
        volumes=[
            kubernetes.Volume.construct(None, **volume) for volume in volumes
        ],
        volumeMounts=[
            kubernetes.VolumeMount.construct(None, **volume_mount)
            for volume_mount in volume_mounts
        ],
    )

    helm_values = DagsterHelmValues.construct(
        dagsterUserDeployments=UserDeployments(
            enabled=True,
            enableSubchart=True,
            deployments=[deployment],
        ))

    user_deployments = template.render(helm_values)

    assert len(user_deployments) == 1

    image = user_deployments[0].spec.template.spec.containers[0].image
    image_name, image_tag = image.split(":")

    deployed_volume_mounts = user_deployments[0].spec.template.spec.containers[
        0].volume_mounts
    assert deployed_volume_mounts == [
        k8s_model_from_dict(k8s_client.models.V1VolumeMount, volume_mount)
        for volume_mount in volume_mounts
    ]

    deployed_volumes = user_deployments[0].spec.template.spec.volumes
    assert deployed_volumes == [
        k8s_model_from_dict(k8s_client.models.V1Volume, volume)
        for volume in volumes
    ]

    assert image_name == deployment.image.repository
    assert image_tag == deployment.image.tag
Esempio n. 8
0
def test_user_deployment_volumes(template: HelmTemplate, include_config_in_launched_runs: bool):
    name = "foo"

    volumes = [
        {"name": "test-volume", "configMap": {"name": "test-volume-configmap"}},
        {"name": "test-pvc", "persistentVolumeClaim": {"claimName": "my_claim", "readOnly": False}},
    ]

    volume_mounts = [
        {
            "name": "test-volume",
            "mountPath": "/opt/dagster/test_mount_path/volume_mounted_file.yaml",
            "subPath": "volume_mounted_file.yaml",
        }
    ]

    deployment = UserDeployment(
        name=name,
        image=kubernetes.Image(repository=f"repo/{name}", tag="tag1", pullPolicy="Always"),
        dagsterApiGrpcArgs=["-m", name],
        port=3030,
        volumes=[kubernetes.Volume.construct(None, **volume) for volume in volumes],
        volumeMounts=[
            kubernetes.VolumeMount.construct(None, **volume_mount) for volume_mount in volume_mounts
        ],
        includeConfigInLaunchedRuns=UserDeploymentIncludeConfigInLaunchedRuns(
            enabled=include_config_in_launched_runs
        ),
    )

    helm_values = DagsterHelmValues.construct(
        dagsterUserDeployments=UserDeployments(
            enabled=True,
            enableSubchart=True,
            deployments=[deployment],
        )
    )

    user_deployments = template.render(helm_values)

    assert len(user_deployments) == 1

    image = user_deployments[0].spec.template.spec.containers[0].image
    image_name, image_tag = image.split(":")

    deployed_volume_mounts = user_deployments[0].spec.template.spec.containers[0].volume_mounts
    assert deployed_volume_mounts == [
        k8s_model_from_dict(
            k8s_client.models.V1VolumeMount,
            k8s_snake_case_dict(k8s_client.models.V1VolumeMount, volume_mount),
        )
        for volume_mount in volume_mounts
    ]

    deployed_volumes = user_deployments[0].spec.template.spec.volumes
    assert deployed_volumes == [
        k8s_model_from_dict(
            k8s_client.models.V1Volume, k8s_snake_case_dict(k8s_client.models.V1Volume, volume)
        )
        for volume in volumes
    ]

    assert image_name == deployment.image.repository
    assert image_tag == deployment.image.tag

    if include_config_in_launched_runs:
        container_context = user_deployments[0].spec.template.spec.containers[0].env[2]
        assert container_context.name == "DAGSTER_CLI_API_GRPC_CONTAINER_CONTEXT"
        assert json.loads(container_context.value) == {
            "k8s": {
                "env_config_maps": [
                    "release-name-dagster-user-deployments-foo-user-env",
                ],
                "image_pull_policy": "Always",
                "volume_mounts": volume_mounts,
                "volumes": volumes,
            }
        }
    else:
        _assert_no_container_context(user_deployments[0])