64 lines
No EOL
2.6 KiB
Python
64 lines
No EOL
2.6 KiB
Python
# ============================================================
|
||
# Система: Единая библиотека, Центр ИИ НИУ ВШЭ
|
||
# Модуль: Управления базовыми объектами Kubernetes
|
||
# Авторы: Полежаев В.А., Хританков А.С.
|
||
# Дата создания: 2025 г.
|
||
# ============================================================
|
||
from datetime import datetime, timezone
|
||
|
||
from kubernetes.client import ApiClient, CoreV1Api, ApiException, AppsV1Api
|
||
|
||
|
||
def delete_deployment_if_exists(api_client: ApiClient, namespace: str, deployment_name: str, logger):
|
||
apps_v1_api: AppsV1Api = AppsV1Api(api_client)
|
||
try:
|
||
apps_v1_api.delete_namespaced_deployment(name=deployment_name, namespace=namespace)
|
||
except ApiException as exc:
|
||
if exc.status == 404:
|
||
logger.info(f"Deployment {deployment_name} doesnt exist, do nothing")
|
||
return
|
||
raise exc
|
||
logger.info(f"Deployment {deployment_name} is deleted")
|
||
|
||
|
||
def create_deployment(api_client: ApiClient, namespace, manifest):
|
||
apps_v1_api: AppsV1Api = AppsV1Api(api_client)
|
||
apps_v1_api.create_namespaced_deployment(namespace=namespace, body=manifest)
|
||
|
||
|
||
def create_or_update_deployment(api_client: ApiClient, name: str, namespace: str, manifest, logger):
|
||
apps_v1_api: AppsV1Api = AppsV1Api(api_client)
|
||
|
||
try:
|
||
apps_v1_api.create_namespaced_deployment(namespace=namespace, body=manifest)
|
||
logger.info(f"Deployment {name} is created")
|
||
except ApiException as exc:
|
||
if exc.status == 409:
|
||
logger.warning(f'Deployment {name} already exists, will be replaced')
|
||
apps_v1_api.replace_namespaced_deployment(name=name, namespace=namespace, body=manifest)
|
||
logger.info(f"Deployment {name} is replaced")
|
||
|
||
|
||
def restart_deployment_if_exists(api_client: ApiClient, name: str, namespace: str, logger):
|
||
apps_v1_api: AppsV1Api = AppsV1Api(api_client)
|
||
now = datetime.now(timezone.utc).replace(tzinfo=None)
|
||
now = now.isoformat("T") + "Z"
|
||
patch = {
|
||
'spec': {
|
||
'template': {
|
||
'metadata': {
|
||
'annotations': {
|
||
'kubectl.kubernetes.io/restartedAt': now
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
try:
|
||
apps_v1_api.patch_namespaced_deployment(name, namespace, patch)
|
||
except ApiException as exc:
|
||
if exc.status == 404:
|
||
logger.warn(f"Deployment {namespace}.{name} doesnt exist, do nothing")
|
||
return
|
||
raise exc
|
||
logger.info(f"Deployment {namespace}.{name} scheduled for restart") |