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
}