From 89c64fdb9ad0166c39a77b0f9fcc6f4d5fdc10ce Mon Sep 17 00:00:00 2001 From: dougbtv Date: Tue, 20 Feb 2024 13:58:51 -0500 Subject: [PATCH] Skips checking for readiness on CNI DEL (and instead warns) Because deletes should favor a successful path, the readiness check should be skipped for pod removals. This can cause an issue where there's pods pending deletes and that might impact scheduling of a pod that may be necessary in order to set the readiness indicator. Adds a new method to check for readiness indicator alone in order to immediately log a warning. --- pkg/multus/multus.go | 9 +++++++-- pkg/types/conf.go | 27 ++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/pkg/multus/multus.go b/pkg/multus/multus.go index e9ecc1ed1..49d55e271 100644 --- a/pkg/multus/multus.go +++ b/pkg/multus/multus.go @@ -815,8 +815,13 @@ func CmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) er } if in.ReadinessIndicatorFile != "" { - if err := types.GetReadinessIndicatorFile(in.ReadinessIndicatorFile); err != nil { - return cmdErr(k8sArgs, "PollImmediate error waiting for ReadinessIndicatorFile (on del): %v", err) + readinessfileexists, err := types.ReadinessIndicatorExistsNow(in.ReadinessIndicatorFile) + if err != nil { + return cmdErr(k8sArgs, "error checking readinessindicatorfile on CNI DEL @ %v: %v", in.ReadinessIndicatorFile, err) + } else { + if !readinessfileexists { + logging.Verbosef("warning: readinessindicatorfile @ %v does not exist on CNI DEL", in.ReadinessIndicatorFile) + } } } diff --git a/pkg/types/conf.go b/pkg/types/conf.go index 4402b4ec7..e85a4a96d 100644 --- a/pkg/types/conf.go +++ b/pkg/types/conf.go @@ -20,17 +20,17 @@ import ( "fmt" "net" "os" + "path/filepath" "strings" "time" - utilwait "k8s.io/apimachinery/pkg/util/wait" - "github.com/containernetworking/cni/libcni" "github.com/containernetworking/cni/pkg/skel" cni100 "github.com/containernetworking/cni/pkg/types/100" "github.com/containernetworking/cni/pkg/version" nadutils "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/utils" "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/logging" + utilwait "k8s.io/apimachinery/pkg/util/wait" ) const ( @@ -610,7 +610,12 @@ func CheckSystemNamespaces(namespace string, systemNamespaces []string) bool { } // GetReadinessIndicatorFile waits for readinessIndicatorFile -func GetReadinessIndicatorFile(readinessIndicatorFile string) error { +func GetReadinessIndicatorFile(readinessIndicatorFileRaw string) error { + readinessIndicatorFile, err := filepath.Abs(readinessIndicatorFileRaw) + if err != nil { + return fmt.Errorf("failed to get absolute path of readinessIndicatorFile: %v", err) + } + pollDuration := 1000 * time.Millisecond pollTimeout := 45 * time.Second return utilwait.PollImmediate(pollDuration, pollTimeout, func() (bool, error) { @@ -618,3 +623,19 @@ func GetReadinessIndicatorFile(readinessIndicatorFile string) error { return err == nil, nil }) } + +func ReadinessIndicatorExistsNow(readinessIndicatorFileRaw string) (bool, error) { + readinessIndicatorFile, err := filepath.Abs(readinessIndicatorFileRaw) + if err != nil { + return false, fmt.Errorf("failed to get absolute path of readinessIndicatorFile: %v", err) + } + + _, err = os.Stat(readinessIndicatorFile) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + return true, nil +}