cni/network/common.go (81 lines of code) (raw):

package network import ( "encoding/json" "io" "os" "reflect" "github.com/Azure/azure-container-networking/cni" "github.com/Azure/azure-container-networking/telemetry" "github.com/containernetworking/cni/pkg/skel" cniTypes "github.com/containernetworking/cni/pkg/types" "github.com/pkg/errors" "go.uber.org/zap" ) // send error report to hostnetagent if CNI encounters any error. func ReportPluginError(reportManager *telemetry.ReportManager, tb *telemetry.TelemetryBuffer, err error) { logger.Error("Report plugin error") reflect.ValueOf(reportManager.Report).Elem().FieldByName("ErrorMessage").SetString(err.Error()) if err := reportManager.SendReport(tb); err != nil { logger.Error("SendReport failed", zap.Error(err)) } } func validateConfig(jsonBytes []byte) error { var conf struct { Name string `json:"name"` } if err := json.Unmarshal(jsonBytes, &conf); err != nil { return errors.Wrapf(err, "error reading network config") } if conf.Name == "" { return errors.New("missing network name") } return nil } func getCmdArgsFromEnv() (string, *skel.CmdArgs, error) { logger.Info("Going to read from stdin") stdinData, err := io.ReadAll(os.Stdin) if err != nil { return "", nil, errors.Wrapf(err, "error reading from stdin") } cmdArgs := &skel.CmdArgs{ ContainerID: os.Getenv("CNI_CONTAINERID"), Netns: os.Getenv("CNI_NETNS"), IfName: os.Getenv("CNI_IFNAME"), Args: os.Getenv("CNI_ARGS"), Path: os.Getenv("CNI_PATH"), StdinData: stdinData, } cmd := os.Getenv("CNI_COMMAND") return cmd, cmdArgs, nil } func HandleIfCniUpdate(update func(*skel.CmdArgs) error) (bool, error) { isupdate := true if os.Getenv("CNI_COMMAND") != cni.CmdUpdate { return false, nil } logger.Info("CNI UPDATE received") _, cmdArgs, err := getCmdArgsFromEnv() if err != nil { logger.Error("Received error while retrieving cmds from environment", zap.Error(err)) return isupdate, err } logger.Info("Retrieved command args for update", zap.Any("args", cmdArgs)) err = validateConfig(cmdArgs.StdinData) if err != nil { logger.Error("Failed to handle CNI UPDATE", zap.Error(err)) return isupdate, err } err = update(cmdArgs) if err != nil { logger.Error("Failed to handle CNI UPDATE", zap.Error(err)) return isupdate, err } return isupdate, nil } func PrintCNIError(msg string) { logger.Error(msg) cniErr := &cniTypes.Error{ Code: cniTypes.ErrTryAgainLater, Msg: msg, } cniErr.Print() }