@@ -32,6 +32,7 @@ import (
3232 "k8s.io/client-go/tools/cache"
3333 "k8s.io/client-go/util/workqueue"
3434
35+ "github.com/apache/apisix-ingress-controller/pkg/apisix"
3536 "github.com/apache/apisix-ingress-controller/pkg/config"
3637 "github.com/apache/apisix-ingress-controller/pkg/kube"
3738 configv2 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2"
@@ -215,12 +216,15 @@ func (c *apisixUpstreamController) sync(ctx context.Context, ev *types.Event) er
215216 // for service discovery related configuration
216217 if au .Spec .Discovery .ServiceName == "" || au .Spec .Discovery .Type == "" {
217218 log .Error ("If you setup Discovery for ApisixUpstream, you need to specify the ServiceName and Type fields." )
218- errRecord = fmt .Errorf ("No ServiceName or Type fields found" )
219+ errRecord = fmt .Errorf ("no ServiceName or Type fields found" )
219220 goto updateStatus
220221 }
221222 // updateUpstream for real
222223 upsName := apisixv1 .ComposeExternalUpstreamName (au .Namespace , au .Name )
223224 errRecord = c .updateUpstream (ctx , upsName , & au .Spec .ApisixUpstreamConfig , ev .Type .IsSyncEvent ())
225+ if err == apisix .ErrNotFound {
226+ errRecord = fmt .Errorf ("%s" , "upstream doesn't exist. It will be created after ApisixRoute is created referencing it." )
227+ }
224228 goto updateStatus
225229 }
226230
@@ -254,15 +258,22 @@ func (c *apisixUpstreamController) sync(ctx context.Context, ev *types.Event) er
254258 cfg = au .Spec .ApisixUpstreamConfig
255259 }
256260 }
257-
258261 err := c .updateUpstream (ctx , apisixv1 .ComposeUpstreamName (namespace , name , subset .Name , port .Port , types .ResolveGranularity .Endpoint ), & cfg , ev .Type .IsSyncEvent ())
259262 if err != nil {
260- errRecord = err
263+ if err == apisix .ErrNotFound {
264+ errRecord = fmt .Errorf ("%s" , "upstream doesn't exist. It will be created after ApisixRoute is created referencing it." )
265+ } else {
266+ errRecord = err
267+ }
261268 goto updateStatus
262269 }
263270 err = c .updateUpstream (ctx , apisixv1 .ComposeUpstreamName (namespace , name , subset .Name , port .Port , types .ResolveGranularity .Service ), & cfg , ev .Type .IsSyncEvent ())
264271 if err != nil {
265- errRecord = err
272+ if err == apisix .ErrNotFound {
273+ errRecord = fmt .Errorf ("%s" , "upstream doesn't exist. It will be created after ApisixRoute is created referencing it." )
274+ } else {
275+ errRecord = err
276+ }
266277 goto updateStatus
267278 }
268279 }
@@ -330,8 +341,7 @@ func (c *apisixUpstreamController) updateUpstream(ctx context.Context, upsName s
330341
331342 ups , err := c .APISIX .Cluster (clusterName ).Upstream ().Get (ctx , upsName )
332343 if err != nil {
333- log .Errorf ("failed to get upstream %s: %s" , upsName , err )
334- return err
344+ return apisix .ErrNotFound
335345 }
336346 var newUps * apisixv1.Upstream
337347 if cfg != nil {
@@ -373,9 +383,19 @@ func (c *apisixUpstreamController) updateExternalNodes(ctx context.Context, au *
373383 upsName := apisixv1 .ComposeExternalUpstreamName (ns , name )
374384 ups , err := c .APISIX .Cluster (clusterName ).Upstream ().Get (ctx , upsName )
375385 if err != nil {
376- log .Errorf ("failed to get upstream %s: %s" , upsName , err )
377- c .RecordEvent (au , corev1 .EventTypeWarning , utils .ResourceSyncAborted , err )
378- c .recordStatus (au , utils .ResourceSyncAborted , err , metav1 .ConditionFalse , au .GetGeneration ())
386+ if err == apisix .ErrNotFound {
387+ log .Debugw ("upstream is not referenced" ,
388+ zap .String ("cluster" , clusterName ),
389+ zap .String ("upstream" , upsName ),
390+ )
391+ err = fmt .Errorf ("%s" , "upstream doesn't exist. It will be created after ApisixRoute is created referencing it." )
392+ c .RecordEvent (au , corev1 .EventTypeWarning , utils .ResourceSyncAborted , err )
393+ c .recordStatus (au , utils .ResourceSyncAborted , err , metav1 .ConditionFalse , au .GetGeneration ())
394+ } else {
395+ c .RecordEvent (au , corev1 .EventTypeWarning , utils .ResourceSyncAborted , err )
396+ c .recordStatus (au , utils .ResourceSyncAborted , err , metav1 .ConditionFalse , au .GetGeneration ())
397+ log .Errorf ("failed to get upstream %s: %s" , upsName , err )
398+ }
379399 return err
380400 } else if ups != nil {
381401 nodes , err := c .translator .TranslateApisixUpstreamExternalNodes (au )
0 commit comments