nuvolaris/enterprise_util.py (181 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 nuvolaris.config as cfg import nuvolaris.kube as kube import nuvolaris.util as util import logging import re # extract the srv name from def extract_host(srv_address_url): """ >>> extract_host("zookeeper-0.zookeeper:2181") 'zookeeper-0.zookeeper' >>> extract_host("zookeeper-0.zookeeper") 'zookeeper-0.zookeeper' >>> extract_host("zookeeper-0.zookeeper.nuvolaris.svc.cluster.local:2181") 'zookeeper-0.zookeeper.nuvolaris.svc.cluster.local' """ host_regex = r'([a-z0-9\-._~%]+)' m = re.search(host_regex, srv_address_url) return m.group(0) def get_invoker_image_data(data): invoker_image = cfg.get("invoker.image") if ":" in invoker_image: img_data = util.parse_image(invoker_image) data['invoker_image'] = img_data["image"] data['invoker_tag'] = img_data["tag"] else: data['invoker_image'] = cfg.get("invoker.image") or "ghcr.io/nuvolaris/openwhisk-invoker" data['invoker_tag'] = cfg.get("invoker.tag") or "3.1.0-mastrogpt.2402101445" def getEnterpriseControllerConfigData(): data = { "name":"controller", "couchdb_host": cfg.get("couchdb.host") or "couchdb", "couchdb_port": cfg.get("couchdb.port") or "5984", "couchdb_admin_user": cfg.get("couchdb.admin.user"), "couchdb_admin_password": cfg.get("couchdb.admin.password"), "couchdb_controller_user": cfg.get("couchdb.controller.user"), "couchdb_controller_password": cfg.get("couchdb.controller.password"), "couchdb_invoker_user": cfg.get("couchdb.invoker.user"), "couchdb_invoker_password": cfg.get("couchdb.invoker.password"), "triggers_fires_perMinute": cfg.get("configs.limits.triggers.fires-perMinute") or 999, "actions_sequence_maxLength": cfg.get("configs.limits.actions.sequence-maxLength") or 50, "actions_invokes_perMinute": cfg.get("configs.limits.actions.invokes-perMinute") or 999, "actions_invokes_concurrent": cfg.get("configs.limits.actions.invokes-concurrent") or 250, "activation_payload_max": cfg.get('configs.limits.activations.max_allowed_payload') or "1048576", "time_limit_min": cfg.get("configs.limits.time.limit-min") or "100ms", "time_limit_std": cfg.get("configs.limits.time.limit-std") or "1min", "time_limit_max": cfg.get("configs.limits.time.limit-max") or "5min", "memory_limit_min": cfg.get("configs.limits.memory.limit-min") or "128m", "memory_limit_std": cfg.get("configs.limits.memory.limit-std") or "256m", "memory_limit_max": cfg.get("configs.limits.memory.limit-max") or "512m", "concurrency_limit_min": cfg.get("configs.limits.concurrency.limit-min") or 1, "concurrency_limit_std": cfg.get("configs.limits.concurrency.limit-std") or 1, "concurrency_limit_max": cfg.get("configs.limits.concurrency.limit-max") or 1, "loadbalancer_blackbox_fraction": cfg.get("configs.limits.loadbalancer.blackbox-fraction") or "10%", "loadbalancer_timeout_factor": cfg.get("configs.limits.loadbalancer.timeout-factor") or "2", "controller_host": cfg.get("controller.host") or "localhost", "controller_port": cfg.get("controller.port") or "3233", "controller_protocol": cfg.get("controller.protocol") or "http", "invoker_host": cfg.get("invoker.host") or "localhost", "invoker_port": cfg.get("invoker.port") or "8080", "invoker_protocol": cfg.get("invoker.protocol") or "http", "kafka_host": cfg.get("nuvolaris.kafka.url") or "kafka:9092", "zookeeper_url": cfg.get('nuvolaris.zookeeper.url') or "zookeeper-0.zookeeper:2181", "controller_java_opts": cfg.get('configs.controller.javaOpts') or "-Xmx1024M", "controller_logging_level": cfg.get('configs.controller.loggingLevel') or "INFO", "controller_replicas": cfg.get('configs.controller.replicas') or 1, "container_cpu_req": cfg.get('configs.controller.resources.cpu-req') or "1", "container_cpu_lim": cfg.get('configs.controller.resources.cpu-lim') or "2", "container_mem_req": cfg.get('configs.controller.resources.mem-req') or "1G", "container_mem_lim": cfg.get('configs.controller.resources.mem-lim') or "2G", "container_manage_resources": cfg.exists('configs.controller.resources.cpu-req') } util.get_controller_image_data(data) get_invoker_image_data(data) enterprise_affinity_tolerations_data(data) return data def getEnterpriseInvokerConfigData(): data = { "name":"invoker", "couchdb_host": cfg.get("couchdb.host") or "couchdb", "couchdb_port": cfg.get("couchdb.port") or "5984", "couchdb_admin_user": cfg.get("couchdb.admin.user"), "couchdb_admin_password": cfg.get("couchdb.admin.password"), "couchdb_controller_user": cfg.get("couchdb.controller.user"), "couchdb_controller_password": cfg.get("couchdb.controller.password"), "couchdb_invoker_user": cfg.get("couchdb.invoker.user"), "couchdb_invoker_password": cfg.get("couchdb.invoker.password"), "triggers_fires_perMinute": cfg.get("configs.limits.triggers.fires-perMinute") or 999, "actions_sequence_maxLength": cfg.get("configs.limits.actions.sequence-maxLength") or 50, "actions_invokes_perMinute": cfg.get("configs.limits.actions.invokes-perMinute") or 999, "actions_invokes_concurrent": cfg.get("configs.limits.actions.invokes-concurrent") or 250, "activation_payload_max": cfg.get('configs.limits.activations.max_allowed_payload') or "1048576", "time_limit_min": cfg.get("configs.limits.time.limit-min") or "100ms", "time_limit_std": cfg.get("configs.limits.time.limit-std") or "1min", "time_limit_max": cfg.get("configs.limits.time.limit-max") or "5min", "memory_limit_min": cfg.get("configs.limits.memory.limit-min") or "128m", "memory_limit_std": cfg.get("configs.limits.memory.limit-std") or "256m", "memory_limit_max": cfg.get("configs.limits.memory.limit-max") or "512m", "concurrency_limit_min": cfg.get("configs.limits.concurrency.limit-min") or 1, "concurrency_limit_std": cfg.get("configs.limits.concurrency.limit-std") or 1, "concurrency_limit_max": cfg.get("configs.limits.concurrency.limit-max") or 1, "loadbalancer_blackbox_fraction": cfg.get("configs.limits.loadbalancer.blackbox-fraction") or "10%", "loadbalancer_timeout_factor": cfg.get("configs.limits.loadbalancer.timeout-factor") or "2", "controller_host": cfg.get("controller.host") or "localhost", "controller_port": cfg.get("controller.port") or "3233", "controller_protocol": cfg.get("controller.protocol") or "http", "invoker_host": cfg.get("invoker.host") or "localhost", "invoker_port": cfg.get("invoker.port") or "8080", "invoker_protocol": cfg.get("invoker.protocol") or "http", "kafka_host": cfg.get("nuvolaris.kafka.url") or "kafka:9092", "zookeeper_url": cfg.get('nuvolaris.zookeeper.url') or "zookeeper-0.zookeeper:2181", "invoker_java_opts": cfg.get('configs.invoker.javaOpts') or "-Xmx1024M", "invoker_containerpool_usermemory": cfg.get('configs.invoker.containerPool.userMemory') or "2048m", "invoker_logging_level": cfg.get('configs.invoker.loggingLevel') or "INFO", "invoker_replicas": cfg.get('configs.invoker.replicas') or 1, "container_cpu_req": cfg.get('configs.invoker.resources.cpu-req') or "1", "container_cpu_lim": cfg.get('configs.invoker.resources.cpu-lim') or "2", "container_mem_req": cfg.get('configs.invoker.resources.mem-req') or "1G", "container_mem_lim": cfg.get('configs.invoker.resources.mem-lim') or "2G", "container_manage_resources": cfg.exists('configs.invoker.resources.cpu-req'), "kubernetes_timeouts_run":cfg.get('configs.invoker.kubernetes.timeouts_run') or "1", "kubernetes_timeouts_logs":cfg.get('configs.invoker.kubernetes.timeouts_logs') or "1", "kubernetes_port_forwarding_enabled":cfg.get('configs.invoker.kubernetes.port_forwarding_enabled') and "true" or "false", "kubernetes_action_namespace":cfg.get('configs.invoker.kubernetes.action_namespace') or "nuvolaris", "kubernetes_user_pod_affinity_enabled":cfg.get('configs.invoker.kubernetes.user_pod_affinity_enabled') and "true" or "false", "kubernetes_user_pod_affinity_key":cfg.get('configs.invoker.kubernetes.user_pod_affinity_key') or "nuvolaris-role", "kubernetes_user_pod_affinity_value":cfg.get('configs.invoker.kubernetes.user_pod_affinity_value') or "invoker", } util.get_controller_image_data(data) get_invoker_image_data(data) invoker_affinity_tolerations_data(data) return data def get_prometheus_config_data(): data = { "name":"nuvolaris-prometheus-server", "pod_anti_affinity_name":"nuvolaris-prometheus-server", "pvcName":"nuvolaris-prometheus-server-pvc", "pvcAccessMode":"ReadWriteOnce", "size": cfg.get("monitoring.prometheus.volume-size") or 10, "storageClass": cfg.get("nuvolaris.storageclass"), "applypodsecurity":util.get_enable_pod_security() } util.common_affinity_tolerations_data(data) return data def get_am_config_data(): data = { "name":"nuvolaris-prometheus-alertmanager", "pod_anti_affinity_name":"nuvolaris-prometheus-alertmanager", "pvcName":"storage-nuvolaris-prometheus-alertmanager", "pvcAccessMode":"ReadWriteOnce", "size": cfg.get("monitoring.alert-manager.volume-size") or 2, "storageClass": cfg.get("nuvolaris.storageclass"), "slack": cfg.get("monitoring.alert-manager.slack.enabled") or False, "slack_channel_name": cfg.get("monitoring.alert-manager.slack.slack_channel_name") or '#monitoring-nuvolaris', "slack_api_url": cfg.get("monitoring.alert-manager.slack.slack_api_url","SLACK_API_URL",""), "slack_default": cfg.get("monitoring.alert-manager.slack.default") or False, "gmail": cfg.get("monitoring.alert-manager.gmail.enabled") or False, "gmail_default": cfg.get("monitoring.alert-manager.gmail.false") or False, "email_recipients": cfg.get("monitoring.alert-manager.gmail.to"), "email_from": cfg.get("monitoring.alert-manager.gmail.from"), "gmail_username": cfg.get("monitoring.alert-manager.gmail.username","GMAIL_USERNAME",""), "gmail_password": cfg.get("monitoring.alert-manager.gmail.password","GMAIL_PASSWORD",""), "applypodsecurity":util.get_enable_pod_security() } util.common_affinity_tolerations_data(data) return data # populate specific affinity data for enterprise controller def enterprise_affinity_tolerations_data(data): util.common_affinity_tolerations_data(data) data["pod_anti_affinity_name"] = "controller" # populate specific affinity data for enterprise invoker def invoker_affinity_tolerations_data(data): util.common_affinity_tolerations_data(data) data["pod_anti_affinity_name"] = "invoker" # populate specific affinity data for zookeper def get_zookeeper_config_data(): data = { "name":"zookeeper", "pod_anti_affinity_name":"zookeeper", "data_volume_size": cfg.get('zookeeper.data-volume-size') or "10", "log_volume_size": cfg.get('zookeeper.log-volume-size') or "5", "storage_class": cfg.get("nuvolaris.storageclass") } util.common_affinity_tolerations_data(data) return data # populate specific affinity data for zookeper def get_kafka_config_data(): data = { "name":"kafka", "pod_anti_affinity_name":"kafka", "data_volume_size": cfg.get('kafka.volume-size') or "10", "storage_class": cfg.get("nuvolaris.storageclass") or "standard" } util.common_affinity_tolerations_data(data) return data