{"record":{"id":"ccafd89a32670547","repo":"kubernetes/kops","slug":"error-deleting-instance-q-v","errorCode":null,"errorMessage":"error deleting instance %q: %v","messagePattern":"error deleting instance %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/instancegroups/instancegroups.go","lineNumber":663,"sourceCode":"\n// deleteInstance deletes an Cloud Instance.\nfunc (c *RollingUpdateCluster) deleteInstance(u *cloudinstances.CloudInstance) error {\n\tid := u.ID\n\tnodeName := \"\"\n\tif u.Node != nil {\n\t\tnodeName = u.Node.Name\n\t}\n\tif nodeName != \"\" {\n\t\tklog.Infof(\"Stopping instance %q, node %q, in group %q (this may take a while).\", id, nodeName, u.CloudInstanceGroup.HumanName)\n\t} else {\n\t\tklog.Infof(\"Stopping instance %q, in group %q (this may take a while).\", id, u.CloudInstanceGroup.HumanName)\n\t}\n\n\tif err := c.Cloud.DeleteInstance(u); err != nil {\n\t\tif nodeName != \"\" {\n\t\t\treturn fmt.Errorf(\"error deleting instance %q, node %q: %v\", id, nodeName, err)\n\t\t}\n\t\treturn fmt.Errorf(\"error deleting instance %q: %v\", id, err)\n\t}\n\n\treturn nil\n}\n\n// drainNode drains a K8s node.\nfunc (c *RollingUpdateCluster) drainNode(ctx context.Context, u *cloudinstances.CloudInstance) error {\n\tif c.K8sClient == nil {\n\t\treturn fmt.Errorf(\"K8sClient not set\")\n\t}\n\n\tif u.Node == nil {\n\t\treturn fmt.Errorf(\"node not set\")\n\t}\n\n\tif u.Node.Name == \"\" {\n\t\treturn fmt.Errorf(\"node name not set\")\n\t}","sourceCodeStart":645,"sourceCodeEnd":681,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/instancegroups/instancegroups.go#L645-L681","documentation":"Same DeleteInstance failure as the sibling error but formatted without a node name (nodeName == \"\"), typically for control-plane or bastion instances. The cloud provider refused or failed the instance termination request.","triggerScenarios":"c.Cloud.DeleteInstance(u) fails and nodeName == \"\": terminate call rejected — instance already gone, IAM denial, dependency error (e.g. volume detach in progress), or throttling.","commonSituations":"Rolling control-plane instances that were modified out-of-band; transient cloud API errors; missing ec2:TerminateInstances permission.","solutions":["Re-run rolling update to reconcile state","Verify IAM permissions for terminating instances","Check instance state in the cloud console (may already be terminated)","Retry after transient cloud API issues"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// confirm control-plane instance exists before terminating\nout, _ := ec2Client.DescribeInstances(&ec2.DescribeInstancesInput{InstanceIds: []*string{&u.ID}})\n// refresh group membership if DescribeInstances returns invalid-instance-id","typeGuard":"func deleteTarget(u *cloudinstances.CloudInstance) bool { return u != nil && u.ID != \"\" }","tryCatchPattern":"if err := c.Cloud.DeleteInstance(u); err != nil {\n    if isNotFound(err) { return nil }\n    return fmt.Errorf(\"error deleting instance %q: %v\", id, err)\n}","preventionTips":["Re-discover instance group state before control-plane rolls","Verify IAM terminate permissions for control-plane groups","Retry after transient cloud API failures"],"tags":["cloud","delete","rolling-update"],"backgroundTag":"cloud-instance-delete-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"}