You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ro...@apache.org on 2025/09/08 09:49:42 UTC
(apisix-ingress-controller) 02/03: fix: r
This is an automated email from the ASF dual-hosted git repository.
ronething pushed a commit to branch fix/inline_upstream
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git
commit 48a4adca9c98eaf3fe9cbc51b02f5c1d6c0b7814
Author: Ashing Zheng <ax...@gmail.com>
AuthorDate: Mon Sep 8 16:50:49 2025 +0800
fix: r
Signed-off-by: Ashing Zheng <ax...@gmail.com>
---
api/v2/shared_types.go | 53 ++++++++++++++++++++++++++++++++++
internal/adc/translator/apisixroute.go | 11 +++++++
2 files changed, 64 insertions(+)
diff --git a/api/v2/shared_types.go b/api/v2/shared_types.go
index 8ea57efa..fa2d7158 100644
--- a/api/v2/shared_types.go
+++ b/api/v2/shared_types.go
@@ -18,6 +18,8 @@
package v2
import (
+ "bytes"
+ "strconv"
"time"
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
@@ -172,3 +174,54 @@ func SchemeToPort(schema string) int {
}
return 80
}
+
+var (
+ ResolveGranularity = struct {
+ Endpoint string
+ Service string
+ }{
+ Endpoint: "endpoint",
+ Service: "service",
+ }
+)
+
+// ComposeUpstreamName uses namespace, name, subset (optional), port, resolveGranularity info to compose
+// the upstream name.
+// the resolveGranularity is not composited in the upstream name when it is endpoint.
+// ref: https://github.com/apache/apisix-ingress-controller/blob/10059afe3e84b693cc61e6df7a0040890a9d16eb/pkg/types/apisix/v1/types.go#L595-L598
+func ComposeUpstreamName(namespace, name, subset string, port int32, resolveGranularity string) string {
+ pstr := strconv.Itoa(int(port))
+ // FIXME Use sync.Pool to reuse this buffer if the upstream
+ // name composing code path is hot.
+ var p []byte
+ plen := len(namespace) + len(name) + len(pstr) + 2
+ if subset != "" {
+ plen = plen + len(subset) + 1
+ }
+ if resolveGranularity == ResolveGranularity.Service {
+ plen = plen + len(resolveGranularity) + 1
+ }
+
+ p = make([]byte, 0, plen)
+ buf := bytes.NewBuffer(p)
+ buf.WriteString(namespace)
+ buf.WriteByte('_')
+ buf.WriteString(name)
+ buf.WriteByte('_')
+ if subset != "" {
+ buf.WriteString(subset)
+ buf.WriteByte('_')
+ }
+ buf.WriteString(pstr)
+ if resolveGranularity == ResolveGranularity.Service {
+ buf.WriteByte('_')
+ buf.WriteString(resolveGranularity)
+ }
+
+ return buf.String()
+}
+
+// ComposeExternalUpstreamName uses ApisixUpstream namespace, name to compose the upstream name.
+func ComposeExternalUpstreamName(namespace, name string) string {
+ return namespace + "_" + name
+}
diff --git a/internal/adc/translator/apisixroute.go b/internal/adc/translator/apisixroute.go
index f4f78144..1ebc1506 100644
--- a/internal/adc/translator/apisixroute.go
+++ b/internal/adc/translator/apisixroute.go
@@ -226,6 +226,10 @@ func (t *Translator) buildUpstream(tctx *provider.TranslateContext, service *adc
if backend.Weight != nil {
upstream.Labels["meta_weight"] = strconv.FormatInt(int64(*backend.Weight), 10)
}
+
+ upstreamName := apiv2.ComposeUpstreamName(ar.Namespace, backend.ServiceName, backend.Subset, int32(backend.ServicePort.IntValue()), backend.ResolveGranularity)
+ upstream.Name = upstreamName
+ upstream.ID = id.GenID(upstreamName)
upstreams = append(upstreams, upstream)
}
@@ -248,6 +252,9 @@ func (t *Translator) buildUpstream(tctx *provider.TranslateContext, service *adc
upstream.Labels["meta_weight"] = strconv.FormatInt(int64(*upstreamRef.Weight), 10)
}
+ upstreamName := apiv2.ComposeExternalUpstreamName(upsNN.Namespace, upsNN.Name)
+ upstream.Name = upstreamName
+ upstream.ID = id.GenID(upstreamName)
upstreams = append(upstreams, upstream)
}
@@ -259,6 +266,10 @@ func (t *Translator) buildUpstream(tctx *provider.TranslateContext, service *adc
// the first valid upstream is used as service.upstream;
// the others are configured in the traffic-split plugin
service.Upstream = upstreams[0]
+ // remove the id and name of the service.upstream, adc schema does not need id and name for service.upstream
+ service.Upstream.ID = ""
+ service.Upstream.Name = ""
+
upstreams = upstreams[1:]
// Add remaining upstreams to service.Upstreams for independent management