blob: 83d3a9acee35d8391c69eee3cbbc0ad33fdd251c [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package controllers
import (
"fmt"
"strconv"
"strings"
)
type Member struct {
Name string
// Kubernetes namespace this member runs in.
Namespace string
// ID field can be 0, which is unknown ID.
// We know the ID of a member when we get the member information from dbmaster,
// but not from Kubernetes pod list.
ID uint64
Phase string
Created bool
RunningAndReady bool
Version string
}
func (m Member) Ordinal() int {
idx := strings.LastIndex(m.Name, "-")
id, _ := strconv.ParseInt(m.Name[idx+1:], 10, 32)
return int(id)
}
type MemberSet map[string]*Member
// the set of all members of s1 that are not members of s2
func (ms MemberSet) Diff(other MemberSet) MemberSet {
diff := MemberSet{}
for n, m := range ms {
if _, ok := other[n]; !ok {
diff[n] = m
}
}
return diff
}
func (ms MemberSet) Get(id int) *Member {
for _, m := range ms {
idx := strings.LastIndex(m.Name, "-")
mid, _ := strconv.ParseInt(m.Name[idx+1:], 10, 32)
if int(mid) == id {
return m
}
}
return nil
}
// IsEqual tells whether two member sets are equal by checking
// - they have the same set of members and member equality are judged by Name only.
func (ms MemberSet) IsEqual(other MemberSet) bool {
if ms.Size() != other.Size() {
return false
}
for n := range ms {
if _, ok := other[n]; !ok {
return false
}
}
return true
}
func (ms MemberSet) Size() int {
return len(ms)
}
func (ms MemberSet) String() string {
var mstring []string
for m, v := range ms {
mstring = append(mstring, fmt.Sprintf("%s:%s", m, v.Version))
}
return strings.Join(mstring, ",")
}
func (ms MemberSet) PickOne() *Member {
for _, m := range ms {
return m
}
panic("empty")
}
func (ms MemberSet) Add(m *Member) {
ms[m.Name] = m
}
func (ms MemberSet) Remove(name string) {
delete(ms, name)
}
func (ms MemberSet) Ordinals() map[int]bool {
ids := map[int]bool{}
for _, m := range ms {
ids[m.Ordinal()] = true
}
return ids
}
func (ms MemberSet) Names() []string {
names := make([]string, 0)
for _, m := range ms {
names = append(names, m.Name)
}
return names
}
func (ms MemberSet) Duplicate() MemberSet {
r := MemberSet{}
for k, v := range ms {
r[k] = v
}
return r
}
func allMembersHealth(ms MemberSet) bool {
for _, m := range ms {
if !m.RunningAndReady {
return false
}
}
return true
}