Enable BGPVPN for master deployments
[apex.git] / apex / overcloud / deploy.py
index 439848f..790e794 100644 (file)
@@ -75,6 +75,8 @@ OVS_NSH_RPM = "openvswitch-2.6.1-1.el7.centos.x86_64.rpm"
 ODL_NETVIRT_VPP_RPM = "/root/opendaylight-7.0.0-0.1.20170531snap665.el7" \
                       ".noarch.rpm"
 
+LOOP_DEVICE_SIZE = "10G"
+
 LOSETUP_SERVICE = """[Unit]
 Description=Setup loop devices
 Before=network.target
@@ -136,24 +138,24 @@ def build_sdn_env_list(ds, sdn_map, env_list=None):
     return env_list
 
 
-def get_docker_sdn_file(ds_opts):
+def get_docker_sdn_files(ds_opts):
     """
     Returns docker env file for detected SDN
     :param ds_opts: deploy options
-    :return: docker THT env file for an SDN
+    :return: list of docker THT env files for an SDN
     """
-    # FIXME(trozet): We assume right now there is only one docker SDN file
     docker_services = con.VALID_DOCKER_SERVICES
     tht_dir = con.THT_DOCKER_ENV_DIR[ds_opts['os_version']]
     sdn_env_list = build_sdn_env_list(ds_opts, SDN_FILE_MAP)
-    for sdn_file in sdn_env_list:
+    for i, sdn_file in enumerate(sdn_env_list):
         sdn_base = os.path.basename(sdn_file)
         if sdn_base in docker_services:
             if docker_services[sdn_base] is not None:
-                return os.path.join(tht_dir,
-                                    docker_services[sdn_base])
+                sdn_env_list[i] = \
+                    os.path.join(tht_dir, docker_services[sdn_base])
             else:
-                return os.path.join(tht_dir, sdn_base)
+                sdn_env_list[i] = os.path.join(tht_dir, sdn_base)
+    return sdn_env_list
 
 
 def create_deploy_cmd(ds, ns, inv, tmp_dir,
@@ -182,9 +184,10 @@ def create_deploy_cmd(ds, ns, inv, tmp_dir,
 
     if ds_opts['containers']:
         deploy_options.append('docker-images.yaml')
-        sdn_docker_file = get_docker_sdn_file(ds_opts)
-        if sdn_docker_file:
+        sdn_docker_files = get_docker_sdn_files(ds_opts)
+        for sdn_docker_file in sdn_docker_files:
             deploy_options.append(sdn_docker_file)
+        if sdn_docker_files:
             deploy_options.append('sdn-images.yaml')
     else:
         deploy_options += build_sdn_env_list(ds_opts, SDN_FILE_MAP)
@@ -304,7 +307,13 @@ def prep_image(ds, ns, img, tmp_dir, root_pw=None, docker_tag=None,
                 "echo 'https_proxy={}' >> /etc/environment".format(
                     ns['https_proxy'])})
 
+    tmp_oc_image = os.path.join(tmp_dir, 'overcloud-full.qcow2')
+    shutil.copyfile(img, tmp_oc_image)
+    logging.debug("Temporary overcloud image stored as: {}".format(
+        tmp_oc_image))
+
     if ds_opts['vpn']:
+        oc_builder.inject_quagga(tmp_oc_image, tmp_dir)
         virt_cmds.append({con.VIRT_RUN_CMD: "chmod +x /etc/rc.d/rc.local"})
         virt_cmds.append({
             con.VIRT_RUN_CMD:
@@ -344,15 +353,30 @@ def prep_image(ds, ns, img, tmp_dir, root_pw=None, docker_tag=None,
     if root_pw:
         pw_op = "password:{}".format(root_pw)
         virt_cmds.append({con.VIRT_PW: pw_op})
-    if ds_opts['sfc'] and dataplane == 'ovs':
-        virt_cmds.extend([
-            {con.VIRT_RUN_CMD: "yum -y install "
-                               "/root/ovs/rpm/rpmbuild/RPMS/x86_64/"
-                               "{}".format(OVS_NSH_KMOD_RPM)},
-            {con.VIRT_RUN_CMD: "yum downgrade -y "
-                               "/root/ovs/rpm/rpmbuild/RPMS/x86_64/"
-                               "{}".format(OVS_NSH_RPM)}
-        ])
+
+    if dataplane == 'ovs':
+        if ds_opts['sfc']:
+            virt_cmds.extend([
+                {con.VIRT_RUN_CMD: "yum -y install "
+                                   "/root/ovs/rpm/rpmbuild/RPMS/x86_64/"
+                                   "{}".format(OVS_NSH_KMOD_RPM)},
+                {con.VIRT_RUN_CMD: "yum downgrade -y "
+                                   "/root/ovs/rpm/rpmbuild/RPMS/x86_64/"
+                                   "{}".format(OVS_NSH_RPM)}
+            ])
+        elif sdn == 'opendaylight':
+            # FIXME(trozet) remove this after RDO is updated with fix for
+            # https://bugzilla.redhat.com/show_bug.cgi?id=1544892
+            ovs_file = os.path.basename(con.CUSTOM_OVS)
+            ovs_url = con.CUSTOM_OVS.replace(ovs_file, '')
+            utils.fetch_upstream_and_unpack(dest=tmp_dir, url=ovs_url,
+                                            targets=[ovs_file])
+            virt_cmds.extend([
+                {con.VIRT_UPLOAD: "{}:/root/".format(os.path.join(tmp_dir,
+                                                                  ovs_file))},
+                {con.VIRT_RUN_CMD: "yum downgrade -y /root/{}".format(
+                    ovs_file)}
+            ])
     if dataplane == 'fdio':
         # Patch neutron with using OVS external interface for router
         # and add generic linux NS interface driver
@@ -366,11 +390,6 @@ def prep_image(ds, ns, img, tmp_dir, root_pw=None, docker_tag=None,
                                    "/root/nosdn_vpp_rpms/*.rpm"}
             ])
 
-    tmp_oc_image = os.path.join(tmp_dir, 'overcloud-full.qcow2')
-    shutil.copyfile(img, tmp_oc_image)
-    logging.debug("Temporary overcloud image stored as: {}".format(
-        tmp_oc_image))
-
     if sdn == 'opendaylight':
         undercloud_admin_ip = ns['networks'][con.ADMIN_NETWORK][
             'installer_vm']['ip']
@@ -406,7 +425,8 @@ def prep_image(ds, ns, img, tmp_dir, root_pw=None, docker_tag=None,
         virt_cmds.extend([
             {con.VIRT_UPLOAD: "{}:/usr/lib/systemd/system/".format(tmp_losetup)
              },
-            {con.VIRT_RUN_CMD: 'truncate /srv/data.img --size 10G'},
+            {con.VIRT_RUN_CMD: 'truncate /srv/data.img --size {}'
+                .format(LOOP_DEVICE_SIZE)},
             {con.VIRT_RUN_CMD: 'systemctl daemon-reload'},
             {con.VIRT_RUN_CMD: 'systemctl enable losetup.service'},
         ])