mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-30 15:05:27 +00:00
Merge pull request #38959 from Gradiant/master
Automatic merge from submit-queue Adapt loadbalancer deleting/updating when using cloudprovider openstack in openstack/liberty **What this PR does / why we need it**: Make an extra verification on the returned listeners and pools because gophercloud query doesn't filter the results by loadbalancerID / listenerID respectively when using **openstack/librerty**. **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes # #33759 **Special notes for your reviewer**: #33759 it's supposed to have a pull request which fixes this problem but in the release 1.5 loadbalancers doesn't use that patched code. **Release note**: NONE ```release-note ```
This commit is contained in:
commit
39308b8980
@ -973,53 +973,26 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
Protocol listeners.Protocol
|
Protocol listeners.Protocol
|
||||||
Port int
|
Port int
|
||||||
}
|
}
|
||||||
|
var listenerIDs []string
|
||||||
lbListeners := make(map[portKey]listeners.Listener)
|
lbListeners := make(map[portKey]listeners.Listener)
|
||||||
err = listeners.List(lbaas.network, listeners.ListOpts{LoadbalancerID: loadbalancer.ID}).EachPage(func(page pagination.Page) (bool, error) {
|
allListeners, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
||||||
listenersList, err := listeners.ExtractListeners(page)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
for _, l := range listenersList {
|
|
||||||
for _, lb := range l.Loadbalancers {
|
|
||||||
// Double check this Listener belongs to the LB we're updating. Neutron's API filtering
|
|
||||||
// can't be counted on in older releases (i.e Liberty).
|
|
||||||
if loadbalancer.ID == lb.ID {
|
|
||||||
key := portKey{Protocol: listeners.Protocol(l.Protocol), Port: l.ProtocolPort}
|
|
||||||
lbListeners[key] = l
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("Error getting listeners for LB %s: %v", loadBalancerName, err)
|
||||||
|
}
|
||||||
|
for _, l := range allListeners {
|
||||||
|
key := portKey{Protocol: listeners.Protocol(l.Protocol), Port: l.ProtocolPort}
|
||||||
|
lbListeners[key] = l
|
||||||
|
listenerIDs = append(listenerIDs, l.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get all pools for this loadbalancer, by listener ID.
|
// Get all pools for this loadbalancer, by listener ID.
|
||||||
lbPools := make(map[string]v2pools.Pool)
|
lbPools := make(map[string]v2pools.Pool)
|
||||||
err = v2pools.List(lbaas.network, v2pools.ListOpts{LoadbalancerID: loadbalancer.ID}).EachPage(func(page pagination.Page) (bool, error) {
|
for _, listenerID := range listenerIDs {
|
||||||
poolsList, err := v2pools.ExtractPools(page)
|
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listenerID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return fmt.Errorf("Error getting pool for listener %s: %v", listenerID, err)
|
||||||
}
|
}
|
||||||
for _, p := range poolsList {
|
lbPools[listenerID] = *pool
|
||||||
for _, l := range p.Listeners {
|
|
||||||
// Double check this Pool belongs to the LB we're deleting. Neutron's API filtering
|
|
||||||
// can't be counted on in older releases (i.e Liberty).
|
|
||||||
for _, val := range lbListeners {
|
|
||||||
if val.ID == l.ID {
|
|
||||||
lbPools[l.ID] = p
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compose Set of member (addresses) that _should_ exist
|
// Compose Set of member (addresses) that _should_ exist
|
||||||
@ -1050,19 +1023,13 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find existing pool members (by address) for this port
|
// Find existing pool members (by address) for this port
|
||||||
members := make(map[string]v2pools.Member)
|
getMembers, err := getMembersByPoolID(lbaas.network, pool.ID)
|
||||||
err := v2pools.ListMembers(lbaas.network, pool.ID, v2pools.ListMembersOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
|
||||||
membersList, err := v2pools.ExtractMembers(page)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
for _, member := range membersList {
|
|
||||||
members[member.Address] = member
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("Error getting pool members %s: %v", pool.ID, err)
|
||||||
|
}
|
||||||
|
members := make(map[string]v2pools.Member)
|
||||||
|
for _, member := range getMembers {
|
||||||
|
members[member.Address] = member
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add any new members for this port
|
// Add any new members for this port
|
||||||
@ -1125,60 +1092,32 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *v1.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get all listeners associated with this loadbalancer
|
// get all listeners associated with this loadbalancer
|
||||||
var listenerIDs []string
|
listenerList, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
||||||
err = listeners.List(lbaas.network, listeners.ListOpts{LoadbalancerID: loadbalancer.ID}).EachPage(func(page pagination.Page) (bool, error) {
|
|
||||||
listenerList, err := listeners.ExtractListeners(page)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, listener := range listenerList {
|
|
||||||
listenerIDs = append(listenerIDs, listener.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("Error getting LB %s listeners: %v", loadbalancer.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all pools (and health monitors) associated with this loadbalancer
|
// get all pools (and health monitors) associated with this loadbalancer
|
||||||
var poolIDs []string
|
var poolIDs []string
|
||||||
var monitorIDs []string
|
var monitorIDs []string
|
||||||
err = v2pools.List(lbaas.network, v2pools.ListOpts{LoadbalancerID: loadbalancer.ID}).EachPage(func(page pagination.Page) (bool, error) {
|
for _, listener := range listenerList {
|
||||||
poolsList, err := v2pools.ExtractPools(page)
|
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listener.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return fmt.Errorf("Error getting pool for listener %s: %v", listener.ID, err)
|
||||||
}
|
}
|
||||||
|
poolIDs = append(poolIDs, pool.ID)
|
||||||
for _, pool := range poolsList {
|
monitorIDs = append(monitorIDs, pool.MonitorID)
|
||||||
poolIDs = append(poolIDs, pool.ID)
|
|
||||||
monitorIDs = append(monitorIDs, pool.MonitorID)
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all members associated with each poolIDs
|
// get all members associated with each poolIDs
|
||||||
var memberIDs []string
|
var memberIDs []string
|
||||||
for _, poolID := range poolIDs {
|
for _, pool := range poolIDs {
|
||||||
err := v2pools.ListMembers(lbaas.network, poolID, v2pools.ListMembersOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
membersList, err := getMembersByPoolID(lbaas.network, pool)
|
||||||
membersList, err := v2pools.ExtractMembers(page)
|
if err != nil && !isNotFound(err) {
|
||||||
if err != nil {
|
return fmt.Errorf("Error getting pool members %s: %v", pool, err)
|
||||||
return false, err
|
}
|
||||||
}
|
for _, member := range membersList {
|
||||||
|
memberIDs = append(memberIDs, member.ID)
|
||||||
for _, member := range membersList {
|
|
||||||
memberIDs = append(memberIDs, member.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1211,8 +1150,8 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *v1.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// delete all listeners
|
// delete all listeners
|
||||||
for _, listenerID := range listenerIDs {
|
for _, listener := range listenerList {
|
||||||
err := listeners.Delete(lbaas.network, listenerID).ExtractErr()
|
err := listeners.Delete(lbaas.network, listener.ID).ExtractErr()
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user