func()

in pkg/cni/conf/confmanager.go [251:300]


func (mgr *Manager) managePluginFromConfList(file string) (map[string]interface{}, error) {
	bytes, err := os.ReadFile(file)
	if err != nil {
		return nil, fmt.Errorf("failed to read cni config file %s: %w", file, err)
	}
	rawList := make(map[string]interface{})
	if err = json.Unmarshal(bytes, &rawList); err != nil {
		return nil, fmt.Errorf("failed to unmarshal cni config from file %s: %w", file, err)
	}
	var plugins []interface{}
	plug, ok := rawList["plugins"]
	if !ok {
		return nil, fmt.Errorf("failed to find plugins in cni config file %s", file)
	}
	plugins, ok = plug.([]interface{})
	if !ok {
		return nil, fmt.Errorf("plugins field is not an array in %s", file)
	}
	if len(plugins) == 0 {
		return nil, fmt.Errorf("empty plugin list in cni config file %s", file)
	}

	// remove the plugin if it already exists
	for i, plugin := range plugins {
		p, ok := plugin.(map[string]interface{})
		if !ok {
			return nil, fmt.Errorf("failed to parse plugin conf in file %s", file)
		}
		cniType, ok := p["type"]
		if !ok {
			return nil, fmt.Errorf("failed to find type in plugin conf in file %s", file)
		}
		cniTypeStr, ok := cniType.(string)
		if ok && strings.EqualFold(cniTypeStr, consts.KubeEgressCNIName) {
			plugins = append(plugins[:i], plugins[i+1:]...)
			break
		}
	}

	// insert kube-egress-gateway-cni at plugins[1]
	plugins = append(plugins[:1], append([]interface{}{map[string]interface{}{
		"type":          consts.KubeEgressCNIName,
		"ipam":          map[string]interface{}{"type": consts.KubeEgressIPAMCNIName},
		"excludedCIDRs": mgr.exceptionCidrs,
		"socketPath":    fmt.Sprintf("localhost:%d", mgr.grpcPort),
	}}, plugins[1:]...)...)

	rawList["plugins"] = plugins
	return rawList, nil
}