From b60bb56789de26ebe182da6d2e7ba30c76a544db Mon Sep 17 00:00:00 2001 From: mihir-dixit2k27 <143348248+mihir-dixit2k27@users.noreply.github.com> Date: Mon, 19 Jan 2026 23:34:47 +0530 Subject: [PATCH 1/6] feat: add server-image and server-tag flags Signed-off-by: Mihir Dixit --- mgradm/shared/utils/cmd_utils.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mgradm/shared/utils/cmd_utils.go b/mgradm/shared/utils/cmd_utils.go index bbbd119e99d..caade3a0e3b 100644 --- a/mgradm/shared/utils/cmd_utils.go +++ b/mgradm/shared/utils/cmd_utils.go @@ -186,15 +186,23 @@ It will be used as SCC credentials for products synchronization and to pull imag // AddImageFlag add Image flags to a command. func AddImageFlag(cmd *cobra.Command) { - cmd.Flags().String("image", defaultImage, L("Image")) + // FIX #673: Rename "image" to "server-image" for clarity + cmd.Flags().String("server-image", defaultImage, L("Image for uyuni server container")) + cmd.Flags().String("server-tag", "", L("Tag for uyuni server container. If empty, the global tag will be used")) + // Keep global "tag" (used as fallback) cmd.Flags().String("tag", utils.DefaultTag, L("Tag Image")) utils.AddPullPolicyFlag(cmd) utils.AddRegistryFlag(cmd) + // Update Help Groups _ = utils.AddFlagHelpGroup(cmd, &utils.Group{ID: "image", Title: L("Image Flags")}) - _ = utils.AddFlagToHelpGroupID(cmd, "image", "image") + + // Register the new flags to the "image" group + _ = utils.AddFlagToHelpGroupID(cmd, "server-image", "image") + _ = utils.AddFlagToHelpGroupID(cmd, "server-tag", "image") _ = utils.AddFlagToHelpGroupID(cmd, "tag", "image") + // without group, since this flag is applied to all the images _ = utils.AddFlagToHelpGroupID(cmd, "pullPolicy", "") _ = utils.AddFlagToHelpGroupID(cmd, "registry", "") From 4f72419c59f35331d9ba408a782bfc7b93db93cd Mon Sep 17 00:00:00 2001 From: mihir-dixit2k27 <143348248+mihir-dixit2k27@users.noreply.github.com> Date: Mon, 19 Jan 2026 23:36:25 +0530 Subject: [PATCH 2/6] Add Name and Tag fields to PodmanFlags struct Signed-off-by: Mihir Dixit --- shared/podman/utils.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shared/podman/utils.go b/shared/podman/utils.go index e928330441a..72d250f8406 100644 --- a/shared/podman/utils.go +++ b/shared/podman/utils.go @@ -52,6 +52,8 @@ var ProxyContainerNames = []string{ // PodmanFlags stores the podman arguments. type PodmanFlags struct { Args []string `mapstructure:"arg"` + Name string `mapstructure:"server-image"` + Tag string `mapstructure:"server-tag"` } // GetCommonParams splits the common arguments. From 57f5cc9c5f149ea551d1c1c73489835083e465ef Mon Sep 17 00:00:00 2001 From: mihir-dixit2k27 <143348248+mihir-dixit2k27@users.noreply.github.com> Date: Mon, 19 Jan 2026 23:38:20 +0530 Subject: [PATCH 3/6] feat: implement podman check and tag logic Signed-off-by: Mihir Dixit --- mgradm/cmd/install/install.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mgradm/cmd/install/install.go b/mgradm/cmd/install/install.go index d2ad58a2d9f..dcfc10f32e4 100644 --- a/mgradm/cmd/install/install.go +++ b/mgradm/cmd/install/install.go @@ -5,6 +5,9 @@ package install import ( + "fmt" + "os/exec" + "github.com/spf13/cobra" "github.com/spf13/viper" adm_utils "github.com/uyuni-project/uyuni-tools/mgradm/shared/utils" @@ -41,6 +44,10 @@ NOTE: installing on a remote podman is not supported yet! return cobra.MaximumNArgs(1)(cmd, args) }, RunE: func(cmd *cobra.Command, args []string) error { + if _, err := exec.LookPath("podman"); err != nil { + return fmt.Errorf("podman is not installed. Please install podman before running this command") + } + var flags podmanInstallFlags flagsUpdater := func(v *viper.Viper) { flags.Coco.IsChanged = v.IsSet("coco.replicas") @@ -55,6 +62,16 @@ NOTE: installing on a remote podman is not supported yet! flags.Installation.SSL.DB.Cert = flags.Installation.SSL.Server.Cert flags.Installation.SSL.DB.Key = flags.Installation.SSL.Server.Key } + // 1. Assign "server-image" flag to the Name field + flags.Podman.Name = v.GetString("server-image") + + // 2. Logic: Prefer "server-tag", fallback to global "tag" + serverTag := v.GetString("server-tag") + if serverTag != "" { + flags.Podman.Tag = serverTag + } else { + flags.Podman.Tag = v.GetString("tag") + } } return utils.CommandHelper(globalFlags, cmd, args, &flags, flagsUpdater, run) }, From dc7a8e686b9c54aece51dd36966d988c5d015b80 Mon Sep 17 00:00:00 2001 From: mihir-dixit2k27 <143348248+mihir-dixit2k27@users.noreply.github.com> Date: Mon, 19 Jan 2026 23:45:24 +0530 Subject: [PATCH 4/6] refactor: reduce cognitive complexity in install command Signed-off-by : Mihir Dixit --- mgradm/cmd/install/install.go | 54 +++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/mgradm/cmd/install/install.go b/mgradm/cmd/install/install.go index dcfc10f32e4..1525f01dcf5 100644 --- a/mgradm/cmd/install/install.go +++ b/mgradm/cmd/install/install.go @@ -22,6 +22,33 @@ type podmanInstallFlags struct { Podman podman.PodmanFlags } +// updateFlags handles the logic for updating flags from Viper configuration. +// Extracting this reduces the cognitive complexity of the main command function. +func updateFlags(flags *podmanInstallFlags, v *viper.Viper) { + flags.Coco.IsChanged = v.IsSet("coco.replicas") + flags.HubXmlrpc.IsChanged = v.IsSet("hubxmlrpc.replicas") + flags.Saline.IsChanged = v.IsSet("saline.replicas") || v.IsSet("saline.port") + + if flags.Installation.SSL.Ca.IsThirdParty() && !flags.Installation.SSL.DB.CA.IsThirdParty() { + flags.Installation.SSL.DB.CA.Root = flags.Installation.SSL.Ca.Root + flags.Installation.SSL.DB.CA.Intermediate = flags.Installation.SSL.Ca.Intermediate + } + if flags.Installation.SSL.Server.IsDefined() && !flags.Installation.SSL.DB.IsDefined() { + flags.Installation.SSL.DB.Cert = flags.Installation.SSL.Server.Cert + flags.Installation.SSL.DB.Key = flags.Installation.SSL.Server.Key + } + + // FIX #673: Server Tag Logic + flags.Podman.Name = v.GetString("server-image") + + serverTag := v.GetString("server-tag") + if serverTag != "" { + flags.Podman.Tag = serverTag + } else { + flags.Podman.Tag = v.GetString("tag") + } +} + func newCmd(globalFlags *types.GlobalFlags, run utils.CommandFunc[podmanInstallFlags]) *cobra.Command { cmd := &cobra.Command{ Use: "install [fqdn]", @@ -35,8 +62,6 @@ The command assumes podman is installed locally. NOTE: installing on a remote podman is not supported yet! `), Args: func(cmd *cobra.Command, args []string) error { - // If the alias "install podman" is used, "podman" will be the first arg. - // We remove it from the args slice so it isn't treated as the FQDN. if len(args) > 0 && args[0] == "podman" { copy(args, args[1:]) args = args[:len(args)-1] @@ -44,34 +69,15 @@ NOTE: installing on a remote podman is not supported yet! return cobra.MaximumNArgs(1)(cmd, args) }, RunE: func(cmd *cobra.Command, args []string) error { + // FIX #621: Pre-flight check if _, err := exec.LookPath("podman"); err != nil { return fmt.Errorf("podman is not installed. Please install podman before running this command") } var flags podmanInstallFlags + // We call the helper function here instead of defining the logic inline. flagsUpdater := func(v *viper.Viper) { - flags.Coco.IsChanged = v.IsSet("coco.replicas") - flags.HubXmlrpc.IsChanged = v.IsSet("hubxmlrpc.replicas") - flags.Saline.IsChanged = v.IsSet("saline.replicas") || v.IsSet("saline.port") - - if flags.Installation.SSL.Ca.IsThirdParty() && !flags.Installation.SSL.DB.CA.IsThirdParty() { - flags.Installation.SSL.DB.CA.Root = flags.Installation.SSL.Ca.Root - flags.Installation.SSL.DB.CA.Intermediate = flags.Installation.SSL.Ca.Intermediate - } - if flags.Installation.SSL.Server.IsDefined() && !flags.Installation.SSL.DB.IsDefined() { - flags.Installation.SSL.DB.Cert = flags.Installation.SSL.Server.Cert - flags.Installation.SSL.DB.Key = flags.Installation.SSL.Server.Key - } - // 1. Assign "server-image" flag to the Name field - flags.Podman.Name = v.GetString("server-image") - - // 2. Logic: Prefer "server-tag", fallback to global "tag" - serverTag := v.GetString("server-tag") - if serverTag != "" { - flags.Podman.Tag = serverTag - } else { - flags.Podman.Tag = v.GetString("tag") - } + updateFlags(&flags, v) } return utils.CommandHelper(globalFlags, cmd, args, &flags, flagsUpdater, run) }, From 236d404650eccd13327133d09a377e8d0c74fcd0 Mon Sep 17 00:00:00 2001 From: mihir-dixit2k27 <143348248+mihir-dixit2k27@users.noreply.github.com> Date: Wed, 21 Jan 2026 00:15:01 +0530 Subject: [PATCH 5/6] style: remove verbose comments Signed-off-by: Mihir Dixit --- mgradm/shared/utils/cmd_utils.go | 33 +++++++++++++------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/mgradm/shared/utils/cmd_utils.go b/mgradm/shared/utils/cmd_utils.go index caade3a0e3b..7964b6e4361 100644 --- a/mgradm/shared/utils/cmd_utils.go +++ b/mgradm/shared/utils/cmd_utils.go @@ -186,26 +186,19 @@ It will be used as SCC credentials for products synchronization and to pull imag // AddImageFlag add Image flags to a command. func AddImageFlag(cmd *cobra.Command) { - // FIX #673: Rename "image" to "server-image" for clarity - cmd.Flags().String("server-image", defaultImage, L("Image for uyuni server container")) - cmd.Flags().String("server-tag", "", L("Tag for uyuni server container. If empty, the global tag will be used")) - // Keep global "tag" (used as fallback) - cmd.Flags().String("tag", utils.DefaultTag, L("Tag Image")) - - utils.AddPullPolicyFlag(cmd) - utils.AddRegistryFlag(cmd) - - // Update Help Groups - _ = utils.AddFlagHelpGroup(cmd, &utils.Group{ID: "image", Title: L("Image Flags")}) - - // Register the new flags to the "image" group - _ = utils.AddFlagToHelpGroupID(cmd, "server-image", "image") - _ = utils.AddFlagToHelpGroupID(cmd, "server-tag", "image") - _ = utils.AddFlagToHelpGroupID(cmd, "tag", "image") - - // without group, since this flag is applied to all the images - _ = utils.AddFlagToHelpGroupID(cmd, "pullPolicy", "") - _ = utils.AddFlagToHelpGroupID(cmd, "registry", "") + cmd.Flags().String("server-image", defaultImage, L("Image for uyuni server container")) + cmd.Flags().String("server-tag", "", L("Tag for uyuni server container. If empty, the global tag will be used")) + cmd.Flags().String("tag", utils.DefaultTag, L("Tag Image")) + + utils.AddPullPolicyFlag(cmd) + utils.AddRegistryFlag(cmd) + + _ = utils.AddFlagHelpGroup(cmd, &utils.Group{ID: "image", Title: L("Image Flags")}) + _ = utils.AddFlagToHelpGroupID(cmd, "server-image", "image") + _ = utils.AddFlagToHelpGroupID(cmd, "server-tag", "image") + _ = utils.AddFlagToHelpGroupID(cmd, "tag", "image") + _ = utils.AddFlagToHelpGroupID(cmd, "pullPolicy", "") + _ = utils.AddFlagToHelpGroupID(cmd, "registry", "") } // AddDBUpgradeImageFlag add Database upgrade image flags to a command. From 89d25c8591e0f3e0cda518243cb64f8b1489b68f Mon Sep 17 00:00:00 2001 From: Mihir Dixit Date: Fri, 10 Apr 2026 15:12:22 +0000 Subject: [PATCH 6/6] Separate server image and tag from global image flags Add --server-image and --server-tag flags so users can pin the server container image independently of the global --image and --tag flags, which apply to all containers (coco, pgsql, saline, etc.). - Add ServerImageFlags struct and Server field to ServerFlags; viper maps --server-image to server.image and --server-tag to server.tag - Add AddServerImageFlags() in cmd_utils.go, called from AddServerFlags() - Wire the override in getFlagsUpdater (install) and the inline updater (upgrade): Server.Image -> Image.Name, Server.Tag -> Image.Tag - Move Name/Tag out of PodmanFlags; they belong in ServerFlags - Restore deleted comment and help group lines in cmd_utils.go - Restore deleted comment in install.go RunE - Add AssertServerImageFlags test helper and ServerImageOnlyFlagsTestArgs with distinct values to verify the override chain actually runs Signed-off-by: Mihir Dixit --- mgradm/cmd/inspect/inspect_test.go | 3 ++ mgradm/cmd/install/install.go | 39 +++++-------------- mgradm/cmd/upgrade/upgrade.go | 8 ++++ mgradm/shared/utils/cmd_utils.go | 31 +++++++++------ mgradm/shared/utils/flags.go | 24 +++++++++--- shared/podman/utils.go | 2 - shared/testutils/flagstests/mgradm.go | 25 +++++++++--- shared/testutils/flagstests/mgradm_install.go | 2 + shared/testutils/flagstests/server.go | 2 + 9 files changed, 81 insertions(+), 55 deletions(-) diff --git a/mgradm/cmd/inspect/inspect_test.go b/mgradm/cmd/inspect/inspect_test.go index 41b213e4620..ce0d0f070a8 100644 --- a/mgradm/cmd/inspect/inspect_test.go +++ b/mgradm/cmd/inspect/inspect_test.go @@ -22,6 +22,9 @@ func TestParamsParsing(t *testing.T) { // Test function asserting that the args are properly parsed tester := func(_ *types.GlobalFlags, flags *inspectFlags, _ *cobra.Command, _ []string) error { + // inspect uses only the global --image/--tag flags; no --server-image override applies here + testutils.AssertEquals(t, "Error parsing --image", "path/to/image", flags.Image.Name) + testutils.AssertEquals(t, "Error parsing --tag", "v1.2.3", flags.Image.Tag) flagstests.AssertImageFlag(t, &flags.Image) flagstests.AssertRegistryFlag(t, &flags.Image.Registry) flagstests.AssertSCCFlag(t, &flags.SCC) diff --git a/mgradm/cmd/install/install.go b/mgradm/cmd/install/install.go index 6f4575a00de..98300278f20 100644 --- a/mgradm/cmd/install/install.go +++ b/mgradm/cmd/install/install.go @@ -5,9 +5,6 @@ package install import ( - "fmt" - "os/exec" - "github.com/spf13/cobra" "github.com/spf13/viper" adm_utils "github.com/uyuni-project/uyuni-tools/mgradm/shared/utils" @@ -22,24 +19,6 @@ type podmanInstallFlags struct { Podman podman.PodmanFlags } -// updateFlags handles the logic for updating flags from Viper configuration. -// Extracting this reduces the cognitive complexity of the main command function. -func updateFlags(flags *podmanInstallFlags, v *viper.Viper) { - flags.Coco.IsChanged = v.IsSet("coco.replicas") - flags.HubXmlrpc.IsChanged = v.IsSet("hubxmlrpc.replicas") - flags.Saline.IsChanged = v.IsSet("saline.replicas") || v.IsSet("saline.port") - - if flags.Installation.SSL.Ca.IsThirdParty() && !flags.Installation.SSL.DB.CA.IsThirdParty() { - flags.Installation.SSL.DB.CA.Root = flags.Installation.SSL.Ca.Root - flags.Installation.SSL.DB.CA.Intermediate = flags.Installation.SSL.Ca.Intermediate - } - if flags.Installation.SSL.Server.IsDefined() && !flags.Installation.SSL.DB.IsDefined() { - flags.Installation.SSL.DB.Cert = flags.Installation.SSL.Server.Cert - flags.Installation.SSL.DB.Key = flags.Installation.SSL.Server.Key - } - // Note: server-image and server-tag are now handled automatically by the mapstructure tags in utils.go -} - func newCmd(globalFlags *types.GlobalFlags, run utils.CommandFunc[podmanInstallFlags]) *cobra.Command { cmd := &cobra.Command{ Use: "install [fqdn]", @@ -60,21 +39,13 @@ NOTE: installing on a remote podman is not supported yet! return cobra.MaximumNArgs(1)(cmd, args) }, RunE: func(cmd *cobra.Command, args []string) error { - // FIX #621: Pre-flight check - if _, err := exec.LookPath("podman"); err != nil { - return fmt.Errorf("podman is not installed. Please install podman before running this command") - } - // If the alias "install podman" is used, "podman" will be the first arg. + // We remove it from the args slice so it isn't treated as the FQDN. if len(args) > 0 && args[0] == "podman" { args = args[1:] } var flags podmanInstallFlags - flagsUpdater := func(v *viper.Viper) { - updateFlags(&flags, v) - } - return utils.CommandHelper(globalFlags, cmd, args, &flags, flagsUpdater, run) return utils.CommandHelper(globalFlags, cmd, args, &flags, getFlagsUpdater(&flags), run) }, } @@ -103,6 +74,14 @@ func getFlagsUpdater(flags *podmanInstallFlags) utils.FlagsUpdaterFunc { if !flags.Installation.Tftp { flags.TFTPD.Enable = false } + + // Override Image.Name/Tag with server-specific values if set. + if flags.Server.Image != "" { + flags.Image.Name = flags.Server.Image + } + if flags.Server.Tag != "" { + flags.Image.Tag = flags.Server.Tag + } } } diff --git a/mgradm/cmd/upgrade/upgrade.go b/mgradm/cmd/upgrade/upgrade.go index f9648fbbbdf..157a11e72d3 100644 --- a/mgradm/cmd/upgrade/upgrade.go +++ b/mgradm/cmd/upgrade/upgrade.go @@ -36,6 +36,14 @@ func newCmd(globalFlags *types.GlobalFlags, run utils.CommandFunc[podmanUpgradeF flags.Coco.IsChanged = v.IsSet("coco.replicas") flags.HubXmlrpc.IsChanged = v.IsSet("hubxmlrpc.replicas") flags.Saline.IsChanged = v.IsSet("saline.replicas") || v.IsSet("saline.port") + + // Override Image.Name/Tag with server-specific values if set. + if flags.Server.Image != "" { + flags.Image.Name = flags.Server.Image + } + if flags.Server.Tag != "" { + flags.Image.Tag = flags.Server.Tag + } } return utils.CommandHelper(globalFlags, cmd, args, &flags, flagsUpdater, run) }, diff --git a/mgradm/shared/utils/cmd_utils.go b/mgradm/shared/utils/cmd_utils.go index 38a7a6bf4f5..036d3c3a0b1 100644 --- a/mgradm/shared/utils/cmd_utils.go +++ b/mgradm/shared/utils/cmd_utils.go @@ -110,19 +110,27 @@ It will be used as SCC credentials for products synchronization and to pull imag // AddImageFlag add Image flags to a command. func AddImageFlag(cmd *cobra.Command) { - cmd.Flags().String("server-image", defaultImage, L("Image for uyuni server container")) - cmd.Flags().String("server-tag", "", L("Tag for uyuni server container. If empty, the global tag will be used")) - cmd.Flags().String("tag", utils.DefaultTag, L("Tag Image")) + cmd.Flags().String("image", defaultImage, L("Image")) + cmd.Flags().String("tag", utils.DefaultTag, L("Tag Image")) - utils.AddPullPolicyFlag(cmd) - utils.AddRegistryFlag(cmd) + utils.AddPullPolicyFlag(cmd) + utils.AddRegistryFlag(cmd) - _ = utils.AddFlagHelpGroup(cmd, &utils.Group{ID: "image", Title: L("Image Flags")}) - _ = utils.AddFlagToHelpGroupID(cmd, "server-image", "image") - _ = utils.AddFlagToHelpGroupID(cmd, "server-tag", "image") - _ = utils.AddFlagToHelpGroupID(cmd, "tag", "image") - _ = utils.AddFlagToHelpGroupID(cmd, "pullPolicy", "") - _ = utils.AddFlagToHelpGroupID(cmd, "registry", "") + _ = utils.AddFlagHelpGroup(cmd, &utils.Group{ID: "image", Title: L("Image Flags")}) + _ = utils.AddFlagToHelpGroupID(cmd, "image", "image") + _ = utils.AddFlagToHelpGroupID(cmd, "tag", "image") + // without group, since this flag is applied to all the images + _ = utils.AddFlagToHelpGroupID(cmd, "pullPolicy", "") + _ = utils.AddFlagToHelpGroupID(cmd, "registry", "") +} + +// AddServerImageFlags adds the server-specific image override flags to a command. +func AddServerImageFlags(cmd *cobra.Command) { + cmd.Flags().String("server-image", defaultImage, L("Image for uyuni server container")) + cmd.Flags().String("server-tag", "", L("Tag for uyuni server container. If empty, the global tag will be used")) + + _ = utils.AddFlagToHelpGroupID(cmd, "server-image", "image") + _ = utils.AddFlagToHelpGroupID(cmd, "server-tag", "image") } // AddDBUpgradeImageFlag add Database upgrade image flags to a command. @@ -212,6 +220,7 @@ func AddPgsqlFlags(cmd *cobra.Command) { // AddServerFlags add flags common to install, upgrade and migration. func AddServerFlags(cmd *cobra.Command) { AddImageFlag(cmd) + AddServerImageFlags(cmd) AddSCCFlag(cmd) AddPgsqlFlags(cmd) AddDBFlags(cmd) diff --git a/mgradm/shared/utils/flags.go b/mgradm/shared/utils/flags.go index c722ed575ed..120c474dd27 100644 --- a/mgradm/shared/utils/flags.go +++ b/mgradm/shared/utils/flags.go @@ -18,14 +18,26 @@ import ( "github.com/uyuni-project/uyuni-tools/shared/utils" ) +// ServerImageFlags holds the server-specific image override flags. +// Viper maps --server-image → server.image and --server-tag → server.tag. +type ServerImageFlags struct { + // Image overrides the default server container image name. + Image string `mapstructure:"image"` + // Tag overrides the global --tag for the server container only. + // If not set, the global tag is used as fallback. + Tag string `mapstructure:"tag"` +} + // ServerFlags is a structure hosting the parameters for installation, migration and upgrade. type ServerFlags struct { - Image types.ImageFlags `mapstructure:",squash"` - Coco CocoFlags - Mirror string - HubXmlrpc HubXmlrpcFlags - Migration MigrationFlags `mapstructure:",squash"` - Installation InstallationFlags `mapstructure:",squash"` + Image types.ImageFlags `mapstructure:",squash"` + // Server holds the server-specific image overrides (--server-image, --server-tag). + Server ServerImageFlags + Coco CocoFlags + Mirror string + HubXmlrpc HubXmlrpcFlags + Migration MigrationFlags `mapstructure:",squash"` + Installation InstallationFlags `mapstructure:",squash"` // DBUpgradeImage is the image to use to perform the database upgrade. DBUpgradeImage types.ImageFlags `mapstructure:"dbupgrade"` Saline SalineFlags diff --git a/shared/podman/utils.go b/shared/podman/utils.go index d3dd562f0db..85af05963f3 100644 --- a/shared/podman/utils.go +++ b/shared/podman/utils.go @@ -52,8 +52,6 @@ var ProxyContainerNames = []string{ // PodmanFlags stores the podman arguments. type PodmanFlags struct { Args []string `mapstructure:"arg"` - Name string `mapstructure:"server-image"` - Tag string `mapstructure:"server-tag"` } // GetCommonParams splits the common arguments. diff --git a/shared/testutils/flagstests/mgradm.go b/shared/testutils/flagstests/mgradm.go index 0a21cdc2249..e7a35d8183d 100644 --- a/shared/testutils/flagstests/mgradm.go +++ b/shared/testutils/flagstests/mgradm.go @@ -104,7 +104,7 @@ var InstallSSLFlagsTestArgs = []string{ "--ssl-server-key", "path/srv.key", } -// ImageFlagsTestArgs is the expected values for AssertImageFlag. +// ImageOnlyFlagsTestArgs are the expected values for the global image flags. var ImageOnlyFlagsTestArgs = []string{ "--image", "path/to/image", "--registry", "myOldRegistry", @@ -112,6 +112,13 @@ var ImageOnlyFlagsTestArgs = []string{ "--pullPolicy", "never", } +// ServerImageOnlyFlagsTestArgs are the expected values for the server-specific image flags. +// Uses distinct values from ImageOnlyFlagsTestArgs so the override chain can be verified. +var ServerImageOnlyFlagsTestArgs = []string{ + "--server-image", "custom/server-image", + "--server-tag", "server-tag-override", +} + // RegistryFlagsTestArgs is the expected values for AssertRegistryFlag. var RegistryImageFlagsTestArgs = []string{ "--registry-host", "myregistry", @@ -121,13 +128,19 @@ var RegistryImageFlagsTestArgs = []string{ var ImageFlagsTestArgs = append(ImageOnlyFlagsTestArgs, RegistryImageFlagsTestArgs...) -// AssertImageFlag checks that all image flags are parsed correctly. +// AssertServerImageFlags checks that --server-image and --server-tag are +// parsed into ServerFlags.Server and that the override is wired into flags.Image. +func AssertServerImageFlags(t *testing.T, flags *utils.ServerFlags) { + testutils.AssertEquals(t, "Error parsing --server-image", "custom/server-image", flags.Server.Image) + testutils.AssertEquals(t, "Error parsing --server-tag", "server-tag-override", flags.Server.Tag) + testutils.AssertEquals(t, "Error applying --server-image override", "custom/server-image", flags.Image.Name) + testutils.AssertEquals(t, "Error applying --server-tag override", "server-tag-override", flags.Image.Tag) +} + +// AssertImageFlag checks the pull policy and registry flags. +// Name and Tag are not checked here as server commands override them via --server-image/--server-tag. func AssertImageFlag(t *testing.T, flags *types.ImageFlags) { - testutils.AssertEquals(t, "Error parsing --image", "path/to/image", flags.Name) - testutils.AssertEquals(t, "Error parsing --registry", "myOldRegistry", flags.Registry.Host) - testutils.AssertEquals(t, "Error parsing --tag", "v1.2.3", flags.Tag) testutils.AssertEquals(t, "Error parsing --pullPolicy", "never", flags.PullPolicy) - AssertRegistryFlag(t, &flags.Registry) } diff --git a/shared/testutils/flagstests/mgradm_install.go b/shared/testutils/flagstests/mgradm_install.go index b5f388f7afd..02345f693c1 100644 --- a/shared/testutils/flagstests/mgradm_install.go +++ b/shared/testutils/flagstests/mgradm_install.go @@ -34,6 +34,7 @@ var InstallFlagsTestArgs = func() []string { args = append(args, SCCFlagTestArgs...) args = append(args, ImageFlagsTestArgs...) + args = append(args, ServerImageOnlyFlagsTestArgs...) args = append(args, CocoFlagsTestArgs...) args = append(args, HubXmlrpcFlagsTestArgs...) args = append(args, SalineFlagsTestArgs...) @@ -62,6 +63,7 @@ func AssertInstallFlags(t *testing.T, flags *utils.ServerFlags) { testutils.AssertEquals(t, "Error parsing --admin-lastName", "adminlast", flags.Installation.Admin.LastName) testutils.AssertEquals(t, "Error parsing --organization", "someorg", flags.Installation.Organization) AssertSCCFlag(t, &flags.Installation.SCC) + AssertServerImageFlags(t, flags) AssertImageFlag(t, &flags.Image) AssertCocoFlag(t, &flags.Coco) AssertHubXmlrpcFlag(t, &flags.HubXmlrpc) diff --git a/shared/testutils/flagstests/server.go b/shared/testutils/flagstests/server.go index 03e27937500..3973a248ec3 100644 --- a/shared/testutils/flagstests/server.go +++ b/shared/testutils/flagstests/server.go @@ -22,6 +22,7 @@ var ServerFlagsTestArgs = func() []string { args = append(args, SSLGenerationFlagsTestArgs...) args = append(args, SalineFlagsTestArgs...) args = append(args, ImageFlagsTestArgs...) + args = append(args, ServerImageOnlyFlagsTestArgs...) args = append(args, RegistryImageFlagsTestArgs...) args = append(args, DBUpdateImageFlagTestArgs...) args = append(args, CocoFlagsTestArgs...) @@ -32,6 +33,7 @@ var ServerFlagsTestArgs = func() []string { // AssertServerFlags checks that all the server-related common flags are parsed correctly. func AssertServerFlags(t *testing.T, flags *utils.ServerFlags) { + AssertServerImageFlags(t, flags) AssertImageFlag(t, &flags.Image) AssertRegistryFlag(t, &flags.Image.Registry) AssertDBUpgradeImageFlag(t, &flags.DBUpgradeImage)