Fix rocky container preparation
[apex.git] / apex / undercloud / undercloud.py
index 915c85f..8b6b9d4 100644 (file)
@@ -75,17 +75,27 @@ class Undercloud:
                                    template_dir=self.template_path)
         self.setup_volumes()
         self.inject_auth()
-        self._update_delorean_repo()
 
-    def _set_ip(self):
-        ip_out = self.vm.interfaceAddresses(
+    @staticmethod
+    def _get_ip(vm):
+        ip_out = vm.interfaceAddresses(
             libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE, 0)
         if ip_out:
             for (name, val) in ip_out.items():
                 for ipaddr in val['addrs']:
                     if ipaddr['type'] == libvirt.VIR_IP_ADDR_TYPE_IPV4:
-                        self.ip = ipaddr['addr']
-                        return True
+                        return ipaddr['addr']
+
+    def _set_ip(self):
+        ip = self._get_ip(self.vm)
+        if ip:
+            self.ip = ip
+            return True
+
+    @staticmethod
+    def get_ip():
+        vm = Undercloud._get_vm()
+        return Undercloud._get_ip(vm)
 
     def start(self):
         """
@@ -114,14 +124,25 @@ 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):
+                  playbook, apex_temp_dir, virtual_oc=False):
         """
         Configures undercloud VM
         :param net_settings: Network settings for deployment
         :param deploy_settings: Deployment settings for deployment
         :param playbook: playbook to use to configure undercloud
         :param apex_temp_dir: temporary apex directory to hold configs/logs
+        :param virtual_oc: Boolean to determine if overcloud is virt
         :return: None
         """
 
@@ -130,6 +151,8 @@ class Undercloud:
         ansible_vars = Undercloud.generate_config(net_settings,
                                                   deploy_settings)
         ansible_vars['apex_temp_dir'] = apex_temp_dir
+
+        ansible_vars['nat'] = self.detect_nat(net_settings)
         try:
             utils.run_ansible(ansible_vars, playbook, host=self.ip,
                               user='stack')
@@ -176,7 +199,7 @@ class Undercloud:
                          '/root/.ssh/id_rsa.pub:/root/.ssh/authorized_keys'})
         run_cmds = [
             'chmod 600 /root/.ssh/authorized_keys',
-            'restorecon /root/.ssh/authorized_keys',
+            'restorecon -R -v /root/.ssh',
             'cp /root/.ssh/authorized_keys /home/stack/.ssh/',
             'chown stack:stack /home/stack/.ssh/authorized_keys',
             'chmod 600 /home/stack/.ssh/authorized_keys'
@@ -211,11 +234,18 @@ class Undercloud:
             "undercloud_hostname undercloud.{}".format(ns['dns-domain']),
             "local_ip {}/{}".format(str(ns_admin['installer_vm']['ip']),
                                     str(ns_admin['cidr']).split('/')[1]),
-            "network_gateway {}".format(str(ns_admin['installer_vm']['ip'])),
-            "network_cidr {}".format(str(ns_admin['cidr'])),
+            "generate_service_certificate false",
+            "undercloud_ntp_servers {}".format(str(ns['ntp'][0])),
+            "container_images_file "
+            "/home/stack/containers-prepare-parameter.yaml"
+        ]
+
+        config['undercloud_network_config'] = [
+            "gateway {}".format(str(ns_admin['installer_vm']['ip'])),
+            "cidr {}".format(str(ns_admin['cidr'])),
             "dhcp_start {}".format(str(ns_admin['dhcp_range'][0])),
             "dhcp_end {}".format(str(ns_admin['dhcp_range'][1])),
-            "inspection_iprange {}".format(','.join(intro_range))
+            "inspection_iprange {}".format(','.join(intro_range)),
         ]
 
         config['ironic_config'] = [
@@ -239,7 +269,19 @@ class Undercloud:
             "prefix": str(ns_external['cidr']).split('/')[1],
             "enabled": ns_external['enabled']
         }
-
+        # We will NAT external network if it is enabled. If external network
+        # is IPv6, we will NAT admin network in case we need IPv4 connectivity
+        # for things like DNS server.
+        if 'external' in ns.enabled_network_list and \
+                ns_external['cidr'].version == 4:
+            nat_cidr = ns_external['cidr']
+        else:
+            nat_cidr = ns['networks']['admin']['cidr']
+        config['nat_cidr'] = str(nat_cidr)
+        if nat_cidr.version == 6:
+            config['nat_network_ipv6'] = True
+        else:
+            config['nat_network_ipv6'] = False
         config['http_proxy'] = ns.get('http_proxy', '')
         config['https_proxy'] = ns.get('https_proxy', '')
 
@@ -254,7 +296,7 @@ class Undercloud:
             cmd = ("curl -L -f -o "
                    "/etc/yum.repos.d/deloran.repo {}".format(delorean_repo))
             try:
-                virt_utils.virt_customize({constants.VIRT_RUN_CMD: cmd},
+                virt_utils.virt_customize([{constants.VIRT_RUN_CMD: cmd}],
                                           self.volume)
             except Exception:
                 logging.warning("Failed to download and update delorean repo "