nuvolaris/patcher.py (124 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # import logging, time import nuvolaris.openwhisk as openwhisk import nuvolaris.ferretdb as mongodb import nuvolaris.redis as redis import nuvolaris.cronjob as cron import nuvolaris.minio_deploy as minio import nuvolaris.storage_static as static import nuvolaris.config as cfg import nuvolaris.kube as kube import nuvolaris.util as util import nuvolaris.kopf_util as kopf_util import nuvolaris.postgres_operator as postgres import nuvolaris.endpoint as endpoint import nuvolaris.issuer as issuer import nuvolaris.operator_util as operator_util import nuvolaris.runtimes_preloader as preloader import nuvolaris.invoker as invoker import nuvolaris.quota_checker_job as quota import nuvolaris.etcd as etcd import nuvolaris.milvus_standalone as milvus def patch_preloader(owner: None): try: logging.info("*** handling request to patch openwhisk runtime preloader") preloader.delete(owner) preloader.create(owner) logging.info("*** handled request to patch openwhisk runtime preloader") except Exception as e: logging.error("*** failed to patch openwhisk runtime preloader",e) import nuvolaris.invoker as invoker def redeploy_invoker(owner=None): try: logging.info('*** handling request to redeploy whisk invoker') msg = invoker.create(owner) logging.info(msg) rollout("sts/invoker") logging.info('*** handled request to redeploy whisk invoker') except Exception as e: logging.error('*** failed to redeploy whisk invoker: %s' % e) def rollout(kube_name): try: logging.info(f"*** handling request to rollout {kube_name}") kube.rollout(kube_name) logging.info(f"*** handled request to rollout {kube_name}") except Exception as e: logging.error('*** failed to rollout %s: %s' % kube_name,e) def restart_sts(sts_name): try: logging.info(f"*** handling request to redeploy {sts_name} using scaledown/scaleup") replicas = 1 current_rep = kube.kubectl("get",sts_name,jsonpath="{.spec.replicas}") if current_rep: replicas = current_rep[0] kube.scale_sts(sts_name,0) time.sleep(5) logging.info(f"scaling {sts_name} to {replicas}") kube.scale_sts(sts_name,replicas) logging.info(f"*** handling request to redeploy {sts_name} using scaledown/scaleup") except Exception as e: logging.error('*** failed to scale up/down %s: %s' % sts_name,e) def redeploy_controller(owner=None): try: logging.info("*** handling request to redeploy whisk controller") msg = openwhisk.create(owner) logging.info(msg) rollout("sts/controller") logging.info("*** handled request to redeploy whisk controller") except Exception as e: logging.error('*** failed to redeploy whisk controller: %s' % e) def restart_whisk(owner=None): useInvoker = cfg.get('components.invoker') or False if useInvoker: rollout("sts/invoker") rollout("sts/controller") def redeploy_whisk(owner=None): useInvoker = cfg.get('components.invoker') or False if useInvoker: redeploy_invoker(owner) redeploy_controller(owner) def patch(diff, status, owner=None, name=None): """ Implements the patching logic of the nuvolaris operator by analyzing the kopf provided diff object to identify which components needs to be added/removed. """ logging.info(status) what_to_do = kopf_util.detect_component_changes(diff) if len(what_to_do) == 0: logging.warn("*** no relevant changes identified by the operator patcher. Skipping processing") return None for key in what_to_do.keys(): logging.info(f"{key}={what_to_do[key]}") components_updated = False # components 1st if "postgres" in what_to_do: postgres.patch(status,what_to_do['postgres'], owner) components_updated = True if "mongodb" in what_to_do: mongodb.patch(status,what_to_do['mongodb'], owner) components_updated = True if "redis" in what_to_do: redis.patch(status,what_to_do['redis'], owner) components_updated = True if "cron" in what_to_do: cron.patch(status,what_to_do['cron'], owner) components_updated = True if "minio" in what_to_do: minio.patch(status,what_to_do['minio'], owner) components_updated = True if "static" in what_to_do: static.patch(status,what_to_do['static'], owner) components_updated = True if "quota" in what_to_do: quota.patch(status,what_to_do['quota'], owner) components_updated = True if "etcd" in what_to_do: etcd.patch(status,what_to_do['etcd'], owner) components_updated = True if "milvus" in what_to_do: milvus.patch(status,what_to_do['milvus'], owner) components_updated = True # handle update action on openwhisk if "openwhisk" in what_to_do and what_to_do['openwhisk'] == "update": redeploy_whisk(owner) components_updated = True # handle update action on endpoint if "endpoint" in what_to_do and what_to_do['endpoint'] == "update": issuer.patch(status,what_to_do['endpoint'], owner) endpoint.patch(status,what_to_do['endpoint'], owner) if "minio-ingresses" in what_to_do and what_to_do['minio-ingresses'] == "update": minio.patch_ingresses(status,what_to_do['minio-ingresses'], owner) if components_updated: operator_util.whisk_post_create(name)