...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package membership
16
17 import (
18 "github.com/coreos/go-semver/semver"
19 "go.etcd.io/etcd/api/v3/version"
20 "go.uber.org/zap"
21 )
22
23 type DowngradeInfo struct {
24
25
26 TargetVersion string `json:"target-version"`
27
28 Enabled bool `json:"enabled"`
29 }
30
31 func (d *DowngradeInfo) GetTargetVersion() *semver.Version {
32 return semver.Must(semver.NewVersion(d.TargetVersion))
33 }
34
35
36 func isValidDowngrade(verFrom *semver.Version, verTo *semver.Version) bool {
37 return verTo.Equal(*AllowedDowngradeVersion(verFrom))
38 }
39
40
41 func mustDetectDowngrade(lg *zap.Logger, cv *semver.Version, d *DowngradeInfo) {
42 lv := semver.Must(semver.NewVersion(version.Version))
43
44 lv = &semver.Version{Major: lv.Major, Minor: lv.Minor}
45
46
47 if d != nil && d.Enabled && d.TargetVersion != "" {
48 if lv.Equal(*d.GetTargetVersion()) {
49 if cv != nil {
50 lg.Info(
51 "cluster is downgrading to target version",
52 zap.String("target-cluster-version", d.TargetVersion),
53 zap.String("determined-cluster-version", version.Cluster(cv.String())),
54 zap.String("current-server-version", version.Version),
55 )
56 }
57 return
58 }
59 lg.Fatal(
60 "invalid downgrade; server version is not allowed to join when downgrade is enabled",
61 zap.String("current-server-version", version.Version),
62 zap.String("target-cluster-version", d.TargetVersion),
63 )
64 }
65
66
67
68 if cv != nil && lv.LessThan(*cv) {
69 lg.Fatal(
70 "invalid downgrade; server version is lower than determined cluster version",
71 zap.String("current-server-version", version.Version),
72 zap.String("determined-cluster-version", version.Cluster(cv.String())),
73 )
74 }
75 }
76
77 func AllowedDowngradeVersion(ver *semver.Version) *semver.Version {
78
79 return &semver.Version{Major: ver.Major, Minor: ver.Minor - 1}
80 }
81
View as plain text