Files
2026-07-13 13:22:34 +08:00

363 lines
13 KiB
Python

import pytest
from mlflow.models.resources import (
DEFAULT_API_VERSION,
DatabricksApp,
DatabricksFunction,
DatabricksGenieSpace,
DatabricksLakebase,
DatabricksServingEndpoint,
DatabricksSQLWarehouse,
DatabricksTable,
DatabricksUCConnection,
DatabricksVectorSearchIndex,
_ResourceBuilder,
)
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_serving_endpoint(on_behalf_of_user):
endpoint = DatabricksServingEndpoint(
endpoint_name="llm_server", on_behalf_of_user=on_behalf_of_user
)
expected = (
{"serving_endpoint": [{"name": "llm_server"}]}
if on_behalf_of_user is None
else {"serving_endpoint": [{"name": "llm_server", "on_behalf_of_user": on_behalf_of_user}]}
)
assert endpoint.to_dict() == expected
assert _ResourceBuilder.from_resources([endpoint]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_index_name(on_behalf_of_user):
index = DatabricksVectorSearchIndex(index_name="index1", on_behalf_of_user=on_behalf_of_user)
expected = (
{"vector_search_index": [{"name": "index1"}]}
if on_behalf_of_user is None
else {"vector_search_index": [{"name": "index1", "on_behalf_of_user": on_behalf_of_user}]}
)
assert index.to_dict() == expected
assert _ResourceBuilder.from_resources([index]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_sql_warehouse(on_behalf_of_user):
sql_warehouse = DatabricksSQLWarehouse(warehouse_id="id1", on_behalf_of_user=on_behalf_of_user)
expected = (
{"sql_warehouse": [{"name": "id1"}]}
if on_behalf_of_user is None
else {"sql_warehouse": [{"name": "id1", "on_behalf_of_user": on_behalf_of_user}]}
)
assert sql_warehouse.to_dict() == expected
assert _ResourceBuilder.from_resources([sql_warehouse]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_uc_function(on_behalf_of_user):
uc_function = DatabricksFunction(function_name="function", on_behalf_of_user=on_behalf_of_user)
expected = (
{"function": [{"name": "function"}]}
if on_behalf_of_user is None
else {"function": [{"name": "function", "on_behalf_of_user": on_behalf_of_user}]}
)
assert uc_function.to_dict() == expected
assert _ResourceBuilder.from_resources([uc_function]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_genie_space(on_behalf_of_user):
genie_space = DatabricksGenieSpace(genie_space_id="id1", on_behalf_of_user=on_behalf_of_user)
expected = (
{"genie_space": [{"name": "id1"}]}
if on_behalf_of_user is None
else {"genie_space": [{"name": "id1", "on_behalf_of_user": on_behalf_of_user}]}
)
assert genie_space.to_dict() == expected
assert _ResourceBuilder.from_resources([genie_space]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_uc_connection(on_behalf_of_user):
uc_function = DatabricksUCConnection(
connection_name="slack_connection", on_behalf_of_user=on_behalf_of_user
)
expected = (
{"uc_connection": [{"name": "slack_connection"}]}
if on_behalf_of_user is None
else {
"uc_connection": [{"name": "slack_connection", "on_behalf_of_user": on_behalf_of_user}]
}
)
assert uc_function.to_dict() == expected
assert _ResourceBuilder.from_resources([uc_function]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_table(on_behalf_of_user):
table = DatabricksTable(table_name="tableName", on_behalf_of_user=on_behalf_of_user)
expected = (
{"table": [{"name": "tableName"}]}
if on_behalf_of_user is None
else {"table": [{"name": "tableName", "on_behalf_of_user": on_behalf_of_user}]}
)
assert table.to_dict() == expected
assert _ResourceBuilder.from_resources([table]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_app(on_behalf_of_user):
app = DatabricksApp(app_name="id1", on_behalf_of_user=on_behalf_of_user)
expected = (
{"app": [{"name": "id1"}]}
if on_behalf_of_user is None
else {"app": [{"name": "id1", "on_behalf_of_user": on_behalf_of_user}]}
)
assert app.to_dict() == expected
assert _ResourceBuilder.from_resources([app]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
@pytest.mark.parametrize("on_behalf_of_user", [True, False, None])
def test_lakebase(on_behalf_of_user):
lakebase = DatabricksLakebase(
database_instance_name="lakebase_name", on_behalf_of_user=on_behalf_of_user
)
expected = (
{"lakebase": [{"name": "lakebase_name"}]}
if on_behalf_of_user is None
else {"lakebase": [{"name": "lakebase_name", "on_behalf_of_user": on_behalf_of_user}]}
)
assert lakebase.to_dict() == expected
assert _ResourceBuilder.from_resources([lakebase]) == {
"api_version": DEFAULT_API_VERSION,
"databricks": expected,
}
def test_resources():
resources = [
DatabricksVectorSearchIndex(index_name="rag.studio_bugbash.databricks_docs_index"),
DatabricksServingEndpoint(endpoint_name="databricks-mixtral-8x7b-instruct"),
DatabricksServingEndpoint(endpoint_name="databricks-llama-8x7b-instruct"),
DatabricksSQLWarehouse(warehouse_id="id123"),
DatabricksFunction(function_name="rag.studio.test_function_1"),
DatabricksFunction(function_name="rag.studio.test_function_2"),
DatabricksUCConnection(connection_name="slack_connection"),
DatabricksApp(app_name="test_databricks_app"),
DatabricksLakebase(database_instance_name="test_databricks_lakebase"),
]
expected = {
"api_version": DEFAULT_API_VERSION,
"databricks": {
"vector_search_index": [{"name": "rag.studio_bugbash.databricks_docs_index"}],
"serving_endpoint": [
{"name": "databricks-mixtral-8x7b-instruct"},
{"name": "databricks-llama-8x7b-instruct"},
],
"sql_warehouse": [{"name": "id123"}],
"function": [
{"name": "rag.studio.test_function_1"},
{"name": "rag.studio.test_function_2"},
],
"uc_connection": [{"name": "slack_connection"}],
"app": [{"name": "test_databricks_app"}],
"lakebase": [{"name": "test_databricks_lakebase"}],
},
}
assert _ResourceBuilder.from_resources(resources) == expected
def test_invoker_resources():
resources = [
DatabricksVectorSearchIndex(
index_name="rag.studio_bugbash.databricks_docs_index", on_behalf_of_user=True
),
DatabricksServingEndpoint(endpoint_name="databricks-mixtral-8x7b-instruct"),
DatabricksServingEndpoint(
endpoint_name="databricks-llama-8x7b-instruct", on_behalf_of_user=True
),
DatabricksSQLWarehouse(warehouse_id="id123"),
DatabricksFunction(function_name="rag.studio.test_function_1"),
DatabricksFunction(function_name="rag.studio.test_function_2", on_behalf_of_user=True),
DatabricksUCConnection(connection_name="slack_connection"),
]
expected = {
"api_version": DEFAULT_API_VERSION,
"databricks": {
"vector_search_index": [
{"name": "rag.studio_bugbash.databricks_docs_index", "on_behalf_of_user": True}
],
"serving_endpoint": [
{"name": "databricks-mixtral-8x7b-instruct"},
{"name": "databricks-llama-8x7b-instruct", "on_behalf_of_user": True},
],
"sql_warehouse": [{"name": "id123"}],
"function": [
{"name": "rag.studio.test_function_1"},
{"name": "rag.studio.test_function_2", "on_behalf_of_user": True},
],
"uc_connection": [{"name": "slack_connection"}],
},
}
assert _ResourceBuilder.from_resources(resources) == expected
def test_resources_from_yaml(tmp_path):
yaml_file = tmp_path.joinpath("resources.yaml")
with open(yaml_file, "w") as f:
f.write(
"""
api_version: "1"
databricks:
vector_search_index:
- name: rag.studio_bugbash.databricks_docs_index
serving_endpoint:
- name: databricks-mixtral-8x7b-instruct
- name: databricks-llama-8x7b-instruct
sql_warehouse:
- name: id123
function:
- name: rag.studio.test_function_1
- name: rag.studio.test_function_2
lakebase:
- name: test_databricks_lakebase
uc_connection:
- name: slack_connection
app:
- name: test_databricks_app
"""
)
assert _ResourceBuilder.from_yaml_file(yaml_file) == {
"api_version": DEFAULT_API_VERSION,
"databricks": {
"vector_search_index": [{"name": "rag.studio_bugbash.databricks_docs_index"}],
"serving_endpoint": [
{"name": "databricks-mixtral-8x7b-instruct"},
{"name": "databricks-llama-8x7b-instruct"},
],
"sql_warehouse": [{"name": "id123"}],
"function": [
{"name": "rag.studio.test_function_1"},
{"name": "rag.studio.test_function_2"},
],
"uc_connection": [{"name": "slack_connection"}],
"app": [{"name": "test_databricks_app"}],
"lakebase": [{"name": "test_databricks_lakebase"}],
},
}
with pytest.raises(OSError, match="No such file or directory: 'no-file.yaml'"):
_ResourceBuilder.from_yaml_file("no-file.yaml")
incorrect_version = tmp_path.joinpath("incorrect_file.yaml")
with open(incorrect_version, "w") as f:
f.write(
"""
api_version: "v1"
"""
)
with pytest.raises(ValueError, match="Unsupported API version: v1"):
_ResourceBuilder.from_yaml_file(incorrect_version)
incorrect_target_uri = tmp_path.joinpath("incorrect_target_uri.yaml")
with open(incorrect_target_uri, "w") as f:
f.write(
"""
api_version: "1"
databricks-aa:
vector_search_index_name:
- name: rag.studio_bugbash.databricks_docs_index
"""
)
with pytest.raises(ValueError, match="Unsupported target URI: databricks-aa"):
_ResourceBuilder.from_yaml_file(incorrect_target_uri)
incorrect_resource = tmp_path.joinpath("incorrect_resource.yaml")
with open(incorrect_resource, "w") as f:
f.write(
"""
api_version: "1"
databricks:
vector_search_index_name:
- name: rag.studio_bugbash.databricks_docs_index
"""
)
with pytest.raises(ValueError, match="Unsupported resource type: vector_search_index_name"):
_ResourceBuilder.from_yaml_file(incorrect_resource)
invokers_yaml_file = tmp_path.joinpath("invokers_resources.yaml")
with open(invokers_yaml_file, "w") as f:
f.write(
"""
api_version: "1"
databricks:
vector_search_index:
- name: rag.studio_bugbash.databricks_docs_index
on_behalf_of_user: true
serving_endpoint:
- name: databricks-mixtral-8x7b-instruct
- name: databricks-llama-8x7b-instruct
on_behalf_of_user: true
sql_warehouse:
- name: id123
function:
- name: rag.studio.test_function_1
on_behalf_of_user: true
- name: rag.studio.test_function_2
uc_connection:
- name: slack_connection
on_behalf_of_user: true
"""
)
assert _ResourceBuilder.from_yaml_file(invokers_yaml_file) == {
"api_version": DEFAULT_API_VERSION,
"databricks": {
"vector_search_index": [
{"name": "rag.studio_bugbash.databricks_docs_index", "on_behalf_of_user": True}
],
"serving_endpoint": [
{"name": "databricks-mixtral-8x7b-instruct"},
{"name": "databricks-llama-8x7b-instruct", "on_behalf_of_user": True},
],
"sql_warehouse": [{"name": "id123"}],
"function": [
{"name": "rag.studio.test_function_1", "on_behalf_of_user": True},
{"name": "rag.studio.test_function_2"},
],
"uc_connection": [{"name": "slack_connection", "on_behalf_of_user": True}],
},
}