{"record":{"id":"39e77256dd09cf4b","repo":"kubernetes/kops","slug":"failed-to-update-member-v","errorCode":null,"errorMessage":"Failed to update member: %v","messagePattern":"Failed to update member: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstacktasks/poolassociation.go","lineNumber":194,"sourceCode":"\t\t\t}\n\n\t\t\tmember, err := t.Cloud.AssociateToPool(&server, fi.ValueOf(e.Pool.ID), v2pools.CreateMemberOpts{\n\t\t\t\tName:         fi.ValueOf(e.Name),\n\t\t\t\tProtocolPort: fi.ValueOf(e.ProtocolPort),\n\t\t\t\tSubnetID:     fi.ValueOf(e.Pool.Loadbalancer.VipSubnet),\n\t\t\t\tAddress:      memberAddress,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"Failed to create member: %v\", err)\n\t\t\t}\n\t\t\te.ID = new(member.ID)\n\t\t}\n\t} else {\n\t\t_, err := t.Cloud.UpdateMemberInPool(fi.ValueOf(a.Pool.ID), fi.ValueOf(a.ID), v2pools.UpdateMemberOpts{\n\t\t\tWeight: e.Weight,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to update member: %v\", err)\n\t\t}\n\t}\n\treturn nil\n}\n","sourceCodeStart":176,"sourceCodeEnd":199,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstacktasks/poolassociation.go#L176-L199","documentation":"On the update path (a != nil), RenderOpenstack calls Cloud.UpdateMemberInPool to apply changed member options (currently Weight). If Octavia rejects the member update, kOps wraps the error with this message and the member keeps its old settings.","triggerScenarios":"t.Cloud.UpdateMemberInPool(poolID, memberID, UpdateMemberOpts{Weight: ...}) errors: member ID no longer exists (404, deleted out-of-band), loadbalancer in PENDING state (409), invalid weight value, or Octavia API 401/403/5xx.","commonSituations":"Member removed manually while kops still tracks its ID; loadbalancer stuck PENDING from a concurrent operation; weight set outside Octavia's accepted range in the cluster spec; token expiry during a long reconcile.","solutions":["Check the wrapped Octavia status: 404 means delete stale state and let kops recreate the member","Verify the loadbalancer is ACTIVE (fix PENDING_* states via `openstack loadbalancer failover` if needed)","Confirm the Weight value is within Octavia's valid range (0-256)","Retry after transient 5xx; re-authenticate on 401"],"exampleFix":"// before\nweight: fi.Int32(999) // outside Octavia range\n// after\nweight: fi.Int32(128)","handlingStrategy":"try-catch","validationCode":"// confirm member still exists before update\nout, err := exec.Command(\"openstack\", \"loadbalancer\", \"member\", \"list\", poolID).Output()\nif err != nil || !bytes.Contains(out, []byte(memberID)) {\n\treturn fmt.Errorf(\"member %s missing; let kops recreate it\", memberID)\n}","typeGuard":"func isValidOctaviaWeight(w int32) bool { return w >= 0 && w <= 256 }","tryCatchPattern":"_, err := t.Cloud.UpdateMemberInPool(poolID, memberID, v2pools.UpdateMemberOpts{Weight: e.Weight})\nif err != nil {\n\tvar gerr gophercloud.ErrUnexpectedResponseCode\n\tif errors.As(err, &gerr) {\n\t\tswitch gerr.Actual {\n\t\tcase 404: // member gone: clear stale ID so kops recreates\n\t\tcase 409: // LB pending: wait/failover then retry\n\t\t}\n\t}\n\treturn fmt.Errorf(\"Failed to update member: %v\", err)\n}","preventionTips":["Keep member weights within Octavia's 0-256 range","Do not delete Octavia members manually while kops tracks them","Resolve PENDING loadbalancer states before re-running updates"],"tags":["openstack","octavia","loadbalancer","pool-member","update"],"backgroundTag":"octavia-member-update-failed","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"}