pkg/ingress/kube/common/controller.go (119 lines of code) (raw):
// Copyright (c) 2022 Alibaba Group Holding Ltd.
//
// Licensed 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 common
import (
"strings"
"github.com/alibaba/higress/pkg/cert"
"github.com/alibaba/higress/pkg/ingress/kube/annotations"
networking "istio.io/api/networking/v1alpha3"
"istio.io/istio/pilot/pkg/model"
"istio.io/istio/pkg/cluster"
"istio.io/istio/pkg/config"
gatewaytool "istio.io/istio/pkg/config/gateway"
listerv1 "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/tools/cache"
)
type ServiceKey struct {
Namespace string
Name string
ServiceFQDN string
Port int32
}
type WrapperConfig struct {
Config *config.Config
AnnotationsConfig *annotations.Ingress
}
type WrapperConfigWithRuleKey struct {
Config *config.Config
RuleKey string
}
type WrapperGateway struct {
Gateway *networking.Gateway
WrapperConfig *WrapperConfig
ClusterId cluster.ID
Host string
}
func CreateMcpServiceKey(host string, portNumber int32) ServiceKey {
return ServiceKey{
Namespace: "mcp",
Name: host,
ServiceFQDN: host,
Port: portNumber,
}
}
func (w *WrapperGateway) IsHTTPS() bool {
if w.Gateway == nil || len(w.Gateway.Servers) == 0 {
return false
}
for _, server := range w.Gateway.Servers {
if gatewaytool.IsTLSServer(server) {
return true
}
}
return false
}
type WrapperHTTPRoute struct {
HTTPRoute *networking.HTTPRoute
WrapperConfig *WrapperConfig
RawClusterId string
ClusterId cluster.ID
ClusterName string
Host string
OriginPath string
OriginPathType PathType
WeightTotal int32
IsDefaultBackend bool
RuleKey string
}
func (w *WrapperHTTPRoute) Meta() string {
return strings.Join([]string{w.WrapperConfig.Config.Namespace, w.WrapperConfig.Config.Name}, "/")
}
func (w *WrapperHTTPRoute) BasePathFormat() string {
return strings.Join([]string{w.Host, w.OriginPath}, "-")
}
func (w *WrapperHTTPRoute) PathFormat() string {
return strings.Join([]string{w.Host, string(w.OriginPathType), w.OriginPath}, "-")
}
type WrapperVirtualService struct {
VirtualService *networking.VirtualService
WrapperConfig *WrapperConfig
ConfiguredDefaultBackend bool
AppRoot string
}
type WrapperTrafficPolicy struct {
TrafficPolicy *networking.TrafficPolicy
PortTrafficPolicy *networking.TrafficPolicy_PortTrafficPolicy
WrapperConfig *WrapperConfig
}
type WrapperDestinationRule struct {
DestinationRule *networking.DestinationRule
WrapperConfig *WrapperConfig
ServiceKey ServiceKey
}
type IngressController interface {
// RegisterEventHandler adds a handler to receive config update events for a
// configuration type
RegisterEventHandler(kind config.GroupVersionKind, handler model.EventHandler)
List() []config.Config
ServiceLister() listerv1.ServiceLister
SecretLister() listerv1.SecretLister
ConvertGateway(convertOptions *ConvertOptions, wrapper *WrapperConfig, httpsCredentialConfig *cert.Config) error
ConvertHTTPRoute(convertOptions *ConvertOptions, wrapper *WrapperConfig) error
ApplyDefaultBackend(convertOptions *ConvertOptions, wrapper *WrapperConfig) error
ApplyCanaryIngress(convertOptions *ConvertOptions, wrapper *WrapperConfig) error
ConvertTrafficPolicy(convertOptions *ConvertOptions, wrapper *WrapperConfig) error
// Run until a signal is received
Run(stop <-chan struct{})
SetWatchErrorHandler(func(r *cache.Reflector, err error)) error
// HasSynced returns true after initial cache synchronization is complete
HasSynced() bool
}
type KIngressController interface {
// RegisterEventHandler adds a handler to receive config update events for a
// configuration type
RegisterEventHandler(kind config.GroupVersionKind, handler model.EventHandler)
List() []config.Config
ServiceLister() listerv1.ServiceLister
SecretLister() listerv1.SecretLister
ConvertGateway(convertOptions *ConvertOptions, wrapper *WrapperConfig) error
ConvertHTTPRoute(convertOptions *ConvertOptions, wrapper *WrapperConfig) error
// Run until a signal is received
Run(stop <-chan struct{})
SetWatchErrorHandler(func(r *cache.Reflector, err error)) error
// HasSynced returns true after initial cache synchronization is complete
HasSynced() bool
}
type GatewayController interface {
model.ConfigStoreController
SetWatchErrorHandler(func(r *cache.Reflector, err error)) error
}