relationalai 0.13.1__py3-none-any.whl → 0.13.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- relationalai/clients/client.py +49 -14
- relationalai/clients/local.py +23 -8
- relationalai/clients/resources/azure/azure.py +36 -11
- relationalai/clients/resources/snowflake/__init__.py +3 -3
- relationalai/clients/resources/snowflake/cli_resources.py +12 -1
- relationalai/clients/resources/snowflake/direct_access_resources.py +57 -17
- relationalai/clients/resources/snowflake/engine_service.py +381 -0
- relationalai/clients/resources/snowflake/engine_state_handlers.py +35 -29
- relationalai/clients/resources/snowflake/error_handlers.py +43 -2
- relationalai/clients/resources/snowflake/snowflake.py +116 -121
- relationalai/clients/types.py +5 -0
- relationalai/errors.py +1 -1
- relationalai/semantics/metamodel/typer/typer.py +6 -2
- relationalai/tools/cli.py +339 -186
- relationalai/tools/cli_helpers.py +410 -6
- {relationalai-0.13.1.dist-info → relationalai-0.13.2.dist-info}/METADATA +1 -1
- {relationalai-0.13.1.dist-info → relationalai-0.13.2.dist-info}/RECORD +21 -20
- relationalai_test_util/fixtures.py +2 -2
- {relationalai-0.13.1.dist-info → relationalai-0.13.2.dist-info}/WHEEL +0 -0
- {relationalai-0.13.1.dist-info → relationalai-0.13.2.dist-info}/entry_points.txt +0 -0
- {relationalai-0.13.1.dist-info → relationalai-0.13.2.dist-info}/licenses/LICENSE +0 -0
relationalai/clients/client.py
CHANGED
|
@@ -164,11 +164,18 @@ class ResourcesBase(ABC):
|
|
|
164
164
|
pass
|
|
165
165
|
|
|
166
166
|
@abstractmethod
|
|
167
|
-
def list_engines(
|
|
167
|
+
def list_engines(
|
|
168
|
+
self,
|
|
169
|
+
state: str | None = None,
|
|
170
|
+
name: str | None = None,
|
|
171
|
+
type: str | None = None,
|
|
172
|
+
size: str | None = None,
|
|
173
|
+
created_by: str | None = None,
|
|
174
|
+
) -> List[Any]:
|
|
168
175
|
pass
|
|
169
176
|
|
|
170
177
|
@abstractmethod
|
|
171
|
-
def get_engine(self, name: str) -> EngineState | None:
|
|
178
|
+
def get_engine(self, name: str, type: str) -> EngineState | None:
|
|
172
179
|
pass
|
|
173
180
|
|
|
174
181
|
@abstractmethod
|
|
@@ -180,23 +187,31 @@ class ResourcesBase(ABC):
|
|
|
180
187
|
pass
|
|
181
188
|
|
|
182
189
|
@abstractmethod
|
|
183
|
-
def create_engine(
|
|
190
|
+
def create_engine(
|
|
191
|
+
self,
|
|
192
|
+
name: str,
|
|
193
|
+
type: str | None = None,
|
|
194
|
+
size: str | None = None,
|
|
195
|
+
auto_suspend_mins: int | None = None,
|
|
196
|
+
headers: Dict | None = None,
|
|
197
|
+
settings: dict | None = None,
|
|
198
|
+
) -> dict | None:
|
|
184
199
|
pass
|
|
185
200
|
|
|
186
201
|
@abstractmethod
|
|
187
|
-
def delete_engine(self, name:str,
|
|
202
|
+
def delete_engine(self, name:str, type: str) -> dict | None:
|
|
188
203
|
pass
|
|
189
204
|
|
|
190
205
|
@abstractmethod
|
|
191
|
-
def suspend_engine(self, name: str):
|
|
206
|
+
def suspend_engine(self, name: str, type: str | None = None):
|
|
192
207
|
pass
|
|
193
208
|
|
|
194
209
|
@abstractmethod
|
|
195
|
-
def resume_engine(self, name: str, headers: Dict | None = None) -> dict:
|
|
210
|
+
def resume_engine(self, name: str, type: str | None = None, headers: Dict | None = None) -> dict:
|
|
196
211
|
pass
|
|
197
212
|
|
|
198
213
|
@abstractmethod
|
|
199
|
-
def resume_engine_async(self, name: str) -> dict:
|
|
214
|
+
def resume_engine_async(self, name: str, type: str | None = None, headers: Dict | None = None) -> dict:
|
|
200
215
|
pass
|
|
201
216
|
|
|
202
217
|
@abstractmethod
|
|
@@ -210,7 +225,7 @@ class ResourcesBase(ABC):
|
|
|
210
225
|
return engine
|
|
211
226
|
|
|
212
227
|
@abstractmethod
|
|
213
|
-
def auto_create_engine_async(self, name: str | None = None) -> str:
|
|
228
|
+
def auto_create_engine_async(self, name: str | None = None, type: str | None = None) -> str:
|
|
214
229
|
pass
|
|
215
230
|
|
|
216
231
|
_active_engine: EngineState|None = None
|
|
@@ -428,14 +443,34 @@ class ProviderBase(ABC):
|
|
|
428
443
|
|
|
429
444
|
resources: ResourcesBase
|
|
430
445
|
|
|
431
|
-
def list_engines(
|
|
432
|
-
|
|
446
|
+
def list_engines(
|
|
447
|
+
self,
|
|
448
|
+
state: str | None = None,
|
|
449
|
+
name: str | None = None,
|
|
450
|
+
type: str | None = None,
|
|
451
|
+
size: str | None = None,
|
|
452
|
+
created_by: str | None = None,
|
|
453
|
+
):
|
|
454
|
+
return self.resources.list_engines(state=state, name=name, type=type, size=size, created_by=created_by)
|
|
433
455
|
|
|
434
|
-
def create_engine(
|
|
435
|
-
|
|
456
|
+
def create_engine(
|
|
457
|
+
self,
|
|
458
|
+
name: str,
|
|
459
|
+
type: str | None = None,
|
|
460
|
+
size: str | None = None,
|
|
461
|
+
auto_suspend_mins: int | None = None,
|
|
462
|
+
settings: dict | None = None,
|
|
463
|
+
):
|
|
464
|
+
return self.resources.create_engine(
|
|
465
|
+
name,
|
|
466
|
+
type=type,
|
|
467
|
+
size=size,
|
|
468
|
+
auto_suspend_mins=auto_suspend_mins,
|
|
469
|
+
settings=settings,
|
|
470
|
+
)
|
|
436
471
|
|
|
437
|
-
def delete_engine(self, name:str):
|
|
438
|
-
return self.resources.delete_engine(name)
|
|
472
|
+
def delete_engine(self, name:str, type: str = "LOGIC"):
|
|
473
|
+
return self.resources.delete_engine(name, type)
|
|
439
474
|
|
|
440
475
|
def get_transaction(self, transaction_id:str):
|
|
441
476
|
return self.resources.get_transaction(transaction_id)
|
relationalai/clients/local.py
CHANGED
|
@@ -172,10 +172,17 @@ class LocalResources(ResourcesBase):
|
|
|
172
172
|
def get_engine_sizes(self, cloud_provider: str | None = None):
|
|
173
173
|
raise NotImplementedError("get_engine_sizes not supported in local mode")
|
|
174
174
|
|
|
175
|
-
def list_engines(
|
|
175
|
+
def list_engines(
|
|
176
|
+
self,
|
|
177
|
+
state: str | None = None,
|
|
178
|
+
name: str | None = None,
|
|
179
|
+
type: str | None = None,
|
|
180
|
+
size: str | None = None,
|
|
181
|
+
created_by: str | None = None,
|
|
182
|
+
):
|
|
176
183
|
raise NotImplementedError("list_engines not supported in local mode")
|
|
177
184
|
|
|
178
|
-
def get_engine(self, name: str):
|
|
185
|
+
def get_engine(self, name: str, type: str):
|
|
179
186
|
raise NotImplementedError("get_engine not supported in local mode")
|
|
180
187
|
|
|
181
188
|
def get_cloud_provider(self) -> str:
|
|
@@ -184,25 +191,33 @@ class LocalResources(ResourcesBase):
|
|
|
184
191
|
def is_valid_engine_state(self, name: str) -> bool:
|
|
185
192
|
raise NotImplementedError("is_valid_engine_state not supported in local mode")
|
|
186
193
|
|
|
187
|
-
def create_engine(
|
|
194
|
+
def create_engine(
|
|
195
|
+
self,
|
|
196
|
+
name: str,
|
|
197
|
+
type: str | None = None,
|
|
198
|
+
size: str | None = None,
|
|
199
|
+
auto_suspend_mins: int | None = None,
|
|
200
|
+
headers: dict | None = None,
|
|
201
|
+
settings: dict | None = None,
|
|
202
|
+
):
|
|
188
203
|
raise NotImplementedError("create_engine not supported in local mode")
|
|
189
204
|
|
|
190
|
-
def delete_engine(self, name: str,
|
|
205
|
+
def delete_engine(self, name: str, type: str):
|
|
191
206
|
raise NotImplementedError("delete_engine not supported in local mode")
|
|
192
207
|
|
|
193
|
-
def suspend_engine(self, name: str):
|
|
208
|
+
def suspend_engine(self, name: str, type: str | None = None):
|
|
194
209
|
raise NotImplementedError("suspend_engine not supported in local mode")
|
|
195
210
|
|
|
196
|
-
def resume_engine(self, name: str, headers: Dict | None = None):
|
|
211
|
+
def resume_engine(self, name: str, type: str | None = None, headers: Dict | None = None):
|
|
197
212
|
raise NotImplementedError("resume_engine not supported in local mode")
|
|
198
213
|
|
|
199
|
-
def resume_engine_async(self, name: str):
|
|
214
|
+
def resume_engine_async(self, name: str, type: str | None = None, headers: Dict | None = None):
|
|
200
215
|
raise NotImplementedError("resume_engine_async not supported in local mode")
|
|
201
216
|
|
|
202
217
|
def alter_engine_pool(self, size: str | None = None, mins: int | None = None, maxs: int | None = None):
|
|
203
218
|
raise NotImplementedError("alter_engine_pool not supported in local mode")
|
|
204
219
|
|
|
205
|
-
def auto_create_engine_async(self, name: str | None = None) -> str:
|
|
220
|
+
def auto_create_engine_async(self, name: str | None = None, type: str | None = None) -> str:
|
|
206
221
|
raise NotImplementedError("auto_create_engine_async not supported in local mode")
|
|
207
222
|
|
|
208
223
|
#--------------------------------------------------
|
|
@@ -78,34 +78,59 @@ class Resources(ResourcesBase):
|
|
|
78
78
|
def get_cloud_provider(self) -> str:
|
|
79
79
|
return "azure"
|
|
80
80
|
|
|
81
|
-
def list_engines(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
def list_engines(
|
|
82
|
+
self,
|
|
83
|
+
state: str | None = None,
|
|
84
|
+
name: str | None = None,
|
|
85
|
+
type: str | None = None,
|
|
86
|
+
size: str | None = None,
|
|
87
|
+
created_by: str | None = None,
|
|
88
|
+
):
|
|
89
|
+
# Azure only supports state filtering at the API level; other filters are ignored.
|
|
90
|
+
engines = api.list_engines(self._api_ctx(), state)
|
|
91
|
+
# Ensure EngineState shape includes 'type' for callers/tests.
|
|
92
|
+
for eng in engines:
|
|
93
|
+
eng.setdefault("type", "LOGIC")
|
|
94
|
+
return engines
|
|
95
|
+
|
|
96
|
+
def get_engine(self, name: str, type: str) -> EngineState:
|
|
97
|
+
# type is ignored for Azure as it doesn't support multiple engine types
|
|
98
|
+
engine = cast(EngineState, api.get_engine(self._api_ctx(), name))
|
|
99
|
+
engine.setdefault("type", "LOGIC")
|
|
100
|
+
return engine
|
|
86
101
|
|
|
87
102
|
def is_valid_engine_state(self, name:str):
|
|
88
103
|
return name in VALID_ENGINE_STATES
|
|
89
104
|
|
|
90
|
-
def create_engine(
|
|
105
|
+
def create_engine(
|
|
106
|
+
self,
|
|
107
|
+
name: str,
|
|
108
|
+
type: str | None = None,
|
|
109
|
+
size: str | None = None,
|
|
110
|
+
auto_suspend_mins: int | None = None,
|
|
111
|
+
headers: dict | None = None,
|
|
112
|
+
settings: dict | None = None,
|
|
113
|
+
):
|
|
114
|
+
# Azure only supports one engine type, so type parameter is ignored
|
|
91
115
|
if size is None:
|
|
92
116
|
size = "M"
|
|
93
117
|
with debugging.span("create_engine", name=name, size=size):
|
|
94
118
|
return api.create_engine_wait(self._api_ctx(), name, size)
|
|
95
119
|
|
|
96
|
-
def delete_engine(self, name:str,
|
|
120
|
+
def delete_engine(self, name:str, type: str):
|
|
97
121
|
return api.delete_engine(self._api_ctx(), name)
|
|
98
122
|
|
|
99
|
-
def suspend_engine(self, name:str):
|
|
123
|
+
def suspend_engine(self, name:str, type: str | None = None): # type is ignored for Azure
|
|
100
124
|
return api.suspend_engine(self._api_ctx(), name)
|
|
101
125
|
|
|
102
|
-
def resume_engine(self, name:str, headers={}):
|
|
126
|
+
def resume_engine(self, name:str, type: str | None = None, headers={}):
|
|
127
|
+
# type is ignored for Azure as it doesn't support multiple engine types
|
|
103
128
|
return api.resume_engine_wait(self._api_ctx(), name)
|
|
104
129
|
|
|
105
|
-
def resume_engine_async(self, name:str):
|
|
130
|
+
def resume_engine_async(self, name:str, type: str | None = None, headers: Dict | None = None):
|
|
106
131
|
return api.resume_engine(self._api_ctx(), name)
|
|
107
132
|
|
|
108
|
-
def auto_create_engine_async(self, name: str | None = None) -> str:
|
|
133
|
+
def auto_create_engine_async(self, name: str | None = None, type: str | None = None) -> str:
|
|
109
134
|
raise Exception("Azure doesn't support auto_create_engine_async")
|
|
110
135
|
|
|
111
136
|
def alter_engine_pool(self, size: str | None = None, mins: int | None = None, maxs: int | None = None):
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Snowflake resources module.
|
|
3
3
|
"""
|
|
4
4
|
# Import order matters - Resources must be imported first since other classes depend on it
|
|
5
|
-
from .snowflake import Resources, Provider, Graph, SnowflakeClient, APP_NAME, PYREL_ROOT_DB, ExecContext,
|
|
6
|
-
|
|
5
|
+
from .snowflake import Resources, Provider, Graph, SnowflakeClient, APP_NAME, PYREL_ROOT_DB, ExecContext, PrimaryKey, PRINT_TXN_PROGRESS_FLAG
|
|
6
|
+
from .engine_service import EngineType, INTERNAL_ENGINE_SIZES, ENGINE_SIZES_AWS, ENGINE_SIZES_AZURE
|
|
7
7
|
# These imports depend on Resources, so they come after
|
|
8
8
|
from .cli_resources import CLIResources
|
|
9
9
|
from .use_index_resources import UseIndexResources
|
|
@@ -12,7 +12,7 @@ from .resources_factory import create_resources_instance
|
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
14
|
'Resources', 'DirectAccessResources', 'Provider', 'Graph', 'SnowflakeClient',
|
|
15
|
-
'APP_NAME', 'PYREL_ROOT_DB', 'CLIResources', 'UseIndexResources', 'ExecContext',
|
|
15
|
+
'APP_NAME', 'PYREL_ROOT_DB', 'CLIResources', 'UseIndexResources', 'ExecContext', 'EngineType',
|
|
16
16
|
'INTERNAL_ENGINE_SIZES', 'ENGINE_SIZES_AWS', 'ENGINE_SIZES_AZURE', 'PrimaryKey',
|
|
17
17
|
'PRINT_TXN_PROGRESS_FLAG', 'create_resources_instance',
|
|
18
18
|
]
|
|
@@ -11,6 +11,7 @@ from ....tools.constants import RAI_APP_NAME
|
|
|
11
11
|
# Import Resources from snowflake - this creates a dependency but no circular import
|
|
12
12
|
# since snowflake.py doesn't import from this file
|
|
13
13
|
from .snowflake import Resources, ExecContext
|
|
14
|
+
from .error_handlers import AppMissingErrorHandler, AppFunctionMissingErrorHandler, ServiceNotStartedErrorHandler
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class CLIResources(Resources):
|
|
@@ -20,7 +21,17 @@ class CLIResources(Resources):
|
|
|
20
21
|
"""
|
|
21
22
|
|
|
22
23
|
def _handle_standard_exec_errors(self, e: Exception, ctx: ExecContext) -> Any | None:
|
|
23
|
-
"""
|
|
24
|
+
"""
|
|
25
|
+
For CLI resources, keep exceptions raw except for few specific cases.
|
|
26
|
+
"""
|
|
27
|
+
message = str(e).lower()
|
|
28
|
+
for handler in (
|
|
29
|
+
ServiceNotStartedErrorHandler(),
|
|
30
|
+
AppMissingErrorHandler(),
|
|
31
|
+
AppFunctionMissingErrorHandler(),
|
|
32
|
+
):
|
|
33
|
+
if handler.matches(e, message, ctx, self):
|
|
34
|
+
handler.handle(e, ctx, self)
|
|
24
35
|
raise e
|
|
25
36
|
|
|
26
37
|
def list_warehouses(self):
|
|
@@ -513,7 +513,14 @@ class DirectAccessResources(UseIndexResources):
|
|
|
513
513
|
# Engines
|
|
514
514
|
#--------------------------------------------------
|
|
515
515
|
|
|
516
|
-
def list_engines(
|
|
516
|
+
def list_engines(
|
|
517
|
+
self,
|
|
518
|
+
state: str | None = None,
|
|
519
|
+
name: str | None = None,
|
|
520
|
+
type: str | None = None,
|
|
521
|
+
size: str | None = None,
|
|
522
|
+
created_by: str | None = None,
|
|
523
|
+
):
|
|
517
524
|
response = self.request("list_engines")
|
|
518
525
|
if response.status_code != 200:
|
|
519
526
|
raise ResponseStatusException(
|
|
@@ -526,19 +533,31 @@ class DirectAccessResources(UseIndexResources):
|
|
|
526
533
|
{
|
|
527
534
|
"name": engine["name"],
|
|
528
535
|
"id": engine["id"],
|
|
536
|
+
"type": engine.get("type", "LOGIC"),
|
|
529
537
|
"size": engine["size"],
|
|
530
538
|
"state": engine["status"], # callers are expecting 'state'
|
|
531
539
|
"created_by": engine["created_by"],
|
|
532
540
|
"created_on": engine["created_on"],
|
|
533
541
|
"updated_on": engine["updated_on"],
|
|
542
|
+
# Optional fields (present in newer APIs / service-functions path)
|
|
543
|
+
"auto_suspend_mins": engine.get("auto_suspend_mins"),
|
|
544
|
+
"suspends_at": engine.get("suspends_at"),
|
|
545
|
+
"settings": engine.get("settings"),
|
|
534
546
|
}
|
|
535
547
|
for engine in response_content.get("engines", [])
|
|
536
|
-
if state is None or engine.get("status") == state
|
|
548
|
+
if (state is None or engine.get("status") == state)
|
|
549
|
+
and (name is None or name.upper() in engine.get("name", "").upper())
|
|
550
|
+
and (type is None or engine.get("type", "LOGIC").upper() == type.upper())
|
|
551
|
+
and (size is None or engine.get("size") == size)
|
|
552
|
+
and (created_by is None or created_by.upper() in engine.get("created_by", "").upper())
|
|
537
553
|
]
|
|
538
554
|
return sorted(engines, key=lambda x: x["name"])
|
|
539
555
|
|
|
540
|
-
def get_engine(self, name: str):
|
|
541
|
-
|
|
556
|
+
def get_engine(self, name: str, type: str):
|
|
557
|
+
if type is None:
|
|
558
|
+
raise Exception("Engine type is required. Valid types are: LOGIC, SOLVER, ML")
|
|
559
|
+
engine_type_lower = type.lower()
|
|
560
|
+
response = self.request("get_engine", path_params={"engine_name": name, "engine_type": engine_type_lower}, skip_auto_create=True)
|
|
542
561
|
if response.status_code == 404: # engine not found return 404
|
|
543
562
|
return None
|
|
544
563
|
elif response.status_code != 200:
|
|
@@ -552,6 +571,7 @@ class DirectAccessResources(UseIndexResources):
|
|
|
552
571
|
"name": engine["name"],
|
|
553
572
|
"id": engine["id"],
|
|
554
573
|
"size": engine["size"],
|
|
574
|
+
"type": engine.get("type", type),
|
|
555
575
|
"state": engine["status"], # callers are expecting 'state'
|
|
556
576
|
"created_by": engine["created_by"],
|
|
557
577
|
"created_on": engine["created_on"],
|
|
@@ -559,31 +579,47 @@ class DirectAccessResources(UseIndexResources):
|
|
|
559
579
|
"version": engine["version"],
|
|
560
580
|
"auto_suspend": engine["auto_suspend_mins"],
|
|
561
581
|
"suspends_at": engine["suspends_at"],
|
|
582
|
+
"settings": engine.get("settings"),
|
|
562
583
|
}
|
|
563
584
|
return engine_state
|
|
564
585
|
|
|
565
586
|
def _create_engine(
|
|
566
587
|
self,
|
|
567
588
|
name: str,
|
|
589
|
+
type: str = "LOGIC",
|
|
568
590
|
size: str | None = None,
|
|
569
591
|
auto_suspend_mins: int | None = None,
|
|
570
592
|
is_async: bool = False,
|
|
571
|
-
headers: Dict[str, str] | None = None
|
|
593
|
+
headers: Dict[str, str] | None = None,
|
|
594
|
+
settings: Dict[str, Any] | None = None,
|
|
572
595
|
):
|
|
573
596
|
# only async engine creation supported via direct access
|
|
574
597
|
if not is_async:
|
|
575
|
-
return super()._create_engine(
|
|
598
|
+
return super()._create_engine(
|
|
599
|
+
name,
|
|
600
|
+
type=type,
|
|
601
|
+
size=size,
|
|
602
|
+
auto_suspend_mins=auto_suspend_mins,
|
|
603
|
+
is_async=is_async,
|
|
604
|
+
headers=headers,
|
|
605
|
+
settings=settings,
|
|
606
|
+
)
|
|
607
|
+
engine_type_lower = type.lower()
|
|
576
608
|
payload:Dict[str, Any] = {
|
|
577
609
|
"name": name,
|
|
578
610
|
}
|
|
611
|
+
# Allow passing arbitrary engine settings (API-dependent).
|
|
612
|
+
if settings:
|
|
613
|
+
payload["settings"] = settings
|
|
579
614
|
if auto_suspend_mins is not None:
|
|
580
615
|
payload["auto_suspend_mins"] = auto_suspend_mins
|
|
581
|
-
if size is
|
|
582
|
-
|
|
616
|
+
if size is None:
|
|
617
|
+
size = self.config.get_default_engine_size()
|
|
618
|
+
payload["size"] = size
|
|
583
619
|
response = self.request(
|
|
584
620
|
"create_engine",
|
|
585
621
|
payload=payload,
|
|
586
|
-
path_params={"engine_type":
|
|
622
|
+
path_params={"engine_type": engine_type_lower},
|
|
587
623
|
headers=headers,
|
|
588
624
|
skip_auto_create=True,
|
|
589
625
|
)
|
|
@@ -592,11 +628,11 @@ class DirectAccessResources(UseIndexResources):
|
|
|
592
628
|
f"Failed to create engine {name} with size {size}.", response
|
|
593
629
|
)
|
|
594
630
|
|
|
595
|
-
def delete_engine(self, name:str,
|
|
631
|
+
def delete_engine(self, name: str, type: str):
|
|
596
632
|
response = self.request(
|
|
597
633
|
"delete_engine",
|
|
598
|
-
path_params={"engine_name": name, "engine_type":
|
|
599
|
-
headers=
|
|
634
|
+
path_params={"engine_name": name, "engine_type": type.lower()},
|
|
635
|
+
headers={},
|
|
600
636
|
skip_auto_create=True,
|
|
601
637
|
)
|
|
602
638
|
if response.status_code != 200:
|
|
@@ -604,10 +640,12 @@ class DirectAccessResources(UseIndexResources):
|
|
|
604
640
|
f"Failed to delete engine {name}.", response
|
|
605
641
|
)
|
|
606
642
|
|
|
607
|
-
def suspend_engine(self, name:str):
|
|
643
|
+
def suspend_engine(self, name: str, type: str | None = None):
|
|
644
|
+
if type is None:
|
|
645
|
+
type = "LOGIC"
|
|
608
646
|
response = self.request(
|
|
609
647
|
"suspend_engine",
|
|
610
|
-
path_params={"engine_name": name, "engine_type":
|
|
648
|
+
path_params={"engine_name": name, "engine_type": type.lower()},
|
|
611
649
|
skip_auto_create=True,
|
|
612
650
|
)
|
|
613
651
|
if response.status_code != 200:
|
|
@@ -615,11 +653,13 @@ class DirectAccessResources(UseIndexResources):
|
|
|
615
653
|
f"Failed to suspend engine {name}.", response
|
|
616
654
|
)
|
|
617
655
|
|
|
618
|
-
def resume_engine_async(self, name:str, headers=
|
|
656
|
+
def resume_engine_async(self, name: str, type: str | None = None, headers: Dict | None = None):
|
|
657
|
+
if type is None:
|
|
658
|
+
type = "LOGIC"
|
|
619
659
|
response = self.request(
|
|
620
660
|
"resume_engine",
|
|
621
|
-
path_params={"engine_name": name, "engine_type":
|
|
622
|
-
headers=headers,
|
|
661
|
+
path_params={"engine_name": name, "engine_type": type.lower()},
|
|
662
|
+
headers=headers or {},
|
|
623
663
|
skip_auto_create=True,
|
|
624
664
|
)
|
|
625
665
|
if response.status_code != 200:
|