func()

in pkg/providers/k8s/configmap/configmap.go [107:196]


func (c *configmapController) sync(ctx context.Context, ev *types.Event) error {
	key := ev.Object.(string)
	log.Debugw("configmap sync event arrived",
		zap.String("event_type", ev.Type.String()),
		zap.Any("key", ev.Object),
	)

	namespace, name, err := cache.SplitMetaNamespaceKey(key)
	if err != nil {
		log.Errorf("invalid resource key: %s", key)
		return err
	}
	cm, err := c.ConfigMapLister.ConfigMaps(namespace).Get(name)
	if err != nil {
		if !k8serrors.IsNotFound(err) {
			log.Errorw("sync failed, unable to get ConfigMap",
				zap.String("key", key),
				zap.Error(err),
			)
			return err
		}
		if ev.Type != types.EventDelete {
			log.Warnw("configmap was deleted before it can be delivered",
				zap.String("key", key),
			)
			return nil
		}
		cm = ev.Tombstone.(*corev1.ConfigMap)
	}

	var (
		configmap    *translation.ConfigMap
		oldConfigmap *translation.ConfigMap
	)

	configmap, err = translation.TranslateConfigMap(cm)
	if err != nil {
		return err
	}
	if ev.Type == types.EventUpdate {
		oldConfigmap, _ = translation.TranslateConfigMap(ev.OldObject.(*corev1.ConfigMap))
	}

	for clusterName, pluginMetadatas := range configmap.ConfigYaml.Data {
		m := &utils.Manifest{
			PluginMetadatas: pluginMetadatas,
		}

		var (
			added   *utils.Manifest
			updated *utils.Manifest
			deleted *utils.Manifest
		)

		if ev.Type == types.EventDelete {
			deleted = m
		} else if ev.Type == types.EventAdd {
			added = m
		} else {
			if oldConfigmap != nil {
				oldPluginMetadatas := oldConfigmap.ConfigYaml.Data[clusterName]
				om := &utils.Manifest{
					PluginMetadatas: oldPluginMetadatas,
				}
				added, updated, deleted = m.Diff(om)
			}
		}
		if err := c.SyncClusterManifests(ctx, clusterName, added, updated, deleted, false); err != nil {
			log.Errorw("sync cluster failed", zap.Error(err))
			return err
		}
	}
	if ev.Type == types.EventUpdate && oldConfigmap != nil {
		if oldConfigmap == nil {
			return nil
		}
		for clusterName, pluginMetadatas := range oldConfigmap.ConfigYaml.Data {
			if _, ok := configmap.ConfigYaml.Data[clusterName]; !ok {

				deleted := &utils.Manifest{
					PluginMetadatas: pluginMetadatas,
				}
				if err := c.SyncClusterManifests(ctx, clusterName, nil, nil, deleted, false); err != nil {
					log.Errorw("sync cluster failed", zap.Error(err))
				}
			}
		}
	}
	return nil
}