{"record":{"id":"7f4f0a7eaf7888f7","repo":"kubernetes/kops","slug":"reading-user-data-for-instance-group-q-w","errorCode":null,"errorMessage":"reading user-data for instance group %q: %w","messagePattern":"reading user-data for instance group %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/template_functions.go","lineNumber":1208,"sourceCode":"\n\t\ttask, err := tf.Task(\"ServerGroup\", ig.Name)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"finding server group task for instance group %q: %w\", ig.Name, err)\n\t\t}\n\n\t\tserverGroup, ok := task.(*hetznertasks.ServerGroup)\n\t\tif !ok {\n\t\t\treturn \"\", fmt.Errorf(\"server group task for instance group %q has unexpected type %T\", ig.Name, task)\n\t\t}\n\n\t\tnodeLabels, err := nodelabels.BuildNodeLabels(tf.Cluster, ig)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"building node labels for instance group %q: %w\", ig.Name, err)\n\t\t}\n\n\t\tuserDataBytes, err := fi.ResourceAsBytes(serverGroup.UserData)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"reading user-data for instance group %q: %w\", ig.Name, err)\n\t\t}\n\n\t\tvar taints []corev1.Taint\n\t\tfor _, taintSpec := range ig.Spec.Taints {\n\t\t\tparsed, err := util.ParseTaint(taintSpec)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"parsing taints for instance group %q: %w\", ig.Name, err)\n\t\t\t}\n\t\t\ttaints = append(taints, corev1.Taint{\n\t\t\t\tKey:    parsed[\"key\"],\n\t\t\t\tValue:  parsed[\"value\"],\n\t\t\t\tEffect: corev1.TaintEffect(parsed[\"effect\"]),\n\t\t\t})\n\t\t}\n\n\t\t// Copy the server labels and add the user-data hash.\n\t\tserverLabels := make(map[string]string, len(serverGroup.Labels)+1)\n\t\tfor key, value := range serverGroup.Labels {","sourceCodeStart":1190,"sourceCodeEnd":1226,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/template_functions.go#L1190-L1226","documentation":"HCloudClusterConfig reads the ServerGroup task's UserData resource into bytes via fi.ResourceAsBytes to embed it in the cluster config. If reading the resource fails (underlying reader error), this error wraps it with the instance group name.","triggerScenarios":"fi.ResourceAsBytes(serverGroup.UserData) fails — the UserData resource's underlying reader returns an error, e.g. failed to open/read the nodeup script/template that backs the resource.","commonSituations":"Missing or unreadable nodeup source file in the model assets; I/O error reading embedded resources; corrupted/incorrectly built task UserData (custom templates wiring a broken resource).","solutions":["Inspect the wrapped inner error to find which resource read failed.","Verify nodeup assets/templates exist and are readable in the kOps build.","Regenerate/rebuild tasks with stock Hetzner model templates."],"exampleFix":"null","handlingStrategy":"try-catch","validationCode":"// Go: verify the UserData resource is present before reading\nif serverGroup.UserData == nil {\n    return \"\", fmt.Errorf(\"instance group %q: ServerGroup has no UserData\", ig.Name)\n}","typeGuard":null,"tryCatchPattern":"// Go\nuserDataBytes, err := fi.ResourceAsBytes(serverGroup.UserData)\nif err != nil {\n    return \"\", fmt.Errorf(\"reading user-data for instance group %q: %w\", ig.Name, err)\n}","preventionTips":["Ensure nodeup assets are embedded/built correctly","Check file permissions of backing nodeup resources","Use stock model templates to construct UserData"],"tags":["hetzner","user-data","io"],"backgroundTag":"resource-read-failed","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"}