Commit 95eef6e4 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #33768 from hpcloud/bug/33759

Automatic merge from submit-queue Corect filtering of OpenStack LBaaS resources to delete Neutron's API ignores unknown parameters. When listing pools etc, K8 attempts to filter on "LoadBalancerID", which is not a valid filter. As such, it is ignored by Neutron, and a list of all pools is returned. K8 then proceeds to delete each of the pools. Instead, we now double check the resources really belong to the LB we're trying to delete. Fixes issue #33759
parents a8a86604 b73485b9
...@@ -263,7 +263,14 @@ func getListenersByLoadBalancerID(client *gophercloud.ServiceClient, id string) ...@@ -263,7 +263,14 @@ func getListenersByLoadBalancerID(client *gophercloud.ServiceClient, id string)
if err != nil { if err != nil {
return false, err return false, err
} }
existingListeners = append(existingListeners, listenerList...) for _, l := range listenerList {
for _, lb := range l.Loadbalancers {
if lb.ID == id {
existingListeners = append(existingListeners, l)
break
}
}
}
return true, nil return true, nil
}) })
...@@ -530,10 +537,18 @@ func (lbaas *LbaasV2) createLoadBalancer(service *api.Service, name string) (*lo ...@@ -530,10 +537,18 @@ func (lbaas *LbaasV2) createLoadBalancer(service *api.Service, name string) (*lo
if err != nil { if err != nil {
return nil, fmt.Errorf("Error creating loadbalancer %v: %v", createOpts, err) return nil, fmt.Errorf("Error creating loadbalancer %v: %v", createOpts, err)
} }
return loadbalancer, nil return loadbalancer, nil
} }
func stringInArray(x string, list []string) bool {
for _, y := range list {
if y == x {
return true
}
}
return false
}
func (lbaas *LbaasV2) GetLoadBalancer(clusterName string, service *api.Service) (*api.LoadBalancerStatus, bool, error) { func (lbaas *LbaasV2) GetLoadBalancer(clusterName string, service *api.Service) (*api.LoadBalancerStatus, bool, error) {
loadBalancerName := cloudprovider.GetLoadBalancerName(service) loadBalancerName := cloudprovider.GetLoadBalancerName(service)
loadbalancer, err := getLoadbalancerByName(lbaas.network, loadBalancerName) loadbalancer, err := getLoadbalancerByName(lbaas.network, loadBalancerName)
...@@ -954,8 +969,15 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *api.Servic ...@@ -954,8 +969,15 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *api.Servic
return false, err return false, err
} }
for _, l := range listenersList { for _, l := range listenersList {
key := portKey{Protocol: l.Protocol, Port: l.ProtocolPort} for _, lb := range l.Loadbalancers {
lbListeners[key] = l // 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: l.Protocol, Port: l.ProtocolPort}
lbListeners[key] = l
break
}
}
} }
return true, nil return true, nil
}) })
...@@ -972,7 +994,14 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *api.Servic ...@@ -972,7 +994,14 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *api.Servic
} }
for _, p := range poolsList { for _, p := range poolsList {
for _, l := range p.Listeners { for _, l := range p.Listeners {
lbPools[l.ID] = p // 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 return true, nil
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment