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)
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)
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)
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"
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" }
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"]
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
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])