Fixes deployment on CentOS 7.6
[apex.git] / apex / tests / test_apex_overcloud_deploy.py
index 17911d5..79dbf54 100644 (file)
@@ -7,6 +7,7 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
+import mock
 import os
 import sys
 import unittest
@@ -29,7 +30,7 @@ from apex.overcloud.deploy import prep_sriov_env
 from apex.overcloud.deploy import external_network_cmds
 from apex.overcloud.deploy import create_congress_cmds
 from apex.overcloud.deploy import SDN_FILE_MAP
-from apex.overcloud.deploy import get_docker_sdn_file
+from apex.overcloud.deploy import get_docker_sdn_files
 
 from nose.tools import (
     assert_regexp_matches,
@@ -133,6 +134,7 @@ class TestOvercloudDeploy(unittest.TestCase):
                'tacker': False,
                'containers': True,
                'barometer': False,
+               'vpn': False,
                'ceph': True,
                'sdn_controller': 'opendaylight',
                'sriov': False,
@@ -154,7 +156,6 @@ class TestOvercloudDeploy(unittest.TestCase):
         assert_in('--control-scale 3', result_cmd)
         assert_in('--compute-scale 2', result_cmd)
         assert_in('docker-images.yaml', result_cmd)
-        assert_in('sdn-images.yaml', result_cmd)
         assert_in('/usr/share/openstack-tripleo-heat-templates/environments'
                   '/docker.yaml', result_cmd)
         assert_in('/usr/share/openstack-tripleo-heat-templates/environments/'
@@ -192,33 +193,18 @@ class TestOvercloudDeploy(unittest.TestCase):
         assert_not_in('enable_congress.yaml', result_cmd)
         assert_not_in('enable_barometer.yaml', result_cmd)
 
-    @patch('apex.overcloud.deploy.prep_sriov_env')
-    @patch('apex.overcloud.deploy.prep_storage_env')
-    @patch('apex.overcloud.deploy.build_sdn_env_list')
-    def test_create_deploy_cmd_raises(self, mock_sdn_list, mock_prep_storage,
-                                      mock_prep_sriov):
-        mock_sdn_list.return_value = []
-        ds = {'deploy_options': MagicMock(),
-              'global_params': MagicMock()}
-        ds['deploy_options'].__getitem__.side_effect = \
-            lambda i: 'master' if i == 'os_version' else MagicMock()
-        ns = {}
-        inv = MagicMock()
-        inv.get_node_counts.return_value = (0, 0)
-        virt = False
-        assert_raises(ApexDeployException, create_deploy_cmd,
-                      ds, ns, inv, '/tmp', virt)
-
     @patch('apex.builders.overcloud_builder.inject_opendaylight')
     @patch('apex.overcloud.deploy.virt_utils')
     @patch('apex.overcloud.deploy.shutil')
-    @patch('apex.overcloud.deploy.os.path')
+    @patch('apex.overcloud.deploy.os.path.isfile')
     @patch('builtins.open', mock_open())
-    def test_prep_image(self, mock_os_path, mock_shutil, mock_virt_utils,
+    def test_prep_image(self, mock_is_file, mock_shutil, mock_virt_utils,
                         mock_inject_odl):
+        mock_is_file.return_value = True
         ds_opts = {'dataplane': 'fdio',
                    'sdn_controller': 'opendaylight',
                    'odl_version': 'master',
+                   'vpn': False,
                    'sriov': False}
         ds = {'deploy_options': MagicMock(),
               'global_params': MagicMock()}
@@ -231,11 +217,13 @@ class TestOvercloudDeploy(unittest.TestCase):
 
     @patch('apex.overcloud.deploy.virt_utils')
     @patch('apex.overcloud.deploy.shutil')
-    @patch('apex.overcloud.deploy.os.path')
+    @patch('apex.overcloud.deploy.os.path.isfile')
     @patch('builtins.open', mock_open())
-    def test_prep_image_sdn_false(self, mock_os_path, mock_shutil,
+    def test_prep_image_sdn_false(self, mock_is_file, mock_shutil,
                                   mock_virt_utils):
+        mock_is_file.return_value = True
         ds_opts = {'dataplane': 'fdio',
+                   'vpn': False,
                    'sdn_controller': False}
         ds = {'deploy_options': MagicMock(),
               'global_params': MagicMock()}
@@ -245,15 +233,21 @@ class TestOvercloudDeploy(unittest.TestCase):
         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
         mock_virt_utils.virt_customize.assert_called()
 
+    @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
+    @patch('apex.overcloud.deploy.utils.fetch_upstream_and_unpack')
     @patch('apex.builders.overcloud_builder.inject_opendaylight')
     @patch('apex.overcloud.deploy.virt_utils')
     @patch('apex.overcloud.deploy.shutil')
-    @patch('apex.overcloud.deploy.os.path')
+    @patch('apex.overcloud.deploy.os.path.isfile')
     @patch('builtins.open', mock_open())
-    def test_prep_image_sdn_odl(self, mock_os_path, mock_shutil,
-                                mock_virt_utils, mock_inject_odl):
+    def test_prep_image_sdn_odl(self, mock_is_file, mock_shutil,
+                                mock_virt_utils, mock_inject_odl,
+                                mock_fetch, mock_ovs_nsh):
+        mock_is_file.return_value = True
         ds_opts = {'dataplane': 'ovs',
                    'sdn_controller': 'opendaylight',
+                   'vpn': False,
+                   'sfc': False,
                    'odl_version': con.DEFAULT_ODL_VERSION,
                    'odl_vpp_netvirt': True}
         ds = {'deploy_options': MagicMock(),
@@ -266,16 +260,18 @@ class TestOvercloudDeploy(unittest.TestCase):
         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
         mock_virt_utils.virt_customize.assert_called()
         mock_inject_odl.assert_called()
+        # mock_ovs_nsh.assert_called()
 
     @patch('apex.overcloud.deploy.c_builder')
     @patch('apex.overcloud.deploy.oc_builder')
     @patch('apex.overcloud.deploy.virt_utils')
     @patch('apex.overcloud.deploy.shutil')
-    @patch('apex.overcloud.deploy.os.path')
+    @patch('apex.overcloud.deploy.os.path.isfile')
     @patch('builtins.open', mock_open())
     def test_prep_image_sdn_odl_upstream_containers_patches(
-            self, mock_os_path, mock_shutil, mock_virt_utils,
+            self, mock_is_file, mock_shutil, mock_virt_utils,
             mock_oc_builder, mock_c_builder):
+        mock_is_file.return_value = True
         ds_opts = {'dataplane': 'ovs',
                    'sdn_controller': 'opendaylight',
                    'odl_version': con.DEFAULT_ODL_VERSION,
@@ -296,14 +292,44 @@ class TestOvercloudDeploy(unittest.TestCase):
         mock_c_builder.add_upstream_patches.assert_called()
         self.assertListEqual(sorted(rv), ['nova-api', 'opendaylight'])
 
+    @patch('apex.overcloud.deploy.c_builder')
     @patch('apex.overcloud.deploy.oc_builder')
     @patch('apex.overcloud.deploy.virt_utils')
     @patch('apex.overcloud.deploy.shutil')
-    @patch('apex.overcloud.deploy.os.path')
+    @patch('apex.overcloud.deploy.os.path.isfile')
     @patch('builtins.open', mock_open())
-    def test_prep_image_sdn_odl_not_def(self, mock_os_path,
+    def test_prep_image_nosdn_upstream_containers_patches(
+            self, mock_is_file, mock_shutil, mock_virt_utils,
+            mock_oc_builder, mock_c_builder):
+        mock_is_file.return_value = True
+        ds_opts = {'dataplane': 'ovs',
+                   'sdn_controller': False,
+                   'odl_version': con.DEFAULT_ODL_VERSION,
+                   'odl_vpp_netvirt': False}
+        ds = {'deploy_options': MagicMock(),
+              'global_params': MagicMock()}
+        ds['deploy_options'].__getitem__.side_effect = \
+            lambda i: ds_opts.get(i, MagicMock())
+        ds['deploy_options'].__contains__.side_effect = \
+            lambda i: True if i in ds_opts else MagicMock()
+        ns = MagicMock()
+        mock_c_builder.add_upstream_patches.return_value = ['nova-api']
+        patches = ['dummy_nova_patch']
+        rv = prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test',
+                        docker_tag='latest', patches=patches)
+        mock_virt_utils.virt_customize.assert_called()
+        mock_c_builder.add_upstream_patches.assert_called()
+        self.assertListEqual(sorted(rv), ['nova-api'])
+
+    @patch('apex.overcloud.deploy.oc_builder')
+    @patch('apex.overcloud.deploy.virt_utils')
+    @patch('apex.overcloud.deploy.shutil')
+    @patch('apex.overcloud.deploy.os.path.isfile')
+    @patch('builtins.open', mock_open())
+    def test_prep_image_sdn_odl_not_def(self, mock_is_file,
                                         mock_shutil, mock_virt_utils,
                                         mock_oc_builder):
+        mock_is_file.return_value = True
         ds_opts = {'dataplane': 'ovs',
                    'sdn_controller': 'opendaylight',
                    'odl_version': 'uncommon'}
@@ -316,13 +342,17 @@ class TestOvercloudDeploy(unittest.TestCase):
         mock_virt_utils.virt_customize.assert_called()
         mock_oc_builder.inject_opendaylight.assert_called()
 
+    @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
     @patch('apex.overcloud.deploy.virt_utils')
     @patch('apex.overcloud.deploy.shutil')
-    @patch('apex.overcloud.deploy.os.path')
+    @patch('apex.overcloud.deploy.os.path.isfile')
     @patch('builtins.open', mock_open())
-    def test_prep_image_sdn_ovn(self, mock_os_path, mock_shutil,
-                                mock_virt_utils):
+    def test_prep_image_sdn_ovn(self, mock_is_file, mock_shutil,
+                                mock_virt_utils, mock_ovs_nsh):
+        mock_is_file.return_value = True
         ds_opts = {'dataplane': 'ovs',
+                   'vpn': False,
+                   'sfc': False,
                    'sdn_controller': 'ovn'}
         ds = {'deploy_options': MagicMock(),
               'global_params': MagicMock()}
@@ -331,6 +361,67 @@ class TestOvercloudDeploy(unittest.TestCase):
         ns = MagicMock()
         prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
         mock_virt_utils.virt_customize.assert_called()
+        # mock_ovs_nsh.assert_called()
+
+    @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
+    @patch('apex.overcloud.deploy.utils.fetch_upstream_and_unpack')
+    @patch('apex.builders.overcloud_builder.inject_quagga')
+    @patch('apex.builders.overcloud_builder.inject_opendaylight')
+    @patch('apex.overcloud.deploy.virt_utils')
+    @patch('apex.overcloud.deploy.shutil')
+    @patch('apex.overcloud.deploy.os.path.isfile')
+    @patch('builtins.open', mock_open())
+    def test_prep_image_sdn_odl_vpn(self, mock_is_file, mock_shutil,
+                                    mock_virt_utils, mock_inject_odl,
+                                    mock_inject_quagga, mock_fetch,
+                                    mock_ovs_nsh):
+        mock_is_file.return_value = True
+        ds_opts = {'dataplane': 'ovs',
+                   'sdn_controller': 'opendaylight',
+                   'vpn': True,
+                   'sfc': False,
+                   'odl_version': con.DEFAULT_ODL_VERSION,
+                   'odl_vpp_netvirt': True}
+        ds = {'deploy_options': MagicMock(),
+              'global_params': MagicMock()}
+        ds['deploy_options'].__getitem__.side_effect = \
+            lambda i: ds_opts.get(i, MagicMock())
+        ds['deploy_options'].__contains__.side_effect = \
+            lambda i: True if i in ds_opts else MagicMock()
+        ns = MagicMock()
+        prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
+        mock_virt_utils.virt_customize.assert_called()
+        mock_inject_odl.assert_called()
+        mock_inject_quagga.assert_called()
+        # mock_ovs_nsh.assert_called()
+
+        @patch('apex.builders.overcloud_builder.inject_ovs_nsh')
+        @patch('apex.builders.overcloud_builder.inject_opendaylight')
+        @patch('apex.overcloud.deploy.virt_utils')
+        @patch('apex.overcloud.deploy.shutil')
+        @patch('apex.overcloud.deploy.os.path.isfile')
+        @patch('builtins.open', mock_open())
+        def test_prep_image_sdn_odl_sfc(self, mock_is_file, mock_shutil,
+                                        mock_virt_utils, mock_inject_odl,
+                                        mock_inject_ovs_nsh):
+            mock_is_file.return_value = True
+            ds_opts = {'dataplane': 'ovs',
+                       'sdn_controller': 'opendaylight',
+                       'vpn': False,
+                       'sfc': True,
+                       'odl_version': con.DEFAULT_ODL_VERSION,
+                       'odl_vpp_netvirt': True}
+            ds = {'deploy_options': MagicMock(),
+                  'global_params': MagicMock()}
+            ds['deploy_options'].__getitem__.side_effect = \
+                lambda i: ds_opts.get(i, MagicMock())
+            ds['deploy_options'].__contains__.side_effect = \
+                lambda i: True if i in ds_opts else MagicMock()
+            ns = MagicMock()
+            prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test')
+            mock_virt_utils.virt_customize.assert_called()
+            mock_inject_odl.assert_called()
+            # mock_inject_ovs_nsh.assert_called()
 
     @patch('apex.overcloud.deploy.os.path.isfile')
     def test_prep_image_no_image(self, mock_isfile):
@@ -343,16 +434,24 @@ class TestOvercloudDeploy(unittest.TestCase):
         assert_in('-----BEGIN PRIVATE KEY-----', priv)
         assert_in('ssh-rsa', pub)
 
+    @patch('apex.overcloud.deploy.yaml')
     @patch('apex.overcloud.deploy.fileinput')
     @patch('apex.overcloud.deploy.shutil')
-    def test_prep_env(self, mock_shutil, mock_fileinput):
+    @patch('builtins.open', mock_open())
+    def test_prep_env(self, mock_shutil, mock_fileinput, mock_yaml):
         mock_fileinput.input.return_value = \
             ['CloudDomain', 'replace_private_key', 'replace_public_key',
              'opendaylight::vpp_routing_node', 'ControllerExtraConfig',
              'NovaComputeExtraConfig', 'ComputeKernelArgs', 'HostCpusList',
              'ComputeExtraConfigPre', 'resource_registry',
              'NovaSchedulerDefaultFilters']
-        ds = {'deploy_options':
+        mock_yaml.safe_load.return_value = {
+            'parameter_defaults': {
+                'ControllerServices': [1, 2, 3],
+                'ComputeServices': [3, 4, 5]
+            }}
+        ds = {'global_params': {'ha_enabled': False},
+              'deploy_options':
               {'sdn_controller': 'opendaylight',
                'odl_vpp_routing_node': 'test',
                'dataplane': 'ovs_dpdk',
@@ -374,7 +473,8 @@ class TestOvercloudDeploy(unittest.TestCase):
                                       {'members': ['ext_nic']},
                                       'compute':
                                       {'members': ['ext_nic']}}}]}}
-        inv = None
+        inv = MagicMock()
+        inv.get_node_counts.return_value = (1, 0)
         try:
             # Swap stdout
             saved_stdout = sys.stdout
@@ -390,16 +490,24 @@ class TestOvercloudDeploy(unittest.TestCase):
             assert_in('ssh-rsa', output)
             assert_in('ComputeKernelArgs: \'test=test \'', output)
             assert_in('fdio::vpp_cpu_main_core: \'test\'', output)
+            mock_yaml.safe_dump.assert_called_with(
+                {'parameter_defaults': {
+                    'ControllerServices': [1, 2, 3, 4, 5],
+                }},
+                mock.ANY, default_flow_style=False
+            )
         finally:
             # put stdout back
             sys.stdout = saved_stdout
 
     @patch('apex.overcloud.deploy.fileinput')
     @patch('apex.overcloud.deploy.shutil')
+    @patch('builtins.open', mock_open())
     def test_prep_env_round_two(self, mock_shutil, mock_fileinput):
         mock_fileinput.input.return_value = \
             ['NeutronVPPAgentPhysnets']
-        ds = {'deploy_options':
+        ds = {'global_params': {'ha_enabled': False},
+              'deploy_options':
               {'sdn_controller': False,
                'dataplane': 'fdio',
                'sriov': 'xxx',
@@ -417,7 +525,8 @@ class TestOvercloudDeploy(unittest.TestCase):
                                       {'members': ['ext_nic']},
                                       'compute':
                                       {'members': ['ext_nic']}}}]}}
-        inv = None
+        inv = MagicMock()
+        inv.get_node_counts.return_value = (3, 2)
         try:
             # Swap stdout
             saved_stdout = sys.stdout
@@ -439,11 +548,13 @@ class TestOvercloudDeploy(unittest.TestCase):
 
     @patch('apex.overcloud.deploy.fileinput')
     @patch('apex.overcloud.deploy.shutil')
+    @patch('builtins.open', mock_open())
     def test_prep_env_round_three(self, mock_shutil, mock_fileinput):
         mock_fileinput.input.return_value = \
             ['OS::TripleO::Services::NeutronDhcpAgent',
              'NeutronDhcpAgentsPerNetwork', 'ComputeServices']
-        ds = {'deploy_options':
+        ds = {'global_params': {'ha_enabled': False},
+              'deploy_options':
               {'sdn_controller': 'opendaylight',
                'dataplane': 'fdio',
                'sriov': 'xxx',
@@ -480,11 +591,13 @@ class TestOvercloudDeploy(unittest.TestCase):
 
     @patch('apex.overcloud.deploy.fileinput')
     @patch('apex.overcloud.deploy.shutil')
+    @patch('builtins.open', mock_open())
     def test_prep_env_tenant_vlan(self, mock_shutil, mock_fileinput):
         mock_fileinput.input.return_value = \
             ['NeutronNetworkVLANRanges',
              'NeutronNetworkType', 'NeutronBridgeMappings']
-        ds = {'deploy_options':
+        ds = {'global_params': {'ha_enabled': False},
+              'deploy_options':
               {'sdn_controller': False,
                'dataplane': 'ovs',
                'sriov': 'xxx',
@@ -529,13 +642,15 @@ class TestOvercloudDeploy(unittest.TestCase):
 
     @patch('apex.overcloud.deploy.fileinput')
     @patch('apex.overcloud.deploy.shutil')
+    @patch('builtins.open', mock_open())
     def test_prep_env_tenant_vlan_odl(self, mock_shutil, mock_fileinput):
         mock_fileinput.input.return_value = \
             ['NeutronNetworkVLANRanges',
              'NeutronNetworkType',
              'NeutronBridgeMappings',
              'OpenDaylightProviderMappings']
-        ds = {'deploy_options':
+        ds = {'global_params': {'ha_enabled': False},
+              'deploy_options':
               {'sdn_controller': 'opendaylight',
                'dataplane': 'ovs',
                'sriov': 'xxx',
@@ -767,19 +882,20 @@ class TestOvercloudDeploy(unittest.TestCase):
         mock_parsers.return_value.__getitem__.side_effect = KeyError()
         assert_raises(KeyError, create_congress_cmds, 'overcloud_file')
 
-    def test_get_docker_sdn_file(self):
+    def test_get_docker_sdn_files(self):
         ds_opts = {'ha_enabled': True,
                    'congress': True,
                    'tacker': True,
                    'containers': False,
                    'barometer': True,
                    'ceph': False,
+                   'vpn': True,
                    'sdn_controller': 'opendaylight',
                    'os_version': 'queens'
                    }
-        output = get_docker_sdn_file(ds_opts)
-        self.assertEqual(output,
-                         ('/usr/share/openstack-tripleo-heat-templates'
-                          '/environments/services/neutron-opendaylight'
-                          '.yaml')
-                         )
+        output = get_docker_sdn_files(ds_opts)
+        compare = ['/usr/share/openstack-tripleo-heat-templates/'
+                   'environments/services/neutron-opendaylight.yaml',
+                   '/usr/share/openstack-tripleo-heat-templates/environments'
+                   '/services/neutron-bgpvpn-opendaylight.yaml']
+        self.assertEqual(output, compare)