Skip to content
This repository has been archived by the owner on Mar 28, 2020. It is now read-only.

*: make each new member name unique #1875

Merged
merged 1 commit into from
Jan 23, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions pkg/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,7 @@ type Cluster struct {

// in memory state of the cluster
// status is the source of truth after Cluster struct is materialized.
status api.ClusterStatus
memberCounter int
status api.ClusterStatus

eventCh chan *clusterEvent
stopCh chan struct{}
Expand Down Expand Up @@ -326,7 +325,7 @@ func isSpecEqual(s1, s2 api.ClusterSpec) bool {

func (c *Cluster) startSeedMember() error {
m := &etcdutil.Member{
Name: etcdutil.CreateMemberName(c.cluster.Name, c.memberCounter),
Name: k8sutil.UniqueMemberName(c.cluster.Name),
Namespace: c.cluster.Namespace,
SecurePeer: c.isSecurePeer(),
SecureClient: c.isSecureClient(),
Expand All @@ -335,7 +334,6 @@ func (c *Cluster) startSeedMember() error {
if err := c.createPod(ms, m, "new"); err != nil {
return fmt.Errorf("failed to create seed member (%s): %v", m.Name, err)
}
c.memberCounter++
c.members = ms
c.logger.Infof("cluster created with seed member (%s)", m.Name)
_, err := c.eventsCli.Create(k8sutil.NewMemberAddEvent(m.Name, c.cluster))
Expand Down
12 changes: 3 additions & 9 deletions pkg/cluster/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (

api "github.com/coreos/etcd-operator/pkg/apis/etcd/v1beta2"
"github.com/coreos/etcd-operator/pkg/util/etcdutil"
"github.com/coreos/etcd-operator/pkg/util/k8sutil"
"github.com/coreos/etcd/etcdserver/etcdserverpb"
"github.com/pkg/errors"

Expand All @@ -37,13 +38,6 @@ func (c *Cluster) updateMembers(known etcdutil.MemberSet) error {
if err != nil {
return errors.Wrap(err, "get member name failed")
}
ct, err := etcdutil.GetCounterFromMemberName(name)
if err != nil {
return newFatalError(fmt.Sprintf("get counter from member name (%s) failed: %v", name, err))
}
if ct+1 > c.memberCounter {
c.memberCounter = ct + 1
}

members[name] = &etcdutil.Member{
Name: name,
Expand All @@ -57,8 +51,8 @@ func (c *Cluster) updateMembers(known etcdutil.MemberSet) error {
return nil
}

func (c *Cluster) newMember(id int) *etcdutil.Member {
name := etcdutil.CreateMemberName(c.cluster.Name, id)
func (c *Cluster) newMember() *etcdutil.Member {
name := k8sutil.UniqueMemberName(c.cluster.Name)
return &etcdutil.Member{
Name: name,
Namespace: c.cluster.Namespace,
Expand Down
3 changes: 1 addition & 2 deletions pkg/cluster/reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ func (c *Cluster) addOneMember() error {
}
defer etcdcli.Close()

newMember := c.newMember(c.memberCounter)
newMember := c.newMember()
ctx, cancel := context.WithTimeout(context.Background(), constants.DefaultRequestTimeout)
resp, err := etcdcli.MemberAdd(ctx, []string{newMember.PeerURL()})
cancel()
Expand All @@ -144,7 +144,6 @@ func (c *Cluster) addOneMember() error {
if err := c.createPod(c.members, newMember, "existing"); err != nil {
return fmt.Errorf("fail to create member's pod (%s): %v", newMember.Name, err)
}
c.memberCounter++
c.logger.Infof("added member (%s)", newMember.Name)
_, err = c.eventsCli.Create(k8sutil.NewMemberAddEvent(newMember.Name, c.cluster))
if err != nil {
Expand Down
9 changes: 3 additions & 6 deletions pkg/cluster/self_hosted.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,7 @@ func (c *Cluster) addOneSelfHostedMember() error {

c.status.SetScalingUpCondition(c.members.Size(), c.cluster.Spec.Size)

newMember := c.newMember(c.memberCounter)
c.memberCounter++
newMember := c.newMember()
peerURL := newMember.PeerURL()
initialCluster := append(c.members.PeerURLPairs(), newMember.Name+"="+peerURL)

Expand Down Expand Up @@ -159,8 +158,7 @@ func (c *Cluster) addOneSelfHostedMember() error {
}

func (c *Cluster) newSelfHostedSeedMember() error {
newMember := c.newMember(c.memberCounter)
c.memberCounter++
newMember := c.newMember()
initialCluster := []string{newMember.Name + "=" + newMember.PeerURL()}

pod := k8sutil.NewSelfHostedEtcdPod(newMember, initialCluster, nil, c.cluster.Name, "new", uuid.New(), c.cluster.Spec, c.cluster.AsOwner())
Expand Down Expand Up @@ -196,8 +194,7 @@ func (c *Cluster) migrateBootMember() error {
}

// create the member inside Kubernetes for migration
newMember := c.newMember(c.memberCounter)
c.memberCounter++
newMember := c.newMember()

peerURL := newMember.PeerURL()
initialCluster = append(initialCluster, newMember.Name+"="+peerURL)
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/restore-operator/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ func (r *Restore) prepareSeed(er *api.EtcdRestore) (err error) {

func (r *Restore) createSeedMember(ec *api.EtcdCluster, svcAddr, clusterName string, owner metav1.OwnerReference) error {
m := &etcdutil.Member{
Name: etcdutil.CreateMemberName(clusterName, 0),
Name: k8sutil.UniqueMemberName(clusterName),
Namespace: r.namespace,
SecurePeer: ec.Spec.TLS.IsSecurePeer(),
SecureClient: ec.Spec.TLS.IsSecureClient(),
Expand Down
17 changes: 0 additions & 17 deletions pkg/util/etcdutil/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"fmt"
"net/url"
"regexp"
"strconv"
"strings"
)

Expand Down Expand Up @@ -149,18 +148,6 @@ func (ms MemberSet) ClientURLs() []string {
return endpoints
}

func GetCounterFromMemberName(name string) (int, error) {
i := strings.LastIndex(name, "-")
if i == -1 || i+1 >= len(name) {
return 0, fmt.Errorf("name (%s) does not contain '-' or anything after '-'", name)
}
c, err := strconv.Atoi(name[i+1:])
if err != nil {
return 0, fmt.Errorf("could not atoi %s: %v", name[i+1:], err)
}
return c, nil
}

var validPeerURL = regexp.MustCompile(`^\w+:\/\/[\w\.\-]+(:\d+)?$`)

func MemberNameFromPeerURL(pu string) (string, error) {
Expand All @@ -177,10 +164,6 @@ func MemberNameFromPeerURL(pu string) (string, error) {
return name, err
}

func CreateMemberName(clusterName string, member int) string {
return fmt.Sprintf("%s-%04d", clusterName, member)
}

func clusterNameFromMemberName(mn string) string {
i := strings.LastIndex(mn, "-")
if i == -1 {
Expand Down
5 changes: 5 additions & 0 deletions pkg/util/k8sutil/k8sutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
utilrand "k8s.io/apimachinery/pkg/util/rand"
"k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/client-go/kubernetes"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp" // for gcp auth
Expand Down Expand Up @@ -471,3 +472,7 @@ func mergeLabels(l1, l2 map[string]string) {
l1[k] = v
}
}

func UniqueMemberName(clusterName string) string {
return fmt.Sprintf("%s-%s", clusterName, utilrand.String(5))
}