func()

in pkg/providers/apisix/apisix_upstream.go [429:491]


func (c *apisixUpstreamController) syncRelationship(ev *types.Event, auKey string, au kube.ApisixUpstream) {
	obj := ev.Object.(kube.ApisixUpstreamEvent)

	if obj.GroupVersion != config.ApisixV2 {
		return
	}

	var (
		old    *configv2.ApisixUpstream
		newObj *configv2.ApisixUpstream
	)

	if ev.Type == types.EventUpdate {
		old = obj.OldObject.V2()
	} else if ev.Type == types.EventDelete {
		old = ev.Tombstone.(kube.ApisixUpstream).V2()
	}

	if ev.Type != types.EventDelete {
		newObj = au.V2()
	}

	var (
		//oldExternalDomains  []string
		//newExternalDomains  []string
		oldExternalServices []string
		newExternalServices []string
	)
	if old != nil && old.Spec != nil {
		for _, node := range old.Spec.ExternalNodes {
			if node.Type == configv2.ExternalTypeDomain {
				//oldExternalDomains = append(oldExternalDomains, node.Name)
			} else if node.Type == configv2.ExternalTypeService {
				oldExternalServices = append(oldExternalServices, old.Namespace+"/"+node.Name)
			}
		}
	}
	if newObj != nil && newObj.Spec != nil {
		for _, node := range newObj.Spec.ExternalNodes {
			if node.Type == configv2.ExternalTypeDomain {
				//newExternalDomains = append(newExternalDomains, node.Name)
			} else if node.Type == configv2.ExternalTypeService {
				newExternalServices = append(newExternalServices, newObj.Namespace+"/"+node.Name)
			}
		}
	}

	c.externalSvcLock.Lock()
	defer c.externalSvcLock.Unlock()

	toDelete := utils.Difference(oldExternalServices, newExternalServices)
	toAdd := utils.Difference(newExternalServices, oldExternalServices)
	for _, svc := range toDelete {
		delete(c.externalServiceMap[svc], auKey)
	}

	for _, svc := range toAdd {
		if _, ok := c.externalServiceMap[svc]; !ok {
			c.externalServiceMap[svc] = make(map[string]struct{})
		}
		c.externalServiceMap[svc][auKey] = struct{}{}
	}
}