Skip to content

Commit 872c393

Browse files
fix: Fir 27986 engine parameters formatting (#342)
1 parent 2fd0d47 commit 872c393

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

src/firebolt/service/V2/engine.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,20 @@ def get_many(
115115
]
116116
return [Engine._from_dict(_dict, self) for _dict in dicts]
117117

118+
@staticmethod
119+
def _format_engine_parameter(
120+
value: Union[str, int, EngineType, InstanceType, WarmupMethod]
121+
) -> Union[str, int]:
122+
if not isinstance(
123+
value, (str, int, EngineType, InstanceType, WarmupMethod)
124+
) or isinstance(value, bool):
125+
raise TypeError(f"Unsupported type {type(value)} for engine parameter. ")
126+
if isinstance(value, InstanceType):
127+
return value.name
128+
if isinstance(value, (EngineType, WarmupMethod)):
129+
return str(value.value)
130+
return value
131+
118132
def create(
119133
self,
120134
name: str,
@@ -169,7 +183,7 @@ def create(
169183
):
170184
if value is not None:
171185
sql += f"{param} = ? "
172-
parameters.append(str(value))
186+
parameters.append(self._format_engine_parameter(value))
173187
with self._connection.cursor() as c:
174188
c.execute(sql, parameters)
175189
return self.get(name)

tests/integration/resource_manager/V2/test_engine.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
from collections import namedtuple
22

3+
from pytest import mark
4+
35
from firebolt.client.auth import Auth
46
from firebolt.service.manager import ResourceManager
57
from firebolt.service.V2.types import EngineStatus, EngineType, WarmupMethod
68

79

10+
@mark.slow
811
def test_create_start_stop_engine(
912
auth: Auth,
1013
account_name: str,
@@ -16,7 +19,17 @@ def test_create_start_stop_engine(
1619
)
1720
name = start_stop_engine_name
1821

19-
engine = rm.engines.create(name=name)
22+
spec = rm.instance_types.get("B1")
23+
24+
engine = rm.engines.create(
25+
name=name,
26+
region="us-east-1",
27+
engine_type=EngineType.DATA_ANALYTICS,
28+
spec=spec,
29+
scale=1,
30+
auto_stop=120,
31+
warmup=WarmupMethod.MINIMAL,
32+
)
2033
assert engine.name == name
2134

2235
database = rm.databases.create(name=name)

tests/unit/service/V2/test_engine.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Callable
22

3+
from httpx import Request
34
from pytest import raises
45
from pytest_httpx import HTTPXMock
56

@@ -11,6 +12,7 @@
1112
EngineNotFoundError,
1213
NoAttachedDatabaseError,
1314
)
15+
from tests.unit.response import Response
1416
from tests.unit.service.V2.conftest import get_objects_from_db_callback
1517

1618

@@ -19,13 +21,24 @@ def test_engine_create(
1921
resource_manager: ResourceManager,
2022
instance_type_callback: Callable,
2123
instance_type_url: str,
22-
get_engine_callback: Callable,
2324
mock_engine: Engine,
2425
system_engine_no_db_query_url: str,
2526
):
27+
def create_engine_callback(request: Request) -> Response:
28+
if request.content.startswith(b"CREATE"):
29+
assert (
30+
request.content.decode("utf-8")
31+
== "CREATE ENGINE engine_1 WITH REGION = 'us-east-1' ENGINE_TYPE = 'GENERAL_PURPOSE'"
32+
" SPEC = 'B1' SCALE = 2 AUTO_STOP = 7200 WARMUP = 'MINIMAL'"
33+
)
34+
return get_objects_from_db_callback([mock_engine])(request)
2635

2736
httpx_mock.add_callback(instance_type_callback, url=instance_type_url)
28-
httpx_mock.add_callback(get_engine_callback, url=system_engine_no_db_query_url)
37+
httpx_mock.add_callback(create_engine_callback, url=system_engine_no_db_query_url)
38+
39+
for value in (1.0, False, int):
40+
with raises(TypeError):
41+
resource_manager.engines.create("wrong", scale=value)
2942

3043
engine = resource_manager.engines.create(
3144
name=mock_engine.name,

0 commit comments

Comments
 (0)