From 3a7ee332be6a470720a20d596d1989f22091e04a Mon Sep 17 00:00:00 2001 From: Mauricio Vasquez B Date: Fri, 9 Mar 2018 22:29:41 -0500 Subject: [PATCH] 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 --- plugins/main/bridge/bridge.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plugins/main/bridge/bridge.go b/plugins/main/bridge/bridge.go index e6b0f118..7941bfad 100644 --- a/plugins/main/bridge/bridge.go +++ b/plugins/main/bridge/bridge.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "net" + "os" "runtime" "syscall" @@ -323,6 +324,8 @@ func enableIPForward(family int) error { } func cmdAdd(args *skel.CmdArgs) error { + var success bool = false + n, cniVersion, err := loadNetConf(args.StdinData) if err != nil { return err @@ -358,6 +361,15 @@ func cmdAdd(args *skel.CmdArgs) error { 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 result, err := current.NewResultFromResult(r) if err != nil { @@ -454,6 +466,8 @@ func cmdAdd(args *skel.CmdArgs) error { result.DNS = n.DNS + success = true + return types.PrintResult(result, cniVersion) }