Forum Discussion
iControl + Python + add_member / remove_member
So now I have pool_objects which I construct using pool_factory... but now i'm getting complaints about suds and a reference to address:
def pool_factory(b, members):
'''
'''
pobj = []
for x in members:
ip,port = x.split(':')
pmem = b.LocalLB.Pool.typefactory.create('Common.IPPortDefinition')
pmem.address = ip
pmem.port = int(port)
pobj.append(pmem)
return pobj
pool_objects = pool_factory(b,members)
def add_member(b, pool_objects):
"""
"""
try:
b.LocalLB.Pool.add_member(pool_names = [POOL],
members = pool_objects)
except Exception, e:
print e
raise
sys.exit(1)
elif action == 'add':
Add an IP:PORT member to a pool
add_member(b, pool_objects)
Confirm pool list
res = b.LocalLB.PoolMember.get_session_enabled_state(pool_names = [POOL])
print "States: %s" % res
sys.exit(0)
runtime gives
No handlers could be found for logger "suds.client"
Server raised fault: 'Could not find element by name: address'
Traceback (most recent call last):
File "modify_member.py", line 235, in
add_member(b, pool_objects)
File "modify_member.py", line 185, in add_member
members = [pool_objects])
File "/usr/lib/pymodules/python2.6/suds/client.py", line 539, in __call__
return client.invoke(args, kwargs)
File "/usr/lib/pymodules/python2.6/suds/client.py", line 598, in invoke
result = self.send(msg)
File "/usr/lib/pymodules/python2.6/suds/client.py", line 633, in send
result = self.failed(binding, e)
File "/usr/lib/pymodules/python2.6/suds/client.py", line 684, in failed
r, p = binding.get_fault(reply)
File "/usr/lib/pymodules/python2.6/suds/bindings/binding.py", line 238, in get_fault
raise WebFault(p, faultroot)
suds.WebFault: Server raised fault: 'Could not find element by name: address'
- Global variables, evil.
- remove_member is deprecated, use remove_member_v2 for V11 F5
- You pass global members into session_objects function parameter to delete_member... then you don't reference it. Why?
- You pass global 'members' to "remove_member" API call. It's the wrong type -- you are supposed to pass a sequence of IPPortDefinition.
I have a complete solution I've written for my current employer. Would love it if I could just post it but I don't have that freedom at this point. That being said, something like this works:
def f5_build_address_port_seq(b, addressport):
addressportseq = b.LocalLB.Pool.typefactory.create('Common.AddressPortSequence')
addressportseq.item = addressport
return addressportseq
def f5_build_address_port(b, address, port):
addressport = b.LocalLB.Pool.typefactory.create('Common.AddressPort')
addressport.address = address
addressport.port = port
return addressport
def f5_remove_pool_member_v11(b, poolname, address, port):
addressport = f5_build_address_port(b, address, port)
addressportseq = f5_build_address_port_seq(b, addressport)
b.LocalLB.Pool.remove_member_v2(pool_names=[poolname], members=[addressportseq])
Then you just run:
f5_remove_pool_member_v11(b, poolname, address, port)
As an aside, if I were doing this from scratch, I'd be using bigsuds and not pycontrol.
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
