Improved integration tests
This merge includes a refactored integration test framework, to better
take advantage of asyncio, and clarifies the test logic so it's easier
to extend in the future. It also supports testing of more complex VNFs,
such as multi-vdu, multi-charm VNFs.
n2vc/vnf.py:
- Remove duplicate status filtering, as it was a poor solution and lead
to situations where some callbacks were not sent.
- Added an internal refcount to track libjuju instantiation (helpful in
debugging)
tests/charms/layers/proxy-ci/reactive/proxy_ci.py:
- Fix name of install function (remove confusion while reading logs)
tests/base.py:
- Add debug() for more consistent and useful logging
- Refactor: remove parse_metrics
- Improved error handling
- Better LXD network connectivity verification
- Refactor test framework:
- Better use of async coded
- Make handling of test phase more robust
- Support more complex test cases, such as multi-vdu, multi-charm
tests/integration/*
- Update to use refactored test framework
Other:
- `make clean` now removes charm artifacts in tests/charms/builds/
- `make lint` now ignores charm artifacts
Signed-off-by: Adam Israel <adam.israel@canonical.com>
Change-Id: I43a6d573a7bafdfe3ccb0bb0f0f7d75dcc9c42b1
diff --git a/n2vc/vnf.py b/n2vc/vnf.py
index df3ec00..8064cb3 100644
--- a/n2vc/vnf.py
+++ b/n2vc/vnf.py
@@ -87,20 +87,14 @@
self.applications[application_name]['callback_args']
if old and new:
- old_status = old.workload_status
- new_status = new.workload_status
-
- if old_status == new_status:
- """The workload status may fluctuate around certain
- events, so wait until the status has stabilized before
- triggering the callback."""
- if callback:
- callback(
- self.ns_name,
- delta.data['application'],
- new_status,
- new.workload_status_message,
- *callback_args)
+ # Fire off a callback with the application state
+ if callback:
+ callback(
+ self.ns_name,
+ delta.data['application'],
+ new.workload_status,
+ new.workload_status_message,
+ *callback_args)
if old and not new:
# This is a charm being removed
@@ -173,6 +167,12 @@
self.connecting = False
self.authenticated = False
+ # For debugging
+ self.refcount = {
+ 'controller': 0,
+ 'model': 0,
+ }
+
self.models = {}
self.default_model = None
@@ -811,6 +811,7 @@
self.models[model_name] = await self.controller.get_model(
model_name,
)
+ self.refcount['model'] += 1
# Create an observer for this model
self.monitors[model_name] = VCAMonitor(model_name)
@@ -846,6 +847,7 @@
password=self.secret,
cacert=cacert,
)
+ self.refcount['controller'] += 1
else:
# current_controller no longer exists
# self.log.debug("Connecting to current controller...")
@@ -860,8 +862,6 @@
self.authenticated = True
self.log.debug("JujuApi: Logged into controller")
- # self.default_model = await self.controller.get_model("default")
-
async def logout(self):
"""Logout of the Juju controller."""
if not self.authenticated:
@@ -873,20 +873,26 @@
self.default_model
))
await self.default_model.disconnect()
+ self.refcount['model'] -= 1
self.default_model = None
for model in self.models:
await self.models[model].disconnect()
- model = None
+ self.refcount['model'] -= 1
+ self.models[model] = None
if self.controller:
self.log.debug("Disconnecting controller {}".format(
self.controller
))
await self.controller.disconnect()
+ self.refcount['controller'] -= 1
self.controller = None
self.authenticated = False
+
+ self.log.debug(self.refcount)
+
except Exception as e:
self.log.fatal(
"Fatal error logging out of Juju Controller: {}".format(e)