{"record":{"id":"e1e1e4d69aec955c","repo":"kubernetes/kops","slug":"openstack-cloud-provider-does-not-support-surging","errorCode":null,"errorMessage":"openstack cloud provider does not support surging","messagePattern":"openstack cloud provider does not support surging","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"upup/pkg/fi/cloudup/openstack/instance.go","lineNumber":315,"sourceCode":"\t\tnewStats, err := c.GetLBStats(lb.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// NOTE! this is total loadbalancer connections NOT member connections\n\t\tklog.V(4).Infof(\"Loadbalancer %s connections before draining %d and after %d\", lb.Name, oldStats.ActiveConnections, newStats.ActiveConnections)\n\t}\n\treturn nil\n}\n\n// DetachInstance is not implemented yet. It needs to cause a cloud instance to no longer be counted against the group's size limits.\nfunc (c *openstackCloud) DetachInstance(i *cloudinstances.CloudInstance) error {\n\treturn detachInstance(c, i)\n}\n\nfunc detachInstance(c OpenstackCloud, i *cloudinstances.CloudInstance) error {\n\tklog.V(8).Info(\"openstack cloud provider DetachInstance not implemented yet\")\n\treturn fmt.Errorf(\"openstack cloud provider does not support surging\")\n}\n\nfunc (c *openstackCloud) GetInstance(id string) (*servers.Server, error) {\n\treturn getInstance(c, id)\n}\n\nfunc getInstance(c OpenstackCloud, id string) (*servers.Server, error) {\n\tvar server *servers.Server\n\n\tdone, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {\n\t\tinstance, err := servers.Get(context.TODO(), c.ComputeClient(), id).Extract()\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tserver = instance\n\t\treturn true, nil\n\t})\n\tif err != nil {","sourceCodeStart":297,"sourceCodeEnd":333,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/instance.go#L297-L333","documentation":"detachInstance is a deliberately unimplemented stub in the OpenStack cloud provider: it logs that DetachInstance is not implemented and always returns this error. kops calls it when performing surging (rolling updates that add a new instance before draining the old one), which OpenStack does not support.","triggerScenarios":"Any call path that invokes DetachInstance for an OpenStack cluster — i.e. a rolling-update strategy that requires detaching (surging) an instance from the cloud instance group instead of deleting it in place.","commonSituations":"Running `kops rolling-update cluster` with surge configured on an OpenStack cluster; tooling expecting feature parity between AWS/GCE and OpenStack providers.","solutions":["Do not use surging with OpenStack; use the default in-place rolling update strategy (no surge)","If surging is required, switch the affected instance groups to a provider that implements DetachInstance (AWS/GCE)","Implement detachInstance in the OpenStack provider (e.g. via server rebuild/migration or LB member handling) if upstream support is needed"],"exampleFix":"// before: rolling-update with surge on openstack\nkops rolling-update cluster mycluster --surge\n// after: use default in-place update\nkops rolling-update cluster mycluster","handlingStrategy":"fallback","validationCode":"// detect provider capability before requesting surge\nif cloud.ProviderID() == kopsapi.CloudProviderOpenstack && updateStrategyUsesSurge {\n    return fmt.Errorf(\"surge not supported on openstack; use in-place rolling update\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never configure --surge or surge-style rolling updates for OpenStack clusters","Check provider feature parity docs before enabling cloud-specific update strategies","If you need surging, run those instance groups on AWS/GCE instead","Track upstream kops for OpenStack DetachInstance implementation"],"tags":["openstack","unimplemented","surging","detach"],"backgroundTag":"feature-not-supported-by-provider","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"}