bridge: release IP in case of error

If there is an error after an IP has been allocated it is necesary
to release it.

Signed-off-by: Mauricio Vasquez B <mauricio.vasquez@polito.it>
This commit is contained in:
Mauricio Vasquez B
2018-03-09 22:29:41 -05:00
parent 4b296ba330
commit 3a7ee332be

View File

@ -19,6 +19,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"net" "net"
"os"
"runtime" "runtime"
"syscall" "syscall"
@ -323,6 +324,8 @@ func enableIPForward(family int) error {
} }
func cmdAdd(args *skel.CmdArgs) error { func cmdAdd(args *skel.CmdArgs) error {
var success bool = false
n, cniVersion, err := loadNetConf(args.StdinData) n, cniVersion, err := loadNetConf(args.StdinData)
if err != nil { if err != nil {
return err return err
@ -358,6 +361,15 @@ func cmdAdd(args *skel.CmdArgs) error {
return err return err
} }
// release IP in case of failure
defer func() {
if !success {
os.Setenv("CNI_COMMAND", "DEL")
ipam.ExecDel(n.IPAM.Type, args.StdinData)
os.Setenv("CNI_COMMAND", "ADD")
}
}()
// Convert whatever the IPAM result was into the current Result type // Convert whatever the IPAM result was into the current Result type
result, err := current.NewResultFromResult(r) result, err := current.NewResultFromResult(r)
if err != nil { if err != nil {
@ -454,6 +466,8 @@ func cmdAdd(args *skel.CmdArgs) error {
result.DNS = n.DNS result.DNS = n.DNS
success = true
return types.PrintResult(result, cniVersion) return types.PrintResult(result, cniVersion)
} }