Fix random failing of test_init_monitoring test
The existing unit test case [1] is failing randomly [2]
when both test modules `test_plugin` and `test_monitoring`
runs in a single worker.
Reason: VNFMonitor class is using singleton pattern.
In above test modules same object of VNFMonitor class
is returned from __new__ method but internally it makes
a call __init__ explicitly.
Since we are not initializing `_hosting_vnfs` attribute in
the __init__ method, when we try to access __hosting_vnf in
the second test `test_plugin`, it finds two vnf objects.
This issue is fixed in this patch by reinitializing the
`_hosting_vnfs` class level attribute as empty dict in the
test_init_monitoring unit test.
[1]: https://github.com/openstack/tacker/blob/master/tacker/tests/unit/vnfm/test_plugin.py#L75
[2]: http://logs.openstack.org/10/609610/9/check/openstack-tox-py35/b99de12/testr_results.html.gz
Change-Id: I2a5933ed21e478e860cb12b378a4368f9402291d
(cherry picked from commit 4b9bcfeeef
)
This commit is contained in:
parent
1abe8701e9
commit
e855062154
|
@ -29,6 +29,7 @@ from tacker.extensions import vnfm
|
|||
from tacker.plugins.common import constants
|
||||
from tacker.tests.unit.db import base as db_base
|
||||
from tacker.tests.unit.db import utils
|
||||
from tacker.vnfm import monitor
|
||||
from tacker.vnfm import plugin
|
||||
|
||||
|
||||
|
@ -110,6 +111,12 @@ class TestVNFMPluginMonitor(db_base.SqlTestCase):
|
|||
}]
|
||||
|
||||
mock_get_vnfs.return_value = vnfs
|
||||
# NOTE(bhagyashris): VNFMonitor class is using a singleton pattern
|
||||
# and '_hosting_vnfs' is defined as a class level attribute.
|
||||
# If one of the unit test adds a VNF to monitor it will show up here
|
||||
# provided both the unit tests runs in the same process.
|
||||
# Hence, you must reinitialize '_hosting_vnfs' to empty dict.
|
||||
monitor.VNFMonitor._hosting_vnfs = dict()
|
||||
vnfm_plugin = plugin.VNFMPlugin()
|
||||
hosting_vnfs = vnfm_plugin._vnf_monitor._hosting_vnfs.values()
|
||||
hosting_vnf = hosting_vnfs[0]['vnf']
|
||||
|
|
|
@ -95,7 +95,7 @@ class VNFMonitor(object):
|
|||
time.sleep(self._status_check_intvl)
|
||||
|
||||
with self._lock:
|
||||
for hosting_vnf in self._hosting_vnfs.values():
|
||||
for hosting_vnf in VNFMonitor._hosting_vnfs.values():
|
||||
if hosting_vnf.get('dead', False):
|
||||
LOG.debug('monitor skips dead vnf %s', hosting_vnf)
|
||||
continue
|
||||
|
@ -120,7 +120,7 @@ class VNFMonitor(object):
|
|||
'ips': new_vnf['management_ip_addresses']})
|
||||
new_vnf['boot_at'] = timeutils.utcnow()
|
||||
with self._lock:
|
||||
self._hosting_vnfs[new_vnf['id']] = new_vnf
|
||||
VNFMonitor._hosting_vnfs[new_vnf['id']] = new_vnf
|
||||
|
||||
attrib_dict = new_vnf['vnf']['attributes']
|
||||
mon_policy_dict = attrib_dict['monitoring_policy']
|
||||
|
@ -132,7 +132,7 @@ class VNFMonitor(object):
|
|||
def delete_hosting_vnf(self, vnf_id):
|
||||
LOG.debug('deleting vnf_id %(vnf_id)s', {'vnf_id': vnf_id})
|
||||
with self._lock:
|
||||
hosting_vnf = self._hosting_vnfs.pop(vnf_id, None)
|
||||
hosting_vnf = VNFMonitor._hosting_vnfs.pop(vnf_id, None)
|
||||
if hosting_vnf:
|
||||
LOG.debug('deleting vnf_id %(vnf_id)s, Mgmt IP %(ips)s',
|
||||
{'vnf_id': vnf_id,
|
||||
|
@ -175,7 +175,7 @@ class VNFMonitor(object):
|
|||
hosting_vnf['action_cb'](action)
|
||||
|
||||
def mark_dead(self, vnf_id):
|
||||
self._hosting_vnfs[vnf_id]['dead'] = True
|
||||
VNFMonitor._hosting_vnfs[vnf_id]['dead'] = True
|
||||
|
||||
def _invoke(self, driver, **kwargs):
|
||||
method = inspect.stack()[1][3]
|
||||
|
|
Loading…
Reference in New Issue