Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Jun 2025 16:27:01 GMT
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 076fec1b88de - main - nuageinit: implement packages
Message-ID:  <202506061627.556GR1IQ066518@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by bapt:

URL: https://cgit.FreeBSD.org/src/commit/?id=076fec1b88de8e14f370127cc4aeaa737eda92a8

commit 076fec1b88de8e14f370127cc4aeaa737eda92a8
Author:     Sebastien Baylocq <sebastien.baylocq@ovhcloud.com>
AuthorDate: 2025-06-06 09:49:56 +0000
Commit:     Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2025-06-06 16:26:40 +0000

    nuageinit: implement packages
    
    Installs a list of packages
    
    Sponsored by:   OVHCloud
---
 libexec/nuageinit/nuage.lua          | 22 +++++++++++++++++-
 libexec/nuageinit/nuageinit          | 19 ++++++++++++++++
 libexec/nuageinit/tests/nuageinit.sh | 44 ++++++++++++++++++++++++++++++++++++
 3 files changed, 84 insertions(+), 1 deletion(-)

diff --git a/libexec/nuageinit/nuage.lua b/libexec/nuageinit/nuage.lua
index addab5419193..0fe7400c2bbc 100644
--- a/libexec/nuageinit/nuage.lua
+++ b/libexec/nuageinit/nuage.lua
@@ -362,6 +362,9 @@ local function chpasswd(obj)
 end
 
 local function pkg_bootstrap()
+	if os.getenv("NUAGE_RUN_TESTS") then
+		return true
+	end
 	if os.execute("pkg -N 2>/dev/null") then
 		return true
 	end
@@ -369,6 +372,22 @@ local function pkg_bootstrap()
 	return os.execute("env ASSUME_ALWAYS_YES=YES pkg bootstrap")
 end
 
+local function install_package(package)
+	if package == nil then
+		return true
+	end
+	local install_cmd = "pkg install -y " .. package
+	local test_cmd = "pkg info -q " .. package
+	if os.getenv("NUAGE_RUN_TESTS") then
+		print(install_cmd)
+		print(test_cmd)
+		return true
+	end
+	if os.execute(test_cmd) then
+		return true
+	end
+	return os.execute(install_cmd)
+end
 
 local n = {
 	warn = warnmsg,
@@ -381,7 +400,8 @@ local n = {
 	addsshkey = addsshkey,
 	update_sshd_config = update_sshd_config,
 	chpasswd = chpasswd,
-	pkg_bootstrap = pkg_bootstrap
+	pkg_bootstrap = pkg_bootstrap,
+	install_package = install_package
 }
 
 return n
diff --git a/libexec/nuageinit/nuageinit b/libexec/nuageinit/nuageinit
index ef215af00924..ef5726960978 100755
--- a/libexec/nuageinit/nuageinit
+++ b/libexec/nuageinit/nuageinit
@@ -69,6 +69,22 @@ local function get_ifaces()
 	return myifaces
 end
 
+local function install_packages(packages)
+	if not nuage.pkg_bootstrap() then
+		nuage.warn("Failed to bootstrap pkg, skip installing packages")
+		return
+	end
+	for n, p in pairs(packages) do
+		if type(p) == "string" then
+			if not nuage.install_package(p) then
+				nuage.warn("Failed to install : " .. p)
+			end
+		else
+			nuage.warn("Invalid type : " .. type(p) .. " for packages entry number " .. n)
+		end
+	end
+end
+
 local function config2_network(p)
 	local parser = ucl.parser()
 	local f = io.open(p .. "/network_data.json")
@@ -370,6 +386,9 @@ if line == "#cloud-config" then
 			end
 		end
 	end
+	if obj.packages then
+		install_packages(obj.packages)
+	end
 else
 	local res, err = os.execute(path .. "/" .. ud)
 	if not res then
diff --git a/libexec/nuageinit/tests/nuageinit.sh b/libexec/nuageinit/tests/nuageinit.sh
index 06f4a12d7503..e8742be3ba51 100644
--- a/libexec/nuageinit/tests/nuageinit.sh
+++ b/libexec/nuageinit/tests/nuageinit.sh
@@ -24,6 +24,7 @@ atf_test_case nocloud_userdata_cloudconfig_chpasswd
 atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
 atf_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
 atf_test_case config2_userdata_runcmd
+atf_test_case config2_userdata_packages
 
 setup_test_adduser()
 {
@@ -736,6 +737,48 @@ EOF
 	atf_check -s exit:0 -o inline:"FreeBSD\n" cat "${PWD}"/media/nuageinit/runcmd_uname
 }
 
+config2_userdata_packages_head()
+{
+	atf_set "require.user" root
+}
+config2_userdata_packages_body()
+{
+	mkdir -p media/nuageinit
+	setup_test_adduser
+	export NUAGE_RUN_TESTS=1
+	printf "{}" > media/nuageinit/meta_data.json
+	cat > media/nuageinit/user_data << 'EOF'
+#cloud-config
+packages:
+EOF
+	chmod 755 "${PWD}"/media/nuageinit/user_data
+	atf_check -s exit:1 -e match:"attempt to index a nil value" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
+	cat > media/nuageinit/user_data << 'EOF'
+#cloud-config
+packages:
+  - yeah/plop
+EOF
+	chmod 755 "${PWD}"/media/nuageinit/user_data
+	atf_check -s exit:0 -o inline:"pkg install -y yeah/plop\npkg info -q yeah/plop\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
+
+	cat > media/nuageinit/user_data << 'EOF'
+#cloud-config
+packages:
+  - curl
+EOF
+	chmod 755 "${PWD}"/media/nuageinit/user_data
+	atf_check -o inline:"pkg install -y curl\npkg info -q curl\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
+
+	cat > media/nuageinit/user_data << 'EOF'
+#cloud-config
+packages:
+  - curl
+  - meh: bla
+EOF
+	chmod 755 "${PWD}"/media/nuageinit/user_data
+	atf_check -o inline:"pkg install -y curl\npkg info -q curl\n" -e inline:"nuageinit: Invalid type : table for packages entry number 2\n" /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case args
@@ -756,4 +799,5 @@ atf_init_test_cases()
 	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_string
 	atf_add_test_case nocloud_userdata_cloudconfig_chpasswd_list_list
 	atf_add_test_case config2_userdata_runcmd
+	atf_add_test_case config2_userdata_packages
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202506061627.556GR1IQ066518>