mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-10-05 07:16:54 +08:00
feat: check if need to upgrade image
Signed-off-by: yuyicai <yuyicai@hotmail.com>
This commit is contained in:
@@ -90,6 +90,9 @@ const (
|
|||||||
|
|
||||||
// hosts entry key word
|
// hosts entry key word
|
||||||
HostsKeyWord = "# Add by KubeVPN"
|
HostsKeyWord = "# Add by KubeVPN"
|
||||||
|
|
||||||
|
GHCR_IMAGE_REGISTRY = "ghcr.io"
|
||||||
|
DOCKER_IMAGE_REGISTRY = "docker.io"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@@ -866,8 +866,8 @@ func (c *ConnectOptions) upgradeDeploy(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
isNewer, _ := newer(clientImg, serverImg)
|
isNeedUpgrade, _ := newer(config.Version, clientImg, serverImg)
|
||||||
if deploy.Status.ReadyReplicas > 0 && !isNewer {
|
if deploy.Status.ReadyReplicas > 0 && !isNeedUpgrade {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -973,7 +973,7 @@ func (c *ConnectOptions) upgradeDeploy(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newer(clientImgStr, serverImgStr string) (bool, error) {
|
func newer(clientCliVersionStr, clientImgStr, serverImgStr string) (bool, error) {
|
||||||
clientImg, err := reference.ParseNormalizedNamed(clientImgStr)
|
clientImg, err := reference.ParseNormalizedNamed(clientImgStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@@ -982,27 +982,55 @@ func newer(clientImgStr, serverImgStr string) (bool, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
if reference.Domain(clientImg) != reference.Domain(serverImg) {
|
clientImgTag, ok := clientImg.(reference.NamedTagged)
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
serverTag, ok := serverImg.(reference.NamedTagged)
|
|
||||||
if !ok {
|
|
||||||
return false, fmt.Errorf("can not convert server image")
|
|
||||||
}
|
|
||||||
serverVersion, err := goversion.NewVersion(serverTag.Tag())
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
clientTag, ok := clientImg.(reference.NamedTagged)
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return false, fmt.Errorf("can not convert client image")
|
return false, fmt.Errorf("can not convert client image")
|
||||||
}
|
}
|
||||||
clientVersion, err := goversion.NewVersion(clientTag.Tag())
|
|
||||||
|
// 1. if client image version is same as client cli version, does not need to upgrade
|
||||||
|
// kubevpn connect --image=ghcr.io/kubenetworks/kubevpn:v2.3.0 or --kubevpnconfig
|
||||||
|
// the kubevpn version is v2.3.1
|
||||||
|
if clientImgTag.Tag() != clientCliVersionStr {
|
||||||
|
// TODO: is it necessary to exit the process?
|
||||||
|
log.Warnf("\033[33mCurrent kubevpn cli version is %s, please use the same version of kubevpn image on flag \"--image\" or \"--kubevpnconfig\"\033[0m", clientCliVersionStr)
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
serverImgTag, ok := serverImg.(reference.NamedTagged)
|
||||||
|
if !ok {
|
||||||
|
return false, fmt.Errorf("can not convert server image")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. if server image version is same as client cli version, does not need to upgrade
|
||||||
|
if serverImgTag.Tag() == clientCliVersionStr {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. check custom server image registry
|
||||||
|
// if custom server image domain is not same as config.GHCR_IMAGE_REGISTRY
|
||||||
|
// and not same as config.DOCKER_IMAGE_REGISTRY
|
||||||
|
// and not same as client images(may be used --image)
|
||||||
|
// does not need to upgrade
|
||||||
|
serverImgDomain := reference.Domain(serverImg)
|
||||||
|
clientImgDomain := reference.Domain(clientImg)
|
||||||
|
if serverImgDomain != config.GHCR_IMAGE_REGISTRY && serverImgDomain != config.DOCKER_IMAGE_REGISTRY && serverImgDomain != clientImgDomain {
|
||||||
|
newImageStr := fmt.Sprintf("%s:%s", serverImg.Name(), clientCliVersionStr)
|
||||||
|
log.Warnf("\033[33mCurrent kubevpn cli version is %s, please manually upgrade 'kubevpn-traffic-manager' control plane pod container image to %s\033[0m", clientCliVersionStr, newImageStr)
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
serverImgVersion, err := goversion.NewVersion(serverImgTag.Tag())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
return clientVersion.GreaterThan(serverVersion), nil
|
|
||||||
|
clientImgVersion, err := goversion.NewVersion(clientImgTag.Tag())
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. check client image version is greater than server image version
|
||||||
|
return clientImgVersion.GreaterThan(serverImgVersion), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConnectOptions) Equal(a *ConnectOptions) bool {
|
func (c *ConnectOptions) Equal(a *ConnectOptions) bool {
|
||||||
|
@@ -149,3 +149,178 @@ func TestRemoveCIDRsContainingIPs(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_newer(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
clientVersionStr string
|
||||||
|
clientImgStr string
|
||||||
|
serverImgStr string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want bool
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: naison/kubevpn:v1.0.0
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) newer than server(naison/kubevpn:v1.0.0)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "naison/kubevpn:v1.0.0",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: docker.io/naison/kubevpn:v1.0.0
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) newer than server(docker.io/naison/kubevpn:v1.0.0)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "docker.io/naison/kubevpn:v1.0.0",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: naison/kubevpn:v1.2.1
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) same as server(naison/kubevpn:v1.2.1)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "naison/kubevpn:v1.2.1",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: docker.io/naison/kubevpn:v1.2.1
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) same as server(docker.io/naison/kubevpn:v1.2.1)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "docker.io/naison/kubevpn:v1.2.1",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: docker.io/naison/kubevpn:v1.3.1
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) older as server(docker.io/naison/kubevpn:v1.3.1)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "docker.io/naison/kubevpn:v1.3.1",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.3.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1 (not same as client version, --image=xxx)
|
||||||
|
// server image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
{
|
||||||
|
name: "Valid case - client cli version(v1.3.1) not same as client image(ghcr.io/kubenetworks/kubevpn:v1.2.1)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.3.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: ghcr.io/kubenetworks/kubevpn:v1.0.1
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) newer than server(ghcr.io/kubenetworks/kubevpn:v1.0.1)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.0.1",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) same as server(ghcr.io/kubenetworks/kubevpn:v1.2.1)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: ghcr.io/kubenetworks/kubevpn:v1.3.1
|
||||||
|
{
|
||||||
|
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) older as server(ghcr.io/kubenetworks/kubevpn:v1.3.1)",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.3.1",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
// custom server image registry, but client image is not same as client version, does not upgrade
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: mykubevpn.io/kubenetworks/kubevpn:v1.1.1
|
||||||
|
{
|
||||||
|
name: "custom server image registry, but client image is not same as client version, does not upgrade",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "mykubevpn.io/kubenetworks/kubevpn:v1.1.1",
|
||||||
|
},
|
||||||
|
want: false,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
// custom server image registry, client image is same as client version, upgrade
|
||||||
|
// client version: v1.2.1
|
||||||
|
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
|
||||||
|
// server image: mykubevpn.io/kubenetworks/kubevpn:v1.1.1
|
||||||
|
{
|
||||||
|
name: "custom server image registry, client image is same as client version, upgrade",
|
||||||
|
args: args{
|
||||||
|
clientVersionStr: "v1.2.1",
|
||||||
|
clientImgStr: "mykubevpn.io/kubenetworks/kubevpn:v1.2.1",
|
||||||
|
serverImgStr: "mykubevpn.io/kubenetworks/kubevpn:v1.1.1",
|
||||||
|
},
|
||||||
|
want: true,
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := newer(tt.args.clientVersionStr, tt.args.clientImgStr, tt.args.serverImgStr)
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("newer() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if got != tt.want {
|
||||||
|
t.Errorf("newer() got = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user