{"record":{"id":"d21758a92c05089c","repo":"kubernetes/kops","slug":"private-ip-for-digitalocean-droplet-was-empty","errorCode":null,"errorMessage":"private IP for digitalocean droplet was empty","messagePattern":"private IP for digitalocean droplet was empty","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/nodeup/command.go","lineNumber":540,"sourceCode":"\t\tb, err := vfs.Context.ReadFile(\"metadata://gce/instance/hostname\")\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"error reading hostname from GCE metadata: %v\", err)\n\t\t}\n\n\t\t// We only want to use the first portion of the fully-qualified name\n\t\t// e.g. foo.c.project.internal => foo\n\t\tfullyQualified := string(b)\n\t\tbareHostname := strings.Split(fullyQualified, \".\")[0]\n\t\treturn bareHostname, nil\n\tcase api.CloudProviderDO:\n\t\tvBytes, err := vfs.Context.ReadFile(\"metadata://digitalocean/interfaces/private/0/ipv4/address\")\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"error reading droplet private IP from DigitalOcean metadata: %v\", err)\n\t\t}\n\n\t\thostname := string(vBytes)\n\t\tif hostname == \"\" {\n\t\t\treturn \"\", errors.New(\"private IP for digitalocean droplet was empty\")\n\t\t}\n\n\t\treturn hostname, nil\n\tcase api.CloudProviderLinode:\n\t\tlabel, err := linodemetadata.GetMetadataValue(context.TODO(), \"label\")\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"error reading hostname from Linode metadata: %v\", err)\n\t\t}\n\n\t\t// Akamai (Linode) cloud-init does not set the OS hostname.\n\t\t// Set it here so the OS hostname matches the kubelet hostname override.\n\t\tif err := os.WriteFile(\"/etc/hostname\", []byte(label+\"\\n\"), 0o644); err != nil { //nolint:gosec // /etc/hostname is conventionally world-readable system configuration.\n\t\t\tklog.Warningf(\"Failed to write /etc/hostname: %v\", err)\n\t\t} else if err := exec.Command(\"hostname\", label).Run(); err != nil {\n\t\t\tklog.Warningf(\"Failed to set runtime hostname %q: %v\", label, err)\n\t\t} else {\n\t\t\tklog.Infof(\"Set OS hostname to %q\", label)\n\t\t}","sourceCodeStart":522,"sourceCodeEnd":558,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/nodeup/command.go#L522-L558","documentation":"During node bootstrap (evaluateHostnameOverride/evaluateSpec), nodeup queries the DigitalOcean metadata service for the droplet's private IPv4 address and received an empty value. The droplet either has no private networking enabled or the metadata service is not yet populated.","triggerScenarios":"Thrown at upup/pkg/fi/nodeup/command.go:540 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the droplet was created with private networking (a VPC network interface) enabled","Retry after a short delay; metadata may populate shortly after droplet boot","Check the droplet's network interfaces in the DigitalOcean console"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}