From bb865ba0979e6ec2a8deca66f74d838761e9d640 Mon Sep 17 00:00:00 2001 From: James Nesbitt Date: Wed, 14 Jan 2026 14:14:25 +0200 Subject: [PATCH] PRODENG-3325-mke-repo-with-colon-port - fix failure with MKE repo with a `:port` in it, which breaks detection - made new docker image repo tag detector function, and added tests for this failure - mke Collect facts uses this new detector function Signed-off-by: James Nesbitt --- pkg/docker/image.go | 18 ++++++++++++++++++ pkg/docker/image_test.go | 14 ++++++++++++++ pkg/mke/mke.go | 15 ++++++--------- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/pkg/docker/image.go b/pkg/docker/image.go index 33a73380..18355391 100644 --- a/pkg/docker/image.go +++ b/pkg/docker/image.go @@ -1,6 +1,7 @@ package docker import ( + "errors" "fmt" "regexp" "strings" @@ -146,3 +147,20 @@ func AllToRepository(images []*Image, repo string) (list []*Image) { } return list } + +var errInvalidVersion = errors.New("invalid image version") + +// ImageRepoAndTag returns the Repo and tag from a container image. +// +// e.g. `dtr.efzp.com:9026/mirantis/ucp-agent:3.8.10` => `dtr.efzp.com:9026/mirantis/ucp-agent`, `3.8.10` +func ImageRepoAndTag(image string) (string, string, error) { + vparts := strings.Split(image, ":") + vpartslen := len(vparts) + if vpartslen < 2 || vpartslen > 3 { + return "", "", fmt.Errorf("%w: malformed version output: %s", errInvalidVersion, image) + } + + repo := strings.Join(vparts[0:vpartslen-1], ":") + version := vparts[vpartslen-1] + return repo, version, nil +} diff --git a/pkg/docker/image_test.go b/pkg/docker/image_test.go index 0cba1944..42102aee 100644 --- a/pkg/docker/image_test.go +++ b/pkg/docker/image_test.go @@ -69,3 +69,17 @@ registry.ci.mirantis.com/mirantiseng/ucp-auth-store:3.8.7` require.Equal(t, "registry.ci.mirantis.com/mirantiseng/ucp-alertmanager:3.8.7", images[1].String()) require.Equal(t, "registry.ci.mirantis.com/mirantiseng/ucp-auth-store:3.8.7", images[2].String()) } + +func TestImageVersions(t *testing.T) { + repo, tag, err := docker.ImageRepoAndTag("mirantis/ucp-proxy:3.8.8") + require.Nil(t, err, "SwarmMKEVersion gave unexpected error from valid version string") + require.Equal(t, "mirantis/ucp-proxy", repo, "SwarmMKEVersion gave wrong repo value") + require.Equal(t, "3.8.8", tag, "SwarmMKEVersion gave wrong repo value") +} + +func TestImageVersionsWithColon(t *testing.T) { + repo, tag, err := docker.ImageRepoAndTag("dtr.efzp.com:9026/mirantis/ucp-agent:3.8.10") + require.Nil(t, err, "SwarmMKEVersion gave unexpected error from valid version string") + require.Equal(t, "dtr.efzp.com:9026/mirantis/ucp-agent", repo, "SwarmMKEVersion gave wrong repo value") + require.Equal(t, "3.8.10", tag, "SwarmMKEVersion gave wrong repo value") +} diff --git a/pkg/mke/mke.go b/pkg/mke/mke.go index 3427b44c..de38a5f2 100644 --- a/pkg/mke/mke.go +++ b/pkg/mke/mke.go @@ -20,6 +20,7 @@ import ( "time" "github.com/Mirantis/launchpad/pkg/constant" + "github.com/Mirantis/launchpad/pkg/docker" commonconfig "github.com/Mirantis/launchpad/pkg/product/common/config" mkeconfig "github.com/Mirantis/launchpad/pkg/product/mke/config" "github.com/hashicorp/go-version" @@ -40,8 +41,6 @@ type Credentials struct { Password string `json:"password,omitempty"` } -var errInvalidVersion = errors.New("invalid version") - // CollectFacts gathers the current status of installed mke setup. func CollectFacts(swarmLeader *mkeconfig.Host, mkeMeta *mkeconfig.MKEMetadata) error { output, err := swarmLeader.ExecOutput(swarmLeader.Configurer.DockerCommandf(`inspect --format '{{.Config.Image}}' ucp-proxy`)) @@ -51,15 +50,13 @@ func CollectFacts(swarmLeader *mkeconfig.Host, mkeMeta *mkeconfig.MKEMetadata) e return nil } - vparts := strings.Split(output, ":") - if len(vparts) != 2 { - return fmt.Errorf("%w: malformed version output: %s", errInvalidVersion, output) + repo, tag, verr := docker.ImageRepoAndTag(output) + if verr != nil { + return fmt.Errorf("%w: malformed version output: %s", verr, output) } - repo := vparts[0][:strings.LastIndexByte(vparts[0], '/')] - mkeMeta.Installed = true - mkeMeta.InstalledVersion = vparts[1] - mkeMeta.InstalledBootstrapImage = fmt.Sprintf("%s:/ucp:%s", repo, vparts[1]) + mkeMeta.InstalledVersion = tag + mkeMeta.InstalledBootstrapImage = fmt.Sprintf("%s:/ucp:%s", repo, tag) // Find out calico data plane by inspecting the calico container's env variables cmd := swarmLeader.Configurer.DockerCommandf(`ps --filter label=name="Calico node" --format {{.ID}}`)