f5-common-python
f5-common-python copied to clipboard
Loading stats on a resource causes deepcopy loop when updating the resource
When loading a resource (a virtual server for example) and then loading it's statistics causes an error when updating the object again.
We use this way of working when determining if, for example, a virtual server still has open connections, before deleting it.
For example:
from f5.bigip import ManagementRoot
m = ManagementRoot("loadbalancer-x", "admin", "passw0rd", token=True)
vs = m.tm.ltm.virtuals.virtual.load(partition="Common", name="test-vs")
vs.stats.load()
vs.description = "test"
vs.update()
Cause this error:
Traceback (most recent call last):
File "/vagrant/test.py", line 7, in <module>
vs.update()
File "/home/vagrant/.venv/lib/python3.6/site-packages/f5/bigip/tm/ltm/virtual.py", line 78, in update
result = self._update(**kwargs)
File "/home/vagrant/.venv/lib/python3.6/site-packages/f5/bigip/resource.py", line 572, in _update
data_dict = self._prepare_request_json(data_dict)
File "/home/vagrant/.venv/lib/python3.6/site-packages/f5/bigip/resource.py", line 434, in _prepare_request_json
kwargs = self._check_for_python_keywords(kwargs)
File "/home/vagrant/.venv/lib/python3.6/site-packages/f5/bigip/resource.py", line 461, in _check_for_python_keywords
kwargs_copy = copy.deepcopy(kwargs)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 150, in deepcopy
y = copier(x, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/vagrant/.venv/lib/python3.6/copy.py", line 169, in deepcopy
rv = reductor(4)
TypeError: can't pickle property objects
A workaround is deleting the stats object again after having loaded it.
from f5.bigip import ManagementRoot
m = ManagementRoot("loadbalancer-x", "admin", "passw0rd", token=True)
vs = m.tm.ltm.virtuals.virtual.load(partition="Common", name="test-vs")
vs.stats.load()
vs.description = "test"
vs.stats = None # <<<< Deleting the stats again, fixes the problem
vs.update()