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/tests/integration/test_charm_native.py b/tests/integration/test_charm_native.py
index d1b60ff..85a282e 100644
--- a/tests/integration/test_charm_native.py
+++ b/tests/integration/test_charm_native.py
@@ -3,7 +3,6 @@
 """
 
 import asyncio
-import logging
 import pytest
 from .. import base
 
@@ -133,9 +132,10 @@
                     loop=event_loop,
                 )
 
-            while self.running():
-                logging.debug("Waiting for test to finish...")
+            while await self.running():
+                print("Waiting for test to finish...")
                 await asyncio.sleep(15)
-            logging.debug("test_charm_native stopped")
+
+            print("test_charm_native stopped")
 
         return 'ok'
diff --git a/tests/integration/test_charm_proxy.py b/tests/integration/test_charm_proxy.py
index c1661ac..a05df5f 100644
--- a/tests/integration/test_charm_proxy.py
+++ b/tests/integration/test_charm_proxy.py
@@ -134,9 +134,9 @@
                     event_loop,
                 )
 
-            while self.running():
-                logging.debug("Waiting for test to finish...")
+            while await self.running():
+                print("Waiting for test to finish...")
                 await asyncio.sleep(15)
-            logging.debug("test_charm_native stopped")
+            logging.debug("test_charm_proxy stopped")
 
         return 'ok'
diff --git a/tests/integration/test_metrics_native.py b/tests/integration/test_metrics_native.py
index 74faebf..4288915 100644
--- a/tests/integration/test_metrics_native.py
+++ b/tests/integration/test_metrics_native.py
@@ -136,9 +136,10 @@
                     event_loop,
                 )
 
-            while self.running():
-                logging.debug("Waiting for test to finish...")
+            while await self.running():
+                print("Waiting for test to finish...")
                 await asyncio.sleep(15)
+
             logging.debug("test_metrics_native stopped")
 
         return 'ok'
diff --git a/tests/integration/test_metrics_proxy.py b/tests/integration/test_metrics_proxy.py
index 98285fd..e7fa920 100644
--- a/tests/integration/test_metrics_proxy.py
+++ b/tests/integration/test_metrics_proxy.py
@@ -130,8 +130,8 @@
                     event_loop,
                 )
 
-            while self.running():
-                logging.debug("Waiting for test to finish...")
+            while await self.running():
+                print("Waiting for test to finish...")
                 await asyncio.sleep(15)
 
             logging.debug("test_metrics_proxy stopped")
diff --git a/tests/integration/test_multivdu_multicharm.py b/tests/integration/test_multivdu_multicharm.py
index 99ba878..e0fb9c7 100644
--- a/tests/integration/test_multivdu_multicharm.py
+++ b/tests/integration/test_multivdu_multicharm.py
@@ -170,9 +170,10 @@
                 )
                 vnf_index += 1
 
-            while self.running():
+            while await self.running():
                 logging.debug("Waiting for test to finish...")
                 await asyncio.sleep(15)
-            logging.debug("test_charm_native stopped")
+            # assert False
+            logging.debug("test_multivdu_multicharm stopped")
 
         return 'ok'
diff --git a/tests/integration/test_no_initial_config_primitive.py b/tests/integration/test_no_initial_config_primitive.py
index e66a695..0d90205 100644
--- a/tests/integration/test_no_initial_config_primitive.py
+++ b/tests/integration/test_no_initial_config_primitive.py
@@ -133,9 +133,10 @@
                     event_loop,
                 )
 
-            while self.running():
-                logging.debug("Waiting for test to finish...")
+            while await self.running():
+                print("Waiting for test to finish...")
                 await asyncio.sleep(15)
-            logging.debug("test_charm_native stopped")
+
+            logging.debug("test_charm_no_initial_config_primitive stopped")
 
         return 'ok'
diff --git a/tests/integration/test_no_parameter.py b/tests/integration/test_no_parameter.py
index 39c2443..55c2c3a 100644
--- a/tests/integration/test_no_parameter.py
+++ b/tests/integration/test_no_parameter.py
@@ -133,10 +133,8 @@
                     event_loop,
                 )
 
-            while self.running():
-                logging.debug("Waiting for test to finish...")
+            while await self.running():
+                print("Waiting for test to finish...")
                 await asyncio.sleep(15)
-            logging.debug("test_charm_native stopped")
-            await self.n2vc.logout()
 
         return 'ok'
diff --git a/tests/integration/test_non_string_parameter.py b/tests/integration/test_non_string_parameter.py
index ed3dfc7..b93dfed 100644
--- a/tests/integration/test_non_string_parameter.py
+++ b/tests/integration/test_non_string_parameter.py
@@ -139,9 +139,9 @@
                     event_loop,
                 )
 
-            while self.running():
-                logging.debug("Waiting for test to finish...")
+            while await self.running():
+                print("Waiting for test to finish...")
                 await asyncio.sleep(15)
-            logging.debug("test_charm_native stopped")
+            logging.debug("test_charm_non_string_parameter stopped")
 
         return 'ok'