{"record":{"id":"e2aa622f0c84b085","repo":"hashicorp/nomad","slug":"failed-to-load-cni-config-file-s-v-e2aa62","errorCode":null,"errorMessage":"failed to load CNI config file %s: %v","messagePattern":"failed to load CNI config file (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"client/fingerprint/cni.go","lineNumber":55,"sourceCode":"\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to detect CNI conf files: %v\", err)\n\t}\n\n\tfor _, confFile := range files {\n\t\tif strings.HasSuffix(confFile, \".conflist\") {\n\t\t\tconfList, err := libcni.ConfListFromFile(confFile)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to load CNI config list file %s: %v\", confFile, err)\n\t\t\t}\n\t\t\tif _, ok := networks[confList.Name]; ok {\n\t\t\t\tf.logger.Warn(\"duplicate CNI config names found, ignoring file\", \"name\", confList.Name, \"file\", confFile)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tnetworks[confList.Name] = struct{}{}\n\t\t} else {\n\t\t\tconf, err := libcni.ConfFromFile(confFile)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to load CNI config file %s: %v\", confFile, err)\n\t\t\t}\n\t\t\tif _, ok := networks[conf.Network.Name]; ok {\n\t\t\t\tf.logger.Warn(\"duplicate CNI config names found, ignoring file\", \"name\", conf.Network.Name, \"file\", confFile)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tnetworks[conf.Network.Name] = struct{}{}\n\t\t}\n\t}\n\n\tvar nodeNetworks structs.Networks\n\tvar newNodeNetworks []*structs.NodeNetworkResource\n\n\tfor name := range networks {\n\t\tmode := fmt.Sprintf(\"cni/%s\", name)\n\t\tnodeNetworks = append(nodeNetworks, &structs.NetworkResource{\n\t\t\tMode: mode,\n\t\t})\n\t\tnewNodeNetworks = append(newNodeNetworks, &structs.NodeNetworkResource{","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/client/fingerprint/cni.go#L37-L73","documentation":"Same CNI fingerprinter, but for single-network config files (e.g. .conf or .json without the .conflist suffix). libcni.ConfFromFile parses the file into a single CNI config; a read error or invalid single-config JSON aborts the fingerprint with this wrapped error.","triggerScenarios":"A non-.conflist file in the CNI conf dir is unreadable, malformed JSON, lacks required fields (name, cniVersion, type), or contains something unexpected like a README.txt or backup copy.","commonSituations":"Editors leaving .conf.bak or .json.orig files in /opt/cni/net.d; templating tools writing partial configs; missing \"type\" field in a bridge plugin config; permission changes from config management.","solutions":["Validate the file with jq and ensure it has name, cniVersion, and type fields","Remove non-CNI files (backups, docs, .tmp) from the CNI conf directory","Fix file permissions so Nomad can read it","Reinstall/regenerate the config from your CNI plugin's docs"],"exampleFix":"// before (invalid single conf)\n{\"name\":\"bridge\"}\n// after\n{\"name\":\"bridge\",\"cniVersion\":\"0.4.0\",\"type\":\"bridge\"}","handlingStrategy":"validation","validationCode":"func validateCNIConf(path string) error { b, err := os.ReadFile(path); if err != nil { return err }; var c struct{ Name string `json:\"name\"`; CNIVersion string `json:\"cniVersion\"`; Type string `json:\"type\"` }; if err := json.Unmarshal(b, &c); err != nil { return err }; if c.Name == \"\" || c.CNIVersion == \"\" || c.Type == \"\" { return fmt.Errorf(\"missing required fields in %s\", path) }; return nil }","typeGuard":"func isValidCNIConf(path string) bool { b, err := os.ReadFile(path); if err != nil { return false }; var c struct{ Name, CNIVersion, Type string }; return json.Unmarshal(b, &c) == nil && c.Name != \"\" && c.CNIVersion != \"\" && c.Type != \"\" }","tryCatchPattern":null,"preventionTips":["Keep only valid CNI configs in the conf dir — no backups or docs","Add a config-management lint step for CNI configs","Pin CNI plugin versions and regenerate configs on upgrade"],"tags":["cni","networking","file-parse"],"backgroundTag":"cni-config-parse-failure","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}