f5-common-python icon indicating copy to clipboard operation
f5-common-python copied to clipboard

Loading stats on a resource causes deepcopy loop when updating the resource

Open jobec opened this issue 6 years ago • 0 comments

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()

jobec avatar Sep 06 '18 08:09 jobec