Skip to content

Commit 7b5090d

Browse files
committed
fix(fabric): no-op warehouse create when the name already exists
Signed-off-by: Cortland Goffena <30168413+cmgoffena13@users.noreply.github.com>
1 parent 847de8c commit 7b5090d

2 files changed

Lines changed: 44 additions & 1 deletion

File tree

sqlmesh/core/engine_adapter/fabric.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ def create_warehouse(
361361

362362
if (
363363
if_not_exists
364-
and response.status_code == 400
364+
and response.status_code in (400, 409)
365365
and (errorCode := response.json().get("errorCode", None))
366366
):
367367
if errorCode == "ItemDisplayNameAlreadyInUse":

tests/core/engine_adapter/test_fabric.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44

55
import pandas as pd # noqa: TID253
66
import pytest
7+
import requests
78
from pytest_mock import MockerFixture
89
from sqlglot import exp, parse_one
910

1011
from sqlmesh.core.engine_adapter import FabricEngineAdapter
12+
from sqlmesh.core.engine_adapter.fabric import FabricHttpClient
1113
from tests.core.engine_adapter import to_sql_calls
1214
from sqlmesh.core.engine_adapter.shared import DataObject
1315

@@ -19,6 +21,26 @@ def adapter(make_mocked_engine_adapter: t.Callable) -> FabricEngineAdapter:
1921
return make_mocked_engine_adapter(FabricEngineAdapter)
2022

2123

24+
@pytest.fixture
25+
def fabric_http_client(mocker: MockerFixture) -> FabricHttpClient:
26+
client = FabricHttpClient(
27+
tenant_id="tenant-id",
28+
workspace_id="workspace-id",
29+
client_id="client-id",
30+
client_secret="client-secret",
31+
)
32+
client.session = mocker.MagicMock()
33+
return client
34+
35+
36+
def _conflict_response(mocker: MockerFixture, error_code: str) -> t.Any:
37+
resp = mocker.MagicMock()
38+
resp.status_code = 409
39+
resp.json.return_value = {"errorCode": error_code}
40+
resp.raise_for_status.side_effect = requests.HTTPError(response=resp)
41+
return resp
42+
43+
2244
def test_get_current_catalog_uses_only_explicit_target_catalog(
2345
make_mocked_engine_adapter: t.Callable,
2446
):
@@ -451,3 +473,24 @@ def test_comments(make_mocked_engine_adapter: t.Callable, mocker: MockerFixture)
451473
create_table_comment_mock.assert_not_called()
452474
create_column_comments_mock.assert_not_called()
453475
assert to_sql_calls(adapter) == []
476+
477+
478+
def test_create_warehouse_already_exists_is_noop(
479+
fabric_http_client: FabricHttpClient, mocker: MockerFixture
480+
) -> None:
481+
fabric_http_client.session.post.return_value = _conflict_response(
482+
mocker, "ItemDisplayNameAlreadyInUse"
483+
)
484+
485+
fabric_http_client.create_warehouse("my_warehouse")
486+
487+
fabric_http_client.session.post.assert_called_once()
488+
489+
490+
def test_create_warehouse_unrelated_conflict_still_raises(
491+
fabric_http_client: FabricHttpClient, mocker: MockerFixture
492+
) -> None:
493+
fabric_http_client.session.post.return_value = _conflict_response(mocker, "SomeOtherError")
494+
495+
with pytest.raises(requests.HTTPError):
496+
fabric_http_client.create_warehouse("my_warehouse")

0 commit comments

Comments
 (0)