nuvolaris/minio_ingress.py (132 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 kopf, logging, time, os import nuvolaris.kube as kube import nuvolaris.kustomize as kus import nuvolaris.config as cfg import nuvolaris.util as util import nuvolaris.apihost_util as apihost_util import nuvolaris.endpoint as endpoint import nuvolaris.openwhisk as openwhisk from nuvolaris.ingress_data import IngressData from nuvolaris.route_data import RouteData def deploy_minio_route(apihost,namespace,type,service_name,port,context_path): """ Deploys a generic MINIO route ingress param: apihost param: namespace param: type (s3, console) param: service_name (normally it is minio) param: port (9000 or 9090) paramL context_path (/) """ route = RouteData(apihost) route.with_route_name(endpoint.api_route_name(namespace,type)) route.with_service_name(service_name) route.with_service_kind("Service") route.with_service_port(port) route.with_context_path(context_path) logging.info(f"*** configuring minio route for service {service_name}:{port}") path_to_template_yaml = route.render_template(namespace) res = kube.kubectl("apply", "-f",path_to_template_yaml) os.remove(path_to_template_yaml) return res def deploy_minio_ingress(apihost, namespace, type, service_name,port,context_path): """ Deploys a generic MINIO nginx/traefik ingress param: apihost param: namespace param: type (s3, console) param: service_name (normally it is minio) param: port (9000 or 9090) paramL context_path (/) """ ingress = IngressData(apihost) ingress.with_ingress_name(endpoint.api_ingress_name(namespace, type)) ingress.with_secret_name(endpoint.ingress_secret_name(namespace, type)) ingress.with_context_path(context_path) ingress.with_service_name(service_name) ingress.with_service_port(port) if ingress.requires_traefik_middleware(): logging.info(f"*** configuring traefik middleware for {type} ingress") path_to_template_yaml = ingress.render_traefik_middleware_template(namespace) res = kube.kubectl("apply", "-f",path_to_template_yaml) os.remove(path_to_template_yaml) logging.info(f"*** configuring static ingress for {type}") path_to_template_yaml = ingress.render_template(namespace) res = kube.kubectl("apply", "-f",path_to_template_yaml) os.remove(path_to_template_yaml) return res def deploy_minio_upload_route(apihost,namespace, type): upload = RouteData(apihost) upload.with_route_name(endpoint.api_route_name(namespace,type)) upload.with_service_name("nuvolaris-minio") upload.with_service_kind("Service") upload.with_service_port("9000") upload.with_context_path("/api/upload") upload.with_rewrite_target("/") logging.info(f"*** configuring route for upload") path_to_template_yaml = upload.render_template(namespace) res = kube.kubectl("apply", "-f",path_to_template_yaml) os.remove(path_to_template_yaml) return res def deploy_minio_upload_ingress(apihost, namespace, type): upload = IngressData(apihost) upload.with_ingress_name(endpoint.api_ingress_name(namespace,type)) upload.with_secret_name(endpoint.api_secret_name(namespace)) upload.with_context_path("/api/upload") upload.with_context_regexp("(/|$)(.*)") upload.with_rewrite_target("/$2") upload.with_service_name("nuvolaris-minio") upload.with_service_port("9000") upload.with_middleware_ingress_name(endpoint.api_middleware_ingress_name(namespace,type)) if upload.requires_traefik_middleware(): logging.info(f"*** configuring traefik middleware for {type} ingress") path_to_template_yaml = upload.render_traefik_middleware_template(namespace) res = kube.kubectl("apply", "-f",path_to_template_yaml) os.remove(path_to_template_yaml) logging.info(f"*** configuring static ingress for {type} ingress") path_to_template_yaml = upload.render_template(namespace) res = kube.kubectl("apply", "-f",path_to_template_yaml) os.remove(path_to_template_yaml) return res def create_api_uploader_endpoint(runtime, apihost, owner=None): """ exposes MINIO api in the uploader-api ingress/route """ if runtime == 'openshift': return deploy_minio_upload_route(apihost,"nuvolaris","minio-upload") else: return deploy_minio_upload_ingress(apihost,"nuvolaris","minio-upload") def create_s3_ingress_endpoint(data, runtime, apihost, owner=None): """ exposes MINIO S3 api ingress ingress/route """ if runtime == 'openshift': return deploy_minio_route(apihost,"nuvolaris","minio-s3","nuvolaris-minio","9000","/") else: return deploy_minio_ingress(apihost,"nuvolaris","minio-s3","nuvolaris-minio","9000","/") def create_console_ingress_endpoint(data, runtime, apihost, owner=None): """ exposes MINIO api ingress ingress/route """ if runtime == 'openshift': return deploy_minio_route(apihost,"nuvolaris","minio-console","nuvolaris-minio","9090","/") else: return deploy_minio_ingress(apihost,"nuvolaris","minio-console","nuvolaris-minio","9090","/") def get_minio_ingress_hostname(runtime, apihost_url, prefix, hostname_from_config): """ Determine the minio ingress hostname. In auto mode the prefix is appended to the configured apihost,, otherwise the one from configuration is used. """ if hostname_from_config in ["auto"]: return apihost_util.append_prefix_to_url(apihost_url, prefix) return apihost_util.get_ingress_url(runtime, hostname_from_config) def create_minio_ingresses(data, owner=None): """ Creates all the MINIO related ingresses according to provide configuration """ runtime = cfg.get('nuvolaris.kube') apihost_url = apihost_util.get_apihost(runtime) res = create_api_uploader_endpoint(runtime, apihost_url, owner) if data['minio_s3_ingress_enabled']: s3_hostname_url = get_minio_ingress_hostname(runtime, apihost_url,"s3",data['minio_s3_ingress_hostname']) res += create_s3_ingress_endpoint(data, runtime, s3_hostname_url, owner) if res: openwhisk.annotate(f"s3_api_url={s3_hostname_url}") if data['minio_console_ingress_enabled']: minio_hostname_url = get_minio_ingress_hostname(runtime, apihost_url,"minio",data['minio_console_ingress_hostname']) res += create_console_ingress_endpoint(data, runtime, minio_hostname_url, owner) if res: openwhisk.annotate(f"s3_console_url={minio_hostname_url}") # force he s3 API to be localhost:9000 on Kind based deployment. if runtime in ["kind"]: openwhisk.annotate(f"s3_api_url=http://localhost:9000") return res def delete_minio_ingress(runtime, namespace, ingress_class, type, owner=None): """ undeploys ingresses for minio apihost """ logging.info(f"*** removing ingresses for minio upload") try: res = "" if(runtime=='openshift'): res = kube.kubectl("delete", "route",endpoint.api_route_name(namespace,type)) return res res += kube.kubectl("delete", "ingress",endpoint.api_ingress_name(namespace,type)) if(ingress_class == 'traefik'): res = kube.kubectl("delete", "middleware.traefik.containo.us",endpoint.api_middleware_ingress_name(namespace,type)) return res except Exception as e: logging.warn(e) return None def delete_minio_ingresses(data, owner=None): namespace = "nuvolaris" runtime = cfg.get('nuvolaris.kube') ingress_class = util.get_ingress_class(runtime) res = delete_minio_ingress(runtime, namespace, ingress_class, "minio-upload", owner) if data['minio_s3_ingress_enabled']: res += delete_minio_ingress(runtime, namespace, ingress_class, "minio-s3", owner) if data['minio_console_ingress_enabled']: res += delete_minio_ingress(runtime, namespace, ingress_class, "minio-console", owner) return res