Skip to content

Commit

Permalink
feat: change ApisixRoute to v2 api version (#943)
Browse files Browse the repository at this point in the history
Signed-off-by: Jintao Zhang <zhangjintao9020@gmail.com>
  • Loading branch information
tao12345666333 committed Apr 2, 2022
1 parent 3b99353 commit f58f3d5
Show file tree
Hide file tree
Showing 21 changed files with 510 additions and 67 deletions.
3 changes: 3 additions & 0 deletions pkg/api/validation/apisix_consumer.go
Expand Up @@ -26,6 +26,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/apache/apisix-ingress-controller/pkg/apisix"
v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
"github.com/apache/apisix-ingress-controller/pkg/log"
Expand All @@ -47,6 +48,8 @@ var ApisixConsumerValidator = kwhvalidating.ValidatorFunc(
spec = ac.Spec
case *v2beta3.ApisixRoute:
spec = ac.Spec
case *v2.ApisixRoute:
spec = ac.Spec
default:
return &kwhvalidating.ValidatorResult{Valid: false, Message: errNotApisixConsumer.Error()}, errNotApisixConsumer
}
Expand Down
13 changes: 13 additions & 0 deletions pkg/api/validation/apisix_route.go
Expand Up @@ -28,6 +28,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/apache/apisix-ingress-controller/pkg/apisix"
v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
"github.com/apache/apisix-ingress-controller/pkg/log"
Expand Down Expand Up @@ -69,6 +70,18 @@ var ApisixRouteValidator = kwhvalidating.ValidatorFunc(
case *v2beta3.ApisixRoute:
spec = ar.Spec

for _, h := range ar.Spec.HTTP {
for _, p := range h.Plugins {
if p.Enable {
plugins = append(plugins, apisixRoutePlugin{
p.Name, p.Config,
})
}
}
}
case *v2.ApisixRoute:
spec = ar.Spec

for _, h := range ar.Spec.HTTP {
for _, p := range h.Plugins {
if p.Enable {
Expand Down
8 changes: 7 additions & 1 deletion pkg/api/validation/apisix_route_test.go
Expand Up @@ -21,6 +21,7 @@ import (
"testing"

"github.com/apache/apisix-ingress-controller/pkg/apisix"
v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
api "github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
Expand Down Expand Up @@ -123,7 +124,12 @@ func Test_validatePlugin(t *testing.T) {
fakeClient := newFakeSchemaClient()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotValid, _ := validatePlugin(fakeClient, tt.pluginName, v2beta3.ApisixRouteHTTPPluginConfig(tt.pluginConfig))
gotValid, _ := validatePlugin(fakeClient, tt.pluginName, v2.ApisixRouteHTTPPluginConfig(tt.pluginConfig))
if gotValid != tt.wantValid {
t.Errorf("validatePlugin() gotValid = %v, want %v", gotValid, tt.wantValid)
}

gotValid, _ = validatePlugin(fakeClient, tt.pluginName, v2beta3.ApisixRouteHTTPPluginConfig(tt.pluginConfig))
if gotValid != tt.wantValid {
t.Errorf("validatePlugin() gotValid = %v, want %v", gotValid, tt.wantValid)
}
Expand Down
3 changes: 3 additions & 0 deletions pkg/api/validation/apisix_tls.go
Expand Up @@ -26,6 +26,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/apache/apisix-ingress-controller/pkg/apisix"
v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
"github.com/apache/apisix-ingress-controller/pkg/log"
Expand All @@ -47,6 +48,8 @@ var ApisixTlsValidator = kwhvalidating.ValidatorFunc(
spec = at.Spec
case *v2beta3.ApisixRoute:
spec = at.Spec
case *v2.ApisixRoute:
spec = at.Spec
default:
return &kwhvalidating.ValidatorResult{Valid: false, Message: errNotApisixTls.Error()}, errNotApisixTls
}
Expand Down
3 changes: 3 additions & 0 deletions pkg/api/validation/apisix_upstream.go
Expand Up @@ -26,6 +26,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/apache/apisix-ingress-controller/pkg/apisix"
v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
"github.com/apache/apisix-ingress-controller/pkg/log"
Expand All @@ -47,6 +48,8 @@ var ApisixUpstreamValidator = kwhvalidating.ValidatorFunc(
spec = au.Spec
case *v2beta3.ApisixRoute:
spec = au.Spec
case *v2.ApisixRoute:
spec = au.Spec
default:
return &kwhvalidating.ValidatorResult{Valid: false, Message: errNotApisixUpstream.Error()}, errNotApisixUpstream
}
Expand Down
2 changes: 2 additions & 0 deletions pkg/config/config.go
Expand Up @@ -55,6 +55,8 @@ const (
ApisixRouteV2beta2 = "apisix.apache.org/v2beta2"
// ApisixRouteV2beta3 represents apisixroute.apisix.apache.org/v2beta3
ApisixRouteV2beta3 = "apisix.apache.org/v2beta3"
// ApisixRouteV2 represents apisixroute.apisix.apache.org/v2
ApisixRouteV2 = "apisix.apache.org/v2"

_minimalResyncInterval = 30 * time.Second

Expand Down
55 changes: 53 additions & 2 deletions pkg/ingress/apisix_route.go
Expand Up @@ -27,6 +27,7 @@ import (

apisixcache "github.com/apache/apisix-ingress-controller/pkg/apisix/cache"
"github.com/apache/apisix-ingress-controller/pkg/kube"
v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
"github.com/apache/apisix-ingress-controller/pkg/kube/translation"
"github.com/apache/apisix-ingress-controller/pkg/log"
Expand Down Expand Up @@ -101,6 +102,8 @@ func (c *apisixRouteController) sync(ctx context.Context, ev *types.Event) error
ar, err = c.controller.apisixRouteLister.V2beta2(namespace, name)
case kube.ApisixRouteV2beta3:
ar, err = c.controller.apisixRouteLister.V2beta3(namespace, name)
case kube.ApisixRouteV2:
ar, err = c.controller.apisixRouteLister.V2(namespace, name)
}
if err != nil {
if !k8serrors.IsNotFound(err) {
Expand Down Expand Up @@ -162,6 +165,21 @@ func (c *apisixRouteController) sync(ctx context.Context, ev *types.Event) error
)
return err
}
case kube.ApisixRouteV2:
if ev.Type != types.EventDelete {
if err = c.checkPluginNameIfNotEmptyV2(ctx, ar.V2()); err == nil {
tctx, err = c.controller.translator.TranslateRouteV2(ar.V2())
}
} else {
tctx, err = c.controller.translator.TranslateRouteV2NotStrictly(ar.V2())
}
if err != nil {
log.Errorw("failed to translate ApisixRoute v2",
zap.Error(err),
zap.Any("object", ar),
)
return err
}
}

log.Debugw("translated ApisixRoute",
Expand Down Expand Up @@ -195,6 +213,8 @@ func (c *apisixRouteController) sync(ctx context.Context, ev *types.Event) error
oldCtx, err = c.controller.translator.TranslateRouteV2beta2(obj.OldObject.V2beta2())
case kube.ApisixRouteV2beta3:
oldCtx, err = c.controller.translator.TranslateRouteV2beta3(obj.OldObject.V2beta3())
case kube.ApisixRouteV2:
oldCtx, err = c.controller.translator.TranslateRouteV2(obj.OldObject.V2())
}
if err != nil {
log.Errorw("failed to translate old ApisixRoute",
Expand Down Expand Up @@ -241,6 +261,29 @@ func (c *apisixRouteController) checkPluginNameIfNotEmptyV2beta3(ctx context.Con
return nil
}

func (c *apisixRouteController) checkPluginNameIfNotEmptyV2(ctx context.Context, in *v2.ApisixRoute) error {
for _, v := range in.Spec.HTTP {
if v.PluginConfigName != "" {
_, err := c.controller.apisix.Cluster(c.controller.cfg.APISIX.DefaultClusterName).PluginConfig().Get(ctx, apisixv1.ComposePluginConfigName(in.Namespace, v.PluginConfigName))
if err != nil {
if err == apisixcache.ErrNotFound {
log.Errorw("checkPluginNameIfNotEmptyV2 error: plugin_config not found",
zap.String("name", apisixv1.ComposePluginConfigName(in.Namespace, v.PluginConfigName)),
zap.Any("obj", in),
zap.Error(err))
} else {
log.Errorw("checkPluginNameIfNotEmptyV2 PluginConfig get failed",
zap.String("name", apisixv1.ComposePluginConfigName(in.Namespace, v.PluginConfigName)),
zap.Any("obj", in),
zap.Error(err))
}
return err
}
}
}
return nil
}

func (c *apisixRouteController) handleSyncErr(obj interface{}, errOrigin error) {
ev := obj.(*types.Event)
event := ev.Object.(kube.ApisixRouteEvent)
Expand All @@ -260,10 +303,12 @@ func (c *apisixRouteController) handleSyncErr(obj interface{}, errOrigin error)
}
var ar kube.ApisixRoute
switch event.GroupVersion {
case kube.ApisixRouteV2beta3:
ar, errLocal = c.controller.apisixRouteLister.V2beta3(namespace, name)
case kube.ApisixRouteV2beta2:
ar, errLocal = c.controller.apisixRouteLister.V2beta2(namespace, name)
case kube.ApisixRouteV2beta3:
ar, errLocal = c.controller.apisixRouteLister.V2beta3(namespace, name)
case kube.ApisixRouteV2:
ar, errLocal = c.controller.apisixRouteLister.V2(namespace, name)
}
if errOrigin == nil {
if ev.Type != types.EventDelete {
Expand All @@ -275,6 +320,9 @@ func (c *apisixRouteController) handleSyncErr(obj interface{}, errOrigin error)
case kube.ApisixRouteV2beta3:
c.controller.recorderEvent(ar.V2beta3(), v1.EventTypeNormal, _resourceSynced, nil)
c.controller.recordStatus(ar.V2beta3(), _resourceSynced, nil, metav1.ConditionTrue, ar.V2beta3().GetGeneration())
case kube.ApisixRouteV2:
c.controller.recorderEvent(ar.V2(), v1.EventTypeNormal, _resourceSynced, nil)
c.controller.recordStatus(ar.V2(), _resourceSynced, nil, metav1.ConditionTrue, ar.V2().GetGeneration())
}
} else {
log.Errorw("failed list ApisixRoute",
Expand All @@ -300,6 +348,9 @@ func (c *apisixRouteController) handleSyncErr(obj interface{}, errOrigin error)
case kube.ApisixRouteV2beta3:
c.controller.recorderEvent(ar.V2beta3(), v1.EventTypeWarning, _resourceSyncAborted, errOrigin)
c.controller.recordStatus(ar.V2beta3(), _resourceSyncAborted, errOrigin, metav1.ConditionFalse, ar.V2beta3().GetGeneration())
case kube.ApisixRouteV2:
c.controller.recorderEvent(ar.V2(), v1.EventTypeWarning, _resourceSyncAborted, errOrigin)
c.controller.recordStatus(ar.V2(), _resourceSyncAborted, errOrigin, metav1.ConditionFalse, ar.V2().GetGeneration())
}
} else {
log.Errorw("failed list ApisixRoute",
Expand Down
3 changes: 3 additions & 0 deletions pkg/ingress/controller.go
Expand Up @@ -221,6 +221,7 @@ func (c *Controller) initWhenStartLeading() {
c.apisixRouteLister = kube.NewApisixRouteLister(
apisixFactory.Apisix().V2beta2().ApisixRoutes().Lister(),
apisixFactory.Apisix().V2beta3().ApisixRoutes().Lister(),
apisixFactory.Apisix().V2().ApisixRoutes().Lister(),
)
c.apisixUpstreamLister = apisixFactory.Apisix().V2beta3().ApisixUpstreams().Lister()
c.apisixTlsLister = apisixFactory.Apisix().V2beta3().ApisixTlses().Lister()
Expand Down Expand Up @@ -256,6 +257,8 @@ func (c *Controller) initWhenStartLeading() {
apisixRouteInformer = apisixFactory.Apisix().V2beta2().ApisixRoutes().Informer()
case config.ApisixRouteV2beta3:
apisixRouteInformer = apisixFactory.Apisix().V2beta3().ApisixRoutes().Informer()
case config.ApisixRouteV2:
apisixRouteInformer = apisixFactory.Apisix().V2().ApisixRoutes().Informer()
}

c.namespaceInformer = kubeFactory.Core().V1().Namespaces().Informer()
Expand Down
12 changes: 6 additions & 6 deletions pkg/kube/apisix/apis/config/v2beta2/types.go
Expand Up @@ -20,7 +20,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"

"github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2beta3"
v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
)

// +genclient
Expand Down Expand Up @@ -65,10 +65,10 @@ type ApisixRouteHTTP struct {
// Backends represents potential backends to proxy after the route
// rule matched. When number of backends are more than one, traffic-split
// plugin in APISIX will be used to split traffic based on the backend weight.
Backends []v2beta3.ApisixRouteHTTPBackend `json:"backends,omitempty" yaml:"backends,omitempty"`
Websocket bool `json:"websocket" yaml:"websocket"`
Plugins []ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"`
Authentication ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"`
Backends []v2.ApisixRouteHTTPBackend `json:"backends,omitempty" yaml:"backends,omitempty"`
Websocket bool `json:"websocket" yaml:"websocket"`
Plugins []ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"`
Authentication ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"`
}

// ApisixRouteHTTPMatch represents the match condition for hitting this route.
Expand Down Expand Up @@ -98,7 +98,7 @@ type ApisixRouteHTTPMatch struct {
// value:
// - "127.0.0.1"
// - "10.0.5.11"
NginxVars []v2beta3.ApisixRouteHTTPMatchExpr `json:"exprs,omitempty" yaml:"exprs,omitempty"`
NginxVars []v2.ApisixRouteHTTPMatchExpr `json:"exprs,omitempty" yaml:"exprs,omitempty"`
}

// ApisixRouteHTTPMatchExprSubject describes the route match expression subject.
Expand Down
6 changes: 3 additions & 3 deletions pkg/kube/apisix/apis/config/v2beta2/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 7 additions & 6 deletions pkg/kube/apisix/apis/config/v2beta3/types.go
Expand Up @@ -22,6 +22,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"

v2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
"github.com/apache/apisix-ingress-controller/pkg/types"
)

Expand Down Expand Up @@ -67,11 +68,11 @@ type ApisixRouteHTTP struct {
// Backends represents potential backends to proxy after the route
// rule matched. When number of backends are more than one, traffic-split
// plugin in APISIX will be used to split traffic based on the backend weight.
Backends []ApisixRouteHTTPBackend `json:"backends,omitempty" yaml:"backends,omitempty"`
Websocket bool `json:"websocket" yaml:"websocket"`
PluginConfigName string `json:"plugin_config_name,omitempty" yaml:"plugin_config_name,omitempty"`
Plugins []ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"`
Authentication ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"`
Backends []v2.ApisixRouteHTTPBackend `json:"backends,omitempty" yaml:"backends,omitempty"`
Websocket bool `json:"websocket" yaml:"websocket"`
PluginConfigName string `json:"plugin_config_name,omitempty" yaml:"plugin_config_name,omitempty"`
Plugins []ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"`
Authentication ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"`
}

// ApisixRouteHTTPBackend represents a HTTP backend (a Kuberentes Service).
Expand Down Expand Up @@ -120,7 +121,7 @@ type ApisixRouteHTTPMatch struct {
// value:
// - "127.0.0.1"
// - "10.0.5.11"
NginxVars []ApisixRouteHTTPMatchExpr `json:"exprs,omitempty" yaml:"exprs,omitempty"`
NginxVars []v2.ApisixRouteHTTPMatchExpr `json:"exprs,omitempty" yaml:"exprs,omitempty"`
}

// ApisixRouteHTTPMatchExpr represents a binary route match expression .
Expand Down
5 changes: 3 additions & 2 deletions pkg/kube/apisix/apis/config/v2beta3/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit f58f3d5

Please sign in to comment.