363 lines
13 KiB
Python
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}],
|
|
},
|
|
}
|