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:
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user