peak-sdk 1.3.0__py3-none-any.whl → 1.5.0__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.
@@ -0,0 +1,413 @@
1
+ #
2
+ # # Copyright © 2024 Peak AI Limited. or its affiliates. All Rights Reserved.
3
+ # #
4
+ # # Licensed under the Apache License, Version 2.0 (the "License"). You
5
+ # # may not use this file except in compliance with the License. A copy of
6
+ # # the License is located at:
7
+ # #
8
+ # # https://github.com/PeakBI/peak-sdk/blob/main/LICENSE
9
+ # #
10
+ # # or in the "license" file accompanying this file. This file is
11
+ # # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
+ # # ANY KIND, either express or implied. See the License for the specific
13
+ # # language governing permissions and limitations under the License.
14
+ # #
15
+ # # This file is part of the peak-sdk.
16
+ # # see (https://github.com/PeakBI/peak-sdk)
17
+ # #
18
+ # # You should have received a copy of the APACHE LICENSE, VERSION 2.0
19
+ # # along with this program. If not, see <https://apache.org/licenses/LICENSE-2.0>
20
+ #
21
+
22
+ """Service client module."""
23
+ from __future__ import annotations
24
+
25
+ from typing import Any, Dict, Iterator, List, Literal, Optional, overload
26
+
27
+ from peak.base_client import BaseClient
28
+ from peak.constants import ContentType, HttpMethods
29
+ from peak.session import Session
30
+
31
+
32
+ class Service(BaseClient):
33
+ """Client class for interacting with services resource."""
34
+
35
+ BASE_ENDPOINT = "webapps/api/v1"
36
+
37
+ @overload
38
+ def list_services(
39
+ self,
40
+ page_size: Optional[int] = None,
41
+ page_number: Optional[int] = None,
42
+ status: Optional[List[str]] = None,
43
+ name: Optional[str] = None,
44
+ service_type: Optional[List[str]] = None,
45
+ *,
46
+ return_iterator: Literal[False],
47
+ ) -> Dict[str, Any]:
48
+ ...
49
+
50
+ @overload
51
+ def list_services(
52
+ self,
53
+ page_size: Optional[int] = None,
54
+ page_number: Optional[int] = None,
55
+ status: Optional[List[str]] = None,
56
+ name: Optional[str] = None,
57
+ service_type: Optional[List[str]] = None,
58
+ *,
59
+ return_iterator: Literal[True] = True,
60
+ ) -> Iterator[Dict[str, Any]]:
61
+ ...
62
+
63
+ def list_services(
64
+ self,
65
+ page_size: Optional[int] = None,
66
+ page_number: Optional[int] = None,
67
+ status: Optional[List[str]] = None,
68
+ name: Optional[str] = None,
69
+ service_type: Optional[List[str]] = None,
70
+ *,
71
+ return_iterator: bool = True,
72
+ ) -> Iterator[Dict[str, Any]] | Dict[str, Any]:
73
+ """Retrieve a list of services.
74
+
75
+ REFERENCE:
76
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/list-service>`__
77
+
78
+ Args:
79
+ page_size (int | None): The number of services per page.
80
+ page_number (int | None): The page number to retrieve. Only used when `return_iterator` is False.
81
+ status (List[str] | None): A list of service status to filter the list by.
82
+ Valid values are `CREATING`, `DEPLOYING`, `AVAILABLE`, `DELETING`, `CREATE_FAILED`, `DELETE_FAILED`.
83
+ name (str | None): Name of the service to search for.
84
+ service_type (List[str] | None): A list of service types to filter the list by. Valid values are `api`, `web-app` and `shiny`.
85
+ return_iterator (bool): Whether to return an iterator object or list of services for a specified page number, defaults to True.
86
+
87
+ Returns:
88
+ Iterator[Dict[str, Any] | Dict[str, Any]: an iterator object which returns an element per iteration, until there are no more elements to return.
89
+ If `return_iterator` is set to False, a dictionary containing the list and pagination details is returned instead.
90
+ Set `return_iterator` to True if you want automatic client-side pagination, or False if you want server-side pagination.
91
+
92
+ Raises:
93
+ BadRequestException: The given request parameters are invalid.
94
+ UnauthorizedException: The credentials are invalid.
95
+ ForbiddenException: The user does not have permission to perform the operation.
96
+ InternalServerErrorException: The server failed to process the request.
97
+ """
98
+ method, endpoint = HttpMethods.GET, f"{self.BASE_ENDPOINT}/webapps/"
99
+ params = {
100
+ "pageSize": page_size,
101
+ "status": status,
102
+ "searchTerm": name,
103
+ "serviceType": service_type,
104
+ "featureType": "services",
105
+ }
106
+
107
+ if return_iterator:
108
+ return self.session.create_generator_request(
109
+ endpoint,
110
+ method,
111
+ content_type=ContentType.APPLICATION_JSON,
112
+ response_key="services",
113
+ params=params,
114
+ )
115
+
116
+ return self.session.create_request( # type: ignore[no-any-return]
117
+ endpoint,
118
+ method,
119
+ content_type=ContentType.APPLICATION_JSON,
120
+ params={**params, "pageNumber": page_number},
121
+ )
122
+
123
+ def create_service(self, body: Dict[str, Any]) -> Dict[str, str]:
124
+ """Create a new service.
125
+
126
+ REFERENCE:
127
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/create-service>`__
128
+
129
+ Args:
130
+ body (Dict[str, Any]): A dictionary containing the service config. Schema can be found below.
131
+
132
+ Returns:
133
+ Dict[str, str]: Id of the new service
134
+
135
+ SCHEMA:
136
+ .. code-block:: json
137
+
138
+ {
139
+ "name": "string(required)",
140
+ "title": "string",
141
+ "serviceType": "string. Valid values are 'api', 'web-app' and 'shiny'",
142
+ "imageDetails": {
143
+ "imageId": "number(required)",
144
+ "versionId": "number"
145
+ },
146
+ "resources": {
147
+ "instanceTypeId": "number"
148
+ },
149
+ "parameters": {
150
+ "env": {
151
+ "key: string": "value: string"
152
+ },
153
+ "secrets": []
154
+ },
155
+ "description": "string",
156
+ "sessionStickiness": "boolean. Not required for 'api' service type.",
157
+ "entrypoint": "string",
158
+ "healthCheckURL": "string"
159
+ }
160
+
161
+ Raises:
162
+ BadRequestException: The given request parameters are invalid.
163
+ UnauthorizedException: The credentials are invalid.
164
+ ForbiddenException: The user does not have permission to perform the operation.
165
+ InternalServerErrorException: The server failed to process the request.
166
+ """
167
+ method, endpoint = HttpMethods.POST, f"{self.BASE_ENDPOINT}/webapps/"
168
+
169
+ return self.session.create_request( # type: ignore[no-any-return]
170
+ endpoint,
171
+ method,
172
+ content_type=ContentType.APPLICATION_JSON,
173
+ body=body,
174
+ )
175
+
176
+ def update_service(
177
+ self,
178
+ service_id: str,
179
+ body: Dict[str, Any],
180
+ ) -> Dict[str, str]:
181
+ """Updates the existing service.
182
+
183
+ When updating the service, it will trigger a redeployment only under specific conditions.
184
+ Redeployment is triggered if you make changes to any of the following parameters: imageId, versionId, instanceTypeId, parameters, healthCheckURL, entrypoint or sessionStickiness.
185
+ However, only modifying the title or description will not trigger a redeployment.
186
+
187
+ With the help of this operation, we can just update the required fields (except name and serviceType) and keep the rest of the fields as it is.
188
+
189
+ REFERENCE:
190
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/update-service>`__
191
+
192
+ Args:
193
+ service_id (str): The ID of the service to update.
194
+ body (Dict[str, Any]): A dictionary containing the service config. Schema can be found below.
195
+
196
+ Returns:
197
+ Dict[str, str]: Id of the service.
198
+
199
+ SCHEMA:
200
+ .. code-block:: json
201
+
202
+ {
203
+ "title": "string",
204
+ "imageDetails": {
205
+ "imageId": "number(required)",
206
+ "versionId": "number",
207
+ },
208
+ "resources": {
209
+ "instanceTypeId": "number"
210
+ },
211
+ "parameters": {
212
+ "env": {
213
+ "key: string": "value: string",
214
+ },
215
+ "secrets": []
216
+ },
217
+ "description": "string",
218
+ "sessionStickiness": "boolean. Not required for 'api' service type.",
219
+ "entrypoint": "string",
220
+ "healthCheckURL": "string",
221
+ }
222
+
223
+ Raises:
224
+ BadRequestException: The given request parameters are invalid.
225
+ UnauthorizedException: The credentials are invalid.
226
+ ForbiddenException: The user does not have permission to perform the operation.
227
+ NotFoundException: The given service does not exist.
228
+ UnprocessableEntityException: The server was unable to process the request.
229
+ InternalServerErrorException: The server failed to process the request.
230
+ """
231
+ method, endpoint = HttpMethods.PATCH, f"{self.BASE_ENDPOINT}/webapps/{service_id}"
232
+ return self.session.create_request( # type: ignore[no-any-return]
233
+ endpoint,
234
+ method,
235
+ content_type=ContentType.APPLICATION_JSON,
236
+ body=body,
237
+ )
238
+
239
+ def create_or_update_service(self, body: Dict[str, Any]) -> Dict[str, str]:
240
+ """Create a new service or updates an existing service based on service name.
241
+
242
+ When updating the service, it will trigger a redeployment only under specific conditions.
243
+ Redeployment is triggered if you make changes to any of the following parameters: imageId, versionId, instanceTypeId, parameters, healthCheckURL, entrypoint or sessionStickiness.
244
+ However, only modifying the title or description will not trigger a redeployment.
245
+
246
+ REFERENCE:
247
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/create-service>`__
248
+
249
+ Args:
250
+ body (Dict[str, Any]): A dictionary containing the service config. Schema can be found below.
251
+
252
+ Returns:
253
+ Dict[str, str]: Id of the new or updated service.
254
+
255
+ SCHEMA:
256
+ .. code-block:: json
257
+
258
+ {
259
+ "name": "string(required)",
260
+ "title": "string",
261
+ "serviceType": "string. Valid values are 'api', 'web-app' and 'shiny'",
262
+ "imageDetails": {
263
+ "imageId": "number(required)",
264
+ "versionId": "number"
265
+ },
266
+ "resources": {
267
+ "instanceTypeId": "number"
268
+ },
269
+ "parameters": {
270
+ "env": {
271
+ "key: string": "value: string",
272
+ },
273
+ "secrets": []
274
+ },
275
+ "description": "string",
276
+ "sessionStickiness": "boolean. Not required for 'api' service type.",
277
+ "entrypoint": "string",
278
+ "healthCheckURL": "string",
279
+ }
280
+
281
+
282
+ Raises:
283
+ BadRequestException: The given request parameters are invalid.
284
+ UnauthorizedException: The credentials are invalid.
285
+ ForbiddenException: The user does not have permission to perform the operation.
286
+ InternalServerErrorException: The server failed to process the request.
287
+ """
288
+ service_name = body["name"] if "name" in body else ""
289
+ response = (
290
+ {} if not len(service_name) else self.list_services(page_size=100, return_iterator=False, name=service_name)
291
+ )
292
+ filtered_services = list(
293
+ filter(lambda service: service.get("name", "") == service_name, response.get("services", [])),
294
+ )
295
+
296
+ if len(filtered_services) > 0:
297
+ service_id = filtered_services[0]["id"]
298
+ return self.update_service(service_id=service_id, body=body)
299
+
300
+ return self.create_service(body=body)
301
+
302
+ def delete_service(
303
+ self,
304
+ service_id: str,
305
+ ) -> Dict[str, str]:
306
+ """Delete a service.
307
+
308
+ REFERENCE:
309
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/delete-service>`__
310
+
311
+ Args:
312
+ service_id (str): The ID of the service to delete.
313
+
314
+ Returns:
315
+ Dict[str, str]: Dictonary containing ID of the deleted service.
316
+
317
+ Raises:
318
+ UnauthorizedException: The credentials are invalid.
319
+ ForbiddenException: The user does not have permission to perform the operation.
320
+ NotFoundException: The given service does not exist.
321
+ ConflictException: If the service is in a conflicting state while deleting.
322
+ InternalServerErrorException: The server failed to process the request.
323
+ """
324
+ method, endpoint = HttpMethods.DELETE, f"{self.BASE_ENDPOINT}/webapps/{service_id}"
325
+
326
+ return self.session.create_request( # type: ignore[no-any-return]
327
+ endpoint,
328
+ method,
329
+ content_type=ContentType.APPLICATION_JSON,
330
+ )
331
+
332
+ def describe_service(
333
+ self,
334
+ service_id: str,
335
+ ) -> Dict[str, Any]:
336
+ """Retrieve details of a specific service.
337
+
338
+ REFERENCE:
339
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/get-service>`__
340
+
341
+ Args:
342
+ service_id (str): The ID of the service to fetch.
343
+
344
+ Returns:
345
+ Dict[str, Any]: Dictonary containing details of the service.
346
+
347
+ Raises:
348
+ UnauthorizedException: The credentials are invalid.
349
+ ForbiddenException: The user does not have permission to perform the operation.
350
+ NotFoundException: The given service does not exist.
351
+ UnprocessableEntityException: The server was unable to process the request.
352
+ InternalServerErrorException: The server failed to process the request.
353
+ """
354
+ method, endpoint = HttpMethods.GET, f"{self.BASE_ENDPOINT}/webapps/{service_id}"
355
+
356
+ return self.session.create_request( # type: ignore[no-any-return]
357
+ endpoint,
358
+ method,
359
+ content_type=ContentType.APPLICATION_JSON,
360
+ )
361
+
362
+ def test_service(
363
+ self,
364
+ service_name: str,
365
+ http_method: str,
366
+ path: Optional[str] = None,
367
+ payload: Optional[Dict[str, Any]] = None,
368
+ ) -> Dict[str, Any]:
369
+ """Test an API service to verify it's health and if it is working. Make sure the service is of type "api".
370
+
371
+ REFERENCE:
372
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/test-api-service>`__
373
+
374
+ Args:
375
+ service_name (str): The name of the API type service to test.
376
+ http_method (str): The HTTP method to use for the test. Valid values are 'get', 'post', 'put', 'patch' and 'delete'.
377
+ path (str, None): The path to test the service with. Default is '/'.
378
+ payload (Dict[str, Any], None): The payload to test the service with.
379
+
380
+ Returns:
381
+ Dict[str, Any]: Dictonary containing response of the test.
382
+
383
+ Raises:
384
+ UnauthorizedException: The credentials are invalid.
385
+ ForbiddenException: The user does not have permission to perform the operation.
386
+ NotFoundException: The given service does not exist.
387
+ UnprocessableEntityException: The server was unable to process the request.
388
+ InternalServerErrorException: The server failed to process the request.
389
+ """
390
+ method, endpoint = HttpMethods.POST, f"{self.BASE_ENDPOINT}/webapps/{service_name}/test"
391
+ body = {"httpMethod": http_method, "path": path, "payload": payload}
392
+
393
+ return self.session.create_request( # type: ignore[no-any-return]
394
+ endpoint,
395
+ method,
396
+ content_type=ContentType.APPLICATION_JSON,
397
+ body=body,
398
+ )
399
+
400
+
401
+ def get_client(session: Optional[Session] = None) -> Service:
402
+ """Returns a Service client, If no session is provided, a default session is used.
403
+
404
+ Args:
405
+ session (Optional[Session]): A Session Object. Default is None.
406
+
407
+ Returns:
408
+ Service: The service client object.
409
+ """
410
+ return Service(session)
411
+
412
+
413
+ __all__ = ["get_client"]
@@ -0,0 +1,93 @@
1
+ #
2
+ # # Copyright © 2024 Peak AI Limited. or its affiliates. All Rights Reserved.
3
+ # #
4
+ # # Licensed under the Apache License, Version 2.0 (the "License"). You
5
+ # # may not use this file except in compliance with the License. A copy of
6
+ # # the License is located at:
7
+ # #
8
+ # # https://github.com/PeakBI/peak-sdk/blob/main/LICENSE
9
+ # #
10
+ # # or in the "license" file accompanying this file. This file is
11
+ # # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
+ # # ANY KIND, either express or implied. See the License for the specific
13
+ # # language governing permissions and limitations under the License.
14
+ # #
15
+ # # This file is part of the peak-sdk.
16
+ # # see (https://github.com/PeakBI/peak-sdk)
17
+ # #
18
+ # # You should have received a copy of the APACHE LICENSE, VERSION 2.0
19
+ # # along with this program. If not, see <https://apache.org/licenses/LICENSE-2.0>
20
+ #
21
+
22
+ """User client module."""
23
+ from __future__ import annotations
24
+
25
+ from typing import Dict, Optional
26
+
27
+ from peak.base_client import BaseClient
28
+ from peak.constants import ContentType, HttpMethods
29
+ from peak.helpers import search_action
30
+ from peak.session import Session
31
+ from peak.validators import validate_action, validate_feature_path
32
+
33
+
34
+ class User(BaseClient):
35
+ """Client class for interacting with users resource."""
36
+
37
+ BASE_ENDPOINT = "access-control/api/v2"
38
+
39
+ def check_permissions(self, feature_actions: Dict[str, str]) -> Dict[str, bool]:
40
+ """Check if the user has the specified permissions for the given features or subfeatures.
41
+
42
+ Args:
43
+ feature_actions (Dict[str, str]): A dictionary where keys are feature paths (e.g., "PRICING.GUARDRAILS")
44
+ and values are actions (e.g., "read" or "write").
45
+
46
+ Returns:
47
+ Dict[str, bool]: A dictionary where keys are the same feature paths and values are booleans
48
+ indicating whether the user has the specified action permission for that feature.
49
+
50
+ Raises:
51
+ UnauthorizedException: The credentials are invalid.
52
+ ForbiddenException: The user does not have permission to perform the operation.
53
+ NotFoundException: The given feature does not exist.
54
+ UnprocessableEntityException: The server was unable to process the request.
55
+ InternalServerErrorException: The server failed to process the request.
56
+ """
57
+ method, endpoint = HttpMethods.GET, f"{self.BASE_ENDPOINT}/access/permissions"
58
+
59
+ permissions_response = self.session.create_request(
60
+ endpoint,
61
+ method,
62
+ params={
63
+ "type": "app",
64
+ },
65
+ content_type=ContentType.APPLICATION_JSON,
66
+ )
67
+
68
+ result_permissions = {}
69
+
70
+ for feature_path, action in feature_actions.items():
71
+ validate_action(action)
72
+
73
+ search_result = search_action(feature_path, permissions_response, action)
74
+ validate_feature_path(search_result=search_result, feature_path=feature_path)
75
+
76
+ result_permissions[feature_path] = search_result["has_permission"]
77
+
78
+ return result_permissions
79
+
80
+
81
+ def get_client(session: Optional[Session] = None) -> User:
82
+ """Returns a User client, If no session is provided, a default session is used.
83
+
84
+ Args:
85
+ session (Optional[Session]): A Session Object. Default is None.
86
+
87
+ Returns:
88
+ User: The user client object.
89
+ """
90
+ return User(session)
91
+
92
+
93
+ __all__ = ["get_client"]
peak/resources/webapps.py CHANGED
@@ -19,7 +19,13 @@
19
19
  # # along with this program. If not, see <https://apache.org/licenses/LICENSE-2.0>
20
20
  #
21
21
 
22
- """Webapp client module."""
22
+ """Webapp client module.
23
+
24
+ .. warning::
25
+ The ``Webapp`` module is deprecated and will eventually be removed. It is recommended that users begin transitioning to the ``Service`` module, which offers all the features of ``Webapp`` along with the added capability of API deployment and other significant updates for enhanced functionality. Transitioning early to the ``Service`` module will ensure easier adoption of its advanced features and future updates.
26
+
27
+ For guidance on migrating to the ``Service`` module and taking full advantage of its capabilities, please refer to the ``Service`` module's documentation.
28
+ """
23
29
  from __future__ import annotations
24
30
 
25
31
  from typing import Any, Dict, Iterator, List, Literal, Optional, overload
@@ -70,7 +76,7 @@ class Webapp(BaseClient):
70
76
  """Retrieve a list of webapps.
71
77
 
72
78
  REFERENCE:
73
- 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Webapps/list-webapp>`__
79
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/list-service>`__
74
80
 
75
81
  Args:
76
82
  page_size (int | None): The number of webapps per page.
@@ -114,7 +120,7 @@ class Webapp(BaseClient):
114
120
  """Create a new webapp. Only geneic (EKS-based) webapps are supported at the moment.
115
121
 
116
122
  REFERENCE:
117
- 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Webapps/create-webapp>`__
123
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/create-service>`__
118
124
 
119
125
  Args:
120
126
  body (Dict[str, Any]): A dictionary containing the webapp config. Schema can be found below.
@@ -166,7 +172,7 @@ class Webapp(BaseClient):
166
172
  However, only modifying the title or description will not trigger a redeployment.
167
173
 
168
174
  REFERENCE:
169
- 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Webapps/update-webapp>`__
175
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/update-service>`__
170
176
 
171
177
  Args:
172
178
  webapp_id (str): The ID of the webapp to update.
@@ -215,7 +221,7 @@ class Webapp(BaseClient):
215
221
  However, only modifying the title or description will not trigger a redeployment.
216
222
 
217
223
  REFERENCE:
218
- 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Webapps/create-webapp>`__
224
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/create-service>`__
219
225
 
220
226
  Args:
221
227
  body (Dict[str, Any]): A dictionary containing the webapp config. Schema can be found below.
@@ -268,7 +274,7 @@ class Webapp(BaseClient):
268
274
  """Delete a webapp.
269
275
 
270
276
  REFERENCE:
271
- 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Webapps/delete-webapp>`__
277
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/delete-service>`__
272
278
 
273
279
  Args:
274
280
  webapp_id (str): The ID of the webapp to delete.
@@ -298,7 +304,7 @@ class Webapp(BaseClient):
298
304
  """Retrieve details of a specific webapp.
299
305
 
300
306
  REFERENCE:
301
- 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Webapps/get-webapp>`__
307
+ 🔗 `API Documentation <https://service.peak.ai/webapps/api-docs/index.htm#/Services/get-service>`__
302
308
 
303
309
  Args:
304
310
  webapp_id (str): The ID of the webapp to fetch.
@@ -156,7 +156,6 @@ class Workflow(BaseClient):
156
156
  },
157
157
  {
158
158
  "webhook": "boolean",
159
- "webhookPolicy": "string"
160
159
  }
161
160
  ],
162
161
  "watchers": [
@@ -286,7 +285,6 @@ class Workflow(BaseClient):
286
285
  },
287
286
  {
288
287
  "webhook": "boolean",
289
- "webhookPolicy": "string"
290
288
  }
291
289
  ],
292
290
  "watchers": [
@@ -455,7 +453,6 @@ class Workflow(BaseClient):
455
453
  },
456
454
  {
457
455
  "webhook": "boolean",
458
- "webhookPolicy": "string"
459
456
  }
460
457
  ],
461
458
  "watchers": [
@@ -617,7 +614,6 @@ class Workflow(BaseClient):
617
614
  },
618
615
  {
619
616
  "webhook": "boolean",
620
- "webhookPolicy": "string"
621
617
  }
622
618
  ],
623
619
  "watchers": [
@@ -1015,7 +1011,7 @@ class Workflow(BaseClient):
1015
1011
  Set `return_iterator` to True if you want automatic client-side pagination, or False if you want server-side pagination.
1016
1012
 
1017
1013
  Raises:
1018
- BadRequestException: BadRequestException: The given request parameters are invalid.
1014
+ BadRequestException: The given request parameters are invalid.
1019
1015
  UnauthorizedException: The credentials are invalid.
1020
1016
  ForbiddenException: The user does not have permission to perform the operation.
1021
1017
  NotFoundException: The given workflow does not exist.
@@ -1072,7 +1068,7 @@ class Workflow(BaseClient):
1072
1068
  Dict[str, Any]: A dictionary containing the logs for the given execution.
1073
1069
 
1074
1070
  Raises:
1075
- BadRequestException: BadRequestException: The given request parameters are invalid.
1071
+ BadRequestException: The given request parameters are invalid.
1076
1072
  UnauthorizedException: The credentials are invalid.
1077
1073
  ForbiddenException: The user does not have permission to perform the operation.
1078
1074
  NotFoundException: The given workflow does not exist.
@@ -1127,7 +1123,7 @@ class Workflow(BaseClient):
1127
1123
  Dict[str, Any]: A dictionary containing the logs for the given execution.
1128
1124
 
1129
1125
  Raises:
1130
- BadRequestException: BadRequestException: The given request parameters are invalid.
1126
+ BadRequestException: The given request parameters are invalid.
1131
1127
  UnauthorizedException: The credentials are invalid.
1132
1128
  ForbiddenException: The user does not have permission to perform the operation.
1133
1129
  NotFoundException: The given workflow does not exist.
@@ -0,0 +1,24 @@
1
+ # service.yaml
2
+
3
+ body:
4
+ name: my-service
5
+ title: New service
6
+ description: This is a new service
7
+ serviceType: web-app
8
+ imageDetails:
9
+ imageId: 100
10
+ versionId: 100
11
+ resources:
12
+ instanceTypeId: 43
13
+ parameters:
14
+ env:
15
+ param1: value1
16
+ param2: value2
17
+ secrets:
18
+ - secret1
19
+ - secret2
20
+ sessionStickiness: true
21
+ entrypoint: |
22
+ python
23
+ app.py
24
+ healthCheckURL: /health
@@ -0,0 +1,24 @@
1
+ # service.yaml
2
+
3
+ body:
4
+ name: my-service
5
+ title: New service
6
+ description: This is a new service
7
+ serviceType: web-app
8
+ imageDetails:
9
+ imageId: 100
10
+ versionId: 100
11
+ resources:
12
+ instanceTypeId: 43
13
+ parameters:
14
+ env:
15
+ param1: value1
16
+ param2: value2
17
+ secrets:
18
+ - secret1
19
+ - secret2
20
+ sessionStickiness: true
21
+ entrypoint: |
22
+ python
23
+ app.py
24
+ healthCheckURL: /health