From 370ad205b7ea8bf9927d5f7edf5c9a70808f1947 Mon Sep 17 00:00:00 2001 From: FengyunPan Date: Mon, 9 Oct 2017 10:01:49 +0800 Subject: [PATCH] [OpenStack]Add codes to check the count of nodes(members) After merging this PR(#53146), if there is no available nodes for the loadbalancer service, UpdateLoadBalancer() will run panic. --- .../providers/openstack/openstack_loadbalancer.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go b/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go index c176218665..82270dee14 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go +++ b/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go @@ -623,6 +623,10 @@ func getSubnetIDForLB(compute *gophercloud.ServiceClient, node v1.Node) (string, func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) { glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, nodes, apiService.Annotations) + if len(nodes) == 0 { + return nil, fmt.Errorf("There are no available nodes for LoadBalancer service %s/%s", apiService.Namespace, apiService.Name) + } + if len(lbaas.opts.SubnetId) == 0 { // Get SubnetId automatically. // The LB needs to be configured with instance addresses on the same subnet, so get SubnetId by one node. @@ -1024,7 +1028,7 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service loadBalancerName := cloudprovider.GetLoadBalancerName(service) glog.V(4).Infof("UpdateLoadBalancer(%v, %v, %v)", clusterName, loadBalancerName, nodes) - if len(lbaas.opts.SubnetId) == 0 { + if len(lbaas.opts.SubnetId) == 0 && len(nodes) > 0 { // Get SubnetId automatically. // The LB needs to be configured with instance addresses on the same subnet, so get SubnetId by one node. subnetID, err := getSubnetIDForLB(lbaas.compute, *nodes[0]) @@ -1322,6 +1326,10 @@ func (lb *LbaasV1) GetLoadBalancer(clusterName string, service *v1.Service) (*v1 func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) { glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, nodes, apiService.Annotations) + if len(nodes) == 0 { + return nil, fmt.Errorf("There are no available nodes for LoadBalancer service %s/%s", apiService.Namespace, apiService.Name) + } + if len(lb.opts.SubnetId) == 0 { // Get SubnetId automatically. // The LB needs to be configured with instance addresses on the same subnet, so get SubnetId by one node.