pkg/cni/ipam/delegate.go (46 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. package ipam import ( "errors" "fmt" current "github.com/containernetworking/cni/pkg/types/100" "github.com/containernetworking/plugins/pkg/ipam" ) type IPWrapper struct { pluginType string netConf []byte } type IPProvider interface { WithIP(configFunc func(ipamResult *current.Result) error) (err error) DeleteIP() error } func New(pluginType string, netConf []byte) IPProvider { return &IPWrapper{ pluginType: pluginType, netConf: netConf, } } func (wrapper *IPWrapper) WithIP(configFunc func(ipamResult *current.Result) error) (err error) { r, err := ipam.ExecAdd(wrapper.pluginType, wrapper.netConf) if err != nil { return err } // release IP in case of failure defer func() { if err != nil { recoverErr := wrapper.DeleteIP() if recoverErr != nil { err = fmt.Errorf("error occurred %w and failed to delete ip: %s", err, recoverErr.Error()) } } }() ipamResult, err := current.NewResultFromResult(r) if err != nil { return err } if configFunc == nil { return errors.New("configure function is nil") } return configFunc(ipamResult) } func (wrapper *IPWrapper) DeleteIP() error { return ipam.ExecDel(wrapper.pluginType, wrapper.netConf) }