in pkg/providers/apisix/apisix_cluster_config.go [86:213]
func (c *apisixClusterConfigController) sync(ctx context.Context, ev *types.Event) error {
event := ev.Object.(kube.ApisixClusterConfigEvent)
key := event.Key
_, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
log.Errorf("found ApisixClusterConfig resource with invalid meta key %s: %s", key, err)
return err
}
var multiVersioned kube.ApisixClusterConfig
switch event.GroupVersion {
case config.ApisixV2:
multiVersioned, err = c.ApisixClusterConfigLister.V2(name)
default:
return fmt.Errorf("unsupported ApisixClusterConfig group version %s", event.GroupVersion)
}
if err != nil {
if !k8serrors.IsNotFound(err) {
log.Errorw("failed to get ApisixClusterConfig",
zap.Error(err),
zap.String("key", key),
zap.String("version", event.GroupVersion),
)
return err
}
if ev.Type == types.EventSync {
// ignore not found error in delay sync
return nil
}
if ev.Type != types.EventDelete {
log.Warnw("ApisixClusterConfig was deleted before it can be delivered",
zap.String("key", key),
zap.String("version", event.GroupVersion),
)
return nil
}
}
if ev.Type == types.EventDelete {
if multiVersioned != nil {
// We still find the resource while we are processing the DELETE event,
// that means object with same namespace and name was created, discarding
// this stale DELETE event.
log.Warnf("discard the stale ApisixClusterConfig delete event since the %s exists", key)
return nil
}
multiVersioned = ev.Tombstone.(kube.ApisixClusterConfig)
}
switch event.GroupVersion {
case config.ApisixV2:
acc := multiVersioned.V2()
// Currently we don't handle multiple cluster, so only process
// the default apisix cluster.
if acc.Name != c.Config.APISIX.DefaultClusterName {
log.Infow("ignore non-default apisix cluster config",
zap.String("default_cluster_name", c.Config.APISIX.DefaultClusterName),
zap.Any("ApisixClusterConfig", acc),
)
return nil
}
// Cluster delete is dangerous.
// TODO handle delete?
if ev.Type == types.EventDelete {
log.Error("ApisixClusterConfig delete event for default apisix cluster will be ignored")
return nil
}
if acc.Spec.Admin != nil {
clusterOpts := &apisix.ClusterOptions{
Name: acc.Name,
BaseURL: acc.Spec.Admin.BaseURL,
AdminKey: acc.Spec.Admin.AdminKey,
}
log.Infow("updating cluster",
zap.Any("opts", clusterOpts),
)
// TODO we may first call AddCluster.
// Since now we already have the default cluster, we just call UpdateCluster.
if err := c.APISIX.UpdateCluster(ctx, clusterOpts); err != nil {
log.Errorw("failed to update cluster",
zap.String("cluster_name", acc.Name),
zap.Error(err),
zap.Any("opts", clusterOpts),
)
c.RecordEvent(acc, corev1.EventTypeWarning, utils.ResourceSyncAborted, err)
c.recordStatus(acc, utils.ResourceSyncAborted, err, metav1.ConditionFalse, acc.GetGeneration())
return err
}
}
globalRule, err := c.translator.TranslateClusterConfigV2(acc)
if err != nil {
log.Errorw("failed to translate ApisixClusterConfig",
zap.Error(err),
zap.String("key", key),
zap.Any("object", acc),
)
c.RecordEvent(acc, corev1.EventTypeWarning, utils.ResourceSyncAborted, err)
c.recordStatus(acc, utils.ResourceSyncAborted, err, metav1.ConditionFalse, acc.GetGeneration())
return err
}
log.Debugw("translated global_rule",
zap.Any("object", globalRule),
)
// TODO multiple cluster support
if ev.Type.IsAddEvent() {
_, err = c.APISIX.Cluster(acc.Name).GlobalRule().Create(ctx, globalRule, ev.Type.IsSyncEvent())
} else {
_, err = c.APISIX.Cluster(acc.Name).GlobalRule().Update(ctx, globalRule, false)
}
if err != nil {
log.Errorw("failed to reflect global_rule changes to apisix cluster",
zap.Any("global_rule", globalRule),
zap.Any("cluster", acc.Name),
)
c.RecordEvent(acc, corev1.EventTypeWarning, utils.ResourceSyncAborted, err)
c.recordStatus(acc, utils.ResourceSyncAborted, err, metav1.ConditionFalse, acc.GetGeneration())
return err
}
c.RecordEvent(acc, corev1.EventTypeNormal, utils.ResourceSynced, nil)
c.recordStatus(acc, utils.ResourceSynced, nil, metav1.ConditionTrue, acc.GetGeneration())
return nil
default:
return fmt.Errorf("unsupported ApisixClusterConfig group version %s", event.GroupVersion)
}
}