Merge pull request #286 from nagiesek/noErrorEndpointNotFound

Windows: No error for no endpoint on DEL. Ipam clean-up on ADD failure
This commit is contained in:
Dan Williams 2019-04-24 10:36:25 -05:00 committed by GitHub
commit 697550083d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 24 deletions

View File

@ -94,7 +94,7 @@ func GenerateHnsEndpoint(epInfo *EndpointInfo, n *NetConf) (*hcsshim.HNSEndpoint
func GenerateHcnEndpoint(epInfo *EndpointInfo, n *NetConf) (*hcn.HostComputeEndpoint, error) { func GenerateHcnEndpoint(epInfo *EndpointInfo, n *NetConf) (*hcn.HostComputeEndpoint, error) {
// run the IPAM plugin and get back the config to apply // run the IPAM plugin and get back the config to apply
hcnEndpoint, err := hcn.GetEndpointByName(epInfo.EndpointName) hcnEndpoint, err := hcn.GetEndpointByName(epInfo.EndpointName)
if err != nil && (err != hcn.EndpointNotFoundError{EndpointName: epInfo.EndpointName}) { if err != nil && !hcn.IsNotFoundError(err) {
return nil, errors.Annotatef(err, "Attempt to get endpoint \"%v\" failed", epInfo.EndpointName) return nil, errors.Annotatef(err, "Attempt to get endpoint \"%v\" failed", epInfo.EndpointName)
} }
@ -172,7 +172,10 @@ func DeprovisionEndpoint(epName string, netns string, containerID string) error
} }
hnsEndpoint, err := hcsshim.GetHNSEndpointByName(epName) hnsEndpoint, err := hcsshim.GetHNSEndpointByName(epName)
if err != nil {
if hcsshim.IsNotExist(err) {
return nil
} else if err != nil {
return errors.Annotatef(err, "failed to find HNSEndpoint %s", epName) return errors.Annotatef(err, "failed to find HNSEndpoint %s", epName)
} }
@ -314,7 +317,9 @@ func ConstructResult(hnsNetwork *hcsshim.HNSNetwork, hnsEndpoint *hcsshim.HNSEnd
// This version follows the v2 workflow of removing the endpoint from the namespace and deleting it // This version follows the v2 workflow of removing the endpoint from the namespace and deleting it
func RemoveHcnEndpoint(epName string) error { func RemoveHcnEndpoint(epName string) error {
hcnEndpoint, err := hcn.GetEndpointByName(epName) hcnEndpoint, err := hcn.GetEndpointByName(epName)
if err != nil { if hcn.IsNotFoundError(err) {
return nil
} else if err != nil {
_ = fmt.Errorf("[win-cni] Failed to find endpoint %v, err:%v", epName, err) _ = fmt.Errorf("[win-cni] Failed to find endpoint %v, err:%v", epName, err)
return err return err
} }

View File

@ -19,6 +19,7 @@ import (
"fmt" "fmt"
"runtime" "runtime"
"strings" "strings"
"os"
"github.com/Microsoft/hcsshim" "github.com/Microsoft/hcsshim"
"github.com/Microsoft/hcsshim/hcn" "github.com/Microsoft/hcsshim/hcn"
@ -92,20 +93,19 @@ func ProcessEndpointArgs(args *skel.CmdArgs, n *NetConf) (*hns.EndpointInfo, err
return epInfo, nil return epInfo, nil
} }
func cmdHnsAdd(args *skel.CmdArgs, n *NetConf, cniVersion *string) error { func cmdHnsAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) {
networkName := n.Name networkName := n.Name
hnsNetwork, err := hcsshim.GetHNSNetworkByName(networkName) hnsNetwork, err := hcsshim.GetHNSNetworkByName(networkName)
if err != nil { if err != nil {
return errors.Annotatef(err, "error while GETHNSNewtorkByName(%s)", networkName) return nil, errors.Annotatef(err, "error while GETHNSNewtorkByName(%s)", networkName)
} }
if hnsNetwork == nil { if hnsNetwork == nil {
return fmt.Errorf("network %v not found", networkName) return nil, fmt.Errorf("network %v not found", networkName)
} }
if !strings.EqualFold(hnsNetwork.Type, "L2Bridge") { if !strings.EqualFold(hnsNetwork.Type, "L2Bridge") {
return fmt.Errorf("network %v is of an unexpected type: %v", networkName, hnsNetwork.Type) return nil, fmt.Errorf("network %v is of an unexpected type: %v", networkName, hnsNetwork.Type)
} }
epName := hns.ConstructEndpointName(args.ContainerID, args.Netns, n.Name) epName := hns.ConstructEndpointName(args.ContainerID, args.Netns, n.Name)
@ -123,31 +123,31 @@ func cmdHnsAdd(args *skel.CmdArgs, n *NetConf, cniVersion *string) error {
return hnsEndpoint, nil return hnsEndpoint, nil
}) })
if err != nil { if err != nil {
return errors.Annotatef(err, "error while ProvisionEndpoint(%v,%v,%v)", epName, hnsNetwork.Id, args.ContainerID) return nil, errors.Annotatef(err, "error while ProvisionEndpoint(%v,%v,%v)", epName, hnsNetwork.Id, args.ContainerID)
} }
result, err := hns.ConstructResult(hnsNetwork, hnsEndpoint) result, err := hns.ConstructResult(hnsNetwork, hnsEndpoint)
if err != nil { if err != nil {
return errors.Annotatef(err, "error while constructResult") return nil, errors.Annotatef(err, "error while constructResult")
} }
return types.PrintResult(result, *cniVersion) return result, nil
} }
func cmdHcnAdd(args *skel.CmdArgs, n *NetConf, cniVersion *string) error { func cmdHcnAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) {
networkName := n.Name networkName := n.Name
hcnNetwork, err := hcn.GetNetworkByName(networkName) hcnNetwork, err := hcn.GetNetworkByName(networkName)
if err != nil { if err != nil {
return errors.Annotatef(err, "error while GetNetworkByName(%s)", networkName) return nil, errors.Annotatef(err, "error while GetNetworkByName(%s)", networkName)
} }
if hcnNetwork == nil { if hcnNetwork == nil {
return fmt.Errorf("network %v not found", networkName) return nil, fmt.Errorf("network %v not found", networkName)
} }
if hcnNetwork.Type != hcn.L2Bridge { if hcnNetwork.Type != hcn.L2Bridge {
return fmt.Errorf("network %v is of unexpected type: %v", networkName, hcnNetwork.Type) return nil, fmt.Errorf("network %v is of unexpected type: %v", networkName, hcnNetwork.Type)
} }
epName := hns.ConstructEndpointName(args.ContainerID, args.Netns, n.Name) epName := hns.ConstructEndpointName(args.ContainerID, args.Netns, n.Name)
@ -166,15 +166,15 @@ func cmdHcnAdd(args *skel.CmdArgs, n *NetConf, cniVersion *string) error {
return hcnEndpoint, nil return hcnEndpoint, nil
}) })
if err != nil { if err != nil {
return errors.Annotatef(err, "error while AddHcnEndpoint(%v,%v,%v)", epName, hcnNetwork.Id, args.Netns) return nil, errors.Annotatef(err, "error while AddHcnEndpoint(%v,%v,%v)", epName, hcnNetwork.Id, args.Netns)
} }
result, err := hns.ConstructHcnResult(hcnNetwork, hcnEndpoint) result, err := hns.ConstructHcnResult(hcnNetwork, hcnEndpoint)
if err != nil { if err != nil {
return errors.Annotatef(err, "error while ConstructHcnResult") return nil, errors.Annotatef(err, "error while ConstructHcnResult")
} }
return types.PrintResult(result, *cniVersion) return result, nil
} }
func cmdAdd(args *skel.CmdArgs) error { func cmdAdd(args *skel.CmdArgs) error {
@ -183,12 +183,24 @@ func cmdAdd(args *skel.CmdArgs) error {
return errors.Annotate(err, "error while loadNetConf") return errors.Annotate(err, "error while loadNetConf")
} }
var result *current.Result
if n.ApiVersion == 2 { if n.ApiVersion == 2 {
err = cmdHcnAdd(args, n, &cniVersion) result, err = cmdHcnAdd(args, n)
} else { } else {
err = cmdHnsAdd(args, n, &cniVersion) result, err = cmdHnsAdd(args, n)
} }
return err
if err != nil {
os.Setenv("CNI_COMMAND", "DEL")
ipam.ExecDel(n.IPAM.Type, args.StdinData)
os.Setenv("CNI_COMMAND", "ADD")
return errors.Annotate(err, "error while executing ADD command")
}
if (result == nil) {
return errors.New("result for ADD not populated correctly")
}
return types.PrintResult(result, cniVersion)
} }
func cmdDel(args *skel.CmdArgs) error { func cmdDel(args *skel.CmdArgs) error {
@ -213,7 +225,7 @@ func cmdDel(args *skel.CmdArgs) error {
func cmdGet(_ *skel.CmdArgs) error { func cmdGet(_ *skel.CmdArgs) error {
// TODO: implement // TODO: implement
return fmt.Errorf("not implemented") return nil
} }
func main() { func main() {

View File

@ -19,6 +19,7 @@ import (
"fmt" "fmt"
"runtime" "runtime"
"strings" "strings"
"os"
"github.com/Microsoft/hcsshim" "github.com/Microsoft/hcsshim"
"github.com/juju/errors" "github.com/juju/errors"
@ -56,6 +57,7 @@ func loadNetConf(bytes []byte) (*NetConf, string, error) {
} }
func cmdAdd(args *skel.CmdArgs) error { func cmdAdd(args *skel.CmdArgs) error {
success := false
n, cniVersion, err := loadNetConf(args.StdinData) n, cniVersion, err := loadNetConf(args.StdinData)
if err != nil { if err != nil {
return errors.Annotate(err, "error while loadNetConf") return errors.Annotate(err, "error while loadNetConf")
@ -131,6 +133,13 @@ func cmdAdd(args *skel.CmdArgs) error {
return hnsEndpoint, nil return hnsEndpoint, nil
}) })
defer func() {
if !success {
os.Setenv("CNI_COMMAND", "DEL")
ipam.ExecDel(n.IPAM.Type, args.StdinData)
os.Setenv("CNI_COMMAND", "ADD")
}
}()
if err != nil { if err != nil {
return errors.Annotatef(err, "error while ProvisionEndpoint(%v,%v,%v)", epName, hnsNetwork.Id, args.ContainerID) return errors.Annotatef(err, "error while ProvisionEndpoint(%v,%v,%v)", epName, hnsNetwork.Id, args.ContainerID)
} }
@ -140,6 +149,7 @@ func cmdAdd(args *skel.CmdArgs) error {
return errors.Annotatef(err, "error while constructResult") return errors.Annotatef(err, "error while constructResult")
} }
success = true
return types.PrintResult(result, cniVersion) return types.PrintResult(result, cniVersion)
} }
@ -160,7 +170,7 @@ func cmdDel(args *skel.CmdArgs) error {
func cmdGet(_ *skel.CmdArgs) error { func cmdGet(_ *skel.CmdArgs) error {
// TODO: implement // TODO: implement
return fmt.Errorf("not implemented") return nil
} }
func main() { func main() {