diff options
| author | gy95 <guoyao17@huawei.com> | 2022-09-22 21:06:35 +0800 |
|---|---|---|
| committer | gy95 <guoyao17@huawei.com> | 2022-09-23 10:18:47 +0800 |
| commit | 952791c7cbfffb3926a38ba18b89b3401067de0e (patch) | |
| tree | 65ab7b3a9c7601a40f263e5e530cfec64cc27e54 | |
| parent | Merge pull request #4004 from gy95/upgrade (diff) | |
| download | kubeedge-952791c7cbfffb3926a38ba18b89b3401067de0e.tar.gz | |
update NodeUpgradeJob Image description
Signed-off-by: gy95 <guoyao17@huawei.com>
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 |
