Tox + Integration testing
This commit implements a VNF Descriptor-driven integration
test framework, which will lead to integration tests being able
to run via jenkins, and more robust testing in general.
N2VC:
- Allow the use of an event loop passed when instantiating N2VC
- Refactor the execution of the initial-config-primitive so that it can
be easily re-run, such as the case of when a proxy charm is deployed
before the VNF's VM is created.
- Refactor GetPrimitiveStatus, to return the status (queued, running,
complete, failed) of a primitive.
- Add GetPrimitiveOutput, to return the output of a completed primitive
- Fix model disconnection when executing a primitive (it was happening
in the wrong scope)
- Fix wait_for_application, which was previously unused and broken
- Add support for parameter's 'data-type' field
- Add support for better SSH key management, allowing for a proxy charm
to be deployed before the VNF, so that it's public SSH key can be
injected when the VNF's VM is created.
Integration Tests:
The integration tests are intended to exercise the expected
functionality of a VNF/charm: deploy the charm, configure it as required
(i.e., ssh credentials), and execute the VNF's
initial-config-primitives.
- test_native_charm: deploy a native charm to a juju-managed machine and
verify primitive execution works
- test_proxy_charm: deploy a proxy charm, configured to talk to a remote
machine, and verify primitive execution works
- test_metrics_native: deploy a native charm and collect a metric
- test_metrics_proxy: deploy a proxy charm and collect a metric from the
vnf
- test_no_initial-config-primitive: deploy a vnf without an
initial-config-primitive
- test_non-string_parameter: deploy a vnf with a non-string parameter in
initial-config-primitive
- test_no_parameter: deploy a vnf with a primitive with no parameters
General:
- Add a build target to tox.ini so that a .deb is built via Jenkins
TODO (in a follow-up commit):
- test multi-vdu, multi-charm
- test deploying a native charm to a manually-provisioned machine
- Update inline pydoc
- Add more integration tests
- Add global per-test timeout to catch stalled tests
Signed-off-by: Adam Israel <adam.israel@canonical.com>
Change-Id: Id322b45d65c44714e8051fc5764f8c20b76d846c
diff --git a/tests/charms/layers/proxy-ci/README.md b/tests/charms/layers/proxy-ci/README.md
new file mode 100644
index 0000000..c16d9d8
--- /dev/null
+++ b/tests/charms/layers/proxy-ci/README.md
@@ -0,0 +1,3 @@
+# Overview
+
+A `charm layer` to test the functionality of proxy charms.
diff --git a/tests/charms/layers/proxy-ci/actions.yaml b/tests/charms/layers/proxy-ci/actions.yaml
new file mode 100644
index 0000000..5af8591
--- /dev/null
+++ b/tests/charms/layers/proxy-ci/actions.yaml
@@ -0,0 +1,2 @@
+test:
+ description: "Verify that the action can run."
diff --git a/tests/charms/layers/proxy-ci/actions/test b/tests/charms/layers/proxy-ci/actions/test
new file mode 100755
index 0000000..7e30af4
--- /dev/null
+++ b/tests/charms/layers/proxy-ci/actions/test
@@ -0,0 +1,33 @@
+#!/usr/bin/env python3
+##
+# Copyright 2016 Canonical Ltd.
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+##
+import sys
+sys.path.append('lib')
+
+from charms.reactive import main, set_flag
+from charmhelpers.core.hookenv import action_fail, action_name
+
+"""
+`set_state` only works here because it's flushed to disk inside the `main()`
+loop. remove_state will need to be called inside the action method.
+"""
+set_flag('actions.{}'.format(action_name()))
+
+try:
+ main()
+except Exception as e:
+ action_fail(repr(e))
diff --git a/tests/charms/layers/proxy-ci/layer.yaml b/tests/charms/layers/proxy-ci/layer.yaml
new file mode 100644
index 0000000..790dee6
--- /dev/null
+++ b/tests/charms/layers/proxy-ci/layer.yaml
@@ -0,0 +1,4 @@
+includes:
+ - 'layer:basic'
+ - 'layer:vnfproxy'
+ - 'layer:sshproxy'
diff --git a/tests/charms/layers/proxy-ci/metadata.yaml b/tests/charms/layers/proxy-ci/metadata.yaml
new file mode 100644
index 0000000..b96abe4
--- /dev/null
+++ b/tests/charms/layers/proxy-ci/metadata.yaml
@@ -0,0 +1,12 @@
+name: proxy-ci
+summary: <Fill in summary here>
+maintainer: Adam Israel <Adam.Israel@ronin>
+description: |
+ <Multi-line description here>
+tags:
+ # Replace "misc" with one or more whitelisted tags from this list:
+ # https://jujucharms.com/docs/stable/authors-charm-metadata
+ - misc
+subordinate: false
+series:
+ - xenial
diff --git a/tests/charms/layers/proxy-ci/reactive/proxy_ci.py b/tests/charms/layers/proxy-ci/reactive/proxy_ci.py
new file mode 100644
index 0000000..30e4eea
--- /dev/null
+++ b/tests/charms/layers/proxy-ci/reactive/proxy_ci.py
@@ -0,0 +1,34 @@
+from charmhelpers.core.hookenv import (
+ action_fail,
+ action_set,
+ status_set,
+)
+from charms.reactive import (
+ set_flag,
+ clear_flag,
+ when_not,
+ when,
+)
+import charms.sshproxy
+
+
+@when_not('proxy-ci.installed')
+def install_metrics_ci():
+ status_set('blocked', "Waiting for SSH credentials.")
+ set_flag('proxy-ci.installed')
+
+
+@when('actions.test', 'proxy-ci.installed')
+def test():
+ err = ''
+ try:
+ cmd = ['hostname']
+ result, err = charms.sshproxy._run(cmd)
+ if len(result) == 0:
+ raise Exception("Proxy failed")
+ except Exception as e:
+ action_fail('command failed: {}'.format(e))
+ else:
+ action_set({'output': result})
+ finally:
+ clear_flag('actions.test')