blob: 1798bad7673b547b3d145cc413fab0133ecf6bcf [file] [log] [blame]
// 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"
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
networkingv1 "k8s.io/api/networking/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1"
listersextensionsv1beta1 "k8s.io/client-go/listers/extensions/v1beta1"
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"
// IngressExtensionsV1beta1 represents the Ingress in extensions/v1beta1 group version.
IngressExtensionsV1beta1 = "extensions/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)
// ExtensionsV1beta1 gets the ingress in extensions/v1beta1.
ExtensionsV1beta1(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
// ExtensionsV1beta1 returns the ingress in extensions/v1beta1, the real
// ingress must be in extensions/v1beta1, or ExtensionsV1beta1() will panic.
ExtensionsV1beta1() *extensionsv1beta1.Ingress
// ResourceVersion returns the the resource version field inside
// the real Ingress.
ResourceVersion() string
}
// 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
extensionsV1beta1 *extensionsv1beta1.Ingress
}
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) ExtensionsV1beta1() *extensionsv1beta1.Ingress {
if ing.groupVersion != IngressExtensionsV1beta1 {
panic("not a extensions/v1beta1 ingress")
}
return ing.extensionsV1beta1
}
func (ing *ingress) GroupVersion() string {
return ing.groupVersion
}
func (ing *ingress) ResourceVersion() string {
if ing.GroupVersion() == IngressV1 {
return ing.V1().ResourceVersion
}
if ing.GroupVersion() == IngressV1beta1 {
return ing.V1beta1().ResourceVersion
}
return ing.ExtensionsV1beta1().ResourceVersion
}
type ingressLister struct {
v1Lister listersnetworkingv1.IngressLister
v1beta1Lister listersnetworkingv1beta1.IngressLister
extensionsV1beta1Lister listersextensionsv1beta1.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,
}, 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,
}, nil
}
func (l *ingressLister) ExtensionsV1beta1(namespace, name string) (Ingress, error) {
ing, err := l.extensionsV1beta1Lister.Ingresses(namespace).Get(name)
if err != nil {
return nil, err
}
return &ingress{
groupVersion: IngressExtensionsV1beta1,
extensionsV1beta1: 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,
}
case *networkingv1beta1.Ingress:
return &ingress{
groupVersion: IngressV1beta1,
v1beta1: ing,
}
case *extensionsv1beta1.Ingress:
return &ingress{
groupVersion: IngressExtensionsV1beta1,
extensionsV1beta1: 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,
}, nil
case *networkingv1beta1.Ingress:
return &ingress{
groupVersion: IngressV1beta1,
v1beta1: ing,
}, nil
case *extensionsv1beta1.Ingress:
return &ingress{
groupVersion: IngressExtensionsV1beta1,
extensionsV1beta1: 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,
extensionsv1beta1 listersextensionsv1beta1.IngressLister) IngressLister {
return &ingressLister{
v1Lister: v1,
v1beta1Lister: v1beta1,
extensionsV1beta1Lister: extensionsv1beta1,
}
}