Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrates to Kubernetes_asyncio for asynchronous support #13910

Merged
merged 126 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from 112 commits
Commits
Show all changes
126 commits
Select commit Hold shift + click to select a range
aac2094
WIP events tests
gabcoyne May 15, 2024
366c4cc
WIP events tests
gabcoyne May 15, 2024
a3cec8c
WIP events tests
gabcoyne May 15, 2024
58daa2b
remove extra stop
gabcoyne May 15, 2024
d50dbe1
kubernetes credetials are now async
jeanluciano May 16, 2024
95acc0a
update with upstream creds work
gabcoyne May 16, 2024
44f64ee
Merge branch 'main' of https://github.com/prefecthq/prefect into kube…
gabcoyne May 16, 2024
9a8f755
WIP k8s mocks
gabcoyne May 17, 2024
60bab2e
WIP k8s mocks
gabcoyne May 20, 2024
c84c57c
mocks api client
jeanluciano May 20, 2024
187c1c0
WIP k8s mocks
gabcoyne May 22, 2024
7165e8c
WIP watch tests
gabcoyne May 22, 2024
6f68a9f
mocks correct calls
jeanluciano May 22, 2024
b4a608d
mocks logs call correctly
jeanluciano May 23, 2024
8bb5fef
test changes minus watch
jeanluciano May 23, 2024
ef1f67b
uses asyncio sleep
jeanluciano May 24, 2024
8e16b37
fix watch loop
gabcoyne May 24, 2024
528bd80
WIP fix iter on log content
gabcoyne May 24, 2024
02324db
test upto test_watch_timeout_is_restarted_until_job_is_complete are p…
jeanluciano May 24, 2024
72dcadb
Merge branch 'kubernetes-asyncio' of https://github.com/PrefectHQ/pre…
jeanluciano May 24, 2024
33dae4d
All kill tests
gabcoyne May 28, 2024
c010137
All but test_watch_timeout_is_restarted_until_job_is_complete passing'
jeanluciano May 28, 2024
c5ed9b0
update conftest to allow load from integration dir
gabcoyne May 28, 2024
fd2f977
Merge branch 'kubernetes-asyncio' of https://github.com/prefecthq/pre…
gabcoyne May 28, 2024
f06c2f9
refactor watch
jeanluciano May 29, 2024
800c60b
all watch realted test passing
jeanluciano May 29, 2024
0feb70f
flow tests passing
gabcoyne May 30, 2024
30fa016
flow tests passing
gabcoyne May 30, 2024
0fb92a4
all test passing
jeanluciano May 30, 2024
df6fe3d
aiohttpx error fix
jeanluciano May 30, 2024
2d25247
flow tests passing
gabcoyne May 30, 2024
e4428cb
Merge branch 'kubernetes-asyncio' of https://github.com/prefecthq/pre…
gabcoyne May 30, 2024
b517ac1
credentials block get config fixes
jeanluciano May 30, 2024
a6e0833
merge from main
jeanluciano May 30, 2024
2f4b4ec
watch stop fix
jeanluciano May 30, 2024
7f01ca2
add credwork
gabcoyne May 31, 2024
7b66ae0
fix merge
gabcoyne May 31, 2024
6b9a60b
fix imports|
gabcoyne May 31, 2024
89665d8
logs.content mock fixes
jeanluciano May 31, 2024
28aaf8a
Merge branch 'kubernetes-asyncio' of https://github.com/PrefectHQ/pre…
jeanluciano May 31, 2024
1aa92c2
pod fixture fixes
jeanluciano Jun 3, 2024
c675005
jobs and services test
jeanluciano Jun 4, 2024
88fcc84
flows fixture fixes
jeanluciano Jun 4, 2024
d23ee3f
all tests passing
jeanluciano Jun 4, 2024
05f1380
tweak prints
gabcoyne Jun 4, 2024
3fb1b7d
Merge branch 'main' of https://github.com/PrefectHQ/prefect into kube…
jeanluciano Jun 5, 2024
0a10847
fix events (#13813)
gabcoyne Jun 5, 2024
4e72660
fixing tests
gabcoyne Jun 6, 2024
dc6770b
Merge branch 'main' of https://github.com/prefecthq/prefect into kube…
gabcoyne Jun 6, 2024
82bfb74
fixes 410 no getting caught
jeanluciano Jun 6, 2024
1549fa5
Merge branch 'kubernetes-asyncio' of https://github.com/PrefectHQ/pre…
jeanluciano Jun 6, 2024
e1946dd
WIP add timeout_async
gabcoyne Jun 7, 2024
d48f5d7
push concurrent stream
gabcoyne Jun 7, 2024
e6f26fd
uses timeout context manager
jeanluciano Jun 7, 2024
9add91b
remove tests
gabcoyne Jun 10, 2024
e1aaff4
add conditional for stream output
gabcoyne Jun 10, 2024
bf2b43f
add timeout to pod and job watch
gabcoyne Jun 10, 2024
db1e62b
Merge branch 'gather-k8s-streams' of https://github.com/PrefectHQ/pre…
jeanluciano Jun 10, 2024
fc7c3a3
read_namespaced_pod_log no longer timesout
jeanluciano Jun 11, 2024
c5d33c2
switched logs to watch
jeanluciano Jun 12, 2024
72e08a6
moved watch statements to functions
jeanluciano Jun 12, 2024
3043327
cleanup files and remove extraneous test
gabcoyne Jun 13, 2024
c885149
cleanup files and remove extraneous test
gabcoyne Jun 13, 2024
2f0b3c2
Merge branch 'main' into kubernetes-asyncio
gabcoyne Jun 13, 2024
a32c1c2
update python version
gabcoyne Jun 13, 2024
fd0dd91
Delete job_manifest.json
gabcoyne Jun 13, 2024
1eb1b56
add openssl
gabcoyne Jun 13, 2024
b1ca929
Merge branch 'main' of https://github.com/prefecthq/prefect into kube…
gabcoyne Jun 14, 2024
d2f60f5
add openssl
gabcoyne Jun 14, 2024
80b3455
Merge branch 'main' of https://github.com/prefecthq/prefect into kube…
gabcoyne Jun 14, 2024
6b08cfe
remove last run_sync_in_worker_thread
gabcoyne Jun 14, 2024
9389113
remove _watch
gabcoyne Jun 18, 2024
bebfec9
mocks list namespaced pods sort for less warnings
jeanluciano Jun 18, 2024
21d985a
Merge branch 'main' into kubernetes-asyncio
jeanluciano Jun 18, 2024
403c021
imports cluster config from integration instead of blocks
jeanluciano Jun 18, 2024
554d00b
from file now async
jeanluciano Jun 18, 2024
13834f5
Merge branch 'main' of https://github.com/prefecthq/prefect into kube…
gabcoyne Jun 18, 2024
5d822db
adjust watch and stream imports
gabcoyne Jun 18, 2024
846c6c0
pod metadata
jeanluciano Jun 20, 2024
7b33d6a
Merge branch 'main' of https://github.com/PrefectHQ/prefect into kube…
jeanluciano Jun 20, 2024
67cacbe
hygeine and naming
gabcoyne Jun 20, 2024
c1166df
Merge branch 'kubernetes-asyncio' of https://github.com/prefecthq/pre…
gabcoyne Jun 20, 2024
5587ceb
revert test
gabcoyne Jun 20, 2024
3a2efd1
Merge branch 'main' into kubernetes-asyncio
jeanluciano Jun 20, 2024
4fc804e
get client type fix
jeanluciano Jun 20, 2024
3c6b7ac
Merge branch 'kubernetes-asyncio' of https://github.com/PrefectHQ/pre…
jeanluciano Jun 20, 2024
30f7344
get client type fix
jeanluciano Jun 20, 2024
0930929
kubernetes asyncio import fix
jeanluciano Jun 20, 2024
673604e
job pod metadata
jeanluciano Jun 20, 2024
1a13519
_pod_as_resource
jeanluciano Jun 20, 2024
5de44e2
monkeypatch fix in cluster config
jeanluciano Jun 20, 2024
555b9dd
test no cred test
jeanluciano Jun 20, 2024
a208c6f
test credentials class
jeanluciano Jun 20, 2024
bf73ed0
tweak imports
gabcoyne Jun 20, 2024
a9f165d
Merge branch 'kubernetes-asyncio' of https://github.com/prefecthq/pre…
gabcoyne Jun 20, 2024
72f9812
tweak imports
gabcoyne Jun 20, 2024
5d78678
Merge branch 'kubernetes-asyncio' of https://github.com/prefecthq/pre…
gabcoyne Jun 20, 2024
b81bb2f
read_namespaced_pod_log no longer timesout
jeanluciano Jun 20, 2024
c55a351
Merge branch 'kubernetes-asyncio' of https://github.com/PrefectHQ/pre…
jeanluciano Jun 20, 2024
c6a2ed5
temp cert fixture cleans own tempfile
jeanluciano Jun 20, 2024
f454162
no credentials test
jeanluciano Jun 20, 2024
b5af9b3
different env test
jeanluciano Jun 21, 2024
698def4
removed breakpoint
jeanluciano Jun 21, 2024
04c25ca
chaged env assert
jeanluciano Jun 21, 2024
35506f6
changed db path in test harness
jeanluciano Jun 21, 2024
d0f04c0
changed prefect db fixture
jeanluciano Jun 21, 2024
268dfbb
Merge branch 'main' into kubernetes-asyncio
jeanluciano Jun 21, 2024
92a1b5d
Merge branch 'main' into kubernetes-asyncio
jeanluciano Jun 21, 2024
7379cba
Merge branch 'main' into kubernetes-asyncio
zzstoatzz Jun 24, 2024
50eda52
try statement added to _replicate_pod_events
jeanluciano Jun 24, 2024
b91092f
Merge branch 'main' into kubernetes-asyncio
desertaxle Jun 25, 2024
4a425da
Merge branch 'main' into kubernetes-asyncio
jeanluciano Jun 26, 2024
af10fca
event changes
jeanluciano Jun 29, 2024
84a4d27
Merge branch 'kubernetes-asyncio' of https://github.com/PrefectHQ/pre…
jeanluciano Jun 29, 2024
8c7e1e3
from file await remove
jeanluciano Jun 29, 2024
53b3339
mock stream mock refactor
jeanluciano Jun 30, 2024
ca56dd5
test fixes
jeanluciano Jun 30, 2024
5840368
watches are now context manager
jeanluciano Jun 30, 2024
d476c6b
credentials test refractor
jeanluciano Jun 30, 2024
29d5eb6
batch client context manager
jeanluciano Jul 1, 2024
42a802c
cancels asyncio task inside of event replicator
jeanluciano Jul 9, 2024
915041e
Merge branch 'main' into kubernetes-asyncio
jeanluciano Jul 9, 2024
22cf21d
evicted pod test sleep changed to match other tests
jeanluciano Jul 9, 2024
bc7410e
Merge branch 'kubernetes-asyncio' of https://github.com/PrefectHQ/pre…
jeanluciano Jul 9, 2024
c74e594
batch client context manager removed
jeanluciano Jul 9, 2024
5c90df0
removed redundant job logger
jeanluciano Jul 10, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions docs/3.0rc/api-ref/server/flows/paginate-flows.mdx

This file was deleted.

3 changes: 0 additions & 3 deletions docs/3.0rc/api-ref/server/root/server-version.mdx

This file was deleted.

4 changes: 2 additions & 2 deletions src/integrations/prefect-kubernetes/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ def kubernetes_orchestrator():
#### Patch an existing deployment

```python
import yaml
from kubernetes.client.models import V1Deployment
from kubernetes_asyncio.client.models import V1Deployment

from prefect import flow
from prefect_kubernetes.credentials import KubernetesCredentials
from prefect_kubernetes.deployments import patch_namespaced_deployment
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
"""Module for defining Kubernetes credential handling and client generation."""

from contextlib import contextmanager
from contextlib import asynccontextmanager
from pathlib import Path
from typing import Dict, Generator, Optional, Type, Union
from typing import AsyncGenerator, Dict, Optional, Type, Union

import yaml
from kubernetes import config
from kubernetes.client import (
from kubernetes_asyncio import config
from kubernetes_asyncio.client import (
ApiClient,
AppsV1Api,
BatchV1Api,
Configuration,
CoreV1Api,
CustomObjectsApi,
)
from kubernetes.config.config_exception import ConfigException
from kubernetes_asyncio.config.config_exception import ConfigException
from pydantic import Field, field_validator
from typing_extensions import Literal, Self

Expand Down Expand Up @@ -68,7 +68,7 @@ def parse_yaml_config(cls, value):
return value

@classmethod
def from_file(
async def from_file(
jeanluciano marked this conversation as resolved.
Show resolved Hide resolved
cls: Type[Self], path: Optional[Path] = None, context_name: Optional[str] = None
) -> Self:
"""
Expand Down Expand Up @@ -103,24 +103,23 @@ def from_file(
# Load the entire config file
config_file_contents = path.read_text()
config_dict = yaml.safe_load(config_file_contents)

return cls(config=config_dict, context_name=context_name)

def get_api_client(self) -> "ApiClient":
async def get_api_client(self) -> "ApiClient":
"""
Returns a Kubernetes API client for this cluster config.
"""
return config.kube_config.new_client_from_config_dict(
return await config.kube_config.new_client_from_config_dict(
config_dict=self.config, context=self.context_name
)

def configure_client(self) -> None:
async def configure_client(self) -> None:
"""
Activates this cluster configuration by loading the configuration into the
Kubernetes Python client. After calling this, Kubernetes API clients can use
this config's context.
"""
config.kube_config.load_kube_config_from_dict(
await config.kube_config.load_kube_config_from_dict(
config_dict=self.config, context=self.context_name
)

Expand All @@ -147,12 +146,12 @@ class KubernetesCredentials(Block):

cluster_config: Optional[KubernetesClusterConfig] = None

@contextmanager
def get_client(
@asynccontextmanager
async def get_client(
self,
client_type: Literal["apps", "batch", "core", "custom_objects"],
configuration: Optional[Configuration] = None,
) -> Generator[KubernetesClient, None, None]:
) -> AsyncGenerator[KubernetesClient, None]:
"""Convenience method for retrieving a Kubernetes API client for deployment resources.

Args:
Expand All @@ -165,22 +164,36 @@ def get_client(
```python
from prefect_kubernetes.credentials import KubernetesCredentials

with KubernetesCredentials.get_client("core") as core_v1_client:
for pod in core_v1_client.list_namespaced_pod():
async with KubernetesCredentials.get_client("core") as core_v1_client:
pods = await core_v1_client.list_namespaced_pod()
for pod in pods.items:
print(pod.metadata.name)
```
"""
client_config = configuration or Configuration()
client_configuration = configuration or Configuration()
if self.cluster_config:
config_dict = self.cluster_config.config
context = self.cluster_config.context_name

# Use Configuration to load configuration from a dictionary

with ApiClient(configuration=client_config) as generic_client:
await config.load_kube_config_from_dict(
config_dict=config_dict,
context=context,
client_configuration=client_configuration,
)
async with ApiClient(configuration=client_configuration) as api_client:
try:
yield self.get_resource_specific_client(client_type)
yield await self.get_resource_specific_client(
client_type, api_client=api_client
)
finally:
generic_client.rest_client.pool_manager.clear()
await api_client.close()

def get_resource_specific_client(
async def get_resource_specific_client(
self,
client_type: str,
api_client: ApiClient,
) -> Union[AppsV1Api, BatchV1Api, CoreV1Api]:
"""
Utility function for configuring a generic Kubernetes client.
Expand Down Expand Up @@ -209,15 +222,15 @@ def get_resource_specific_client(
"""

if self.cluster_config:
self.cluster_config.configure_client()
await self.cluster_config.configure_client()
else:
try:
config.load_incluster_config()
except ConfigException:
config.load_kube_config()
await config.load_kube_config()

try:
return K8S_CLIENT_TYPES[client_type]()
return K8S_CLIENT_TYPES[client_type](api_client)
except KeyError:
raise ValueError(
f"Invalid client type provided '{client_type}'."
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from typing import Any, Dict, Optional

from prefect import task
from prefect.utilities.asyncutils import run_sync_in_worker_thread
from prefect_kubernetes.credentials import KubernetesCredentials


Expand Down Expand Up @@ -55,9 +54,10 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("custom_objects") as custom_objects_client:
return await run_sync_in_worker_thread(
custom_objects_client.create_namespaced_custom_object,
async with kubernetes_credentials.get_client(
"custom_objects"
) as custom_objects_client:
return await custom_objects_client.create_namespaced_custom_object(
group=group,
version=version,
plural=plural,
Expand Down Expand Up @@ -113,9 +113,10 @@ def kubernetes_orchestrator():
```
"""

with kubernetes_credentials.get_client("custom_objects") as custom_objects_client:
return await run_sync_in_worker_thread(
custom_objects_client.delete_namespaced_custom_object,
async with kubernetes_credentials.get_client(
"custom_objects"
) as custom_objects_client:
return await custom_objects_client.delete_namespaced_custom_object(
group=group,
version=version,
plural=plural,
Expand Down Expand Up @@ -172,9 +173,10 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("custom_objects") as custom_objects_client:
return await run_sync_in_worker_thread(
custom_objects_client.get_namespaced_custom_object,
async with kubernetes_credentials.get_client(
"custom_objects"
) as custom_objects_client:
return await custom_objects_client.get_namespaced_custom_object(
group=group,
version=version,
plural=plural,
Expand Down Expand Up @@ -230,9 +232,10 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("custom_objects") as custom_objects_client:
return await run_sync_in_worker_thread(
custom_objects_client.get_namespaced_custom_object_status,
async with kubernetes_credentials.get_client(
"custom_objects"
) as custom_objects_client:
return await custom_objects_client.get_namespaced_custom_object_status(
group=group,
version=version,
plural=plural,
Expand Down Expand Up @@ -284,9 +287,10 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("custom_objects") as custom_objects_client:
return await run_sync_in_worker_thread(
custom_objects_client.list_namespaced_custom_object,
async with kubernetes_credentials.get_client(
"custom_objects"
) as custom_objects_client:
return await custom_objects_client.list_namespaced_custom_object(
group=group,
version=version,
plural=plural,
Expand Down Expand Up @@ -354,9 +358,10 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("custom_objects") as custom_objects_client:
return await run_sync_in_worker_thread(
custom_objects_client.patch_namespaced_custom_object,
async with kubernetes_credentials.get_client(
"custom_objects"
) as custom_objects_client:
return await custom_objects_client.patch_namespaced_custom_object(
group=group,
version=version,
plural=plural,
Expand Down Expand Up @@ -423,9 +428,10 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("custom_objects") as custom_objects_client:
return await run_sync_in_worker_thread(
custom_objects_client.replace_namespaced_custom_object,
async with kubernetes_credentials.get_client(
"custom_objects"
) as custom_objects_client:
return await custom_objects_client.replace_namespaced_custom_object(
group=group,
version=version,
plural=plural,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

from typing import Any, Dict, Optional

from kubernetes.client.models import V1DeleteOptions, V1Deployment, V1DeploymentList
from kubernetes_asyncio.client.models import (
V1DeleteOptions,
V1Deployment,
V1DeploymentList,
)

from prefect import task
from prefect.utilities.asyncutils import run_sync_in_worker_thread
from prefect_kubernetes.credentials import KubernetesCredentials


Expand Down Expand Up @@ -34,7 +37,7 @@ async def create_namespaced_deployment(
from prefect import flow
from prefect_kubernetes.credentials import KubernetesCredentials
from prefect_kubernetes.deployments import create_namespaced_deployment
from kubernetes.client.models import V1Deployment
from kubernetes_asyncio.client.models import V1Deployment

@flow
def kubernetes_orchestrator():
Expand All @@ -44,9 +47,8 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await run_sync_in_worker_thread(
apps_v1_client.create_namespaced_deployment,
async with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await apps_v1_client.create_namespaced_deployment(
namespace=namespace,
body=new_deployment,
**kube_kwargs,
Expand Down Expand Up @@ -80,7 +82,7 @@ async def delete_namespaced_deployment(
from prefect import flow
from prefect_kubernetes.credentials import KubernetesCredentials
from prefect_kubernetes.deployments import delete_namespaced_deployment
from kubernetes.client.models import V1DeleteOptions
from kubernetes_asyncio.client.models import V1DeleteOptions

@flow
def kubernetes_orchestrator():
Expand All @@ -91,9 +93,8 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await run_sync_in_worker_thread(
apps_v1_client.delete_namespaced_deployment,
async with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await apps_v1_client.delete_namespaced_deployment(
deployment_name,
body=delete_options,
namespace=namespace,
Expand Down Expand Up @@ -132,9 +133,8 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await run_sync_in_worker_thread(
apps_v1_client.list_namespaced_deployment,
async with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await apps_v1_client.list_namespaced_deployment(
namespace=namespace,
**kube_kwargs,
)
Expand Down Expand Up @@ -167,7 +167,7 @@ async def patch_namespaced_deployment(
from prefect import flow
from prefect_kubernetes.credentials import KubernetesCredentials
from prefect_kubernetes.deployments import patch_namespaced_deployment
from kubernetes.client.models import V1Deployment
from kubernetes_asyncio.client.models import V1Deployment

@flow
def kubernetes_orchestrator():
Expand All @@ -178,9 +178,8 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await run_sync_in_worker_thread(
apps_v1_client.patch_namespaced_deployment,
async with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await apps_v1_client.patch_namespaced_deployment(
name=deployment_name,
namespace=namespace,
body=deployment_updates,
Expand Down Expand Up @@ -221,9 +220,8 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await run_sync_in_worker_thread(
apps_v1_client.read_namespaced_deployment,
async with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await apps_v1_client.read_namespaced_deployment(
name=deployment_name,
namespace=namespace,
**kube_kwargs,
Expand Down Expand Up @@ -257,7 +255,7 @@ async def replace_namespaced_deployment(
from prefect import flow
from prefect_kubernetes.credentials import KubernetesCredentials
from prefect_kubernetes.deployments import replace_namespaced_deployment
from kubernetes.client.models import V1Deployment
from kubernetes_asyncio.client.models import V1Deployment

@flow
def kubernetes_orchestrator():
Expand All @@ -268,9 +266,8 @@ def kubernetes_orchestrator():
)
```
"""
with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await run_sync_in_worker_thread(
apps_v1_client.replace_namespaced_deployment,
async with kubernetes_credentials.get_client("apps") as apps_v1_client:
return await apps_v1_client.replace_namespaced_deployment(
body=new_deployment,
name=deployment_name,
namespace=namespace,
Expand Down
Loading