This is an automated email from the ASF dual-hosted git repository.
kvn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git
The following commit(s) were added to refs/heads/master by this push:
new 408eb0d1 feat: support ApisixPluginConfig v2 (#984)
408eb0d1 is described below
commit 408eb0d1c9b05517e530688e2e6e82c721699548
Author: Sarasa Kisaragi <[email protected]>
AuthorDate: Wed Jun 1 18:48:27 2022 +0800
feat: support ApisixPluginConfig v2 (#984)
---
cmd/ingress/ingress.go | 1 +
pkg/config/config.go | 2 +
pkg/config/config_test.go | 2 +
pkg/ingress/apisix_pluginconfig.go | 43 ++++++++++++++++++---
pkg/ingress/controller.go | 15 +++++++-
pkg/kube/apisix_plugin_config.go | 59 +++++++++++++++++++++++------
pkg/kube/translation/apisix_pluginconfig.go | 41 ++++++++++++++++++++
pkg/kube/translation/translator.go | 6 +++
8 files changed, 151 insertions(+), 18 deletions(-)
diff --git a/cmd/ingress/ingress.go b/cmd/ingress/ingress.go
index daed1637..324ff7b1 100644
--- a/cmd/ingress/ingress.go
+++ b/cmd/ingress/ingress.go
@@ -162,6 +162,7 @@ For example, no available LB exists in the bare metal
environment.`)
cmd.PersistentFlags().StringVar(&cfg.Kubernetes.ElectionID,
"election-id", config.IngressAPISIXLeader, "election id used for campaign the
controller leader")
cmd.PersistentFlags().StringVar(&cfg.Kubernetes.IngressVersion,
"ingress-version", config.IngressNetworkingV1, "the supported ingress api group
version, can be \"networking/v1beta1\", \"networking/v1\" (for Kubernetes
version v1.19.0 or higher) and \"extensions/v1beta1\"")
cmd.PersistentFlags().StringVar(&cfg.Kubernetes.ApisixRouteVersion,
"apisix-route-version", config.ApisixRouteV2beta3, "the supported apisixroute
api group version, can be \"apisix.apache.org/v2beta2\" or
\"apisix.apache.org/v2beta3\"")
+
cmd.PersistentFlags().StringVar(&cfg.Kubernetes.ApisixPluginConfigVersion,
"apisix-plugin-config-version", config.ApisixV2beta3, "the supported
ApisixPluginConfig api group version, can be \"apisix.apache.org/v2beta3\" or
\"apisix.apache.org/v2\"")
cmd.PersistentFlags().StringVar(&cfg.Kubernetes.ApisixTlsVersion,
"apisix-tls-version", config.ApisixV2beta3, "the supported apisixtls api group
version, can be \"apisix.apache.org/v2beta3\" or \"apisix.apache.org/v2\"")
cmd.PersistentFlags().StringVar(&cfg.Kubernetes.ApisixClusterConfigVersion,
"apisix-cluster-config-version", config.ApisixV2beta3, "the supported
ApisixClusterConfig api group version, can be \"apisix.apache.org/v2beta3\" or
\"apisix.apache.org/v2\"")
cmd.PersistentFlags().StringVar(&cfg.Kubernetes.ApisixConsumerVersion,
"apisix-consumer-version", config.ApisixV2beta3, "the supported ApisixConsumer
api group version, can be \"apisix.apache.org/v2beta3\" or
\"apisix.apache.org/v2\"")
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 2641ef5d..af6d3665 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -96,6 +96,7 @@ type KubernetesConfig struct {
IngressVersion string `json:"ingress_version"
yaml:"ingress_version"`
WatchEndpointSlices bool
`json:"watch_endpoint_slices" yaml:"watch_endpoint_slices"`
ApisixRouteVersion string
`json:"apisix_route_version" yaml:"apisix_route_version"`
+ ApisixPluginConfigVersion string
`json:"apisix_plugin_config_version" yaml:"apisix_plugin_config_version"`
ApisixConsumerVersion string
`json:"apisix_consumer_version" yaml:"apisix_consumer_version"`
ApisixTlsVersion string
`json:"apisix_tls_version" yaml:"apisix_tls_version"`
ApisixClusterConfigVersion string
`json:"apisix_cluster_config_version" yaml:"apisix_cluster_config_version"`
@@ -134,6 +135,7 @@ func NewDefaultConfig() *Config {
IngressClass: IngressClass,
IngressVersion: IngressNetworkingV1,
ApisixRouteVersion: ApisixRouteV2beta3,
+ ApisixPluginConfigVersion: ApisixV2beta3,
ApisixConsumerVersion: ApisixV2beta3,
ApisixTlsVersion: ApisixV2beta3,
ApisixClusterConfigVersion: ApisixV2beta3,
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index 311afd50..aa0a3077 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -45,6 +45,7 @@ func TestNewConfigFromFile(t *testing.T) {
IngressClass: IngressClass,
IngressVersion: IngressNetworkingV1,
ApisixRouteVersion: ApisixRouteV2beta3,
+ ApisixPluginConfigVersion: ApisixV2beta3,
ApisixConsumerVersion: ApisixV2beta3,
ApisixTlsVersion: ApisixV2beta3,
ApisixClusterConfigVersion: ApisixV2beta3,
@@ -129,6 +130,7 @@ func TestConfigWithEnvVar(t *testing.T) {
IngressClass: IngressClass,
IngressVersion: IngressNetworkingV1,
ApisixRouteVersion: ApisixRouteV2beta3,
+ ApisixPluginConfigVersion: ApisixV2beta3,
ApisixConsumerVersion: ApisixV2beta3,
ApisixTlsVersion: ApisixV2beta3,
ApisixClusterConfigVersion: ApisixV2beta3,
diff --git a/pkg/ingress/apisix_pluginconfig.go
b/pkg/ingress/apisix_pluginconfig.go
index b2e8afa2..a1e4db2c 100644
--- a/pkg/ingress/apisix_pluginconfig.go
+++ b/pkg/ingress/apisix_pluginconfig.go
@@ -16,6 +16,7 @@ package ingress
import (
"context"
+ "fmt"
"time"
"go.uber.org/zap"
@@ -25,6 +26,7 @@ import (
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/workqueue"
+ "github.com/apache/apisix-ingress-controller/pkg/config"
"github.com/apache/apisix-ingress-controller/pkg/kube"
"github.com/apache/apisix-ingress-controller/pkg/kube/translation"
"github.com/apache/apisix-ingress-controller/pkg/log"
@@ -94,8 +96,12 @@ func (c *apisixPluginConfigController) sync(ctx
context.Context, ev *types.Event
tctx *translation.TranslateContext
)
switch obj.GroupVersion {
- case kube.ApisixPluginConfigV2beta3:
+ case config.ApisixV2beta3:
apc, err =
c.controller.apisixPluginConfigLister.V2beta3(namespace, name)
+ case config.ApisixV2:
+ apc, err = c.controller.apisixPluginConfigLister.V2(namespace,
name)
+ default:
+ return fmt.Errorf("unsupported ApisixPluginConfig group version
%s", obj.GroupVersion)
}
if err != nil {
if !k8serrors.IsNotFound(err) {
@@ -129,7 +135,7 @@ func (c *apisixPluginConfigController) sync(ctx
context.Context, ev *types.Event
}
switch obj.GroupVersion {
- case kube.ApisixPluginConfigV2beta3:
+ case config.ApisixV2beta3:
if ev.Type != types.EventDelete {
tctx, err =
c.controller.translator.TranslatePluginConfigV2beta3(apc.V2beta3())
} else {
@@ -142,6 +148,19 @@ func (c *apisixPluginConfigController) sync(ctx
context.Context, ev *types.Event
)
return err
}
+ case config.ApisixV2:
+ if ev.Type != types.EventDelete {
+ tctx, err =
c.controller.translator.TranslatePluginConfigV2(apc.V2())
+ } else {
+ tctx, err =
c.controller.translator.TranslatePluginConfigV2NotStrictly(apc.V2())
+ }
+ if err != nil {
+ log.Errorw("failed to translate ApisixPluginConfig v2",
+ zap.Error(err),
+ zap.Any("object", apc),
+ )
+ return err
+ }
}
log.Debugw("translated ApisixPluginConfig",
@@ -165,8 +184,10 @@ func (c *apisixPluginConfigController) sync(ctx
context.Context, ev *types.Event
} else {
var oldCtx *translation.TranslateContext
switch obj.GroupVersion {
- case kube.ApisixPluginConfigV2beta3:
+ case config.ApisixV2beta3:
oldCtx, err =
c.controller.translator.TranslatePluginConfigV2beta3(obj.OldObject.V2beta3())
+ case config.ApisixV2:
+ oldCtx, err =
c.controller.translator.TranslatePluginConfigV2(obj.OldObject.V2())
}
if err != nil {
log.Errorw("failed to translate old ApisixPluginConfig",
@@ -206,16 +227,23 @@ func (c *apisixPluginConfigController) handleSyncErr(obj
interface{}, errOrigin
}
var apc kube.ApisixPluginConfig
switch event.GroupVersion {
- case kube.ApisixPluginConfigV2beta3:
+ case config.ApisixV2beta3:
apc, errLocal =
c.controller.apisixPluginConfigLister.V2beta3(namespace, name)
+ case config.ApisixV2:
+ apc, errLocal =
c.controller.apisixPluginConfigLister.V2(namespace, name)
+ default:
+ errLocal = fmt.Errorf("unsupported ApisixPluginConfig group
version %s", event.GroupVersion)
}
if errOrigin == nil {
if ev.Type != types.EventDelete {
if errLocal == nil {
switch apc.GroupVersion() {
- case kube.ApisixPluginConfigV2beta3:
+ case config.ApisixV2beta3:
c.controller.recorderEvent(apc.V2beta3(), v1.EventTypeNormal, _resourceSynced,
nil)
c.controller.recordStatus(apc.V2beta3(), _resourceSynced, nil,
metav1.ConditionTrue, apc.V2beta3().GetGeneration())
+ case config.ApisixV2:
+ c.controller.recorderEvent(apc.V2(),
v1.EventTypeNormal, _resourceSynced, nil)
+ c.controller.recordStatus(apc.V2(),
_resourceSynced, nil, metav1.ConditionTrue, apc.V2().GetGeneration())
}
} else {
log.Errorw("failed list ApisixPluginConfig",
@@ -235,9 +263,12 @@ func (c *apisixPluginConfigController) handleSyncErr(obj
interface{}, errOrigin
)
if errLocal == nil {
switch apc.GroupVersion() {
- case kube.ApisixPluginConfigV2beta3:
+ case config.ApisixV2beta3:
c.controller.recorderEvent(apc.V2beta3(),
v1.EventTypeWarning, _resourceSyncAborted, errOrigin)
c.controller.recordStatus(apc.V2beta3(),
_resourceSyncAborted, errOrigin, metav1.ConditionFalse,
apc.V2beta3().GetGeneration())
+ case config.ApisixV2:
+ c.controller.recorderEvent(apc.V2(),
v1.EventTypeWarning, _resourceSyncAborted, errOrigin)
+ c.controller.recordStatus(apc.V2(),
_resourceSyncAborted, errOrigin, metav1.ConditionFalse,
apc.V2().GetGeneration())
}
} else {
log.Errorw("failed list ApisixPluginConfig",
diff --git a/pkg/ingress/controller.go b/pkg/ingress/controller.go
index 7ab245c6..bcba8a24 100644
--- a/pkg/ingress/controller.go
+++ b/pkg/ingress/controller.go
@@ -205,6 +205,7 @@ func (c *Controller) initWhenStartLeading() {
var (
ingressInformer cache.SharedIndexInformer
apisixRouteInformer cache.SharedIndexInformer
+ apisixPluginConfigInformer cache.SharedIndexInformer
apisixTlsInformer cache.SharedIndexInformer
apisixClusterConfigInformer cache.SharedIndexInformer
apisixConsumerInformer cache.SharedIndexInformer
@@ -244,6 +245,7 @@ func (c *Controller) initWhenStartLeading() {
)
c.apisixPluginConfigLister = kube.NewApisixPluginConfigLister(
apisixFactory.Apisix().V2beta3().ApisixPluginConfigs().Lister(),
+ apisixFactory.Apisix().V2().ApisixPluginConfigs().Lister(),
)
c.translator = translation.NewTranslator(&translation.TranslatorOptions{
@@ -304,6 +306,17 @@ func (c *Controller) initWhenStartLeading() {
apisixConsumerInformer =
apisixFactory.Apisix().V2beta3().ApisixConsumers().Informer()
case config.ApisixRouteV2:
apisixConsumerInformer =
apisixFactory.Apisix().V2().ApisixConsumers().Informer()
+ default:
+ panic(fmt.Errorf("unsupported ApisixConsumer version %v",
c.cfg.Kubernetes.ApisixConsumerVersion))
+ }
+
+ switch c.cfg.Kubernetes.ApisixPluginConfigVersion {
+ case config.ApisixV2beta3:
+ apisixPluginConfigInformer =
apisixFactory.Apisix().V2beta3().ApisixPluginConfigs().Informer()
+ case config.ApisixV2:
+ apisixPluginConfigInformer =
apisixFactory.Apisix().V2().ApisixPluginConfigs().Informer()
+ default:
+ panic(fmt.Errorf("unsupported ApisixPluginConfig version %v",
c.cfg.Kubernetes.ApisixPluginConfigVersion))
}
c.namespaceInformer = kubeFactory.Core().V1().Namespaces().Informer()
@@ -316,7 +329,7 @@ func (c *Controller) initWhenStartLeading() {
c.secretInformer = kubeFactory.Core().V1().Secrets().Informer()
c.apisixTlsInformer = apisixTlsInformer
c.apisixConsumerInformer = apisixConsumerInformer
- c.apisixPluginConfigInformer =
apisixFactory.Apisix().V2beta3().ApisixPluginConfigs().Informer()
+ c.apisixPluginConfigInformer = apisixPluginConfigInformer
if c.cfg.Kubernetes.WatchEndpointSlices {
c.endpointSliceController = c.newEndpointSliceController()
diff --git a/pkg/kube/apisix_plugin_config.go b/pkg/kube/apisix_plugin_config.go
index a3147d28..98f587e5 100644
--- a/pkg/kube/apisix_plugin_config.go
+++ b/pkg/kube/apisix_plugin_config.go
@@ -17,20 +17,20 @@ package kube
import (
"errors"
+ "github.com/apache/apisix-ingress-controller/pkg/config"
+ configv2
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
configv2beta3
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
+ listersv2
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/client/listers/config/v2"
listersv2beta3
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/client/listers/config/v2beta3"
)
-const (
- // ApisixPluginConfigV2beta3 represents the ApisixPluginConfig in
apisix.apache.org/v2beta3 group version
- ApisixPluginConfigV2beta3 = "apisix.apache.org/v2beta3"
-)
-
// ApisixPluginConfigLister is an encapsulation for the lister of
ApisixPluginConfig,
// it aims at to be compatible with different ApisixPluginConfig versions.
type ApisixPluginConfigLister interface {
// V2beta3 gets the ApisixPluginConfig in apisix.apache.org/v2beta3.
V2beta3(string, string) (ApisixPluginConfig, error)
+ // V2 gets the ApisixPluginConfig in apisix.apache.org/v2.
+ V2(string, string) (ApisixPluginConfig, error)
}
// ApisixPluginConfigInformer is an encapsulation for the informer of
ApisixPluginConfig,
@@ -48,6 +48,9 @@ type ApisixPluginConfig interface {
// V2beta3 returns the ApisixPluginConfig in apisix.apache.org/v2beta3,
the real
// ApisixPluginConfig must be in this group version, otherwise will
panic.
V2beta3() *configv2beta3.ApisixPluginConfig
+ // V2 returns the ApisixPluginConfig in apisix.apache.org/v2, the real
+ // ApisixPluginConfig must be in this group version, otherwise will
panic.
+ V2() *configv2.ApisixPluginConfig
// ResourceVersion returns the the resource version field inside
// the real ApisixPluginConfig.
ResourceVersion() string
@@ -64,25 +67,37 @@ type ApisixPluginConfigEvent struct {
type apisixPluginConfig struct {
groupVersion string
v2beta3 *configv2beta3.ApisixPluginConfig
+ v2 *configv2.ApisixPluginConfig
}
func (apc *apisixPluginConfig) V2beta3() *configv2beta3.ApisixPluginConfig {
- if apc.groupVersion != ApisixPluginConfigV2beta3 {
+ if apc.groupVersion != config.ApisixV2beta3 {
panic("not a apisix.apache.org/v2beta3 pluginConfig")
}
return apc.v2beta3
}
+func (apc *apisixPluginConfig) V2() *configv2.ApisixPluginConfig {
+ if apc.groupVersion != config.ApisixV2 {
+ panic("not a apisix.apache.org/v2 pluginConfig")
+ }
+ return apc.v2
+}
+
func (apc *apisixPluginConfig) GroupVersion() string {
return apc.groupVersion
}
func (apc *apisixPluginConfig) ResourceVersion() string {
- return apc.V2beta3().ResourceVersion
+ if apc.groupVersion == config.ApisixV2beta3 {
+ return apc.V2beta3().ResourceVersion
+ }
+ return apc.V2().ResourceVersion
}
type apisixPluginConfigLister struct {
v2beta3Lister listersv2beta3.ApisixPluginConfigLister
+ v2Lister listersv2.ApisixPluginConfigLister
}
func (l *apisixPluginConfigLister) V2beta3(namespace, name string)
(ApisixPluginConfig, error) {
@@ -91,20 +106,36 @@ func (l *apisixPluginConfigLister) V2beta3(namespace, name
string) (ApisixPlugin
return nil, err
}
return &apisixPluginConfig{
- groupVersion: ApisixPluginConfigV2beta3,
+ groupVersion: config.ApisixV2beta3,
v2beta3: apc,
}, nil
}
+func (l *apisixPluginConfigLister) V2(namespace, name string)
(ApisixPluginConfig, error) {
+ apc, err := l.v2Lister.ApisixPluginConfigs(namespace).Get(name)
+ if err != nil {
+ return nil, err
+ }
+ return &apisixPluginConfig{
+ groupVersion: config.ApisixV2,
+ v2: apc,
+ }, nil
+}
+
// MustNewApisixPluginConfig creates a kube.ApisixPluginConfig object
according to the
// type of obj.
func MustNewApisixPluginConfig(obj interface{}) ApisixPluginConfig {
switch apc := obj.(type) {
case *configv2beta3.ApisixPluginConfig:
return &apisixPluginConfig{
- groupVersion: ApisixPluginConfigV2beta3,
+ groupVersion: config.ApisixV2beta3,
v2beta3: apc,
}
+ case *configv2.ApisixPluginConfig:
+ return &apisixPluginConfig{
+ groupVersion: config.ApisixV2,
+ v2: apc,
+ }
default:
panic("invalid ApisixPluginConfig type")
}
@@ -117,16 +148,22 @@ func NewApisixPluginConfig(obj interface{})
(ApisixPluginConfig, error) {
switch apc := obj.(type) {
case *configv2beta3.ApisixPluginConfig:
return &apisixPluginConfig{
- groupVersion: ApisixPluginConfigV2beta3,
+ groupVersion: config.ApisixV2beta3,
v2beta3: apc,
}, nil
+ case *configv2.ApisixPluginConfig:
+ return &apisixPluginConfig{
+ groupVersion: config.ApisixV2,
+ v2: apc,
+ }, nil
default:
return nil, errors.New("invalid ApisixPluginConfig type")
}
}
-func NewApisixPluginConfigLister(v2beta3
listersv2beta3.ApisixPluginConfigLister) ApisixPluginConfigLister {
+func NewApisixPluginConfigLister(v2beta3
listersv2beta3.ApisixPluginConfigLister, v2 listersv2.ApisixPluginConfigLister)
ApisixPluginConfigLister {
return &apisixPluginConfigLister{
v2beta3Lister: v2beta3,
+ v2Lister: v2,
}
}
diff --git a/pkg/kube/translation/apisix_pluginconfig.go
b/pkg/kube/translation/apisix_pluginconfig.go
index 44a62169..14ce0467 100644
--- a/pkg/kube/translation/apisix_pluginconfig.go
+++ b/pkg/kube/translation/apisix_pluginconfig.go
@@ -18,6 +18,7 @@ import (
"go.uber.org/zap"
"github.com/apache/apisix-ingress-controller/pkg/id"
+ configv2
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
configv2beta3
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
"github.com/apache/apisix-ingress-controller/pkg/log"
apisixv1
"github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
@@ -62,3 +63,43 @@ func (t *translator)
TranslatePluginConfigV2beta3NotStrictly(config *configv2bet
ctx.addPluginConfig(pc)
return ctx, nil
}
+
+func (t *translator) TranslatePluginConfigV2(config
*configv2.ApisixPluginConfig) (*TranslateContext, error) {
+ ctx := defaultEmptyTranslateContext()
+ pluginMap := make(apisixv1.Plugins)
+ if len(config.Spec.Plugins) > 0 {
+ for _, plugin := range config.Spec.Plugins {
+ if !plugin.Enable {
+ continue
+ }
+ if plugin.Config != nil {
+ // Here, it will override same key.
+ if t, ok := pluginMap[plugin.Name]; ok {
+ log.Infow("TranslatePluginConfigV2
override same plugin key",
+ zap.String("key", plugin.Name),
+ zap.Any("old", t),
+ zap.Any("new", plugin.Config),
+ )
+ }
+ pluginMap[plugin.Name] = plugin.Config
+ } else {
+ pluginMap[plugin.Name] =
make(map[string]interface{})
+ }
+ }
+ }
+ pc := apisixv1.NewDefaultPluginConfig()
+ pc.Name = apisixv1.ComposePluginConfigName(config.Namespace,
config.Name)
+ pc.ID = id.GenID(pc.Name)
+ pc.Plugins = pluginMap
+ ctx.addPluginConfig(pc)
+ return ctx, nil
+}
+
+func (t *translator) TranslatePluginConfigV2NotStrictly(config
*configv2.ApisixPluginConfig) (*TranslateContext, error) {
+ ctx := defaultEmptyTranslateContext()
+ pc := apisixv1.NewDefaultPluginConfig()
+ pc.Name = apisixv1.ComposePluginConfigName(config.Namespace,
config.Name)
+ pc.ID = id.GenID(pc.Name)
+ ctx.addPluginConfig(pc)
+ return ctx, nil
+}
diff --git a/pkg/kube/translation/translator.go
b/pkg/kube/translation/translator.go
index 8ec4cbb7..d20fc5ce 100644
--- a/pkg/kube/translation/translator.go
+++ b/pkg/kube/translation/translator.go
@@ -106,6 +106,12 @@ type Translator interface {
// TranslatePluginConfigV2beta3NotStrictly translates the
configv2beta3.ApisixPluginConfig object into several PluginConfig
// resources not strictly, only used for delete event.
TranslatePluginConfigV2beta3NotStrictly(*configv2beta3.ApisixPluginConfig)
(*TranslateContext, error)
+ // TranslatePluginConfigV2 translates the configv2.ApisixPluginConfig
object into several PluginConfig
+ // resources.
+ TranslatePluginConfigV2(*configv2.ApisixPluginConfig)
(*TranslateContext, error)
+ // TranslatePluginConfigV2NotStrictly translates the
configv2.ApisixPluginConfig object into several PluginConfig
+ // resources not strictly, only used for delete event.
+ TranslatePluginConfigV2NotStrictly(*configv2.ApisixPluginConfig)
(*TranslateContext, error)
// ExtractKeyPair extracts certificate and private key pair from secret
// Supports APISIX style ("cert" and "key") and Kube style ("tls.crt"
and "tls.key)
ExtractKeyPair(s *corev1.Secret, hasPrivateKey bool) ([]byte, []byte,
error)