summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgy95 <guoyao17@huawei.com>2022-09-22 21:06:35 +0800
committergy95 <guoyao17@huawei.com>2022-09-23 10:18:47 +0800
commit952791c7cbfffb3926a38ba18b89b3401067de0e (patch)
tree65ab7b3a9c7601a40f263e5e530cfec64cc27e54
parentMerge pull request #4004 from gy95/upgrade (diff)
downloadkubeedge-952791c7cbfffb3926a38ba18b89b3401067de0e.tar.gz
update NodeUpgradeJob Image description
Signed-off-by: gy95 <guoyao17@huawei.com>
-rw-r--r--build/crds/operations/operations_v1alpha1_nodeupgradejob.yaml7
-rw-r--r--cloud/pkg/nodeupgradejobcontroller/controller/downstream.go17
-rw-r--r--cloud/pkg/nodeupgradejobcontroller/controller/util.go11
-rw-r--r--cloud/pkg/nodeupgradejobcontroller/controller/util_test.go32
-rw-r--r--edge/pkg/edgehub/upgrade/upgrade.go10
-rw-r--r--manifests/charts/cloudcore/crds/operations_v1alpha1_nodeupgradejob.yaml7
-rw-r--r--pkg/apis/operations/v1alpha1/type.go4
7 files changed, 70 insertions, 18 deletions
diff --git a/build/crds/operations/operations_v1alpha1_nodeupgradejob.yaml b/build/crds/operations/operations_v1alpha1_nodeupgradejob.yaml
index c9e25ae47..a3ea81624 100644
--- a/build/crds/operations/operations_v1alpha1_nodeupgradejob.yaml
+++ b/build/crds/operations/operations_v1alpha1_nodeupgradejob.yaml
@@ -40,9 +40,10 @@ spec:
description: 'Image specifies a container image name, the image contains:
keadm and edgecore. keadm is used as upgradetool, to install the
new version of edgecore. The image name consists of registry hostname
- and repository name, but cannot includes the tag, Version above
- will be used as the tag. If the registry hostname is empty, docker.io
- will be used as default. The default image name is: kubeedge/installation-package.'
+ and repository name, if it includes the tag or digest, the tag or
+ digest will be overwritten by Version field above. If the registry
+ hostname is empty, docker.io will be used as default. The default
+ image name is: kubeedge/installation-package.'
type: string
labelSelector:
description: LabelSelector is a filter to select member clusters by
diff --git a/cloud/pkg/nodeupgradejobcontroller/controller/downstream.go b/cloud/pkg/nodeupgradejobcontroller/controller/downstream.go
index a833b94f5..e95e33d13 100644
--- a/cloud/pkg/nodeupgradejobcontroller/controller/downstream.go
+++ b/cloud/pkg/nodeupgradejobcontroller/controller/downstream.go
@@ -147,6 +147,21 @@ func (dc *DownstreamController) nodeUpgradeJobAdded(upgrade *v1alpha1.NodeUpgrad
klog.Infof("Filtered finished, the below nodes are to upgrade\n%v\n", nodesToUpgrade)
+ // if users specify Image, we'll use upgrade Version as its image tag, even though Image contains tag.
+ // if not, we'll use default image: kubeedge/installation-package:${Version}
+ var repo string
+ var err error
+ repo = "kubeedge/installation-package"
+ if upgrade.Spec.Image != "" {
+ repo, err = GetImageRepo(upgrade.Spec.Image)
+ if err != nil {
+ klog.Errorf("Image format is not right: %v", err)
+ return
+ }
+ }
+ imageTag := upgrade.Spec.Version
+ image := fmt.Sprintf("%s:%s", repo, imageTag)
+
for _, node := range nodesToUpgrade {
// send upgrade msg to every edge node
msg := model.NewMessage("")
@@ -158,7 +173,7 @@ func (dc *DownstreamController) nodeUpgradeJobAdded(upgrade *v1alpha1.NodeUpgrad
HistoryID: uuid.New().String(),
UpgradeTool: upgrade.Spec.UpgradeTool,
Version: upgrade.Spec.Version,
- Image: upgrade.Spec.Image,
+ Image: image,
}
msg.BuildRouter(modules.NodeUpgradeJobControllerModuleName, modules.NodeUpgradeJobControllerModuleGroup, resource, NodeUpgrade).
diff --git a/cloud/pkg/nodeupgradejobcontroller/controller/util.go b/cloud/pkg/nodeupgradejobcontroller/controller/util.go
index a93b69663..ddca4c26d 100644
--- a/cloud/pkg/nodeupgradejobcontroller/controller/util.go
+++ b/cloud/pkg/nodeupgradejobcontroller/controller/util.go
@@ -20,6 +20,7 @@ import (
"fmt"
"strings"
+ "github.com/distribution/distribution/v3/reference"
metav1 "k8s.io/api/core/v1"
"github.com/kubeedge/kubeedge/common/constants"
@@ -136,3 +137,13 @@ func mergeAnnotationUpgradeHistory(origin, fromVersion, toVersion string) string
sets = append(sets, newHistory)
return strings.Join(sets, ";")
}
+
+// GetImageRepo gets repo from a container image
+func GetImageRepo(image string) (string, error) {
+ named, err := reference.ParseNormalizedNamed(image)
+ if err != nil {
+ return "", fmt.Errorf("failed to parse image name: %v", err)
+ }
+
+ return named.Name(), nil
+}
diff --git a/cloud/pkg/nodeupgradejobcontroller/controller/util_test.go b/cloud/pkg/nodeupgradejobcontroller/controller/util_test.go
index f71164a0f..ba0901903 100644
--- a/cloud/pkg/nodeupgradejobcontroller/controller/util_test.go
+++ b/cloud/pkg/nodeupgradejobcontroller/controller/util_test.go
@@ -220,3 +220,35 @@ func TestMergeAnnotationUpgradeHistory(t *testing.T) {
})
}
}
+
+func TestGetImageRepo(t *testing.T) {
+ tests := []struct {
+ Image string
+ ExpectRepo string
+ }{
+ {Image: "name", ExpectRepo: "docker.io/library/name"},
+ {Image: "name:tag", ExpectRepo: "docker.io/library/name"},
+ {Image: "name@sha256:59329e44d499406bd2e620473b0ba0b531abb7e326cef0156f33e5957cdfe259", ExpectRepo: "docker.io/library/name"},
+ {Image: "org/name", ExpectRepo: "docker.io/org/name"},
+ {Image: "org/name:tag", ExpectRepo: "docker.io/org/name"},
+ {Image: "org/name@sha256:59329e44d499406bd2e620473b0ba0b531abb7e326cef0156f33e5957cdfe259", ExpectRepo: "docker.io/org/name"},
+ {Image: "registry:8080/name", ExpectRepo: "registry:8080/name"},
+ {Image: "registry:8080/name:tag", ExpectRepo: "registry:8080/name"},
+ {Image: "registry:8080/name@sha256:59329e44d499406bd2e620473b0ba0b531abb7e326cef0156f33e5957cdfe259", ExpectRepo: "registry:8080/name"},
+ {Image: "registry:8080/org/name", ExpectRepo: "registry:8080/org/name"},
+ {Image: "registry:8080/org/name:tag", ExpectRepo: "registry:8080/org/name"},
+ {Image: "registry:8080/org/name@sha256:59329e44d499406bd2e620473b0ba0b531abb7e326cef0156f33e5957cdfe259", ExpectRepo: "registry:8080/org/name"},
+ }
+
+ for _, test := range tests {
+ t.Run(test.Image, func(t *testing.T) {
+ repo, err := GetImageRepo(test.Image)
+ if err != nil {
+ t.Errorf("error: %v", err)
+ }
+ if repo != test.ExpectRepo {
+ t.Errorf("Got = %v, Want = %v", repo, test.ExpectRepo)
+ }
+ })
+ }
+}
diff --git a/edge/pkg/edgehub/upgrade/upgrade.go b/edge/pkg/edgehub/upgrade/upgrade.go
index 3095a3284..e5194d3c6 100644
--- a/edge/pkg/edgehub/upgrade/upgrade.go
+++ b/edge/pkg/edgehub/upgrade/upgrade.go
@@ -117,15 +117,7 @@ func (*keadmUpgrade) Upgrade(upgradeReq *commontypes.NodeUpgradeJobRequest) erro
return fmt.Errorf("failed to new container runtime: %v", err)
}
- var image string
- imageTag := upgradeReq.Version
- // if users specify Image, we'll use upgrade Version as its image tag
- // if not, we'll use default image: kubeedge/installation-package:${Version}
- if upgradeReq.Image != "" {
- image = fmt.Sprintf("%s:%s", upgradeReq.Image, imageTag)
- } else {
- image = fmt.Sprintf("%s:%s", "kubeedge/installation-package", imageTag)
- }
+ image := upgradeReq.Image
// TODO: do some verification 1.sha256(pass in using CRD) 2.image signature verification
// TODO: release verification mechanism
diff --git a/manifests/charts/cloudcore/crds/operations_v1alpha1_nodeupgradejob.yaml b/manifests/charts/cloudcore/crds/operations_v1alpha1_nodeupgradejob.yaml
index c9e25ae47..a3ea81624 100644
--- a/manifests/charts/cloudcore/crds/operations_v1alpha1_nodeupgradejob.yaml
+++ b/manifests/charts/cloudcore/crds/operations_v1alpha1_nodeupgradejob.yaml
@@ -40,9 +40,10 @@ spec:
description: 'Image specifies a container image name, the image contains:
keadm and edgecore. keadm is used as upgradetool, to install the
new version of edgecore. The image name consists of registry hostname
- and repository name, but cannot includes the tag, Version above
- will be used as the tag. If the registry hostname is empty, docker.io
- will be used as default. The default image name is: kubeedge/installation-package.'
+ and repository name, if it includes the tag or digest, the tag or
+ digest will be overwritten by Version field above. If the registry
+ hostname is empty, docker.io will be used as default. The default
+ image name is: kubeedge/installation-package.'
type: string
labelSelector:
description: LabelSelector is a filter to select member clusters by
diff --git a/pkg/apis/operations/v1alpha1/type.go b/pkg/apis/operations/v1alpha1/type.go
index 8908c62de..fb276a3f6 100644
--- a/pkg/apis/operations/v1alpha1/type.go
+++ b/pkg/apis/operations/v1alpha1/type.go
@@ -81,8 +81,8 @@ type NodeUpgradeJobSpec struct {
LabelSelector *metav1.LabelSelector `json:"labelSelector,omitempty"`
// Image specifies a container image name, the image contains: keadm and edgecore.
// keadm is used as upgradetool, to install the new version of edgecore.
- // The image name consists of registry hostname and repository name, but cannot includes the tag,
- // Version above will be used as the tag.
+ // The image name consists of registry hostname and repository name,
+ // if it includes the tag or digest, the tag or digest will be overwritten by Version field above.
// If the registry hostname is empty, docker.io will be used as default.
// The default image name is: kubeedge/installation-package.
// +optional