blob: be4a995e672a86c983c180ac3df1bb31667dc65a [file]
# 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, json, time
import openserverless.kube as kube
import openserverless.kustomize as kus
import openserverless.config as cfg
import openserverless.util as util
def get_ingress_pod_name(runtime, namespace="ingress-nginx"):
jpath = r"{.items[?(@.metadata.labels.app\.kubernetes\.io\/component == 'controller')].metadata.name}"
if runtime == "microk8s":
jpath= "{.items[?(@.metadata.labels.name == 'nginx-ingress-microk8s')].metadata.name}"
# pod_name is retuned as a string array
pod_name = kube.kubectl("get", "pods", namespace=namespace, jsonpath=jpath)
if pod_name:
return pod_name[0]
return None
def wait_for_ingress_ready(runtime, namespace="ingress-nginx"):
pod_name = get_ingress_pod_name(runtime, namespace)
if pod_name:
logging.info(f"checking for {pod_name}")
while not kube.wait(f"pod/{pod_name}", "condition=ready",namespace=namespace):
logging.info(f"waiting for {pod_name} to be ready...")
time.sleep(1)
else:
logging.error("*** could not determine if ingress-nginx pod is up and running")
# determine the ingress-nginx flavour
def get_ingress_service(runtime):
return "service/ingress-nginx-controller"
def create(owner=None):
runtime = cfg.get('openserverless.kube')
namespace = util.get_ingress_namespace(runtime)
service = get_ingress_service(runtime)
if(runtime == "microk8s"):
logging.info("*** checking availability of microk8s ingress addon")
pod_name = get_ingress_pod_name(runtime, namespace)
if pod_name:
return f"*** ingress-nginx {pod_name} already installed...skipping setup"
else:
# TODO find a way to setup the standard ingress-nginx also on microk8s. For the moment we ask to enable it.
return "*** microk8s ingress missing. Enable it using microk8s enable ingress on your cluster"
else:
ingress = kube.get(service,namespace)
if ingress:
return "*** ingress-nginx already installed...skipping setup"
ingress_yaml = util.get_ingress_yaml(runtime)
logging.info(f"*** Configuring ingress-nginx {ingress_yaml}")
# we apply the ingress specs as they are
spec_setup = "deploy/ingress-nginx/operator-ingress-rbac.yaml"
cfg.put("state.ingress.spec_setup", spec_setup)
res = kube.kubectl("apply", "-f", spec_setup, namespace=None)
logging.info(res)
spec = f"deploy/ingress-nginx/{ingress_yaml}"
cfg.put("state.ingress.spec", spec)
# apply and waits for ingress to be ready
res = kube.kubectl("apply", "-f", spec, namespace=None)
wait_for_ingress_ready(runtime, namespace)
return res
def delete():
spec = cfg.get("state.ingress.spec")
res = False
if spec:
res = kube.kubectl("delete", "-f", spec, namespace=None)
return res