Poll and notice changes to cluster UID
This commit is contained in:
parent
c479d3e261
commit
fc50762257
7 changed files with 260 additions and 18 deletions
|
|
@ -20,6 +20,7 @@ import (
|
|||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/golang/glog"
|
||||
compute "google.golang.org/api/compute/v1"
|
||||
|
|
@ -82,7 +83,42 @@ const (
|
|||
|
||||
// Namer handles centralized naming for the cluster.
|
||||
type Namer struct {
|
||||
ClusterName string
|
||||
clusterName string
|
||||
nameLock sync.Mutex
|
||||
}
|
||||
|
||||
// NewNamer creates a new namer.
|
||||
func NewNamer(clusterName string) *Namer {
|
||||
namer := &Namer{}
|
||||
namer.SetClusterName(clusterName)
|
||||
return namer
|
||||
}
|
||||
|
||||
// NameComponents is a struct representing the components of a a GCE resource
|
||||
// name constructed by the namer. The format of such a name is:
|
||||
// k8s-resource-<metadata, eg port>--uid
|
||||
type NameComponents struct {
|
||||
ClusterName, Resource, Metadata string
|
||||
}
|
||||
|
||||
// SetClusterName sets the UID/name of this cluster.
|
||||
func (n *Namer) SetClusterName(name string) {
|
||||
n.nameLock.Lock()
|
||||
defer n.nameLock.Unlock()
|
||||
if strings.Contains(name, clusterNameDelimiter) {
|
||||
tokens := strings.Split(name, clusterNameDelimiter)
|
||||
glog.Warningf("Given name %v contains %v, taking last token in: %+v", name, clusterNameDelimiter, tokens)
|
||||
name = tokens[len(tokens)-1]
|
||||
}
|
||||
glog.Infof("Changing cluster name from %v to %v", n.clusterName, name)
|
||||
n.clusterName = name
|
||||
}
|
||||
|
||||
// GetClusterName returns the UID/name of this cluster.
|
||||
func (n *Namer) GetClusterName() string {
|
||||
n.nameLock.Lock()
|
||||
defer n.nameLock.Unlock()
|
||||
return n.clusterName
|
||||
}
|
||||
|
||||
// Truncate truncates the given key to a GCE length limit.
|
||||
|
|
@ -96,10 +132,28 @@ func (n *Namer) Truncate(key string) string {
|
|||
}
|
||||
|
||||
func (n *Namer) decorateName(name string) string {
|
||||
if n.ClusterName == "" {
|
||||
clusterName := n.GetClusterName()
|
||||
if clusterName == "" {
|
||||
return name
|
||||
}
|
||||
return n.Truncate(fmt.Sprintf("%v%v%v", name, clusterNameDelimiter, n.ClusterName))
|
||||
return n.Truncate(fmt.Sprintf("%v%v%v", name, clusterNameDelimiter, clusterName))
|
||||
}
|
||||
|
||||
// ParseName parses the name of a resource generated by the namer.
|
||||
func (n *Namer) ParseName(name string) *NameComponents {
|
||||
l := strings.Split(name, clusterNameDelimiter)
|
||||
var uid, resource string
|
||||
if len(l) >= 2 {
|
||||
uid = l[len(l)-1]
|
||||
}
|
||||
c := strings.Split(name, "-")
|
||||
if len(c) >= 2 {
|
||||
resource = c[1]
|
||||
}
|
||||
return &NameComponents{
|
||||
ClusterName: uid,
|
||||
Resource: resource,
|
||||
}
|
||||
}
|
||||
|
||||
// NameBelongsToCluster checks if a given name is tagged with this cluster's UID.
|
||||
|
|
@ -109,8 +163,9 @@ func (n *Namer) NameBelongsToCluster(name string) bool {
|
|||
return false
|
||||
}
|
||||
parts := strings.Split(name, clusterNameDelimiter)
|
||||
clusterName := n.GetClusterName()
|
||||
if len(parts) == 1 {
|
||||
if n.ClusterName == "" {
|
||||
if clusterName == "" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
|
@ -119,7 +174,7 @@ func (n *Namer) NameBelongsToCluster(name string) bool {
|
|||
glog.Warningf("Too many parts to name %v, ignoring", name)
|
||||
return false
|
||||
}
|
||||
return parts[1] == n.ClusterName
|
||||
return parts[1] == clusterName
|
||||
}
|
||||
|
||||
// BeName constructs the name for a backend.
|
||||
|
|
@ -152,11 +207,12 @@ func (n *Namer) IGName() string {
|
|||
|
||||
// FrSuffix constructs the glbc specific suffix for the FirewallRule.
|
||||
func (n *Namer) FrSuffix() string {
|
||||
clusterName := n.GetClusterName()
|
||||
// The entire cluster only needs a single firewall rule.
|
||||
if n.ClusterName == "" {
|
||||
if clusterName == "" {
|
||||
return globalFirewallSuffix
|
||||
}
|
||||
return n.Truncate(fmt.Sprintf("%v%v%v", globalFirewallSuffix, clusterNameDelimiter, n.ClusterName))
|
||||
return n.Truncate(fmt.Sprintf("%v%v%v", globalFirewallSuffix, clusterNameDelimiter, clusterName))
|
||||
}
|
||||
|
||||
// FrName constructs the full firewall rule name, this is the name assigned by
|
||||
|
|
@ -174,10 +230,11 @@ func (n *Namer) LBName(key string) string {
|
|||
// namespace conflicts in the Ubernetes context.
|
||||
parts := strings.Split(key, clusterNameDelimiter)
|
||||
scrubbedName := strings.Replace(key, "/", "-", -1)
|
||||
if n.ClusterName == "" || parts[len(parts)-1] == n.ClusterName {
|
||||
clusterName := n.GetClusterName()
|
||||
if clusterName == "" || parts[len(parts)-1] == clusterName {
|
||||
return scrubbedName
|
||||
}
|
||||
return n.Truncate(fmt.Sprintf("%v%v%v", scrubbedName, clusterNameDelimiter, n.ClusterName))
|
||||
return n.Truncate(fmt.Sprintf("%v%v%v", scrubbedName, clusterNameDelimiter, clusterName))
|
||||
}
|
||||
|
||||
// GCEURLMap is a nested map of hostname->path regex->backend
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue