From 998452e679864ed8d50729736bd6639b6359fc90 Mon Sep 17 00:00:00 2001
From: Raphael Defosseux <raphael.defosseux@eurecom.fr>
Date: Fri, 22 Apr 2022 16:53:34 +0200
Subject: [PATCH] feat(ci): add script to properly flatten the target images

Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
---
 ci-scripts/cls_containerize.py |   3 +
 ci-scripts/flatten_image.py    | 116 +++++++++++++++++++++++++++++++++
 2 files changed, 119 insertions(+)
 create mode 100644 ci-scripts/flatten_image.py

diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index 89a3ac586d4..259db7bffe6 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -294,6 +294,9 @@ class Containerize():
 			if image != 'ran-build':
 				mySSH.command('sed -i -e "s#' + "ran-build" + ':latest#' + "ran-build" + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
 			mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
+			# Flatten Image
+			if image != 'ran-build':
+				mySSH.command('python3 ./ci-scripts/flatten_image.py --tag ' + image + ':' + imageTag, '\$', 300)
 			# split the log
 			mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
 			mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
diff --git a/ci-scripts/flatten_image.py b/ci-scripts/flatten_image.py
new file mode 100644
index 00000000000..aef5bfccad7
--- /dev/null
+++ b/ci-scripts/flatten_image.py
@@ -0,0 +1,116 @@
+"""
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+   http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-------------------------------------------------------------------------------
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+   contact@openairinterface.org
+"""
+
+import argparse
+import re
+import subprocess
+import sys
+
+def main() -> None:
+    args = _parse_args()
+    status = perform_flattening(args.tag)
+    sys.exit(status)
+
+def _parse_args() -> argparse.Namespace:
+    parser = argparse.ArgumentParser(description='Flattening Image')
+
+    parser.add_argument(
+        '--tag', '-t',
+        action='store',
+        required=True,
+        help='Image Tag in image-name:image tag format',
+    )
+    return parser.parse_args()
+
+def perform_flattening(tag):
+    # First detect which docker/podman command to use
+    cli = ''
+    image_prefix = ''
+    cmd = 'which podman || true'
+    podman_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
+    if re.search('podman', podman_check.strip()):
+        cli = 'sudo podman'
+        image_prefix = 'localhost/'
+    if cli == '':
+        cmd = 'which docker || true'
+        docker_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
+        if re.search('docker', docker_check.strip()):
+            cli = 'docker'
+            image_prefix = ''
+    if cli == '':
+        print ('No docker / podman installed: quitting')
+        return -1
+    print (f'Flattening {tag}')
+
+    # Creating a container
+    cmd = cli + ' run --name test-flatten --entrypoint /bin/true -d ' + tag
+    print (cmd)
+    subprocess.check_output(cmd, shell=True, universal_newlines=True)
+
+    # Export / Import trick
+    cmd = cli + ' export test-flatten | ' + cli + ' import '
+    # Bizarro syntax issue with podman
+    if cli == 'docker':
+      cmd += ' --change "ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
+    else:
+      cmd += ' --change "ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
+    if re.search('oai-enb', tag):
+        cmd += ' --change "WORKDIR /opt/oai-enb" '
+        cmd += ' --change "EXPOSE 2152/udp" '
+        cmd += ' --change "EXPOSE 36412/udp" '
+        cmd += ' --change "EXPOSE 36422/udp" '
+        cmd += ' --change "CMD [\\"/opt/oai-enb/bin/lte-softmodem.Rel15\\", \\"-O\\", \\"/opt/oai-enb/etc/enb.conf\\"]" '
+        cmd += ' --change "ENTRYPOINT [\\"/opt/oai-enb/bin/entrypoint.sh\\"]" '
+    if re.search('oai-gnb', tag):
+        cmd += ' --change "WORKDIR /opt/oai-gnb" '
+        cmd += ' --change "EXPOSE 2152/udp" '
+        cmd += ' --change "EXPOSE 36422/udp" '
+        cmd += ' --change "CMD [\\"/opt/oai-gnb/bin/nr-softmodem.Rel15\\", \\"-O\\", \\"/opt/oai-gnb/etc/gnb.conf\\"]" '
+        cmd += ' --change "ENTRYPOINT [\\"/opt/oai-gnb/bin/entrypoint.sh\\"]" '
+    if re.search('oai-lte-ue', tag):
+        cmd += ' --change "WORKDIR /opt/oai-lte-ue" '
+        cmd += ' --change "CMD [\\"/opt/oai-lte-ue/bin/lte-uesoftmodem.Rel15\\"]" '
+        cmd += ' --change "ENTRYPOINT [\\"/opt/oai-lte-ue/bin/entrypoint.sh\\"]" '
+    if re.search('oai-nr-ue', tag):
+        cmd += ' --change "WORKDIR /opt/oai-nr-ue" '
+        cmd += ' --change "CMD [\\"/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15\\", \\"-O\\", \\"/opt/oai-nr-ue/etc/nr-ue.conf\\"]" '
+        cmd += ' --change "ENTRYPOINT [\\"/opt/oai-nr-ue/bin/entrypoint.sh\\"]" '
+    if re.search('oai-lte-ru', tag):
+        cmd += ' --change "WORKDIR /opt/oai-lte-ru" '
+        cmd += ' --change "CMD [\\"/opt/oai-lte-ru/bin/oairu.Rel15\\", \\"-O\\", \\"/opt/oai-lte-ru/etc/rru.conf\\"]" '
+        cmd += ' --change "ENTRYPOINT [\\"/opt/oai-lte-ru/bin/entrypoint.sh\\"]" '
+    if re.search('oai-physim', tag):
+        cmd += ' --change "WORKDIR /opt/oai-physim" '
+    cmd += ' - ' + image_prefix + tag
+    print (cmd)
+    subprocess.check_output(cmd, shell=True, universal_newlines=True)
+
+    # Remove container
+    cmd = cli + ' rm -f test-flatten'
+    print (cmd)
+    subprocess.check_output(cmd, shell=True, universal_newlines=True)
+
+    # At this point the original image is a dangling image.
+    # CI pipeline will clean up (`image prune --force`)
+    return 0
+
+if __name__ == '__main__':
+    main()
-- 
GitLab