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 6df30751370..cb65dac7023 100644 --- a/mgradm/cmd/install/install.go +++ b/mgradm/cmd/install/install.go @@ -44,6 +44,7 @@ NOTE: installing on a remote podman is not supported yet! if len(args) > 0 && args[0] == "podman" { args = args[1:] } + var flags podmanInstallFlags return utils.CommandHelper(globalFlags, cmd, args, &flags, getFlagsUpdater(&flags), run) }, @@ -71,10 +72,21 @@ func getFlagsUpdater(flags *podmanInstallFlags) utils.FlagsUpdaterFunc { flags.Installation.SSL.DB.Cert = flags.Installation.SSL.Server.Cert flags.Installation.SSL.DB.Key = flags.Installation.SSL.Server.Key } + 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 + } } } // NewCommand for installation. func NewCommand(globalFlags *types.GlobalFlags) *cobra.Command { return newCmd(globalFlags, installForPodman) -} +} \ No newline at end of file diff --git a/mgradm/cmd/upgrade/upgrade.go b/mgradm/cmd/upgrade/upgrade.go index 03d718d437b..3e1ba93ca52 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 + } flags.TFTPD.IsChanged = v.IsSet("tftpd.enable") } 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 22859f234db..32560b3776e 100644 --- a/mgradm/shared/utils/cmd_utils.go +++ b/mgradm/shared/utils/cmd_utils.go @@ -127,6 +127,15 @@ func AddImageFlag(cmd *cobra.Command) { _ = 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. func AddDBUpgradeImageFlag(cmd *cobra.Command) { defaultImage := path.Join(utils.DefaultImagePrefix, "server-database-migration") @@ -214,6 +223,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 8f5d6feff68..1c4b1190e71 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/testutils/flagstests/mgradm.go b/shared/testutils/flagstests/mgradm.go index f17db51c78c..a541bab05a7 100644 --- a/shared/testutils/flagstests/mgradm.go +++ b/shared/testutils/flagstests/mgradm.go @@ -105,7 +105,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", @@ -113,6 +113,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", @@ -122,13 +129,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 7da9f7563e5..6657aa398e1 100644 --- a/shared/testutils/flagstests/mgradm_install.go +++ b/shared/testutils/flagstests/mgradm_install.go @@ -33,6 +33,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...) @@ -60,6 +61,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)