diff --git a/pkg/providers/apisix/translation/apisix_route.go b/pkg/providers/apisix/translation/apisix_route.go index 76f01fdd89..841eb5ece1 100644 --- a/pkg/providers/apisix/translation/apisix_route.go +++ b/pkg/providers/apisix/translation/apisix_route.go @@ -325,6 +325,10 @@ func (t *translator) translateHTTPRouteV2(ctx *translation.TranslateContext, ar route.EnableWebsocket = part.Websocket route.Plugins = pluginMap route.Timeout = timeout + if part.PluginConfigName != "" { + route.PluginConfigId = id.GenID(apisixv1.ComposePluginConfigName(ar.Namespace, part.PluginConfigName)) + } + ctx.AddRoute(route) // --- translate "Backends" --- @@ -347,9 +351,6 @@ func (t *translator) translateHTTPRouteV2(ctx *translation.TranslateContext, ar upstreamName := apisixv1.ComposeUpstreamName(ar.Namespace, backend.ServiceName, backend.Subset, svcPort, backend.ResolveGranularity) route.UpstreamId = id.GenID(upstreamName) - if part.PluginConfigName != "" { - route.PluginConfigId = id.GenID(apisixv1.ComposePluginConfigName(ar.Namespace, part.PluginConfigName)) - } if len(backends) > 0 { weight := translation.DefaultWeight diff --git a/pkg/providers/apisix/translation/apisix_route_test.go b/pkg/providers/apisix/translation/apisix_route_test.go index f0a54443b1..194174caae 100644 --- a/pkg/providers/apisix/translation/apisix_route_test.go +++ b/pkg/providers/apisix/translation/apisix_route_test.go @@ -741,3 +741,42 @@ func TestTranslateApisixRouteV2WithUpstream(t *testing.T) { TLS: nil, }, ups) } + +func TestTranslateApisixRouteV2WithUpstreamNoBackendsAndPluginConfigName(t *testing.T) { + tr, processCh := mockTranslatorV2(t) + <-processCh + <-processCh + + ar := &configv2.ApisixRoute{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ar", + Namespace: "test", + }, + Spec: configv2.ApisixRouteSpec{ + HTTP: []configv2.ApisixRouteHTTP{ + { + Name: "rule1", + Match: configv2.ApisixRouteHTTPMatch{ + Paths: []string{ + "/*", + }, + }, + Upstreams: []configv2.ApisixRouteUpstreamReference{ + { + Name: "au", + Weight: ptrOf(1), + }, + }, + PluginConfigName: "test-PluginConfigName-1", + }, + }, + }, + } + + tctx, err := tr.TranslateRouteV2(ar) + assert.NoError(t, err) + assert.Len(t, tctx.PluginConfigs, 0) + assert.Len(t, tctx.Routes, 1) + expectedPluginId := id.GenID(apisixv1.ComposePluginConfigName(ar.Namespace, ar.Spec.HTTP[0].PluginConfigName)) + assert.Equal(t, expectedPluginId, tctx.Routes[0].PluginConfigId) +} diff --git a/test/e2e/suite-plugins/suite-plugins-other/plugin_config.go b/test/e2e/suite-plugins/suite-plugins-other/plugin_config.go index 3daa07f20e..cc7e6d9531 100644 --- a/test/e2e/suite-plugins/suite-plugins-other/plugin_config.go +++ b/test/e2e/suite-plugins/suite-plugins-other/plugin_config.go @@ -539,5 +539,68 @@ spec: }) ginkgo.Describe("suite-plugins-other: scaffold v2", func() { suites(scaffold.NewDefaultV2Scaffold) + + s := scaffold.NewDefaultV2Scaffold() + ginkgo.It("applies plugin config for route with upstream", func() { + apc := fmt.Sprintf(` +apiVersion: apisix.apache.org/v2 +kind: ApisixPluginConfig +metadata: + name: httpbin-plugins +spec: + plugins: + - name: proxy-rewrite + enable: true + config: + regex_uri: + - ^/httpbin/(.*) + - /$1 +`) + assert.Nil(ginkgo.GinkgoT(), s.CreateVersionedApisixResource(apc)) + + au := fmt.Sprintf(` +apiVersion: apisix.apache.org/v2 +kind: ApisixUpstream +metadata: + name: httpbin-upstream +spec: + externalNodes: + - type: Domain + name: httpbin.org +`) + assert.Nil(ginkgo.GinkgoT(), s.CreateVersionedApisixResource(au)) + + ar := fmt.Sprintf(` +apiVersion: apisix.apache.org/v2 +kind: ApisixRoute +metadata: + name: httpbin-route +spec: + http: + - name: httpbin-route-rule + match: + hosts: + - httpbin.org + paths: + - /httpbin/* + methods: + - GET + upstreams: + - name: httpbin-upstream + plugin_config_name: httpbin-plugins +`) + + assert.Nil(ginkgo.GinkgoT(), s.CreateVersionedApisixResource(ar)) + + err := s.EnsureNumApisixUpstreamsCreated(1) + assert.Nil(ginkgo.GinkgoT(), err, "Checking number of upstreams") + err = s.EnsureNumApisixPluginConfigCreated(1) + assert.Nil(ginkgo.GinkgoT(), err, "Checking number of pluginConfigs") + err = s.EnsureNumApisixRoutesCreated(1) + assert.Nil(ginkgo.GinkgoT(), err, "Checking number of routes") + + resp := s.NewAPISIXClient().GET("/httpbin/ip").WithHeader("Host", "httpbin.org").Expect() + resp.Status(http.StatusOK) + }) }) })