{"record":{"id":"a808812b1245270b","repo":"kubernetes/kops","slug":"error-deleting-tag-s-v","errorCode":null,"errorMessage":"error deleting tag %s: %v","messagePattern":"error deleting tag (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/network.go","lineNumber":60,"sourceCode":"\t})\n\tif err != nil {\n\t\treturn err\n\t} else if done {\n\t\treturn nil\n\t} else {\n\t\treturn wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) DeleteTag(resource string, id string, tag string) error {\n\treturn deleteTag(c, resource, id, tag)\n}\n\nfunc deleteTag(c OpenstackCloud, resource string, id string, tag string) error {\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\terr := attributestags.Delete(context.TODO(), c.NetworkingClient(), resource, id, tag).ExtractErr()\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"error deleting tag %s: %v\", tag, err)\n\t\t}\n\t\treturn true, nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t} else if done {\n\t\treturn nil\n\t} else {\n\t\treturn wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) FindNetworkBySubnetID(subnetID string) (*networks.Network, error) {\n\treturn findNetworkBySubnetID(c, subnetID)\n}\n\nfunc findNetworkBySubnetID(c OpenstackCloud, subnetID string) (*networks.Network, error) {\n\tvar rslt *networks.Network","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/network.go#L42-L78","documentation":"The Neutron attribute-tags delete call for the given tag failed. The call is retried with backoff; failure means the tag could not be removed from the resource, e.g. authorization, resource state, or API problems.","triggerScenarios":"NetworkingClient tag delete fails because the resource no longer exists, permissions deny the operation, or the Neutron endpoint is unreachable.","commonSituations":"Cluster teardown deleting tags from already-deleted subnets/ports/routers; RBAC policy restricting tag mutation; token expiry mid-teardown.","solutions":[],"exampleFix":"// before\nerr := deleteTag(c, \"subnets\", subnetID, tag)\n// after\nif _, err := getSubnet(c, subnetID); err == nil {\n    err = deleteTag(c, \"subnets\", subnetID, tag)\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := deleteTag(c, \"subnets\", id, tag); err != nil {\n    if strings.Contains(err.Error(), \"404\") || strings.Contains(err.Error(), \"Not Found\") {\n        return nil // already deleted; safe to ignore\n    }\n    return err\n}","preventionTips":["During cluster teardown, tolerate 404s on tag deletion","Verify resources still exist before mutating tags","Check RBAC policy allows tag mutations","Re-authenticate before long teardown sequences"],"tags":["openstack","neutron","tags","deletion"],"backgroundTag":"openstack-api-error","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"}