Skip to content

Commit 41df985

Browse files
authored
fix: modify upstream name generation method (#273)
Signed-off-by: Ashing Zheng <[email protected]>
1 parent 2fa20fe commit 41df985

File tree

4 files changed

+118
-34
lines changed

4 files changed

+118
-34
lines changed

api/adc/types.go

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -819,38 +819,23 @@ var (
819819
}
820820
)
821821

822-
// ComposeUpstreamName uses namespace, name, subset (optional), port, resolveGranularity info to compose
822+
// ComposeUpstreamName uses namespace, name, ruleIndex, backendIndex, serviceName info to compose
823823
// the upstream name.
824824
// the resolveGranularity is not composited in the upstream name when it is endpoint.
825825
// ref: https://github.com/apache/apisix-ingress-controller/blob/10059afe3e84b693cc61e6df7a0040890a9d16eb/pkg/types/apisix/v1/types.go#L595-L598
826-
func ComposeUpstreamName(namespace, name, subset string, port int32, resolveGranularity string) string {
827-
pstr := strconv.Itoa(int(port))
828-
// FIXME Use sync.Pool to reuse this buffer if the upstream
829-
// name composing code path is hot.
826+
func ComposeUpstreamName(namespace, name, ruleIndex, backendIndex string) string {
830827
var p []byte
831-
plen := len(namespace) + len(name) + len(pstr) + 2
832-
if subset != "" {
833-
plen = plen + len(subset) + 1
834-
}
835-
if resolveGranularity == ResolveGranularity.Service {
836-
plen = plen + len(resolveGranularity) + 1
837-
}
828+
plen := len(namespace) + len(name) + len(ruleIndex) + len(backendIndex) + 3
838829

839830
p = make([]byte, 0, plen)
840831
buf := bytes.NewBuffer(p)
841832
buf.WriteString(namespace)
842833
buf.WriteByte('_')
843834
buf.WriteString(name)
844835
buf.WriteByte('_')
845-
if subset != "" {
846-
buf.WriteString(subset)
847-
buf.WriteByte('_')
848-
}
849-
buf.WriteString(pstr)
850-
if resolveGranularity == ResolveGranularity.Service {
851-
buf.WriteByte('_')
852-
buf.WriteString(resolveGranularity)
853-
}
836+
buf.WriteString(ruleIndex)
837+
buf.WriteByte('_')
838+
buf.WriteString(backendIndex)
854839

855840
return buf.String()
856841
}

internal/adc/translator/apisixroute.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (t *Translator) translateHTTPRule(tctx *provider.TranslateContext, ar *apiv
7373

7474
service := t.buildService(ar, rule, ruleIndex)
7575
t.buildRoute(ar, service, rule, plugins, timeout, vars)
76-
t.buildUpstream(tctx, service, ar, rule)
76+
t.buildUpstream(tctx, service, ar, rule, ruleIndex)
7777

7878
return service, nil
7979
}
@@ -203,13 +203,13 @@ func (t *Translator) buildRoute(ar *apiv2.ApisixRoute, service *adc.Service, rul
203203
service.Routes = []*adc.Route{route}
204204
}
205205

206-
func (t *Translator) buildUpstream(tctx *provider.TranslateContext, service *adc.Service, ar *apiv2.ApisixRoute, rule apiv2.ApisixRouteHTTP) {
206+
func (t *Translator) buildUpstream(tctx *provider.TranslateContext, service *adc.Service, ar *apiv2.ApisixRoute, rule apiv2.ApisixRouteHTTP, ruleIndex int) {
207207
var (
208208
upstreams = make([]*adc.Upstream, 0)
209209
weightedUpstreams = make([]adc.TrafficSplitConfigRuleWeightedUpstream, 0)
210210
)
211211

212-
for _, backend := range rule.Backends {
212+
for backendIndex, backend := range rule.Backends {
213213
var backendErr error
214214
upstream := adc.NewDefaultUpstream()
215215
// try to get the apisixupstream with the same name as the backend service to be upstream config.
@@ -236,7 +236,7 @@ func (t *Translator) buildUpstream(tctx *provider.TranslateContext, service *adc
236236
upstream.Labels["meta_weight"] = strconv.FormatInt(int64(*backend.Weight), 10)
237237
}
238238

239-
upstreamName := adc.ComposeUpstreamName(ar.Namespace, backend.ServiceName, backend.Subset, int32(backend.ServicePort.IntValue()), backend.ResolveGranularity)
239+
upstreamName := adc.ComposeUpstreamName(ar.Namespace, ar.Name, fmt.Sprintf("%d", ruleIndex), fmt.Sprintf("%d", backendIndex))
240240
upstream.Name = upstreamName
241241
upstream.ID = id.GenID(upstreamName)
242242
upstreams = append(upstreams, upstream)

test/e2e/crds/v2/route.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2128,4 +2128,75 @@ spec:
21282128
})
21292129
})
21302130
})
2131+
2132+
Context("Test ApisixRoute with multiple backends", func() {
2133+
It("create ApisixRoute with multiple backends", func() {
2134+
var httpService = `
2135+
apiVersion: v1
2136+
kind: Service
2137+
metadata:
2138+
name: httpbin-service-e2e-test2
2139+
spec:
2140+
selector:
2141+
app: httpbin-deployment-e2e-test
2142+
ports:
2143+
- name: http
2144+
port: 80
2145+
protocol: TCP
2146+
targetPort: 80
2147+
type: ClusterIP
2148+
`
2149+
err := s.CreateResourceFromString(httpService)
2150+
Expect(err).ShouldNot(HaveOccurred())
2151+
s.EnsureNumEndpointsReady(GinkgoT(), "httpbin-service-e2e-test2", 1)
2152+
2153+
const apisixRouteSpec = `
2154+
apiVersion: apisix.apache.org/v2
2155+
kind: ApisixRoute
2156+
metadata:
2157+
name: httpbin
2158+
spec:
2159+
ingressClassName: %s
2160+
http:
2161+
- name: get
2162+
match:
2163+
paths:
2164+
- /get
2165+
backends:
2166+
- serviceName: httpbin-service-e2e-test
2167+
servicePort: 80
2168+
- serviceName: httpbin-service-e2e-test2
2169+
servicePort: 80
2170+
- name: ip
2171+
match:
2172+
paths:
2173+
- /ip
2174+
backends:
2175+
- serviceName: httpbin-service-e2e-test
2176+
servicePort: 80
2177+
- serviceName: httpbin-service-e2e-test2
2178+
servicePort: 80
2179+
`
2180+
By("apply ApisixRoute")
2181+
applier.MustApplyAPIv2(types.NamespacedName{Namespace: s.Namespace(), Name: "httpbin"},
2182+
&apiv2.ApisixRoute{}, fmt.Sprintf(apisixRouteSpec, s.Namespace()))
2183+
2184+
By("check upstreams")
2185+
upstreams, err := s.DefaultDataplaneResource().Upstream().List(context.Background())
2186+
Expect(err).ShouldNot(HaveOccurred())
2187+
Expect(upstreams).Should(HaveLen(4))
2188+
2189+
By("verify ApisixRoute works")
2190+
s.RequestAssert(&scaffold.RequestAssert{
2191+
Method: "GET",
2192+
Path: "/get",
2193+
Check: scaffold.WithExpectedStatus(http.StatusOK),
2194+
})
2195+
s.RequestAssert(&scaffold.RequestAssert{
2196+
Method: "GET",
2197+
Path: "/ip",
2198+
Check: scaffold.WithExpectedStatus(http.StatusOK),
2199+
})
2200+
})
2201+
})
21312202
})

test/e2e/scaffold/adc.go

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ func init() {
5656
// DataplaneResource defines the interface for accessing dataplane resources
5757
type DataplaneResource interface {
5858
Route() RouteResource
59+
Upstream() UpstreamResource
5960
Service() ServiceResource
6061
SSL() SSLResource
6162
Consumer() ConsumerResource
@@ -76,6 +77,11 @@ type SSLResource interface {
7677
List(ctx context.Context) ([]*adctypes.SSL, error)
7778
}
7879

80+
// UpstreamResource defines the interface for upstream resources
81+
type UpstreamResource interface {
82+
List(ctx context.Context) ([]*adctypes.Upstream, error)
83+
}
84+
7985
// ConsumerResource defines the interface for consumer resources
8086
type ConsumerResource interface {
8187
List(ctx context.Context) ([]*adctypes.Consumer, error)
@@ -117,8 +123,11 @@ func (a *adcDataplaneResource) Consumer() ConsumerResource {
117123
return &adcConsumerResource{a}
118124
}
119125

126+
func (a *adcDataplaneResource) Upstream() UpstreamResource {
127+
return &adcUpstreamResource{a}
128+
}
129+
120130
func init() {
121-
// dashboard sdk log
122131
l, err := log.NewLogger(
123132
log.WithOutputFile("stderr"),
124133
log.WithLogLevel("debug"),
@@ -192,14 +201,7 @@ func (a *adcDataplaneResource) dumpResources(ctx context.Context) (*translator.T
192201
return nil, err
193202
}
194203

195-
// Extract routes from services
196-
var routes []*adctypes.Route
197-
for _, service := range resources.Services {
198-
routes = append(routes, service.Routes...)
199-
}
200-
201204
result := &translator.TranslateResult{
202-
Routes: routes,
203205
Services: resources.Services,
204206
SSL: resources.SSLs,
205207
GlobalRules: resources.GlobalRules,
@@ -220,7 +222,11 @@ func (r *adcRouteResource) List(ctx context.Context) ([]*adctypes.Route, error)
220222
if err != nil {
221223
return nil, err
222224
}
223-
return result.Routes, nil
225+
var routes []*adctypes.Route
226+
for _, service := range result.Services {
227+
routes = append(routes, service.Routes...)
228+
}
229+
return routes, nil
224230
}
225231

226232
// adcServiceResource implements ServiceResource
@@ -261,3 +267,25 @@ func (c *adcConsumerResource) List(ctx context.Context) ([]*adctypes.Consumer, e
261267
}
262268
return result.Consumers, nil
263269
}
270+
271+
type adcUpstreamResource struct {
272+
*adcDataplaneResource
273+
}
274+
275+
func (r *adcUpstreamResource) List(ctx context.Context) ([]*adctypes.Upstream, error) {
276+
result, err := r.dumpResources(ctx)
277+
if err != nil {
278+
return nil, err
279+
}
280+
upstreams := make([]*adctypes.Upstream, 0, len(result.Services))
281+
for _, svc := range result.Services {
282+
if svc.Upstream != nil {
283+
upstreams = append(upstreams, svc.Upstream)
284+
}
285+
if svc.Upstreams != nil {
286+
upstreams = append(upstreams, svc.Upstreams...)
287+
}
288+
}
289+
290+
return upstreams, nil
291+
}

0 commit comments

Comments
 (0)