From 61351a71500c83e321e34ea682bd3bdf980ef4c9 Mon Sep 17 00:00:00 2001
From: j1nx
Date: Sat, 21 Oct 2023 10:33:28 +0000
Subject: [PATCH] [WIP] Initial work on pre-pulling containers at buildtime.
---
buildroot-external/Config.in | 1 +
buildroot-external/configs/rpi4_64_defconfig | 3 +-
.../package/ovos-containers/Config.in | 21 ++++++++++++
.../ovos-containers/fetch-container-image.sh | 33 +++++++++++++++++++
.../ovos-containers/ovos-containers.mk | 24 ++++++++++++++
5 files changed, 80 insertions(+), 2 deletions(-)
create mode 100644 buildroot-external/package/ovos-containers/Config.in
create mode 100755 buildroot-external/package/ovos-containers/fetch-container-image.sh
create mode 100644 buildroot-external/package/ovos-containers/ovos-containers.mk
diff --git a/buildroot-external/Config.in b/buildroot-external/Config.in
index 99a9935c..817fb505 100644
--- a/buildroot-external/Config.in
+++ b/buildroot-external/Config.in
@@ -102,6 +102,7 @@ endmenu
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/openfec/Config.in"
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/openfst/Config.in"
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-bus-server/Config.in"
+ source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-containers/Config.in"
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-dashboard/Config.in"
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-shell/Config.in"
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-splash/Config.in"
diff --git a/buildroot-external/configs/rpi4_64_defconfig b/buildroot-external/configs/rpi4_64_defconfig
index 99d68f24..d3e9a9f0 100644
--- a/buildroot-external/configs/rpi4_64_defconfig
+++ b/buildroot-external/configs/rpi4_64_defconfig
@@ -141,9 +141,9 @@ BR2_PACKAGE_PYTHON_PODMAN_COMPOSE=y
BR2_PACKAGE_LILV=y
BR2_PACKAGE_OPUS=y
BR2_PACKAGE_PORTAUDIO=y
-BR2_PACKAGE_SPEEXDSP=y
BR2_PACKAGE_SBC=y
BR2_PACKAGE_SBC_TOOLS=y
+BR2_PACKAGE_SPEEXDSP=y
BR2_PACKAGE_WEBRTC_AUDIO_PROCESSING=y
BR2_PACKAGE_LIBARCHIVE=y
BR2_PACKAGE_LIBDEFLATE=y
@@ -172,7 +172,6 @@ BR2_PACKAGE_LIBV4L_UTILS=y
BR2_PACKAGE_JSON_GLIB=y
BR2_PACKAGE_LIBCAMERA=y
BR2_PACKAGE_LIBCAMERA_V4L2=y
-BR2_PACKAGE_LIBCAMERA_PIPELINE_IPU3=y
BR2_PACKAGE_LIBCAMERA_PIPELINE_SIMPLE=y
BR2_PACKAGE_LIBCAMERA_PIPELINE_UVCVIDEO=y
BR2_PACKAGE_LIBCAMERA_PIPELINE_VIMC=y
diff --git a/buildroot-external/package/ovos-containers/Config.in b/buildroot-external/package/ovos-containers/Config.in
new file mode 100644
index 00000000..dd214ee2
--- /dev/null
+++ b/buildroot-external/package/ovos-containers/Config.in
@@ -0,0 +1,21 @@
+menuconfig BR2_PACKAGE_OVOS_CONTAINERS
+ bool "Pre-install OVOS containers"
+ help
+ This is the system layer that prepares and
+ pre-install the required OVOS containers.
+
+ https://github.com/OpenVoiceOS/ovos-docker
+
+if BR2_PACKAGE_OVOS_CONTAINERS
+
+config BR2_PACKAGE_OVOS_CONTAINERS_ARCH
+ string "Container Arch"
+ help
+ Architecture for which we should be pull.
+
+config BR2_PACKAGE_OVOS_CONTAINERS_IMAGES
+ string "Images"
+ help
+ Space separated list of images to pull.
+
+endif
diff --git a/buildroot-external/package/ovos-containers/fetch-container-image.sh b/buildroot-external/package/ovos-containers/fetch-container-image.sh
new file mode 100755
index 00000000..23f3e9c8
--- /dev/null
+++ b/buildroot-external/package/ovos-containers/fetch-container-image.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# Original script from Home Assistant
+
+set -e
+set -u
+set -o pipefail
+
+arch=$1
+image=$2
+dl_dir=$3
+dst_dir=$4
+
+image_name="docker.io/smartgic/${image}"
+full_image_name="${image_name}:alpha"
+image_digest=$(skopeo inspect --retry-times=5 "docker://${full_image_name}" | jq -r '.Digest')
+
+image_file_name="${full_image_name//[:\/]/_}@${image_digest//[:\/]/_}"
+image_file_path="${dl_dir}/${image_file_name}.tar"
+dst_image_file_path="${dst_dir}/${image_file_name}.tar"
+
+(
+ # Use file locking to avoid race condition
+ flock --verbose 3
+ if [ ! -f "${image_file_path}" ]
+ then
+ echo "Fetching image: ${full_image_name} (digest ${image_digest})"
+ skopeo copy "docker://${image_name}@${image_digest}" "docker-archive:${image_file_path}:${full_image_name}"
+ else
+ echo "Skipping download of existing image: ${full_image_name} (digest ${image_digest})"
+ fi
+
+ cp "${image_file_path}" "${dst_image_file_path}"
+) 3>"${image_file_path}.lock"
diff --git a/buildroot-external/package/ovos-containers/ovos-containers.mk b/buildroot-external/package/ovos-containers/ovos-containers.mk
new file mode 100644
index 00000000..f394ed12
--- /dev/null
+++ b/buildroot-external/package/ovos-containers/ovos-containers.mk
@@ -0,0 +1,24 @@
+################################################################################
+#
+# OVOS Container images
+#
+################################################################################
+
+OVOS_CONTAINERS_VERSION = 1.0.0
+OVOS_CONTAINERS_LICENSE = Apache License 2.0
+OVOS_CONTAINERS_LICENSE_FILES = $(BR2_EXTERNAL_OPENVOICEOS_PATH)/../LICENSE
+OVOS_CONTAINERS_SITE = $(BR2_EXTERNAL_OPENVOICEOS_PATH)/package/ovos-containers
+OVOS_CONTAINERS_SITE_METHOD = local
+
+OVOS_CONTAINERS_IMAGES = $(call qstrip,$(BR2_PACKAGE_OVOS_CONTAINERS))
+
+define OVOS_CONTAINERS_BUILD_CMDS
+ $(Q)mkdir -p $(@D)/images
+ $(Q)mkdir -p $(OVOS_CONTAINERS_DL_DIR)
+ $(foreach image,$(OVOS_CONTAINERS_IMAGES),\
+ $(BR2_EXTERNAL_OPENVOICEOS_PATH)/package/ovos-containers/fetch-container-image.sh \
+ $(BR2_PACKAGE_OVOS_CONTAINERS_ARCH) $(image) "$(OVOS_CONTAINERS_DL_DIR)" "$(@D)/images"
+ )
+endef
+
+$(eval $(generic-package))