Change:
Kubernetes version: $ kubectl version Client Version: version.Info{Major:"1", Minor:"3+", GitVersion:"v1.3.8-hpe.1", GitCommit:"", GitTreeState:"clean", BuildDate:"2016-09-22T23:27:29Z", GoVersion:"go1.6.2", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"3+", GitVersion:"v1.3.8-hpe.1.3+-dirty", GitCommit:"", GitTreeState:"dirty", BuildDate:"2016-09-29T14:43:35Z", GoVersion:"go1.6.2", Compiler:"gc", Platform:"linux/amd64"} Environment: Cloud provider or hardware configuration: OpenStack Liberty, Neutron LBaaS V2 using Octavia OS (e.g. from /etc/os-release): N/A Kernel (e.g. ): N/A Install tools: N/A Others: N/A What happened: Deleting a LoadBalancer service results in the deletion of all LoadBalancer service's LBaaS Pools and Monitors. What you expected to happen: The Pools and Monitors for unrelated services should not be deleted How to reproduce it (as minimally and precisely as possible): 2 services with type=LoadBalancer for LBaaS resources to be created 1 of the 2 services created earlier output, all pools will have been deleted. Anything else do we need to know: Neutron's API ignores unknown paramaters. 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.
We're still experiencing this problem, or at least one with very similar symptoms -- having launched services of type LoadBalancer and then deleting one of them, it deletes all of the pools of all services. As the original report, we're also using OpenStack Liberty, Neutron LBaaS V2, and just updated to K8s 1.5.1 (from 1.4.5) hoping that this fixed our issue, but we are still experiencing the same problem after the upgrade. Is there any other way in which we can help to debug the issue, without delving into the code? (On a side note, the commit which is supposed to fix this is included as part of the 1.5.0 release, so I am not sure if this issue has not been closed for some reason).
it is possible I missed a case in the original fix, the simplest test I found for this issue we had was to create 2x services with type=loadbalancer, wait for all the LBaaS resources to be provisioned, then delete one of the services and ensure the other's resources are still present. If this is failing, either these been a regression, or something else has gone horribly wrong :)
Hi thanks for coming back to this issue. Apparently not all cases deleting the LoadBalancers in OpenStack/liberty were doing the extra step of filtering. We were working on a fix, and submitted a pull request, which is being considered right now:
has merged. closing this issue /close

Discussion:
if err != nil { return false, err } <del> existingListeners = append(existingListeners, listenerList...) </del> <ins> for _, l := range listenerList { for _, lb := range l.Loadbalancers { if lb.ID == id { existingListeners = append(existingListeners, l) break } } } </ins> return true, nil })

if err != nil { return nil, fmt.Errorf("Error creating loadbalancer %v: %v", createOpts, err) } return loadbalancer, nil } <ins> func stringInArray(x string, list []string) bool { for _, y := range list { if y == x { return true } } return false } </ins> func (lbaas *LbaasV2) GetLoadBalancer(clusterName string, service *api.Service) (*api.LoadBalancerStatus, bool, error) { loadBalancerName := cloudprovider.GetLoadBalancerName(service) loadbalancer, err := getLoadbalancerByName(lbaas.network, loadBalancerName)

return false, err } for _, l := range listenersList { <del> key := portKey{Protocol: l.Protocol, Port: l.ProtocolPort} lbListeners[key] = l </del> <ins> 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: l.Protocol, Port: l.ProtocolPort} lbListeners[key] = l break } } </ins> } return true, nil })

} for _, p := range poolsList { for _, l := range p.Listeners { <del> lbPools[l.ID] = p </del> <ins> // 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 } } </ins> } } return true, nil