{"record":{"id":"20c9b641b3c60253","repo":"kubernetes/kops","slug":"openstack-cloud-pools-with-multiple-loadbalancers","errorCode":null,"errorMessage":"Openstack cloud pools with multiple loadbalancers not yet supported!","messagePattern":"Openstack cloud pools with multiple loadbalancers not yet supported!","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstacktasks/lbpool.go","lineNumber":55,"sourceCode":"func (e *LBPool) GetDependencies(tasks map[string]fi.CloudupTask) []fi.CloudupTask {\n\tvar deps []fi.CloudupTask\n\tfor _, task := range tasks {\n\t\tif _, ok := task.(*LB); ok {\n\t\t\tdeps = append(deps, task)\n\t\t}\n\t}\n\treturn deps\n}\n\nvar _ fi.CompareWithID = (*LBPool)(nil)\n\nfunc (s *LBPool) CompareWithID() *string {\n\treturn s.ID\n}\n\nfunc NewLBPoolTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle fi.Lifecycle, pool *v2pools.Pool, find *LBPool) (*LBPool, error) {\n\tif len(pool.Loadbalancers) > 1 {\n\t\treturn nil, fmt.Errorf(\"Openstack cloud pools with multiple loadbalancers not yet supported!\")\n\t}\n\n\ta := &LBPool{\n\t\tID:        new(pool.ID),\n\t\tName:      new(pool.Name),\n\t\tLifecycle: lifecycle,\n\t}\n\tif len(pool.Loadbalancers) == 1 {\n\t\tlbID := pool.Loadbalancers[0]\n\t\tlb, err := cloud.GetLB(lbID.ID)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"NewLBPoolTaskFromCloud: Failed to get lb with id %s: %v\", lbID.ID, err)\n\t\t}\n\t\tloadbalancerTask, err := NewLBTaskFromCloud(cloud, lifecycle, lb, nil)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ta.Loadbalancer = loadbalancerTask","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstacktasks/lbpool.go#L37-L73","documentation":"NewLBPoolTaskFromCloud rejects Octavia pools that reference more than one load balancer. kOps assumes a 1:1 pool-to-loadbalancer mapping when reconstructing task state during find/refresh. A shared pool attached to multiple LBs cannot be modeled, so it fails fast instead of producing wrong state.","triggerScenarios":"During Find (or NewLBListenerTaskFromCloud) the pool listing (GET /v2/lbaas/pools) returns a pool whose loadbalancers array has length > 1 — i.e. the same pool is attached to two or more Octavia load balancers.","commonSituations":"Operators manually shared a pool across load balancers in the OpenStack console/CLI; leftover pools from previous cluster versions; pools created by other tooling inside the kops-managed project that happen to match name/ID filters.","solutions":["Identify the shared pool (openstack loadbalancer pool list / pool show) and detach it from all but one load balancer.","Delete the extraneous/duplicate pool if it is not managed by kops.","Scope the search: set the pool's ID in the task state or ensure pool names are unique so the listing does not surface shared pools.","If the sharing is intentional, manage that pool outside kops (avoid name collisions) since kOps does not support it."],"exampleFix":"// before: pool shared across two LBs\n$ openstack loadbalancer pool show web-pool  # loadbalancers: [lb-1, lb-2]\n// after: detach from the second LB\n$ openstack loadbalancer member remove lb-2 web-pool <member-id>\n$ openstack loadbalancer pool delete --wait  # or recreate dedicated pool per LB","handlingStrategy":"validation","validationCode":"pool := octaviaPoolShow(poolID)\nif len(pool.Loadbalancers) > 1 {\n\treturn fmt.Errorf(\"pool %s is shared across %d load balancers; detach extras before running kops\", poolID, len(pool.Loadbalancers))\n}","typeGuard":null,"tryCatchPattern":"if err := importPoolsFromCloud(); err != nil {\n\tif strings.Contains(err.Error(), \"multiple loadbalancers not yet supported\") {\n\t\t// fall back to manual pool management outside kops\n\t\treturn managePoolExternally()\n\t}\n\treturn err\n}","preventionTips":["Keep a strict 1:1 mapping of pools to load balancers in the OpenStack project.","Name pools uniquely and only via kops-managed workflows.","Audit the project for manually shared pools before kops updates."],"tags":["openstack","octavia","loadbalancer-pool","unsupported"],"backgroundTag":"pool-shared-across-loadbalancers","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"}