pkg/kube/ingress.go (127 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. package kube import ( "errors" networkingv1 "k8s.io/api/networking/v1" networkingv1beta1 "k8s.io/api/networking/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" listersnetworkingv1 "k8s.io/client-go/listers/networking/v1" listersnetworkingv1beta1 "k8s.io/client-go/listers/networking/v1beta1" ) const ( // IngressV1 represents the Ingress in networking/v1 group version. IngressV1 = "networking/v1" // IngressV1beta1 represents the Ingress in networking/v1beta1 group version. IngressV1beta1 = "networking/v1beta1" ) // IngressLister is an encapsulation for the lister of Kubernetes // Ingress, it aims at to be compatible with different Ingress versions. type IngressLister interface { // V1 gets the ingress in networking/v1. V1(string, string) (Ingress, error) // V1beta1 gets the ingress in networking/v1beta1. V1beta1(string, string) (Ingress, error) } // IngressInformer is an encapsulation for the informer of Kubernetes // Ingress, it aims at to be compatible with different Ingress versions. type IngressInformer interface { Run(chan struct{}) } // Ingress is an encapsulation for Kubernetes Ingress with different // versions, for now, they are networking/v1 and networking/v1beta1. type Ingress interface { // GroupVersion returns the api group version of the // real ingress. GroupVersion() string // V1 returns the ingress in networking/v1, the real // ingress must be in networking/v1, or V1() will panic. V1() *networkingv1.Ingress // V1beta1 returns the ingress in networking/v1beta1, the real // ingress must be in networking/v1beta1, or V1beta1() will panic. V1beta1() *networkingv1beta1.Ingress // ResourceVersion returns the the resource version field inside // the real Ingress. ResourceVersion() string metav1.Object } // IngressEvents contains the ingress key (namespace/name) // and the group version message. type IngressEvent struct { Key string GroupVersion string OldObject Ingress } type ingress struct { groupVersion string v1 *networkingv1.Ingress v1beta1 *networkingv1beta1.Ingress metav1.Object } func (ing *ingress) V1() *networkingv1.Ingress { if ing.groupVersion != IngressV1 { panic("not a networking/v1 ingress") } return ing.v1 } func (ing *ingress) V1beta1() *networkingv1beta1.Ingress { if ing.groupVersion != IngressV1beta1 { panic("not a networking/v1beta1 ingress") } return ing.v1beta1 } func (ing *ingress) GroupVersion() string { return ing.groupVersion } func (ing *ingress) ResourceVersion() string { if ing.GroupVersion() == IngressV1beta1 { return ing.V1beta1().ResourceVersion } return ing.V1().ResourceVersion } type ingressLister struct { v1Lister listersnetworkingv1.IngressLister v1beta1Lister listersnetworkingv1beta1.IngressLister } func (l *ingressLister) V1(namespace, name string) (Ingress, error) { ing, err := l.v1Lister.Ingresses(namespace).Get(name) if err != nil { return nil, err } return &ingress{ groupVersion: IngressV1, v1: ing, Object: ing, }, nil } func (l *ingressLister) V1beta1(namespace, name string) (Ingress, error) { ing, err := l.v1beta1Lister.Ingresses(namespace).Get(name) if err != nil { return nil, err } return &ingress{ groupVersion: IngressV1beta1, v1beta1: ing, Object: ing, }, nil } // MustNewIngress creates a kube.Ingress object according to the // type of obj. func MustNewIngress(obj interface{}) Ingress { switch ing := obj.(type) { case *networkingv1.Ingress: return &ingress{ groupVersion: IngressV1, v1: ing, Object: ing, } case *networkingv1beta1.Ingress: return &ingress{ groupVersion: IngressV1beta1, v1beta1: ing, Object: ing, } default: panic("invalid ingress type") } } // NewIngress creates a kube.Ingress object according to the // type of obj. It returns nil and the error reason when the // type assertion fails. func NewIngress(obj interface{}) (Ingress, error) { switch ing := obj.(type) { case *networkingv1.Ingress: return &ingress{ groupVersion: IngressV1, v1: ing, Object: ing, }, nil case *networkingv1beta1.Ingress: return &ingress{ groupVersion: IngressV1beta1, v1beta1: ing, Object: ing, }, nil default: return nil, errors.New("invalid ingress type") } } // NewIngressLister creates an version-neutral Ingress lister. func NewIngressLister(v1 listersnetworkingv1.IngressLister, v1beta1 listersnetworkingv1beta1.IngressLister) IngressLister { return &ingressLister{ v1Lister: v1, v1beta1Lister: v1beta1, } }