cmd/appgw-ingress/utils.go (93 lines of code) (raw):

// ------------------------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // -------------------------------------------------------------------------------------------- package main import ( "context" "os" "sort" "strconv" "strings" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/record" "k8s.io/klog/v2" "github.com/Azure/application-gateway-kubernetes-ingress/pkg/controllererrors" agiccrdscheme "github.com/Azure/application-gateway-kubernetes-ingress/pkg/crd_client/agic_crd_client/clientset/versioned/scheme" "github.com/Azure/application-gateway-kubernetes-ingress/pkg/environment" ) func validateNamespaces(namespaces []string, kubeClient *kubernetes.Clientset) error { var nonExistent []string for _, ns := range namespaces { if _, err := kubeClient.CoreV1().Namespaces().Get(context.TODO(), ns, metav1.GetOptions{}); err != nil { nonExistent = append(nonExistent, ns) } } if len(nonExistent) > 0 { err := controllererrors.NewErrorf( controllererrors.ErrorNoSuchNamespace, "error creating informers; Namespaces do not exist or Ingress Controller has no access to: %v", strings.Join(nonExistent, ","), ) klog.Error(err.Error()) return err } return nil } func getNamespacesToWatch(namespaceEnvVar string) []string { // Returning an empty array effectively switches Ingress Controller // in a mode of observing all accessible namespaces. if namespaceEnvVar == "" { return []string{} } // Namespaces (DNS-1123 label) can have lower case alphanumeric characters or '-' // Commas are safe to use as a separator if strings.Contains(namespaceEnvVar, ",") { var namespaces []string for _, ns := range strings.Split(namespaceEnvVar, ",") { if len(ns) > 0 { namespaces = append(namespaces, strings.TrimSpace(ns)) } } sort.Strings(namespaces) return namespaces } return []string{namespaceEnvVar} } func getKubeClientConfig() *rest.Config { if *inCluster { config, err := rest.InClusterConfig() if err != nil { klog.Fatal("Error creating in-cluster client configuration:", err) } return config } // use the current context in kubeconfig config, err := clientcmd.BuildConfigFromFlags("", *kubeConfigFile) if err != nil { klog.Fatal("error creating client configuration:", err) } return config } func getEventRecorder(kubeClient kubernetes.Interface, ingressClassControllerName string) record.EventRecorder { eventBroadcaster := record.NewBroadcaster() sink := &typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")} eventBroadcaster.StartRecordingToSink(sink) hostname, err := os.Hostname() if err != nil { klog.Error("Could not obtain host name from the operating system", err) hostname = "unknown-hostname" } source := v1.EventSource{ Component: ingressClassControllerName, Host: hostname, } s := scheme.Scheme agiccrdscheme.AddToScheme(s) return eventBroadcaster.NewRecorder(scheme.Scheme, source) } func getVerbosity(flagVerbosity int, envVerbosity string) int { envVerbosityInt, err := strconv.Atoi(envVerbosity) if err != nil { klog.Infof("Using verbosity level %d from CLI flag %s", flagVerbosity, verbosityFlag) return flagVerbosity } klog.Infof("Using verbosity level %d from environment variable %s", envVerbosityInt, environment.VerbosityLevelVarName) return envVerbosityInt }