From 51de6802f1a425067f813651cc98161ad6e5cc63 Mon Sep 17 00:00:00 2001
From: Ilya Shakhat <shakhat@gmail.com>
Date: Wed, 2 Jan 2019 16:50:13 +0100
Subject: [PATCH] Add integration test for devstack cloud management driver

Change-Id: Ia69a3e28d65289c561d240476514cf0536c39868
---
 os_faults/api/node_collection.py              |  3 ++
 os_faults/drivers/cloud/devstack.py           |  4 +-
 .../tests/devstack/os-faults-devstack.yaml    |  8 ++++
 os_faults/tests/devstack/test_lib.py          | 44 ++++++++++++++++++-
 .../tests/devstack/test_os_inject_fault.py    |  5 +++
 .../tests/unit/api/test_node_collection.py    |  3 ++
 .../tests/unit/drivers/cloud/test_devstack.py |  4 +-
 7 files changed, 65 insertions(+), 6 deletions(-)
 create mode 100644 os_faults/tests/devstack/os-faults-devstack.yaml

diff --git a/os_faults/api/node_collection.py b/os_faults/api/node_collection.py
index e7350e7..6dc9ad7 100644
--- a/os_faults/api/node_collection.py
+++ b/os_faults/api/node_collection.py
@@ -85,6 +85,9 @@ class NodeCollection(utils.ReprMixin):
         for host in self.hosts:
             yield host
 
+    def __getitem__(self, item):
+        return self.hosts[item]
+
     def _make_instance(self, hosts):
         return self.__class__(cloud_management=self.cloud_management,
                               hosts=hosts)
diff --git a/os_faults/drivers/cloud/devstack.py b/os_faults/drivers/cloud/devstack.py
index cd182b2..2cf9cf8 100644
--- a/os_faults/drivers/cloud/devstack.py
+++ b/os_faults/drivers/cloud/devstack.py
@@ -22,7 +22,7 @@ from os_faults.drivers import shared_schemas
 LOG = logging.getLogger(__name__)
 
 
-class DevStackNode(node_collection.NodeCollection):
+class DevStackNodeCollection(node_collection.NodeCollection):
     def connect(self, network_name):
         raise NotImplementedError
 
@@ -62,7 +62,7 @@ class DevStackCloudManagement(cloud_management.CloudManagement,
 
     NAME = 'devstack'
     DESCRIPTION = 'DevStack driver'
-    NODE_CLS = DevStackNode
+    NODE_CLS = DevStackNodeCollection
     SERVICES = {
         'cinder-api': {
             'driver': 'system_service',
diff --git a/os_faults/tests/devstack/os-faults-devstack.yaml b/os_faults/tests/devstack/os-faults-devstack.yaml
new file mode 100644
index 0000000..51ff5ae
--- /dev/null
+++ b/os_faults/tests/devstack/os-faults-devstack.yaml
@@ -0,0 +1,8 @@
+cloud_management:
+  driver: devstack
+  args:
+    address: localhost
+    auth:
+      username: stack
+      private_key_file: os_faults_key
+    iface: lo
diff --git a/os_faults/tests/devstack/test_lib.py b/os_faults/tests/devstack/test_lib.py
index 3ba962a..4df189c 100644
--- a/os_faults/tests/devstack/test_lib.py
+++ b/os_faults/tests/devstack/test_lib.py
@@ -16,11 +16,10 @@ from oslotest import base
 
 import os_faults
 
-
 LOG = logging.getLogger(__name__)
 
 
-class TestOSFaultsLibrary(base.BaseTestCase):
+class TestOSFaultsUniversalDriverLibrary(base.BaseTestCase):
     def test_connection_stack_user(self):
         cloud_config = {
             'cloud_management': {
@@ -46,3 +45,44 @@ class TestOSFaultsLibrary(base.BaseTestCase):
 
         LOG.info('# Verify connection to the cloud')
         cloud_management.verify()
+
+
+class TestOSFaultsDevstackDriverLibrary(base.BaseTestCase):
+    def test_connection_stack_user(self):
+        address = 'localhost'
+        cloud_config = {
+            'cloud_management': {
+                'driver': 'devstack',
+                'args':
+                    {
+                        'address': address,
+                        'iface': 'lo',
+                        'auth': {
+                            'username': 'stack',
+                            'private_key_file': 'os_faults_key'
+                        }
+                    }
+            }
+        }
+
+        LOG.info('# Create connection to the cloud')
+        cloud_management = os_faults.connect(cloud_config)
+        self.assertIsNotNone(cloud_management)
+
+        LOG.info('# Verify connection to the cloud')
+        cloud_management.verify()
+
+        nodes = cloud_management.get_nodes()
+        self.assertEqual(1, len(nodes))
+        self.assertEqual(address, nodes[0].ip)
+
+        service = cloud_management.get_service('etcd')
+        self.assertIsNotNone(service)
+        nodes = service.get_nodes()
+        self.assertEqual(1, len(nodes))
+        self.assertEqual(address, nodes[0].ip)
+
+        selection = nodes.pick()
+        self.assertIsNotNone(selection)
+        self.assertEqual(1, len(selection))
+        self.assertEqual(address, selection[0].ip)
diff --git a/os_faults/tests/devstack/test_os_inject_fault.py b/os_faults/tests/devstack/test_os_inject_fault.py
index 52a42a0..16038c7 100644
--- a/os_faults/tests/devstack/test_os_inject_fault.py
+++ b/os_faults/tests/devstack/test_os_inject_fault.py
@@ -46,3 +46,8 @@ class TestOSInjectFaultUniversalDriver(test.TestCase):
         print('stderr', command_stderr)
         success = re.search('successfully', command_stderr)
         self.assertTrue(success)
+
+
+class TestOSInjectFaultDevstackDriver(TestOSInjectFaultUniversalDriver):
+    CONFIG_FILE = os.path.join(os.path.dirname(__file__),
+                               'os-faults-devstack.yaml')
diff --git a/os_faults/tests/unit/api/test_node_collection.py b/os_faults/tests/unit/api/test_node_collection.py
index ba9d157..0cfc86c 100644
--- a/os_faults/tests/unit/api/test_node_collection.py
+++ b/os_faults/tests/unit/api/test_node_collection.py
@@ -122,6 +122,9 @@ class NodeCollectionTestCase(test.TestCase):
     def test_iter(self):
         self.assertEqual(self.hosts, list(self.node_collection))
 
+    def test_getitem(self):
+        self.assertEqual(self.hosts[0], self.node_collection[0])
+
     def test_get_ips(self):
         self.assertEqual(['10.0.0.2', '10.0.0.3', '10.0.0.4', '10.0.0.5'],
                          self.node_collection.get_ips())
diff --git a/os_faults/tests/unit/drivers/cloud/test_devstack.py b/os_faults/tests/unit/drivers/cloud/test_devstack.py
index 047ce63..6aa0b92 100644
--- a/os_faults/tests/unit/drivers/cloud/test_devstack.py
+++ b/os_faults/tests/unit/drivers/cloud/test_devstack.py
@@ -30,7 +30,7 @@ class DevStackNodeTestCase(test.TestCase):
         self.host = node_collection.Host(
             ip='10.0.0.2', mac='09:7b:74:90:63:c1', fqdn='')
 
-        self.node_collection = devstack.DevStackNode(
+        self.node_collection = devstack.DevStackNodeCollection(
             cloud_management=self.mock_cloud_management,
             hosts=[copy.deepcopy(self.host)])
 
@@ -97,7 +97,7 @@ class DevStackManagementTestCase(test.TestCase):
         ansible_runner_inst.execute.assert_called_once_with(
             [self.host], {'command': 'cat /sys/class/net/eth0/address'})
 
-        self.assertIsInstance(nodes, devstack.DevStackNode)
+        self.assertIsInstance(nodes, devstack.DevStackNodeCollection)
         self.assertEqual(
             [node_collection.Host(ip='10.0.0.2', mac='09:7b:74:90:63:c1',
                                   fqdn='')],