Merge "Configure NAT with baremetal when necessary"
authorFeng Pan <fpan@redhat.com>
Thu, 31 May 2018 17:32:27 +0000 (17:32 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Thu, 31 May 2018 17:32:27 +0000 (17:32 +0000)
apex/tests/test_apex_undercloud.py
apex/undercloud/undercloud.py
lib/ansible/playbooks/configure_undercloud.yml

index fce7a55..9bc91e5 100644 (file)
@@ -24,6 +24,7 @@ from nose.tools import (
     assert_regexp_matches,
     assert_raises,
     assert_true,
+    assert_false,
     assert_equal)
 
 
@@ -114,6 +115,105 @@ class TestUndercloud(unittest.TestCase):
         mock_set_ip.return_value = False
         assert_raises(ApexUndercloudException, uc.start)
 
+    @patch('apex.undercloud.undercloud.utils')
+    @patch.object(Undercloud, 'generate_config', return_value={})
+    @patch.object(Undercloud, '_get_vm', return_value=None)
+    @patch.object(Undercloud, 'create')
+    def test_detect_nat_with_external(self, mock_create, mock_get_vm,
+                                      mock_generate_config, mock_utils):
+        ns = MagicMock()
+        ns.enabled_network_list = ['admin', 'external']
+        ns_dict = {
+            'apex': MagicMock(),
+            'dns-domain': 'dns',
+            'networks': {'admin':
+                         {'cidr': ipaddress.ip_network('192.0.2.0/24'),
+                          'installer_vm': {'ip': '192.0.2.1',
+                                           'vlan': 'native'},
+                          'dhcp_range': ['192.0.2.15', '192.0.2.30'],
+                          'gateway': '192.1.1.1',
+                          },
+                         'external':
+                         [{'enabled': True,
+                           'cidr': ipaddress.ip_network('192.168.0.0/24'),
+                          'installer_vm': {'ip': '192.168.0.1',
+                                           'vlan': 'native'},
+                           'gateway': '192.168.0.1'
+                           }]
+                         }
+        }
+        ns.__getitem__.side_effect = ns_dict.__getitem__
+        ns.__contains__.side_effect = ns_dict.__contains__
+
+        uc = Undercloud('img_path', 'tplt_path', external_network=True)
+        assert_true(uc.detect_nat(ns))
+
+    @patch('apex.undercloud.undercloud.utils')
+    @patch.object(Undercloud, 'generate_config', return_value={})
+    @patch.object(Undercloud, '_get_vm', return_value=None)
+    @patch.object(Undercloud, 'create')
+    def test_detect_nat_no_external(self, mock_create, mock_get_vm,
+                                    mock_generate_config, mock_utils):
+        ns = MagicMock()
+        ns.enabled_network_list = ['admin', 'external']
+        ns_dict = {
+            'apex': MagicMock(),
+            'dns-domain': 'dns',
+            'networks': {'admin':
+                         {'cidr': ipaddress.ip_network('192.0.2.0/24'),
+                          'installer_vm': {'ip': '192.0.2.1',
+                                           'vlan': 'native'},
+                          'dhcp_range': ['192.0.2.15', '192.0.2.30'],
+                          'gateway': '192.0.2.1',
+                          },
+                         'external':
+                         [{'enabled': False,
+                           'cidr': ipaddress.ip_network('192.168.0.0/24'),
+                          'installer_vm': {'ip': '192.168.0.1',
+                                           'vlan': 'native'},
+                           'gateway': '192.168.1.1'
+                           }]
+                         }
+        }
+        ns.__getitem__.side_effect = ns_dict.__getitem__
+        ns.__contains__.side_effect = ns_dict.__contains__
+
+        uc = Undercloud('img_path', 'tplt_path', external_network=False)
+        assert_true(uc.detect_nat(ns))
+
+    @patch('apex.undercloud.undercloud.utils')
+    @patch.object(Undercloud, 'generate_config', return_value={})
+    @patch.object(Undercloud, '_get_vm', return_value=None)
+    @patch.object(Undercloud, 'create')
+    def test_detect_no_nat_no_external(self, mock_create, mock_get_vm,
+                                       mock_generate_config, mock_utils):
+        ns = MagicMock()
+        ns.enabled_network_list = ['admin', 'external']
+        ns_dict = {
+            'apex': MagicMock(),
+            'dns-domain': 'dns',
+            'networks': {'admin':
+                         {'cidr': ipaddress.ip_network('192.0.2.0/24'),
+                          'installer_vm': {'ip': '192.0.2.1',
+                                           'vlan': 'native'},
+                          'dhcp_range': ['192.0.2.15', '192.0.2.30'],
+                          'gateway': '192.0.2.3',
+                          },
+                         'external':
+                         [{'enabled': False,
+                           'cidr': ipaddress.ip_network('192.168.0.0/24'),
+                          'installer_vm': {'ip': '192.168.0.1',
+                                           'vlan': 'native'},
+                           'gateway': '192.168.1.1'
+                           }]
+                         }
+        }
+        ns.__getitem__.side_effect = ns_dict.__getitem__
+        ns.__contains__.side_effect = ns_dict.__contains__
+
+        uc = Undercloud('img_path', 'tplt_path', external_network=False)
+        assert_false(uc.detect_nat(ns))
+
     @patch('apex.undercloud.undercloud.utils')
     @patch.object(Undercloud, 'generate_config', return_value={})
     @patch.object(Undercloud, '_get_vm', return_value=None)
index 3cd1e70..d2de2de 100644 (file)
@@ -124,6 +124,16 @@ class Undercloud:
                 "Unable to find IP for undercloud.  Check if VM booted "
                 "correctly")
 
+    def detect_nat(self, net_settings):
+        if self.external_net:
+            net = net_settings['networks'][constants.EXTERNAL_NETWORK][0]
+        else:
+            net = net_settings['networks'][constants.ADMIN_NETWORK]
+        if net['gateway'] == net['installer_vm']['ip']:
+            return True
+        else:
+            return False
+
     def configure(self, net_settings, deploy_settings,
                   playbook, apex_temp_dir, virtual_oc=False):
         """
@@ -141,7 +151,8 @@ class Undercloud:
         ansible_vars = Undercloud.generate_config(net_settings,
                                                   deploy_settings)
         ansible_vars['apex_temp_dir'] = apex_temp_dir
-        ansible_vars['virtual_overcloud'] = virtual_oc
+
+        ansible_vars['nat'] = self.detect_nat(net_settings)
         try:
             utils.run_ansible(ansible_vars, playbook, host=self.ip,
                               user='stack')
index bb58059..040a559 100644 (file)
       become: yes
       when:
         - not nat_network_ipv6
-        - virtual_overcloud
+        - nat
     - name: fetch storage environment file
       fetch:
         src: /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml