From 729e7e84a3270d0dda0075b8b81d757a300f46ad Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Mon, 14 Jul 2025 14:00:52 +0200 Subject: [PATCH 01/14] Add Upgrade Functionality Signed-off-by: Hadi Chokr --- doc/toolbox-upgrade.1.md | 61 +++++++++++++++ doc/toolbox.1.md | 4 + src/cmd/upgrade.go | 156 +++++++++++++++++++++++++++++++++++++++ src/cmd/utils.go | 1 + 4 files changed, 222 insertions(+) create mode 100644 doc/toolbox-upgrade.1.md create mode 100644 src/cmd/upgrade.go diff --git a/doc/toolbox-upgrade.1.md b/doc/toolbox-upgrade.1.md new file mode 100644 index 000000000..8007e1639 --- /dev/null +++ b/doc/toolbox-upgrade.1.md @@ -0,0 +1,61 @@ + +% toolbox-upgrade 1 + +## NAME +toolbox\-upgrade - Upgrade packages in Toolbx containers + +## SYNOPSIS +**toolbox upgrade** [*--all* | *-a*] [*--container* | *-c* *CONTAINER*] + +## DESCRIPTION +Upgrades packages inside one or more Toolbx containers by automatically detecting +the package manager (dnf, apt, pacman, etc.) and running the appropriate upgrade +command. The container should have been created using the `toolbox create` command. + +This command will: +1. Detect the available package manager in the container +2. Run the appropriate update/upgrade commands +3. Report any errors that occur during the process + +## OPTIONS +**--all, -a** +Upgrade all Toolbx containers. Cannot be used with *--container*. + +**--container, -c** *CONTAINER* +Upgrade a specific Toolbx container. Cannot be used with *--all*. + +## EXAMPLES +**Upgrade packages in a specific container:** +``` +$ toolbox upgrade --container fedora-toolbox-38 +``` + +**Upgrade packages in all containers:** +``` +$ toolbox upgrade --all +``` + +**Typical output:** +``` +Detected package manager: dnf +Updating metadata... +Upgrading packages... +Complete! +``` + +## NOTES +Supported package managers: +- dnf (Fedora, RHEL) +- microdnf (Minimal Fedora/RHEL) +- yum (Older RHEL/Fedora) +- apt (Debian, Ubuntu) +- pacman (Arch Linux) +- xbps (Void Linux) +- zypper (openSUSE) +- apk (Alpine Linux) +- emerge (Gentoo) +- slackpkg (Slackware) +- swupd (Clear Linux) + +## SEE ALSO +`toolbox(1)`, `toolbox-create(1)`, `toolbox-list(1)` diff --git a/doc/toolbox.1.md b/doc/toolbox.1.md index 6102e7b43..f225ab7d0 100644 --- a/doc/toolbox.1.md +++ b/doc/toolbox.1.md @@ -160,6 +160,10 @@ Remove one or more Toolbx images. Run a command in an existing Toolbx container. +**toolbox-upgrade(1)** + +Upgrade one or more existing Toolbx containers via their Package Manager. + ## FILES ## **toolbox.conf(5)** diff --git a/src/cmd/upgrade.go b/src/cmd/upgrade.go new file mode 100644 index 000000000..990679a40 --- /dev/null +++ b/src/cmd/upgrade.go @@ -0,0 +1,156 @@ +/* + * Copyright © 2025 Hadi Chokr + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +package cmd + +import ( + "errors" + "fmt" + "os" + + "github.com/containers/toolbox/pkg/utils" + "github.com/spf13/cobra" +) + +var ( + upgradeAll bool + upgradeContainer string +) + +var upgradeCmd = &cobra.Command{ + Use: "upgrade", + Short: "Detect package manager and upgrade packages in toolbx containers", + RunE: runUpgrade, + ValidArgsFunction: completionContainerNamesFiltered, +} + +func init() { + upgradeCmd.Flags().BoolVar(&upgradeAll, "all", false, "Upgrade all Toolbx containers") + upgradeCmd.Flags().StringVar(&upgradeContainer, "container", "", "Name of the toolbox container to upgrade") + + // Register container flag completion + if err := upgradeCmd.RegisterFlagCompletionFunc("container", completionContainerNames); err != nil { + fmt.Fprintf(os.Stderr, "failed to register flag completion function: %v\n", err) + os.Exit(1) + } + upgradeCmd.SetHelpFunc(upgradeHelp) + rootCmd.AddCommand(upgradeCmd) +} + +func runUpgrade(cmd *cobra.Command, args []string) error { + if !upgradeAll && upgradeContainer == "" { + return errors.New("must specify either --all or --container") + } + + if upgradeAll && upgradeContainer != "" { + return errors.New("cannot specify both --all and --container") + } + + if upgradeAll { + containers, err := getContainers() + if err != nil { + return err + } + + if len(containers) == 0 { + return errors.New("no Toolbx containers found") + } + + for _, container := range containers { + fmt.Printf("Upgrading container: %s\n", container.Name()) + if err := execUpgradeInContainer(container.Name()); err != nil { + fmt.Fprintf(os.Stderr, "Error upgrading container %s: %v\n", container.Name(), err) + // Continue with next container instead of returning + } + } + return nil + } + + return execUpgradeInContainer(upgradeContainer) +} + +// execUpgradeInContainer runs detection and upgrade inside the specified container +func execUpgradeInContainer(container string) error { + pkgs := []struct { + detect string + upgrade string + name string + }{ + {"command -v dnf", "sudo dnf -y upgrade", "dnf"}, + {"command -v microdnf", "sudo microdnf upgrade -y", "microdnf"}, + {"command -v yum", "sudo yum -y upgrade", "yum"}, + {"command -v apt", "sudo apt update && apt upgrade -y", "apt"}, + {"command -v pacman", "sudo pacman -Syu --noconfirm", "pacman"}, + {"command -v xbps-install", "sudo xbps-install -Su -y", "xbps"}, + {"command -v zypper", "sudo zypper update -y", "zypper"}, + {"command -v apk", "sudo apk update && apk upgrade", "apk"}, + {"command -v emerge", "sudo emerge --sync && emerge -uDN @world", "emerge"}, + {"command -v slackpkg", "sudo slackpkg update && slackpkg upgrade-all", "slackpkg"}, + {"command -v swupd", "sudo swupd update", "swupd"}, + } + + for _, pkg := range pkgs { + // Use runCommand to check if package manager exists + err := runCommand(container, + false, // defaultContainer + "", // image + "", // release + 0, // preserveFDs + []string{"sh", "-c", pkg.detect}, + false, // emitEscapeSequence + false, // fallbackToBash + true) // pedantic + + if err == nil { + fmt.Printf("Detected package manager: %s\n", pkg.name) + + // Use runCommand to execute the upgrade + upgradeErr := runCommand(container, + false, + "", + "", + 0, + []string{"sh", "-c", pkg.upgrade}, + false, + false, + true) + + return upgradeErr + } + } + return errors.New("no supported package manager found") +} + +func upgradeHelp(cmd *cobra.Command, args []string) { + if utils.IsInsideContainer() { + if !utils.IsInsideToolboxContainer() { + fmt.Fprintf(os.Stderr, "Error: this is not a Toolbx container\n") + return + } + + if _, err := utils.ForwardToHost(); err != nil { + fmt.Fprintf(os.Stderr, "Error: %s\n", err) + return + } + + return + } + + if err := showManual("toolbox-upgrade"); err != nil { + fmt.Fprintf(os.Stderr, "Error: %s\n", err) + return + } +} diff --git a/src/cmd/utils.go b/src/cmd/utils.go index e35fb3df2..6a2ab26dd 100644 --- a/src/cmd/utils.go +++ b/src/cmd/utils.go @@ -362,6 +362,7 @@ func getUsageForCommonCommands() string { builder.WriteString("create Create a new Toolbx container\n") builder.WriteString("enter Enter an existing Toolbx container\n") builder.WriteString("list List all existing Toolbx containers and images\n") + builder.WriteString("upgrade Upgrade an existing Toolbx container via their Package Manager\n") usage := builder.String() return usage From 3d8efa0411e094657ae535d667125772588fb0cf Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Sat, 19 Jul 2025 16:03:02 +0200 Subject: [PATCH 02/14] Add missing sudo calls. Signed-off-by: Hadi Chokr --- src/cmd/upgrade.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/upgrade.go b/src/cmd/upgrade.go index 990679a40..b9997fdb1 100644 --- a/src/cmd/upgrade.go +++ b/src/cmd/upgrade.go @@ -92,13 +92,13 @@ func execUpgradeInContainer(container string) error { {"command -v dnf", "sudo dnf -y upgrade", "dnf"}, {"command -v microdnf", "sudo microdnf upgrade -y", "microdnf"}, {"command -v yum", "sudo yum -y upgrade", "yum"}, - {"command -v apt", "sudo apt update && apt upgrade -y", "apt"}, + {"command -v apt", "sudo apt update && sudo apt upgrade -y", "apt"}, {"command -v pacman", "sudo pacman -Syu --noconfirm", "pacman"}, {"command -v xbps-install", "sudo xbps-install -Su -y", "xbps"}, {"command -v zypper", "sudo zypper update -y", "zypper"}, - {"command -v apk", "sudo apk update && apk upgrade", "apk"}, - {"command -v emerge", "sudo emerge --sync && emerge -uDN @world", "emerge"}, - {"command -v slackpkg", "sudo slackpkg update && slackpkg upgrade-all", "slackpkg"}, + {"command -v apk", "sudo apk update && sudo apk upgrade", "apk"}, + {"command -v emerge", "sudo emerge --sync && sudo emerge -uDN @world", "emerge"}, + {"command -v slackpkg", "sudo slackpkg update && sudo slackpkg upgrade-all", "slackpkg"}, {"command -v swupd", "sudo swupd update", "swupd"}, } From 2193cffab92063af5077ded9c0a5bdc423055caf Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Mon, 28 Jul 2025 14:38:01 +0200 Subject: [PATCH 03/14] No Flag Container Signed-off-by: Hadi Chokr --- src/cmd/upgrade.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/cmd/upgrade.go b/src/cmd/upgrade.go index b9997fdb1..2818e9336 100644 --- a/src/cmd/upgrade.go +++ b/src/cmd/upgrade.go @@ -31,8 +31,9 @@ var ( ) var upgradeCmd = &cobra.Command{ - Use: "upgrade", + Use: "upgrade [container]", Short: "Detect package manager and upgrade packages in toolbx containers", + Args: cobra.MaximumNArgs(1), RunE: runUpgrade, ValidArgsFunction: completionContainerNamesFiltered, } @@ -51,12 +52,17 @@ func init() { } func runUpgrade(cmd *cobra.Command, args []string) error { + // Use positional argument as container name if --container not set + if upgradeContainer == "" && len(args) == 1 { + upgradeContainer = args[0] + } + if !upgradeAll && upgradeContainer == "" { - return errors.New("must specify either --all or --container") + return errors.New("must specify either --all or a container name") } if upgradeAll && upgradeContainer != "" { - return errors.New("cannot specify both --all and --container") + return errors.New("cannot specify both --all and a container name") } if upgradeAll { @@ -73,7 +79,6 @@ func runUpgrade(cmd *cobra.Command, args []string) error { fmt.Printf("Upgrading container: %s\n", container.Name()) if err := execUpgradeInContainer(container.Name()); err != nil { fmt.Fprintf(os.Stderr, "Error upgrading container %s: %v\n", container.Name(), err) - // Continue with next container instead of returning } } return nil From e0568a6919622c47c9472b48f9fb66270015c5b2 Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Mon, 28 Jul 2025 16:40:54 +0200 Subject: [PATCH 04/14] Use Metadate instead Signed-off-by: Hadi Chokr --- src/cmd/upgrade.go | 68 ++++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/src/cmd/upgrade.go b/src/cmd/upgrade.go index 2818e9336..aa55c384f 100644 --- a/src/cmd/upgrade.go +++ b/src/cmd/upgrade.go @@ -21,6 +21,7 @@ import ( "fmt" "os" + "github.com/containers/toolbox/pkg/podman" "github.com/containers/toolbox/pkg/utils" "github.com/spf13/cobra" ) @@ -89,54 +90,31 @@ func runUpgrade(cmd *cobra.Command, args []string) error { // execUpgradeInContainer runs detection and upgrade inside the specified container func execUpgradeInContainer(container string) error { - pkgs := []struct { - detect string - upgrade string - name string - }{ - {"command -v dnf", "sudo dnf -y upgrade", "dnf"}, - {"command -v microdnf", "sudo microdnf upgrade -y", "microdnf"}, - {"command -v yum", "sudo yum -y upgrade", "yum"}, - {"command -v apt", "sudo apt update && sudo apt upgrade -y", "apt"}, - {"command -v pacman", "sudo pacman -Syu --noconfirm", "pacman"}, - {"command -v xbps-install", "sudo xbps-install -Su -y", "xbps"}, - {"command -v zypper", "sudo zypper update -y", "zypper"}, - {"command -v apk", "sudo apk update && sudo apk upgrade", "apk"}, - {"command -v emerge", "sudo emerge --sync && sudo emerge -uDN @world", "emerge"}, - {"command -v slackpkg", "sudo slackpkg update && sudo slackpkg upgrade-all", "slackpkg"}, - {"command -v swupd", "sudo swupd update", "swupd"}, + + inspectedcontainer, err := podman.InspectContainer(container) + if err != nil { + return errors.New("Failed to inspect Metadata.") } - for _, pkg := range pkgs { - // Use runCommand to check if package manager exists - err := runCommand(container, - false, // defaultContainer - "", // image - "", // release - 0, // preserveFDs - []string{"sh", "-c", pkg.detect}, - false, // emitEscapeSequence - false, // fallbackToBash - true) // pedantic - - if err == nil { - fmt.Printf("Detected package manager: %s\n", pkg.name) - - // Use runCommand to execute the upgrade - upgradeErr := runCommand(container, - false, - "", - "", - 0, - []string{"sh", "-c", pkg.upgrade}, - false, - false, - true) - - return upgradeErr - } + labels := inspectedcontainer.Labels() + pkgline := labels["com.github.containers.toolbox.package-manager.update"] + if pkgline == "" { + return errors.New("'com.github.containers.toolbox.package-manager.update' Label not set in Containers Metadata.") + } else { + // Use runCommand to execute the upgrade + upgradeErr := runCommand(inspectedcontainer.Name(), + false, + "", + "", + 0, + []string{"sh", "-c", pkgline}, + false, + false, + true) + + return upgradeErr + } - return errors.New("no supported package manager found") } func upgradeHelp(cmd *cobra.Command, args []string) { From fc77ef424055d374337244092e383923cfcad803 Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Mon, 28 Jul 2025 16:56:46 +0200 Subject: [PATCH 05/14] Update Docs. Signed-off-by: Hadi Chokr --- doc/toolbox-upgrade.1.md | 76 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/doc/toolbox-upgrade.1.md b/doc/toolbox-upgrade.1.md index 8007e1639..f9154ef8a 100644 --- a/doc/toolbox-upgrade.1.md +++ b/doc/toolbox-upgrade.1.md @@ -1,61 +1,63 @@ -% toolbox-upgrade 1 +% toolbox-upgrade(1) ## NAME -toolbox\-upgrade - Upgrade packages in Toolbx containers +toolbox-upgrade - Upgrade packages in Toolbx containers ## SYNOPSIS -**toolbox upgrade** [*--all* | *-a*] [*--container* | *-c* *CONTAINER*] +**toolbox upgrade** [*--all* | *-a*] [*--container* | *-c* *CONTAINER*] [*CONTAINER*] ## DESCRIPTION -Upgrades packages inside one or more Toolbx containers by automatically detecting -the package manager (dnf, apt, pacman, etc.) and running the appropriate upgrade -command. The container should have been created using the `toolbox create` command. +Upgrades packages inside one or more Toolbx containers. The container must have been created using `toolbox create` and must include a label specifying how to upgrade its packages. This command will: -1. Detect the available package manager in the container -2. Run the appropriate update/upgrade commands +1. Read the container's metadata label `com.github.containers.toolbox.package-manager.update` +2. Run the specified upgrade command inside the container 3. Report any errors that occur during the process +The `--container` flag is optional when a positional container name is given. + +## LABEL REQUIREMENT +Each container **must** have the following OCI label set in its metadata: + +`com.github.containers.toolbox.package-manager.update="COMMAND"` + +This label defines the exact package upgrade command to run inside the container. For example: + +`com.github.containers.toolbox.package-manager.update="sudo dnf --assumeyes update"` + +This label is typically the responsibility of the **image publisher** and should be present at container creation. + ## OPTIONS -**--all, -a** -Upgrade all Toolbx containers. Cannot be used with *--container*. -**--container, -c** *CONTAINER* -Upgrade a specific Toolbx container. Cannot be used with *--all*. +**--all, -a** +Upgrade all Toolbx containers. Cannot be used with *--container* or a positional argument. + +**--container, -c** *CONTAINER* +Upgrade a specific Toolbx container. Optional when a positional container name is provided. ## EXAMPLES -**Upgrade packages in a specific container:** -``` + +**Upgrade a specific container (positional):** + +$ toolbox upgrade fedora-toolbox-38 + + +**Upgrade a specific container (flag):** + $ toolbox upgrade --container fedora-toolbox-38 -``` -**Upgrade packages in all containers:** -``` + +**Upgrade all containers:** + $ toolbox upgrade --all -``` -**Typical output:** -``` -Detected package manager: dnf -Updating metadata... -Upgrading packages... -Complete! -``` ## NOTES -Supported package managers: -- dnf (Fedora, RHEL) -- microdnf (Minimal Fedora/RHEL) -- yum (Older RHEL/Fedora) -- apt (Debian, Ubuntu) -- pacman (Arch Linux) -- xbps (Void Linux) -- zypper (openSUSE) -- apk (Alpine Linux) -- emerge (Gentoo) -- slackpkg (Slackware) -- swupd (Clear Linux) + +- This command doesn't perform package manager detection itself. +- It relies entirely on the container image to define the correct update mechanism. +- The `package-manager.update` label **must be set**; otherwise, the upgrade will fail. ## SEE ALSO `toolbox(1)`, `toolbox-create(1)`, `toolbox-list(1)` From 9a22e47d40fda0fb2debc53d4723e373db8e0fca Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Wed, 13 Aug 2025 09:58:59 +0300 Subject: [PATCH 06/14] Update utils.go Signed-off-by: Hadi Chokr --- src/cmd/utils.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cmd/utils.go b/src/cmd/utils.go index 6a2ab26dd..e35fb3df2 100644 --- a/src/cmd/utils.go +++ b/src/cmd/utils.go @@ -362,7 +362,6 @@ func getUsageForCommonCommands() string { builder.WriteString("create Create a new Toolbx container\n") builder.WriteString("enter Enter an existing Toolbx container\n") builder.WriteString("list List all existing Toolbx containers and images\n") - builder.WriteString("upgrade Upgrade an existing Toolbx container via their Package Manager\n") usage := builder.String() return usage From 9129f1d79578b2d1c7f87fd001d51d32b022a735 Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Fri, 15 Aug 2025 10:19:24 +0300 Subject: [PATCH 07/14] Add Label to Arch Toolbx Signed-off-by: Hadi Chokr --- images/arch/Containerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/images/arch/Containerfile b/images/arch/Containerfile index 00163eada..8257a6cd5 100644 --- a/images/arch/Containerfile +++ b/images/arch/Containerfile @@ -1,6 +1,7 @@ FROM docker.io/library/archlinux:base-devel LABEL com.github.containers.toolbox="true" \ + com.github.containers.toolbox.package-manager.update="sudo pacman -Syu --noconfirm" \ name="arch-toolbox" \ version="base-devel" \ usage="This image is meant to be used with the toolbox command" \ From 9d52ebb521c829762d60e3bbbb716d6065fbef8f Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Fri, 15 Aug 2025 10:22:36 +0300 Subject: [PATCH 08/14] Add Label to Ubuntu 25.04 Signed-off-by: Hadi Chokr --- images/ubuntu/25.04/Containerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/images/ubuntu/25.04/Containerfile b/images/ubuntu/25.04/Containerfile index c2f21a971..d417302e4 100644 --- a/images/ubuntu/25.04/Containerfile +++ b/images/ubuntu/25.04/Containerfile @@ -1,6 +1,7 @@ FROM docker.io/library/ubuntu:25.04 LABEL com.github.containers.toolbox="true" \ + com.github.containers.toolbox.package-manager.update="sudo DEBIAN_FRONTEND=noninteractive apt-get update -y && sudo apt-get upgrade -y" \ name="ubuntu-toolbox" \ version="25.04" \ usage="This image is meant to be used with the toolbox command" \ From 7135809f4655e78d36033d14599b3c87959d2de1 Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Fri, 15 Aug 2025 10:23:18 +0300 Subject: [PATCH 09/14] Add Label to Ubuntu 24.04 LTS Signed-off-by: Hadi Chokr --- images/ubuntu/24.04/Containerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/images/ubuntu/24.04/Containerfile b/images/ubuntu/24.04/Containerfile index 7644f51c4..027d44d32 100644 --- a/images/ubuntu/24.04/Containerfile +++ b/images/ubuntu/24.04/Containerfile @@ -1,6 +1,7 @@ FROM docker.io/library/ubuntu:24.04 LABEL com.github.containers.toolbox="true" \ + com.github.containers.toolbox.package-manager.update="sudo DEBIAN_FRONTEND=noninteractive apt-get update -y && sudo apt-get upgrade -y" \ name="ubuntu-toolbox" \ version="24.04" \ usage="This image is meant to be used with the toolbox command" \ From 25e6a57275716a8d82794b315cc9dd61eba7249c Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Fri, 15 Aug 2025 10:23:57 +0300 Subject: [PATCH 10/14] Add Label to Ubuntu 24.10 Signed-off-by: Hadi Chokr --- images/ubuntu/24.10/Containerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/images/ubuntu/24.10/Containerfile b/images/ubuntu/24.10/Containerfile index ee89e0eb9..baa20f81f 100644 --- a/images/ubuntu/24.10/Containerfile +++ b/images/ubuntu/24.10/Containerfile @@ -1,6 +1,7 @@ FROM docker.io/library/ubuntu:24.10 LABEL com.github.containers.toolbox="true" \ + com.github.containers.toolbox.package-manager.update="sudo DEBIAN_FRONTEND=noninteractive apt-get update -y && sudo apt-get upgrade -y" \ name="ubuntu-toolbox" \ version="24.10" \ usage="This image is meant to be used with the toolbox command" \ From ed07005174acbfffbc08824f97a096ee61d5f595 Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Fri, 15 Aug 2025 10:33:30 +0300 Subject: [PATCH 11/14] Create 111-upgrade.bats Signed-off-by: Hadi Chokr --- test/system/111-upgrade.bats | 74 ++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 test/system/111-upgrade.bats diff --git a/test/system/111-upgrade.bats b/test/system/111-upgrade.bats new file mode 100644 index 000000000..e84b9729b --- /dev/null +++ b/test/system/111-upgrade.bats @@ -0,0 +1,74 @@ +# shellcheck shell=bats +# +# Copyright © 2025 Hadi Chokr +# Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 +# +# 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. +# +# bats file_tags=commands-options + +load 'libs/bats-support/load' +load 'libs/bats-assert/load' +load 'libs/helpers' + +setup() { + bats_require_minimum_version 1.8.0 + cleanup_all +} + +teardown() { + cleanup_all +} + +@test "upgrade(Arch): Upgrade Arch container" { + create_distro_container arch latest arch-toolbox-test + run container_started arch-toolbox-test + assert_success + + run "$TOOLBX" upgrade --container arch-toolbox-test + assert_success + + # Optional: check container still runs after upgrade + run container_started arch-toolbox-test + assert_success +} + +@test "upgrade(Ubuntu 25.04): Upgrade Ubuntu container" { + create_distro_container ubuntu 25.04 ubuntu-toolbox-test + run container_started ubuntu-toolbox-test + assert_success + + run "$TOOLBX" upgrade --container ubuntu-toolbox-test + assert_success + + # Optional: check container still runs after upgrade + run container_started ubuntu-toolbox-test + assert_success +} + +@test "upgrade(All): Upgrade all containers" { + create_distro_container arch latest arch-toolbox-all-test + create_distro_container ubuntu 25.04 ubuntu-toolbox-all-test + + run container_started arch-toolbox-all-test + assert_success + run container_started ubuntu-toolbox-all-test + assert_success + + run "$TOOLBX" upgrade --all + assert_success + + # Optional: check both containers still run + run container_started arch-toolbox-all-test + assert_success + run container_started ubuntu-toolbox-all-test + assert_success +} From 8545d437dd8ce6f40a9c8fa9e20044fb7d6e4d4d Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Fri, 15 Aug 2025 10:36:12 +0300 Subject: [PATCH 12/14] Update meson.build Signed-off-by: Hadi Chokr --- test/system/meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/test/system/meson.build b/test/system/meson.build index c53add0cc..d0af9b0c4 100644 --- a/test/system/meson.build +++ b/test/system/meson.build @@ -9,6 +9,7 @@ test_system = files( '106-rm.bats', '107-rmi.bats', '108-completion.bats', + '111-upgrade.bats', '201-ipc.bats', '203-network.bats', '206-user.bats', From b8988e5f66c71990f2c0c954972c162b70bd7176 Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Fri, 15 Aug 2025 23:15:07 +0300 Subject: [PATCH 13/14] Update 111-upgrade.bats Signed-off-by: Hadi Chokr --- test/system/111-upgrade.bats | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/test/system/111-upgrade.bats b/test/system/111-upgrade.bats index e84b9729b..237ee3b71 100644 --- a/test/system/111-upgrade.bats +++ b/test/system/111-upgrade.bats @@ -35,28 +35,11 @@ teardown() { run "$TOOLBX" upgrade --container arch-toolbox-test assert_success - - # Optional: check container still runs after upgrade - run container_started arch-toolbox-test - assert_success -} - -@test "upgrade(Ubuntu 25.04): Upgrade Ubuntu container" { - create_distro_container ubuntu 25.04 ubuntu-toolbox-test - run container_started ubuntu-toolbox-test - assert_success - - run "$TOOLBX" upgrade --container ubuntu-toolbox-test - assert_success - - # Optional: check container still runs after upgrade - run container_started ubuntu-toolbox-test - assert_success } @test "upgrade(All): Upgrade all containers" { create_distro_container arch latest arch-toolbox-all-test - create_distro_container ubuntu 25.04 ubuntu-toolbox-all-test + create_distro_container ubuntu latest ubuntu-toolbox-all-test run container_started arch-toolbox-all-test assert_success @@ -65,10 +48,4 @@ teardown() { run "$TOOLBX" upgrade --all assert_success - - # Optional: check both containers still run - run container_started arch-toolbox-all-test - assert_success - run container_started ubuntu-toolbox-all-test - assert_success } From 61e54a6a1b3567bbb54b14f2797c8cdd08204d55 Mon Sep 17 00:00:00 2001 From: Hadi Chokr Date: Sat, 16 Aug 2025 09:32:23 +0300 Subject: [PATCH 14/14] Improve Tests. Signed-off-by: Hadi Chokr --- test/system/111-upgrade.bats | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/test/system/111-upgrade.bats b/test/system/111-upgrade.bats index 237ee3b71..1324159d5 100644 --- a/test/system/111-upgrade.bats +++ b/test/system/111-upgrade.bats @@ -30,20 +30,23 @@ teardown() { @test "upgrade(Arch): Upgrade Arch container" { create_distro_container arch latest arch-toolbox-test - run container_started arch-toolbox-test assert_success run "$TOOLBX" upgrade --container arch-toolbox-test assert_success } -@test "upgrade(All): Upgrade all containers" { - create_distro_container arch latest arch-toolbox-all-test - create_distro_container ubuntu latest ubuntu-toolbox-all-test +@test "upgrade(Arch): Upgrade Arch container without --container flag" { + create_distro_container arch latest arch-toolbox-test + assert_success - run container_started arch-toolbox-all-test + run "$TOOLBX" upgrade arch-toolbox-test assert_success - run container_started ubuntu-toolbox-all-test +} + +@test "upgrade(All): Upgrade all containers" { + create_distro_container arch latest arch-toolbox-all-test + create_default_container assert_success run "$TOOLBX" upgrade --all