From 7dcd4bdf47a35df914187c036c44a3fd109a6ded Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 7 Sep 2018 10:58:45 +0000 Subject: [PATCH] Refactor: extract peerlist fns to new file --- prog/kube-utils/annotations.go | 56 ------------------ prog/kube-utils/main.go | 38 ------------ prog/kube-utils/peerlist.go | 104 +++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 94 deletions(-) create mode 100644 prog/kube-utils/peerlist.go diff --git a/prog/kube-utils/annotations.go b/prog/kube-utils/annotations.go index 20b45cdd..b9a6b633 100644 --- a/prog/kube-utils/annotations.go +++ b/prog/kube-utils/annotations.go @@ -2,13 +2,10 @@ In order to keep track of active weave peers, we use annotations on the Kubernetes cluster. Kubernetes uses etcd to distribute and synchronise these annotations so we don't have to. - -This module deals with operations on the peerlist backed by Kubernetes' annotation mechanism. */ package main import ( - "encoding/json" "log" "time" @@ -37,38 +34,6 @@ func newConfigMapAnnotations(ns string, configMapName string, clientset *kuberne } } -type peerList struct { - Peers []peerInfo -} - -type peerInfo struct { - PeerName string // Weave internal unique ID - NodeName string // Kubernetes node name -} - -func (pl peerList) contains(peerName string) bool { - for _, peer := range pl.Peers { - if peer.PeerName == peerName { - return true - } - } - return false -} - -func (pl *peerList) add(peerName string, name string) { - pl.Peers = append(pl.Peers, peerInfo{PeerName: peerName, NodeName: name}) -} - -func (pl *peerList) remove(peerNameToRemove string) { - for i := 0; i < len(pl.Peers); { - if pl.Peers[i].PeerName == peerNameToRemove { - pl.Peers = append(pl.Peers[:i], pl.Peers[i+1:]...) - } else { - i++ - } - } -} - const ( retryPeriod = time.Second * 2 jitterFactor = 1.0 @@ -111,27 +76,6 @@ func (cml *configMapAnnotations) Init() error { return nil } -func (cml *configMapAnnotations) GetPeerList() (*peerList, error) { - var record peerList - if cml.cm == nil { - return nil, errors.New("endpoint not initialized, call Init first") - } - if recordBytes, found := cml.cm.Annotations[KubePeersAnnotationKey]; found { - if err := json.Unmarshal([]byte(recordBytes), &record); err != nil { - return nil, err - } - } - return &record, nil -} - -func (cml *configMapAnnotations) UpdatePeerList(list peerList) error { - recordBytes, err := json.Marshal(list) - if err != nil { - return err - } - return cml.UpdateAnnotation(KubePeersAnnotationKey, string(recordBytes)) -} - // Clean up a string so it meets the Kubernetes requiremements for Annotation keys: // name part must consist of alphanumeric characters, '-', '_' or '.', and must // start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc') diff --git a/prog/kube-utils/main.go b/prog/kube-utils/main.go index 5a2a9ff7..9535bb91 100644 --- a/prog/kube-utils/main.go +++ b/prog/kube-utils/main.go @@ -58,44 +58,6 @@ func getKubePeers(c *kubernetes.Clientset, includeWithNoIPAddr bool) ([]nodeInfo return addresses, nil } -const ( - configMapName = "weave-net" - configMapNamespace = "kube-system" -) - -// update the list of all peers that have gone through this code path -func addMyselfToPeerList(cml *configMapAnnotations, c *kubernetes.Clientset, peerName, name string) (*peerList, error) { - var list *peerList - err := cml.LoopUpdate(func() error { - var err error - list, err = cml.GetPeerList() - if err != nil { - return err - } - if !list.contains(peerName) { - list.add(peerName, name) - err = cml.UpdatePeerList(*list) - if err != nil { - return err - } - } - return nil - }) - return list, err -} - -func checkIamInPeerList(cml *configMapAnnotations, c *kubernetes.Clientset, peerName string) (bool, error) { - if err := cml.Init(); err != nil { - return false, err - } - list, err := cml.GetPeerList() - if err != nil { - return false, err - } - common.Log.Debugf("[kube-peers] Checking peer %q against list %v", peerName, list) - return list.contains(peerName), nil -} - // For each of those peers that is no longer listed as a node by // Kubernetes, remove it from Weave IPAM func reclaimRemovedPeers(weave *weaveapi.Client, cml *configMapAnnotations, nodes []nodeInfo, myPeerName, myNodeName string) error { diff --git a/prog/kube-utils/peerlist.go b/prog/kube-utils/peerlist.go new file mode 100644 index 00000000..1b426bb3 --- /dev/null +++ b/prog/kube-utils/peerlist.go @@ -0,0 +1,104 @@ +/* +This module deals with operations on the peerlist backed by Kubernetes' annotation mechanism. +*/ +package main + +import ( + "encoding/json" + + "github.com/pkg/errors" + "k8s.io/client-go/kubernetes" + + "github.com/weaveworks/weave/common" +) + +const ( + configMapName = "weave-net" + configMapNamespace = "kube-system" +) + +type peerList struct { + Peers []peerInfo +} + +type peerInfo struct { + PeerName string // Weave internal unique ID + NodeName string // Kubernetes node name +} + +func (pl peerList) contains(peerName string) bool { + for _, peer := range pl.Peers { + if peer.PeerName == peerName { + return true + } + } + return false +} + +func (pl *peerList) add(peerName string, name string) { + pl.Peers = append(pl.Peers, peerInfo{PeerName: peerName, NodeName: name}) +} + +func (pl *peerList) remove(peerNameToRemove string) { + for i := 0; i < len(pl.Peers); { + if pl.Peers[i].PeerName == peerNameToRemove { + pl.Peers = append(pl.Peers[:i], pl.Peers[i+1:]...) + } else { + i++ + } + } +} + +func (cml *configMapAnnotations) GetPeerList() (*peerList, error) { + var record peerList + if cml.cm == nil { + return nil, errors.New("endpoint not initialized, call Init first") + } + if recordBytes, found := cml.cm.Annotations[KubePeersAnnotationKey]; found { + if err := json.Unmarshal([]byte(recordBytes), &record); err != nil { + return nil, err + } + } + return &record, nil +} + +func (cml *configMapAnnotations) UpdatePeerList(list peerList) error { + recordBytes, err := json.Marshal(list) + if err != nil { + return err + } + return cml.UpdateAnnotation(KubePeersAnnotationKey, string(recordBytes)) +} + +// update the list of all peers that have gone through this code path +func addMyselfToPeerList(cml *configMapAnnotations, c *kubernetes.Clientset, peerName, name string) (*peerList, error) { + var list *peerList + err := cml.LoopUpdate(func() error { + var err error + list, err = cml.GetPeerList() + if err != nil { + return err + } + if !list.contains(peerName) { + list.add(peerName, name) + err = cml.UpdatePeerList(*list) + if err != nil { + return err + } + } + return nil + }) + return list, err +} + +func checkIamInPeerList(cml *configMapAnnotations, c *kubernetes.Clientset, peerName string) (bool, error) { + if err := cml.Init(); err != nil { + return false, err + } + list, err := cml.GetPeerList() + if err != nil { + return false, err + } + common.Log.Debugf("[kube-peers] Checking peer %q against list %v", peerName, list) + return list.contains(peerName), nil +}