From 214cf6cb2e78e2bd53fabef757183a5ca614c089 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 15 Nov 2017 10:10:58 +0000 Subject: [PATCH 1/3] Flip result code when checking for new peer This avoids mistaking an error condition for the result we should act on --- prog/kube-peers/main.go | 6 +++--- prog/weave-kube/launch.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/prog/kube-peers/main.go b/prog/kube-peers/main.go index 3b03f437..9d95c1f5 100644 --- a/prog/kube-peers/main.go +++ b/prog/kube-peers/main.go @@ -182,7 +182,7 @@ func main() { logLevel string ) flag.BoolVar(&justReclaim, "reclaim", false, "reclaim IP space from dead peers") - flag.BoolVar(&justCheck, "check-peer-exists", false, "return success if peer name is stored in annotation") + flag.BoolVar(&justCheck, "check-peer-new", false, "return success if peer name is not stored in annotation") flag.StringVar(&peerName, "peer-name", "unknown", "name of this Weave Net peer") flag.StringVar(&nodeName, "node-name", "unknown", "name of this Kubernetes node") flag.StringVar(&logLevel, "log-level", "info", "logging level (debug, info, warning, error)") @@ -204,9 +204,9 @@ func main() { common.Log.Fatalf("[kube-peers] Could not check peer list: %v", err) } if exists { - os.Exit(0) - } else { os.Exit(9) + } else { + os.Exit(0) } } peers, err := getKubePeers(c) diff --git a/prog/weave-kube/launch.sh b/prog/weave-kube/launch.sh index f91a0d16..f56f9553 100755 --- a/prog/weave-kube/launch.sh +++ b/prog/weave-kube/launch.sh @@ -98,7 +98,7 @@ fi # If this peer name is not stored in the list, either we are a # brand-new peer or we were removed by another peer while temporarily # absent. In order to avoid a CRDT clash for the latter case, clean up -if ! /home/weave/kube-peers -check-peer-exists -peer-name="$PEERNAME" -log-level=debug ; then +if /home/weave/kube-peers -check-peer-new -peer-name="$PEERNAME" -log-level=debug ; then if [ -f ${DB_PREFIX}data.db ]; then echo "Peer not in list; removing persisted data" >&2 rm -f ${DB_PREFIX}data.db From 570ab0b10b2b1a4b51368f99aff96be4002bdd52 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 15 Nov 2017 11:26:43 +0000 Subject: [PATCH 2/3] Avoid deleting persisted data on weave-kube upgrade Add a feature to weaveutil to get and set flags, then use this feature to mark the DB when this version runs --- prog/weave-kube/launch.sh | 21 ++++++++++----- prog/weaveutil/db_flag.go | 54 +++++++++++++++++++++++++++++++++++++++ prog/weaveutil/main.go | 2 ++ 3 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 prog/weaveutil/db_flag.go diff --git a/prog/weave-kube/launch.sh b/prog/weave-kube/launch.sh index f56f9553..bba088da 100755 --- a/prog/weave-kube/launch.sh +++ b/prog/weave-kube/launch.sh @@ -95,16 +95,23 @@ if [ -z "$PEERNAME" ]; then exit 2 fi -# If this peer name is not stored in the list, either we are a -# brand-new peer or we were removed by another peer while temporarily -# absent. In order to avoid a CRDT clash for the latter case, clean up -if /home/weave/kube-peers -check-peer-new -peer-name="$PEERNAME" -log-level=debug ; then - if [ -f ${DB_PREFIX}data.db ]; then - echo "Peer not in list; removing persisted data" >&2 - rm -f ${DB_PREFIX}data.db +# Check if peer reclaim is in use - we don't want to delete persisted data on an upgrade +if /usr/bin/weaveutil get-db-flag "$DB_PREFIX" peer-reclaim >/dev/null ; then + # If this peer name is not stored in the list, either we are a + # brand-new peer or we were removed by another peer while temporarily + # absent. In order to avoid a CRDT clash for the latter case, clean up + if /home/weave/kube-peers -check-peer-new -peer-name="$PEERNAME" -log-level=debug ; then + if [ -f ${DB_PREFIX}data.db ]; then + echo "Peer not in list; removing persisted data" >&2 + rm -f ${DB_PREFIX}data.db + fi fi fi +# flag that peer reclaim is now in use - note we have to do this before +# weaver is running as the DB can only be opened by one process at a time +/usr/bin/weaveutil set-db-flag "$DB_PREFIX" peer-reclaim ok + post_start_actions() { # Wait for weave process to become responsive while true ; do diff --git a/prog/weaveutil/db_flag.go b/prog/weaveutil/db_flag.go new file mode 100644 index 00000000..0beeb48e --- /dev/null +++ b/prog/weaveutil/db_flag.go @@ -0,0 +1,54 @@ +// Get/set arbitrary flags in the Weave Net persistence DB +package main + +import ( + "fmt" + + "github.com/weaveworks/weave/db" +) + +const dbFlagPrefix = "flag:" + +func getDBFlag(args []string) error { + if len(args) != 2 { + cmdUsage("check-db-flag", " ") + } + dbPrefix := args[0] + flagName := args[1] + + d, err := db.NewBoltDBReadOnly(dbPrefix) + if err != nil { + return err + } + defer d.Close() + var value string + nameFound, err := d.Load(dbFlagPrefix+flagName, &value) + if err != nil { + return err + } + if !nameFound { + return fmt.Errorf("Flag %q not found", flagName) + } + fmt.Print(value) + return nil +} + +func setDBFlag(args []string) error { + if len(args) != 3 { + cmdUsage("set-db-flag", " ") + } + dbPrefix := args[0] + flagName := args[1] + value := args[2] + + d, err := db.NewBoltDB(dbPrefix) + if err != nil { + return err + } + defer d.Close() + err = d.Save(dbFlagPrefix+flagName, value) + if err != nil { + return err + } + return nil +} diff --git a/prog/weaveutil/main.go b/prog/weaveutil/main.go index 065208b1..b638a80c 100644 --- a/prog/weaveutil/main.go +++ b/prog/weaveutil/main.go @@ -50,6 +50,8 @@ func init() { "swarm-manager-peers": swarmManagerPeers, "is-docker-plugin-enabled": isDockerPluginEnabled, "rewrite-etc-hosts": rewriteEtcHosts, + "get-db-flag": getDBFlag, + "set-db-flag": setDBFlag, } } From f0e511510a0500998ceed972190547a89a69a924 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 15 Nov 2017 12:35:19 +0000 Subject: [PATCH 3/3] Don't print a message on flag not found --- prog/weaveutil/db_flag.go | 2 +- prog/weaveutil/main.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/prog/weaveutil/db_flag.go b/prog/weaveutil/db_flag.go index 0beeb48e..6d32587b 100644 --- a/prog/weaveutil/db_flag.go +++ b/prog/weaveutil/db_flag.go @@ -27,7 +27,7 @@ func getDBFlag(args []string) error { return err } if !nameFound { - return fmt.Errorf("Flag %q not found", flagName) + return fmt.Errorf("") } fmt.Print(value) return nil diff --git a/prog/weaveutil/main.go b/prog/weaveutil/main.go index b638a80c..deb45d9d 100644 --- a/prog/weaveutil/main.go +++ b/prog/weaveutil/main.go @@ -85,7 +85,9 @@ func main() { os.Exit(1) } if err := cmd(os.Args[2:]); err != nil { - fmt.Fprintln(os.Stderr, err) + if err.Error() != "" { + fmt.Fprintln(os.Stderr, err) + } os.Exit(1) } }