charles walker created LIBCLOUD-879:
---------------------------------------

             Summary: GCE Load balancer suppose that all VM have public ip
                 Key: LIBCLOUD-879
                 URL: https://issues.apache.org/jira/browse/LIBCLOUD-879
             Project: Libcloud
          Issue Type: Bug
          Components: LoadBalancer
         Environment: GCE MASTER
            Reporter: charles walker
            Priority: Minor


When calling "list_members()" on a GCe load balancer libcloud object I end up 
with the following stack :
{noformat}
Retrieve 2 Lbs. Here is the list : [<LoadBalancer: id=68XXXXXXXX707, 
name=europe-lb-forwarding-rule, state=None, ip=10XXXXXXXX.77, 
port=30012-30012>, <LoadBalancer: id=87688XXXXXXXX64, 
name=load-balancer-prd-comp-forwarding-rule-2, state=None, ip=10XXXXXXXX93, 
port=30001-30001>]
--Printing the node obj for DBG : <Node: 
uuid=9001a5d9d425dc0e5dd1db5352296b08920bde21, name=tec-XXXXXXXX-infra-2ktm, 
state=RUNNING, public_ips=[], private_ips=['10.XXXXXXXX'], provider=Google 
Compute Engine ...>
Traceback (most recent call last):
  File "LbTestPy.py", line 43, in <module>
    print ("Members: " +str(aLbs[0].list_members()))
  File 
"/home/cloud-user/LbTest/src/apache-libcloud/libcloud/loadbalancer/base.py", 
line 110, in list_members
    return self.driver.balancer_list_members(balancer=self)
  File 
"/home/cloud-user/LbTest/src/apache-libcloud/libcloud/loadbalancer/drivers/gce.py",
 line 274, in balancer_list_members
    balancer.extra['targetpool'].nodes]
  File 
"/home/cloud-user/LbTest/src/apache-libcloud/libcloud/loadbalancer/drivers/gce.py",
 line 342, in _node_to_member
    member_ip = node.public_ips[0]
IndexError: list index out of range
{noformat}
After some investigations it appears to comes from the method "def 
_node_to_member(self, node, balancer):" in loadbalancer/drivers/gce.py. Mode 
precisely this piece of the code :
{code:title=code1.py|borderStyle=solid}
if hasattr(node, 'name'):
        member_id = node.name
        member_ip = node.public_ips[0]
else:
        member_id = node
        member_ip = None
{code}
which imply that all VM in the load balancer will have public IP. This is not 
necessarly the case and thus when it happen the process crash (as you can see 
in the previous stack where i added some debug log in my libcloud version to 
print the node where the error occurs).

I would had suggest to use private ip instead of public but I do not want to 
impact the existing user of libcloud so I was thinking of a simple fix :
{code:title=code1.py|borderStyle=solid}
if hasattr(node, 'name'):
    member_id = node.name
else:
    member_id = node

if (len(node.public_ips) > 0):
    member_ip = node.public_ips[0]
else:
    member_ip = None
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to