{"record":{"id":"44a8a9a6c4b1957b","repo":"kubernetes/kops","slug":"metal-identifynode-not-implemented","errorCode":null,"errorMessage":"metal::IdentifyNode not implemented","messagePattern":"metal::IdentifyNode not implemented","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/nodeidentity/metal/identify.go","lineNumber":38,"sourceCode":"\t\"context\"\n\t\"fmt\"\n\n\tcorev1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/kops/pkg/nodeidentity\"\n)\n\n// nodeIdentifier identifies a node in a bare-metal cloud\ntype nodeIdentifier struct {\n}\n\n// New creates and returns a nodeidentity.Identifier for Nodes running on bare metal\nfunc New() (nodeidentity.Identifier, error) {\n\treturn &nodeIdentifier{}, nil\n}\n\n// IdentifyNode returns the node identity information\nfunc (i *nodeIdentifier) IdentifyNode(ctx context.Context, node *corev1.Node) (*nodeidentity.Info, error) {\n\treturn nil, fmt.Errorf(\"metal::IdentifyNode not implemented\")\n}\n","sourceCodeStart":20,"sourceCodeEnd":40,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/nodeidentity/metal/identify.go#L20-L40","documentation":"The metal (Equinix Metal / Packet) nodeidentity Identifier is a stub: New() constructs the identifier successfully, but IdentifyNode always returns an 'not implemented' error. The package exists as a placeholder in the nodeidentity framework but performs no actual node lookup.","triggerScenarios":"Any call to nodeidentity/metal's Identifier.IdentifyNode, i.e. running the cloud-controller / node-authorizer identity flow against nodes of a bare-metal cluster using this identifier.","commonSituations":"Deploying kOps components that depend on node identity lookup on an Equinix Metal cluster where the metal identifier has never been implemented; selecting the metal provider in a code path expecting IdentifyNode to work.","solutions":["Do not use the metal nodeidentifier for identity lookups; implement or substitute an identifier (e.g. based on the metal CCM) that resolves node identity","Check the kOps issue tracker / upstream for metal nodeidentity support and upgrade to a version that implements it","Provide identity info out-of-band (labels/taints set by the metal cloud controller) instead of calling IdentifyNode"],"exampleFix":"// before\nid, err := metalIdentifier.IdentifyNode(ctx, node) // always errors\n// after\n// use a provider with an implemented identifier, or contribute an implementation in pkg/nodeidentity/metal/identify.go","handlingStrategy":"fallback","validationCode":"// Feature-check: metal IdentifyNode is a stub that always errors; avoid calling it.\n// Route metal-cluster nodes to an implemented identifier instead.","typeGuard":"func identifierImplemented(id nodeidentity.Identifier) bool {\n    // The metal identifier is known-unimplemented; treat it as absent.\n    return id != nil // caller must additionally special-case pkg/nodeidentity/metal\n}","tryCatchPattern":"info, err := identifier.IdentifyNode(ctx, node)\nif err != nil && strings.Contains(err.Error(), \"not implemented\") {\n    // fall back to provider-agnostic identity (labels/annotations)\n    info = fallbackIdentityFromNode(node)\n}","preventionTips":["Do not select the metal nodeidentifier in code paths that require real identity lookup","Track upstream kOps for metal nodeidentity implementation before enabling the integration","Derive identity for metal nodes from CCM-set labels/annotations instead"],"tags":["metal","node-identity","not-implemented"],"backgroundTag":"not-implemented","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}