From f59a3c860e2f4c937e839b95ec3fa4d008cfd32a Mon Sep 17 00:00:00 2001 From: "Matthew R. Kasun" Date: Thu, 30 Jun 2022 17:58:01 -0400 Subject: [PATCH 1/2] support upgrades from multiple version --- netclient/functions/clientconfig.go | 50 +++++++++++++++++++++---- netclient/functions/upgrades/types.go | 6 +-- netclient/functions/upgrades/v0-14-5.go | 20 +++++++--- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/netclient/functions/clientconfig.go b/netclient/functions/clientconfig.go index cad52da4..2f0ecac6 100644 --- a/netclient/functions/clientconfig.go +++ b/netclient/functions/clientconfig.go @@ -1,7 +1,11 @@ package functions import ( + "strconv" + "strings" + "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/netclient/config" "github.com/gravitl/netmaker/netclient/functions/upgrades" "github.com/gravitl/netmaker/netclient/ncutils" @@ -16,27 +20,57 @@ func UpdateClientConfig() { if len(networks) == 0 { return } - logger.Log(0, "updating netclient...") + logger.Log(0, "checking for netclient updates...") for _, network := range networks { cfg := config.ClientConfig{} cfg.Network = network cfg.ReadConfig() - //update any new fields + major, minor, _ := Version(cfg.Node.Version) + if major == 0 && minor < 14 { + logger.Log(0, "schema of network", cfg.Network, "is out of date and cannot be updated\n Correct behaviour of netclient cannot be guaranteed") + continue + } configChanged := false for _, u := range upgrades.Upgrades { - if cfg.Node.Version == u.RequiredVersion { - upgrades.UpgradeFunction(u.OP)(&cfg) + configChanged = false + if logic.StringSliceContains(u.RequiredVersions, cfg.Node.Version) { + logger.Log(0, "updating ", cfg.Network) + u.OP(&cfg) cfg.Node.Version = u.NewVersion configChanged = true } } - //insert update logic here if configChanged { - logger.Log(0, "updating clientConfig for network", cfg.Network) - if err := config.Write(&cfg, cfg.Network); err != nil { - logger.Log(0, "failed to update clientConfig for ", cfg.Network, err.Error()) + //save and publish + if err := PublishNodeUpdate(&cfg); err != nil { + logger.Log(0, "error publishing node update during schema change", err.Error()) } } } logger.Log(0, "finished updates") } + +// Version - parse version string into component parts +// version string must be semantic version of form 1.2.3 or v1.2.3 +// otherwise 0, 0, 0 will be returned. +func Version(version string) (int, int, int) { + var major, minor, patch int + var errMajor, errMinor, errPatch error + parts := strings.Split(version, ".") + //ensure semantic version + if len(parts) < 3 { + return major, minor, patch + } + if strings.Contains(parts[0], "v") { + majors := strings.Split(parts[0], "v") + major, errMajor = strconv.Atoi(majors[1]) + } else { + major, errMajor = strconv.Atoi(parts[0]) + } + minor, errMinor = strconv.Atoi(parts[1]) + patch, errPatch = strconv.Atoi(parts[2]) + if errMajor != nil || errMinor != nil || errPatch != nil { + return 0, 0, 0 + } + return major, minor, patch +} diff --git a/netclient/functions/upgrades/types.go b/netclient/functions/upgrades/types.go index fc022c85..58607d9b 100644 --- a/netclient/functions/upgrades/types.go +++ b/netclient/functions/upgrades/types.go @@ -7,7 +7,7 @@ type UpgradeFunction func(*config.ClientConfig) // UpgradeInfo - struct for holding upgrade info type UpgradeInfo struct { - RequiredVersion string - NewVersion string - OP UpgradeFunction + RequiredVersions []string + NewVersion string + OP UpgradeFunction } diff --git a/netclient/functions/upgrades/v0-14-5.go b/netclient/functions/upgrades/v0-14-5.go index f5ba90da..1d41638d 100644 --- a/netclient/functions/upgrades/v0-14-5.go +++ b/netclient/functions/upgrades/v0-14-5.go @@ -1,14 +1,24 @@ package upgrades -import "github.com/gravitl/netmaker/netclient/config" +import ( + "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/netclient/config" +) var upgrade0145 = UpgradeInfo{ - RequiredVersion: "0.14.4", - NewVersion: "0.14.5", - OP: update0145, + RequiredVersions: []string{ + "v0.14.0", + "v0.14.1", + "v0.14.2", + "v0.14.3", + "v0.14.4", + }, + NewVersion: "v0.14.5", + OP: update0145, } func update0145(cfg *config.ClientConfig) { - // do stuff for 14.4 -> 14.5 + // do stuff for 14.X -> 14.5 // No-op + logger.Log(0, "updating schema for 0.14.5") } From dcc637e98a5b79f7e2e674296b8e9db60e623991 Mon Sep 17 00:00:00 2001 From: "Matthew R. Kasun" Date: Wed, 6 Jul 2022 10:27:20 -0400 Subject: [PATCH 2/2] add log on completion of update Signed-off-by: Matthew R. Kasun --- netclient/functions/clientconfig.go | 1 + 1 file changed, 1 insertion(+) diff --git a/netclient/functions/clientconfig.go b/netclient/functions/clientconfig.go index 2f0ecac6..aa75877e 100644 --- a/netclient/functions/clientconfig.go +++ b/netclient/functions/clientconfig.go @@ -36,6 +36,7 @@ func UpdateClientConfig() { if logic.StringSliceContains(u.RequiredVersions, cfg.Node.Version) { logger.Log(0, "updating ", cfg.Network) u.OP(&cfg) + logger.Log(0, "updated", cfg.Node.Version, "to", u.NewVersion, "for node", cfg.Node.Name) cfg.Node.Version = u.NewVersion configChanged = true }