Merge "More cleanup for ci directory"
authorFeng Pan <fpan@redhat.com>
Thu, 7 Sep 2017 20:09:46 +0000 (20:09 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Thu, 7 Sep 2017 20:09:46 +0000 (20:09 +0000)
17 files changed:
apex/common/utils.py
apex/deploy.py
apex/tests/config/nova_output.json [new file with mode: 0644]
apex/tests/config/test_overcloudrc [new file with mode: 0644]
apex/tests/constants.py
apex/tests/test_apex_clean.py
apex/tests/test_apex_common_parsers.py [new file with mode: 0644]
apex/tests/test_apex_common_utils.py
apex/tests/test_apex_deploy_settings.py
apex/tests/test_apex_inventory.py
apex/tests/test_apex_ip_utils.py
apex/tests/test_apex_network_environment.py
apex/tests/test_apex_network_settings.py
apex/undercloud/undercloud.py
apex/virtual/virtual_utils.py
lib/ansible/playbooks/configure_undercloud.yml
lib/ansible/playbooks/deploy_overcloud.yml

index 848f264..e21ab83 100644 (file)
@@ -76,7 +76,7 @@ def run_ansible(ansible_vars, playbook, host='localhost', user='root',
     else:
         conn_type = 'smart'
     ansible_command = ['ansible-playbook', '--become', '-i', inv_host,
-                       '-u', user, '-c', conn_type, playbook, '-vvv']
+                       '-u', user, '-c', conn_type, playbook, '-vv']
     if dry_run:
         ansible_command.append('--check')
 
@@ -99,8 +99,8 @@ def run_ansible(ansible_vars, playbook, host='localhost', user='root',
         my_env = os.environ.copy()
         my_env['ANSIBLE_HOST_KEY_CHECKING'] = 'False'
         logging.info("Executing playbook...this may take some time")
-        logging.debug(subprocess.check_output(ansible_command, env=my_env,
-                      stderr=subprocess.STDOUT).decode('utf-8'))
+        logging.info(subprocess.check_output(ansible_command, env=my_env,
+                     stderr=subprocess.STDOUT).decode('utf-8'))
     except subprocess.CalledProcessError as e:
         logging.error("Error executing ansible: {}".format(
             pprint.pformat(e.output.decode('utf-8'))))
index 6866945..1cab0d6 100644 (file)
@@ -13,6 +13,7 @@ import argparse
 import json
 import logging
 import os
+import platform
 import pprint
 import shutil
 import sys
@@ -77,7 +78,6 @@ def build_vms(inventory, network_settings,
         name = 'baremetal{}'.format(idx)
         volume = name + ".qcow2"
         volume_path = os.path.join(constants.LIBVIRT_VOLUME_PATH, volume)
-        # TODO(trozet): add back aarch64
         # TODO(trozet): add error checking
         vm_lib.create_vm(
             name, volume_path,
@@ -357,6 +357,7 @@ def main():
         deploy_vars = dict()
         deploy_vars['virtual'] = args.virtual
         deploy_vars['debug'] = args.debug
+        deploy_vars['aarch64'] = platform.machine() == 'aarch64'
         deploy_vars['dns_server_args'] = ''
         deploy_vars['apex_temp_dir'] = APEX_TEMP_DIR
         deploy_vars['stackrc'] = 'source /home/stack/stackrc'
diff --git a/apex/tests/config/nova_output.json b/apex/tests/config/nova_output.json
new file mode 100644 (file)
index 0000000..1348ef2
--- /dev/null
@@ -0,0 +1,23 @@
+[
+  {
+    "Status": "ACTIVE",
+    "Networks": "ctlplane=192.30.9.9",
+    "ID": "a5ff8aeb-5fd0-467f-9d89-791dfbc6267b",
+    "Image Name": "overcloud-full",
+    "Name": "overcloud-novacompute-1"
+  },
+  {
+    "Status": "ACTIVE",
+    "Networks": "ctlplane=192.30.9.10",
+    "ID": "c8be26ae-6bef-4841-bb03-c7f336cfd785",
+    "Image Name": "overcloud-full",
+    "Name": "overcloud-novacompute-0"
+  },
+  {
+    "Status": "ACTIVE",
+    "Networks": "ctlplane=192.30.9.8",
+    "ID": "105d1c61-78d3-498f-9191-6b21823b8544",
+    "Image Name": "overcloud-full",
+    "Name": "overcloud-controller-0"
+  }
+]
diff --git a/apex/tests/config/test_overcloudrc b/apex/tests/config/test_overcloudrc
new file mode 100644 (file)
index 0000000..2707184
--- /dev/null
@@ -0,0 +1,17 @@
+# Clear any old environment that may conflict.
+for key in $( set | awk '{FS="="}  /^OS_/ {print $1}' ); do unset $key ; done
+export OS_USERNAME=admin
+export OS_BAREMETAL_API_VERSION=1.29
+export NOVA_VERSION=1.1
+export OS_PROJECT_NAME=admin
+export OS_PASSWORD=Wd8ruyf6qG8cmcms6dq2HM93f
+export OS_NO_CACHE=True
+export COMPUTE_API_VERSION=1.1
+export no_proxy=,172.30.9.29,192.30.9.5
+export OS_CLOUDNAME=overcloud
+export OS_AUTH_URL=http://172.30.9.29:5000/v2.0
+export IRONIC_API_VERSION=1.29
+export OS_AUTH_TYPE=password
+export PYTHONWARNINGS="ignore:Certificate has no, ignore:A true SSLContext object is not available"
+export OS_PROJECT_ID=4695721d82c1421094005ef4ab86d33a
+export OS_TENANT_NAME=admin
index 47e63e2..eec6429 100644 (file)
@@ -10,3 +10,4 @@
 TEST_CONFIG_DIR = 'config'
 TEST_BUILD_DIR = 'build'
 TEST_PLAYBOOK_DIR = 'playbooks'
+TEST_DUMMY_CONFIG = 'apex/tests/config'
index d0b8791..7b7df51 100644 (file)
@@ -16,16 +16,16 @@ from nose import tools
 from apex import clean_nodes
 
 
-class TestClean(object):
+class TestClean:
     @classmethod
-    def setup_class(klass):
+    def setup_class(cls):
         """This method is run once for each class before any tests are run"""
 
     @classmethod
-    def teardown_class(klass):
+    def teardown_class(cls):
         """This method is run once for each class _after_ all tests are run"""
 
-    def setUp(self):
+    def setup(self):
         """This method is run once before _each_ test method is executed"""
 
     def teardown(self):
diff --git a/apex/tests/test_apex_common_parsers.py b/apex/tests/test_apex_common_parsers.py
new file mode 100644 (file)
index 0000000..bed2a8c
--- /dev/null
@@ -0,0 +1,54 @@
+##############################################################################
+# Copyright (c) 2016 Dan Radez (Red Hat)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import os
+
+from apex.tests import constants as con
+from apex.common import parsers as apex_parsers
+from nose.tools import (
+    assert_is_instance,
+    assert_dict_equal
+)
+
+
+class TestCommonParsers:
+    @classmethod
+    def setup_class(cls):
+        """This method is run once for each class before any tests are run"""
+
+    @classmethod
+    def teardown_class(cls):
+        """This method is run once for each class _after_ all tests are run"""
+
+    def setup(self):
+        """This method is run once before _each_ test method is executed"""
+
+    def teardown(self):
+        """This method is run once after _each_ test method is executed"""
+
+    def test_parse_nova_output(self):
+        output = apex_parsers.parse_nova_output(
+            os.path.join(con.TEST_DUMMY_CONFIG, 'nova_output.json'))
+        assert_is_instance(output, dict)
+        nodes = {
+            'overcloud-controller-0': '192.30.9.8',
+            'overcloud-novacompute-0': '192.30.9.10',
+            'overcloud-novacompute-1': '192.30.9.9'
+        }
+        print(output)
+        assert_dict_equal(output, nodes)
+
+    def test_parse_overcloudrc(self):
+        output = apex_parsers.parse_overcloudrc(
+            os.path.join(con.TEST_DUMMY_CONFIG, 'test_overcloudrc'))
+        assert_is_instance(output, dict)
+        assert 'OS_AUTH_TYPE' in output.keys()
+        assert output['OS_AUTH_TYPE'] == 'password'
+        assert 'OS_PASSWORD' in output.keys()
+        assert output['OS_PASSWORD'] == 'Wd8ruyf6qG8cmcms6dq2HM93f'
index 357ad1b..12aeaf2 100644 (file)
@@ -8,7 +8,6 @@
 ##############################################################################
 
 import ipaddress
-import nose.tools
 import os
 
 from apex.common import utils
@@ -17,43 +16,47 @@ from apex.tests.constants import (
     TEST_CONFIG_DIR,
     TEST_PLAYBOOK_DIR)
 
+from nose.tools import (
+    assert_equal,
+    assert_is_instance,
+    assert_not_is_instance)
+
 NET_SETS = os.path.join(TEST_CONFIG_DIR, 'network', 'network_settings.yaml')
 
 
-class TestCommonUtils(object):
+class TestCommonUtils:
     @classmethod
-    def setup_class(klass):
+    def setup_class(cls):
         """This method is run once for each class before any tests are run"""
 
     @classmethod
-    def teardown_class(klass):
+    def teardown_class(cls):
         """This method is run once for each class _after_ all tests are run"""
 
-    def setUp(self):
+    def setup(self):
         """This method is run once before _each_ test method is executed"""
 
     def teardown(self):
         """This method is run once after _each_ test method is executed"""
 
     def test_str2bool(self):
-        nose.tools.assert_equal(utils.str2bool(True), True)
-        nose.tools.assert_equal(utils.str2bool(False), False)
-        nose.tools.assert_equal(utils.str2bool("True"), True)
-        nose.tools.assert_equal(utils.str2bool("YES"), True)
+        assert_equal(utils.str2bool(True), True)
+        assert_equal(utils.str2bool(False), False)
+        assert_equal(utils.str2bool("True"), True)
+        assert_equal(utils.str2bool("YES"), True)
 
     def test_parse_yaml(self):
-        nose.tools.assert_is_instance(utils.parse_yaml(NET_SETS), dict)
+        assert_is_instance(utils.parse_yaml(NET_SETS), dict)
 
     def test_dict_to_string(self):
         net_settings = NetworkSettings(NET_SETS)
         output = utils.dict_objects_to_str(net_settings)
-        nose.tools.assert_is_instance(output, dict)
+        assert_is_instance(output, dict)
         for k, v in output.items():
-            nose.tools.assert_is_instance(k, str)
-            nose.tools.assert_not_is_instance(v, ipaddress.IPv4Address)
+            assert_is_instance(k, str)
+            assert_not_is_instance(v, ipaddress.IPv4Address)
 
     def test_run_ansible(self):
         playbook = 'apex/tests/playbooks/test_playbook.yaml'
-        nose.tools.assert_equal(
-            utils.run_ansible(None, os.path.join(playbook),
-                              dry_run=True), None)
+        assert_equal(utils.run_ansible(None, os.path.join(playbook),
+                                       dry_run=True), None)
index 312c1f3..0338087 100644 (file)
@@ -64,16 +64,16 @@ deploy_options:
 """,)
 
 
-class TestIpUtils(object):
+class TestIpUtils:
     @classmethod
-    def setup_class(klass):
+    def setup_class(cls):
         """This method is run once for each class before any tests are run"""
 
     @classmethod
-    def teardown_class(klass):
+    def teardown_class(cls):
         """This method is run once for each class _after_ all tests are run"""
 
-    def setUp(self):
+    def setup(self):
         """This method is run once before _each_ test method is executed"""
 
     def teardown(self):
index ed95c53..cca8068 100644 (file)
@@ -8,13 +8,11 @@
 ##############################################################################
 
 import os
-import sys
-from io import StringIO
 
-from nose.tools import assert_equal
-from nose.tools import assert_is_instance
-from nose.tools import assert_raises
-from nose.tools import assert_regexp_matches
+from nose.tools import (
+    assert_equal,
+    assert_is_instance,
+    assert_raises)
 
 from apex import Inventory
 from apex.inventory.inventory import InventoryException
@@ -27,16 +25,16 @@ inventory_files = ('intel_pod2_settings.yaml',
 files_dir = os.path.join(TEST_CONFIG_DIR, 'inventory')
 
 
-class TestInventory(object):
+class TestInventory:
     @classmethod
-    def setup_class(klass):
+    def setup_class(cls):
         """This method is run once for each class before any tests are run"""
 
     @classmethod
-    def teardown_class(klass):
+    def teardown_class(cls):
         """This method is run once for each class _after_ all tests are run"""
 
-    def setUp(self):
+    def setup(self):
         """This method is run once before _each_ test method is executed"""
 
     def teardown(self):
index 04a1b2b..eb4549d 100644 (file)
@@ -12,19 +12,21 @@ import re
 from ipaddress import IPv4Address
 from ipaddress import ip_network
 
-from nose.tools import assert_equal
-from nose.tools import assert_false
-from nose.tools import assert_is_instance
-from nose.tools import assert_raises
-from nose.tools import assert_regexp_matches
-from nose.tools import assert_true
-
-from apex.network.ip_utils import IPUtilsException
-from apex.network.ip_utils import _validate_ip_range
-from apex.network.ip_utils import find_gateway
-from apex.network.ip_utils import get_interface
-from apex.network.ip_utils import get_ip
-from apex.network.ip_utils import get_ip_range
+from nose.tools import (
+    assert_equal,
+    assert_false,
+    assert_is_instance,
+    assert_raises,
+    assert_regexp_matches,
+    assert_true)
+
+from apex.network.ip_utils import (
+    IPUtilsException,
+    _validate_ip_range,
+    find_gateway,
+    get_interface,
+    get_ip,
+    get_ip_range)
 
 ip4_pattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
 ip4_range_pattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3},\d{1,'
@@ -40,19 +42,19 @@ def get_default_gateway_linux():
                 return fields[0]
 
 
-class TestIpUtils(object):
+class TestIpUtils:
     @classmethod
-    def setup_class(klass):
+    def setup_class(cls):
         """This method is run once for each class before any tests are run"""
-        klass.iface_name = get_default_gateway_linux()
-        iface = get_interface(klass.iface_name)
-        klass.iface = iface
+        cls.iface_name = get_default_gateway_linux()
+        iface = get_interface(cls.iface_name)
+        cls.iface = iface
 
     @classmethod
-    def teardown_class(klass):
+    def teardown_class(cls):
         """This method is run once for each class _after_ all tests are run"""
 
-    def setUp(self):
+    def setup(self):
         """This method is run once before _each_ test method is executed"""
 
     def teardown(self):
index 5047adb..4e3ae11 100644 (file)
@@ -11,10 +11,11 @@ import os
 
 from copy import copy
 
-from nose.tools import assert_equal
-from nose.tools import assert_is_instance
-from nose.tools import assert_not_equal
-from nose.tools import assert_raises
+from nose.tools import (
+    assert_equal,
+    assert_is_instance,
+    assert_not_equal,
+    assert_raises)
 
 from apex.common.constants import (
     EXTERNAL_NETWORK,
@@ -29,23 +30,23 @@ from apex.tests.constants import TEST_CONFIG_DIR
 from apex.tests.constants import TEST_BUILD_DIR
 
 
-class TestNetworkEnvironment(object):
+class TestNetworkEnvironment:
     @classmethod
-    def setup_class(klass):
+    def setup_class(cls):
         """This method is run once for each class before any tests are run"""
-        klass.ns = NetworkSettings(
+        cls.ns = NetworkSettings(
             os.path.join(TEST_CONFIG_DIR, 'network/network_settings.yaml'))
-        klass.ns_vlans = NetworkSettings(
+        cls.ns_vlans = NetworkSettings(
             os.path.join(TEST_CONFIG_DIR,
                          'network/network_settings_vlans.yaml'))
-        klass.ns_ipv6 = NetworkSettings(
+        cls.ns_ipv6 = NetworkSettings(
             os.path.join(TEST_CONFIG_DIR, 'network/network_settings_v6.yaml'))
 
     @classmethod
     def teardown_class(klass):
         """This method is run once for each class _after_ all tests are run"""
 
-    def setUp(self):
+    def setup(self):
         """This method is run once before _each_ test method is executed"""
 
     def teardown(self):
index adff8cf..5e2fa07 100644 (file)
@@ -27,16 +27,16 @@ from apex.tests.constants import TEST_CONFIG_DIR
 files_dir = os.path.join(TEST_CONFIG_DIR, 'network')
 
 
-class TestNetworkSettings(object):
+class TestNetworkSettings:
     @classmethod
-    def setup_class(klass):
+    def setup_class(cls):
         """This method is run once for each class before any tests are run"""
 
     @classmethod
-    def teardown_class(klass):
+    def teardown_class(cls):
         """This method is run once for each class _after_ all tests are run"""
 
-    def setUp(self):
+    def setup(self):
         """This method is run once before _each_ test method is executed"""
 
     def teardown(self):
index da695f5..513c419 100644 (file)
@@ -10,6 +10,7 @@
 import libvirt
 import logging
 import os
+import platform
 import shutil
 import subprocess
 import time
@@ -215,7 +216,7 @@ class Undercloud:
             "enabled": ns_external['enabled']
         }
 
-        # FIXME (trozet): for now hardcoding aarch64 to false
-        config['aarch64'] = False
+        # Check if this is an ARM deployment
+        config['aarch64'] = platform.machine() == 'aarch64'
 
         return config
index 5ebb058..4582dbc 100644 (file)
@@ -11,6 +11,7 @@ import copy
 import iptc
 import logging
 import os
+import platform
 import pprint
 import subprocess
 
@@ -26,7 +27,7 @@ DEFAULT_VIRT_IP = '192.168.122.1'
 
 
 def generate_inventory(target_file, ha_enabled=False, num_computes=1,
-                       controller_ram=DEFAULT_RAM, arch='x86_64',
+                       controller_ram=DEFAULT_RAM, arch=platform.machine(),
                        compute_ram=DEFAULT_RAM, vcpus=4):
     """
     Generates inventory file for virtual deployments
index f19218c..91a8f9a 100644 (file)
@@ -45,7 +45,7 @@
     - lineinfile:
         path: /usr/lib/python2.7/site-packages/ironic/common/pxe_utils.py
         regexp: '_link_ip_address_pxe_configs'
-        line: '_link_mac_pxe_configs(task)'
+        line: '        _link_mac_pxe_configs(task)'
       when: aarch64
     - block:
         - name: undercloud install
index a16c81f..19e4638 100644 (file)
       become: yes
       become_user: stack
     - name: Import inventory (baremetal)
-      shell: "{{ stackrc }} && {{ item }}"
-      with_items:
-        - openstack overcloud node import instackenv.json
-        - openstack overcloud node introspect --all-manageable --provide
+      shell: "{{ stackrc }} && openstack overcloud node import instackenv.json"
       when: not virtual
+    - name: Introspect inventory (baremetal)
+      shell: "{{ stackrc }} && openstack overcloud node introspect --all-manageable --provide"
+      when:
+        - not virtual
+        - not aarch64
     - name: Import inventory (virtual)
       shell: "{{ stackrc }} && openstack overcloud node import --provide instackenv.json"
       when: virtual