diff --git a/actions.yaml b/actions.yaml index b260e6ff..ba3537d1 100644 --- a/actions.yaml +++ b/actions.yaml @@ -8,3 +8,5 @@ hugepagereport: description: Report on hugepage configuration and usage security-checklist: description: Validate the running configuration against the OpenStack security guides checklist +virsh-audit: + description: List all domains as virsh sees on the compute node \ No newline at end of file diff --git a/actions/virsh-audit b/actions/virsh-audit new file mode 120000 index 00000000..d07a8d5d --- /dev/null +++ b/actions/virsh-audit @@ -0,0 +1 @@ +virshaudit.py \ No newline at end of file diff --git a/actions/virshaudit.py b/actions/virshaudit.py new file mode 100755 index 00000000..65af968c --- /dev/null +++ b/actions/virshaudit.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# +# Copyright 2020 Canonical Ltd +# +# 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 os +import sys + +_path = os.path.dirname(os.path.realpath(__file__)) +_hooks = os.path.abspath(os.path.join(_path, '../hooks')) + + +def _add_path(path): + if path not in sys.path: + sys.path.insert(1, path) + + +_add_path(_hooks) + + +import subprocess +from charmhelpers.core import hookenv + + +def virsh_audit(): + """ + Return the list of VM instances as virsh sees on the + compute node + """ + outmap = {} + cmd = "virsh list --all" + try: + outmap['virsh-domains'] = subprocess.check_output( + cmd, shell=True).decode('UTF-8') + except subprocess.CalledProcessError as e: + hookenv.log(e) + hookenv.action_fail( + "Getting virsh list report failed: {}".format(e.message) + ) + hookenv.action_set(outmap) + + +if __name__ == '__main__': + virsh_audit() diff --git a/tests/tests.yaml b/tests/tests.yaml index 54d53ee5..db2ce9b5 100644 --- a/tests/tests.yaml +++ b/tests/tests.yaml @@ -46,6 +46,7 @@ tests: - zaza.openstack.charm_tests.nova.tests.CirrosGuestCreateTest - zaza.openstack.charm_tests.nova.tests.LTSGuestCreateTest - zaza.openstack.charm_tests.nova.tests.NovaCompute +- zaza.openstack.charm_tests.nova.tests.NovaComputeActionTest - zaza.openstack.charm_tests.nova.tests.SecurityTests tests_options: diff --git a/unit_tests/test_actions_virsh_audit.py b/unit_tests/test_actions_virsh_audit.py new file mode 100644 index 00000000..1e458c31 --- /dev/null +++ b/unit_tests/test_actions_virsh_audit.py @@ -0,0 +1,36 @@ +# Copyright 2020 Canonical Ltd +# +# 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 mock +from test_utils import CharmTestCase +import virshaudit as actions + + +class MainTestCase(CharmTestCase): + def setUp(self): + pass + + @mock.patch('subprocess.check_output') + @mock.patch('charmhelpers.core.hookenv.action_set') + def test_virsh_audit(self, mock_action_set, mock_check_output): + virsh_output = "1 instance-00000001 running" + mock_check_output.return_value = virsh_output.encode() + dummy_action = [] + mock_action_set.side_effect = dummy_action.append + actions.virsh_audit() + self.assertEqual(len(dummy_action), 1) + d = dummy_action[0] + self.assertIsInstance(d, dict) + self.assert_('virsh-domains' in d) + self.assertEqual(d['virsh-domains'], virsh_output)