Skip to content

Commit ec7d939

Browse files
authored
Merge pull request #458 from kubenetworks/check-if-need-upgrade-server-image
feat: check if need to upgrade image
2 parents a16c1ef + a682dfb commit ec7d939

File tree

3 files changed

+218
-12
lines changed

3 files changed

+218
-12
lines changed

pkg/config/config.go

+3
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ const (
9090

9191
// hosts entry key word
9292
HostsKeyWord = "# Add by KubeVPN"
93+
94+
GHCR_IMAGE_REGISTRY = "ghcr.io"
95+
DOCKER_IMAGE_REGISTRY = "docker.io"
9396
)
9497

9598
var (

pkg/handler/connect.go

+40-12
Original file line numberDiff line numberDiff line change
@@ -866,8 +866,8 @@ func (c *ConnectOptions) upgradeDeploy(ctx context.Context) error {
866866
return nil
867867
}
868868

869-
isNewer, _ := newer(clientImg, serverImg)
870-
if deploy.Status.ReadyReplicas > 0 && !isNewer {
869+
isNeedUpgrade, _ := newer(config.Version, clientImg, serverImg)
870+
if deploy.Status.ReadyReplicas > 0 && !isNeedUpgrade {
871871
return nil
872872
}
873873

@@ -973,7 +973,7 @@ func (c *ConnectOptions) upgradeDeploy(ctx context.Context) error {
973973
return nil
974974
}
975975

976-
func newer(clientImgStr, serverImgStr string) (bool, error) {
976+
func newer(clientCliVersionStr, clientImgStr, serverImgStr string) (bool, error) {
977977
clientImg, err := reference.ParseNormalizedNamed(clientImgStr)
978978
if err != nil {
979979
return false, err
@@ -982,27 +982,55 @@ func newer(clientImgStr, serverImgStr string) (bool, error) {
982982
if err != nil {
983983
return false, err
984984
}
985-
if reference.Domain(clientImg) != reference.Domain(serverImg) {
985+
clientImgTag, ok := clientImg.(reference.NamedTagged)
986+
if !ok {
987+
return false, fmt.Errorf("can not convert client image")
988+
}
989+
990+
// 1. if client image version is same as client cli version, does not need to upgrade
991+
// kubevpn connect --image=ghcr.io/kubenetworks/kubevpn:v2.3.0 or --kubevpnconfig
992+
// the kubevpn version is v2.3.1
993+
if clientImgTag.Tag() != clientCliVersionStr {
994+
// TODO: is it necessary to exit the process?
995+
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)
986996
return false, nil
987997
}
988998

989-
serverTag, ok := serverImg.(reference.NamedTagged)
999+
serverImgTag, ok := serverImg.(reference.NamedTagged)
9901000
if !ok {
9911001
return false, fmt.Errorf("can not convert server image")
9921002
}
993-
serverVersion, err := goversion.NewVersion(serverTag.Tag())
1003+
1004+
// 2. if server image version is same as client cli version, does not need to upgrade
1005+
if serverImgTag.Tag() == clientCliVersionStr {
1006+
return false, nil
1007+
}
1008+
1009+
// 3. check custom server image registry
1010+
// if custom server image domain is not same as config.GHCR_IMAGE_REGISTRY
1011+
// and not same as config.DOCKER_IMAGE_REGISTRY
1012+
// and not same as client images(may be used --image)
1013+
// does not need to upgrade
1014+
serverImgDomain := reference.Domain(serverImg)
1015+
clientImgDomain := reference.Domain(clientImg)
1016+
if serverImgDomain != config.GHCR_IMAGE_REGISTRY && serverImgDomain != config.DOCKER_IMAGE_REGISTRY && serverImgDomain != clientImgDomain {
1017+
newImageStr := fmt.Sprintf("%s:%s", serverImg.Name(), clientCliVersionStr)
1018+
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)
1019+
return false, nil
1020+
}
1021+
1022+
serverImgVersion, err := goversion.NewVersion(serverImgTag.Tag())
9941023
if err != nil {
9951024
return false, err
9961025
}
997-
clientTag, ok := clientImg.(reference.NamedTagged)
998-
if !ok {
999-
return false, fmt.Errorf("can not convert client image")
1000-
}
1001-
clientVersion, err := goversion.NewVersion(clientTag.Tag())
1026+
1027+
clientImgVersion, err := goversion.NewVersion(clientImgTag.Tag())
10021028
if err != nil {
10031029
return false, err
10041030
}
1005-
return clientVersion.GreaterThan(serverVersion), nil
1031+
1032+
// 4. check client image version is greater than server image version
1033+
return clientImgVersion.GreaterThan(serverImgVersion), nil
10061034
}
10071035

10081036
func (c *ConnectOptions) Equal(a *ConnectOptions) bool {

pkg/handler/connect_test.go

+175
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,178 @@ func TestRemoveCIDRsContainingIPs(t *testing.T) {
149149
})
150150
}
151151
}
152+
153+
func Test_newer(t *testing.T) {
154+
type args struct {
155+
clientVersionStr string
156+
clientImgStr string
157+
serverImgStr string
158+
}
159+
tests := []struct {
160+
name string
161+
args args
162+
want bool
163+
wantErr bool
164+
}{
165+
// client version: v1.2.1
166+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
167+
// server image: naison/kubevpn:v1.0.0
168+
{
169+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) newer than server(naison/kubevpn:v1.0.0)",
170+
args: args{
171+
clientVersionStr: "v1.2.1",
172+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
173+
serverImgStr: "naison/kubevpn:v1.0.0",
174+
},
175+
want: true,
176+
wantErr: false,
177+
},
178+
// client version: v1.2.1
179+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
180+
// server image: docker.io/naison/kubevpn:v1.0.0
181+
{
182+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) newer than server(docker.io/naison/kubevpn:v1.0.0)",
183+
args: args{
184+
clientVersionStr: "v1.2.1",
185+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
186+
serverImgStr: "docker.io/naison/kubevpn:v1.0.0",
187+
},
188+
want: true,
189+
wantErr: false,
190+
},
191+
// client version: v1.2.1
192+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
193+
// server image: naison/kubevpn:v1.2.1
194+
{
195+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) same as server(naison/kubevpn:v1.2.1)",
196+
args: args{
197+
clientVersionStr: "v1.2.1",
198+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
199+
serverImgStr: "naison/kubevpn:v1.2.1",
200+
},
201+
want: false,
202+
wantErr: false,
203+
},
204+
// client version: v1.2.1
205+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
206+
// server image: docker.io/naison/kubevpn:v1.2.1
207+
{
208+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) same as server(docker.io/naison/kubevpn:v1.2.1)",
209+
args: args{
210+
clientVersionStr: "v1.2.1",
211+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
212+
serverImgStr: "docker.io/naison/kubevpn:v1.2.1",
213+
},
214+
want: false,
215+
wantErr: false,
216+
},
217+
// client version: v1.2.1
218+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
219+
// server image: docker.io/naison/kubevpn:v1.3.1
220+
{
221+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) older as server(docker.io/naison/kubevpn:v1.3.1)",
222+
args: args{
223+
clientVersionStr: "v1.2.1",
224+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
225+
serverImgStr: "docker.io/naison/kubevpn:v1.3.1",
226+
},
227+
want: false,
228+
wantErr: false,
229+
},
230+
// client version: v1.3.1
231+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1 (not same as client version, --image=xxx)
232+
// server image: ghcr.io/kubenetworks/kubevpn:v1.2.1
233+
{
234+
name: "Valid case - client cli version(v1.3.1) not same as client image(ghcr.io/kubenetworks/kubevpn:v1.2.1)",
235+
args: args{
236+
clientVersionStr: "v1.3.1",
237+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
238+
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
239+
},
240+
want: false,
241+
wantErr: false,
242+
},
243+
// client version: v1.2.1
244+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
245+
// server image: ghcr.io/kubenetworks/kubevpn:v1.0.1
246+
{
247+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) newer than server(ghcr.io/kubenetworks/kubevpn:v1.0.1)",
248+
args: args{
249+
clientVersionStr: "v1.2.1",
250+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
251+
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.0.1",
252+
},
253+
want: true,
254+
wantErr: false,
255+
},
256+
// client version: v1.2.1
257+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
258+
// server image: ghcr.io/kubenetworks/kubevpn:v1.2.1
259+
{
260+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) same as server(ghcr.io/kubenetworks/kubevpn:v1.2.1)",
261+
args: args{
262+
clientVersionStr: "v1.2.1",
263+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
264+
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
265+
},
266+
want: false,
267+
wantErr: false,
268+
},
269+
// client version: v1.2.1
270+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
271+
// server image: ghcr.io/kubenetworks/kubevpn:v1.3.1
272+
{
273+
name: "Valid case - client(ghcr.io/kubenetworks/kubevpn:v1.2.1) older as server(ghcr.io/kubenetworks/kubevpn:v1.3.1)",
274+
args: args{
275+
clientVersionStr: "v1.2.1",
276+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
277+
serverImgStr: "ghcr.io/kubenetworks/kubevpn:v1.3.1",
278+
},
279+
want: false,
280+
wantErr: false,
281+
},
282+
283+
// custom server image registry, but client image is not same as client version, does not upgrade
284+
// client version: v1.2.1
285+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
286+
// server image: mykubevpn.io/kubenetworks/kubevpn:v1.1.1
287+
{
288+
name: "custom server image registry, but client image is not same as client version, does not upgrade",
289+
args: args{
290+
clientVersionStr: "v1.2.1",
291+
clientImgStr: "ghcr.io/kubenetworks/kubevpn:v1.2.1",
292+
serverImgStr: "mykubevpn.io/kubenetworks/kubevpn:v1.1.1",
293+
},
294+
want: false,
295+
wantErr: false,
296+
},
297+
298+
// custom server image registry, client image is same as client version, upgrade
299+
// client version: v1.2.1
300+
// client image: ghcr.io/kubenetworks/kubevpn:v1.2.1
301+
// server image: mykubevpn.io/kubenetworks/kubevpn:v1.1.1
302+
{
303+
name: "custom server image registry, client image is same as client version, upgrade",
304+
args: args{
305+
clientVersionStr: "v1.2.1",
306+
clientImgStr: "mykubevpn.io/kubenetworks/kubevpn:v1.2.1",
307+
serverImgStr: "mykubevpn.io/kubenetworks/kubevpn:v1.1.1",
308+
},
309+
want: true,
310+
wantErr: false,
311+
},
312+
}
313+
314+
for _, tt := range tests {
315+
t.Run(tt.name, func(t *testing.T) {
316+
got, err := newer(tt.args.clientVersionStr, tt.args.clientImgStr, tt.args.serverImgStr)
317+
if (err != nil) != tt.wantErr {
318+
t.Errorf("newer() error = %v, wantErr %v", err, tt.wantErr)
319+
return
320+
}
321+
if got != tt.want {
322+
t.Errorf("newer() got = %v, want %v", got, tt.want)
323+
}
324+
})
325+
}
326+
}

0 commit comments

Comments
 (0)