github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/lorry/dcs/types.go (about)

     1  /*
     2  Copyright (C) 2022-2023 ApeCloud Co., Ltd
     3  
     4  This file is part of KubeBlocks project
     5  
     6  This program is free software: you can redistribute it and/or modify
     7  it under the terms of the GNU Affero General Public License as published by
     8  the Free Software Foundation, either version 3 of the License, or
     9  (at your option) any later version.
    10  
    11  This program is distributed in the hope that it will be useful
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    14  GNU Affero General Public License for more details.
    15  
    16  You should have received a copy of the GNU Affero General Public License
    17  along with this program.  If not, see <http://www.gnu.org/licenses/>.
    18  */
    19  
    20  package dcs
    21  
    22  import (
    23  	"fmt"
    24  
    25  	"github.com/1aal/kubeblocks/pkg/constant"
    26  	viper "github.com/1aal/kubeblocks/pkg/viperx"
    27  )
    28  
    29  type Cluster struct {
    30  	ClusterCompName string
    31  	Namespace       string
    32  	Replicas        int32
    33  	HaConfig        *HaConfig
    34  	Leader          *Leader
    35  	Members         []Member
    36  	Switchover      *Switchover
    37  	Extra           map[string]string
    38  	resource        any
    39  }
    40  
    41  func (c *Cluster) HasMember(memberName string) bool {
    42  	for _, member := range c.Members {
    43  		if memberName == member.Name {
    44  			return true
    45  		}
    46  	}
    47  	return false
    48  }
    49  
    50  func (c *Cluster) GetLeaderMember() *Member {
    51  	if c.Leader == nil || c.Leader.Name == "" {
    52  		return nil
    53  	}
    54  
    55  	return c.GetMemberWithName(c.Leader.Name)
    56  }
    57  
    58  func (c *Cluster) GetMemberWithName(name string) *Member {
    59  	for _, m := range c.Members {
    60  		if m.Name == name {
    61  			return &m
    62  		}
    63  	}
    64  
    65  	return nil
    66  }
    67  
    68  func (c *Cluster) GetMemberWithHost(host string) *Member {
    69  	for _, m := range c.Members {
    70  		if host == c.GetMemberAddr(m) {
    71  			return &m
    72  		}
    73  	}
    74  
    75  	return nil
    76  }
    77  
    78  func (c *Cluster) GetMemberName() []string {
    79  	var memberList []string
    80  	for _, member := range c.Members {
    81  		memberList = append(memberList, member.Name)
    82  	}
    83  
    84  	return memberList
    85  }
    86  
    87  func (c *Cluster) IsLocked() bool {
    88  	return c.Leader != nil && c.Leader.Name != ""
    89  }
    90  
    91  func (c *Cluster) GetMemberAddrWithPort(member Member) string {
    92  	addr := c.GetMemberAddr(member)
    93  	return fmt.Sprintf("%s:%s", addr, member.DBPort)
    94  }
    95  
    96  func (c *Cluster) GetMemberAddr(member Member) string {
    97  	clusterDomain := viper.GetString(constant.KubernetesClusterDomainEnv)
    98  	return fmt.Sprintf("%s.%s-headless.%s.svc.%s", member.Name, c.ClusterCompName, c.Namespace, clusterDomain)
    99  }
   100  
   101  func (c *Cluster) GetMemberAddrWithName(name string) string {
   102  	return fmt.Sprintf("%s.%s-headless.%s.svc", name, c.ClusterCompName, c.Namespace)
   103  }
   104  
   105  func (c *Cluster) GetMemberAddrs() []string {
   106  	hosts := make([]string, len(c.Members))
   107  	for i, member := range c.Members {
   108  		hosts[i] = c.GetMemberAddrWithPort(member)
   109  	}
   110  	return hosts
   111  }
   112  
   113  type MemberToDelete struct {
   114  	UID        string
   115  	IsFinished bool
   116  }
   117  
   118  type HaConfig struct {
   119  	index              string
   120  	ttl                int
   121  	enable             bool
   122  	maxLagOnSwitchover int64
   123  	DeleteMembers      map[string]MemberToDelete
   124  	resource           any
   125  }
   126  
   127  func (c *HaConfig) GetTTL() int {
   128  	return c.ttl
   129  }
   130  
   131  func (c *HaConfig) IsEnable() bool {
   132  	return c.enable
   133  }
   134  
   135  func (c *HaConfig) GetMaxLagOnSwitchover() int64 {
   136  	return c.maxLagOnSwitchover
   137  }
   138  
   139  func (c *HaConfig) IsDeleting(member *Member) bool {
   140  	memberToDelete := c.GetMemberToDelete(member)
   141  	return memberToDelete != nil
   142  }
   143  
   144  func (c *HaConfig) IsDeleted(member *Member) bool {
   145  	memberToDelete := c.GetMemberToDelete(member)
   146  	if memberToDelete == nil {
   147  		return false
   148  	}
   149  	return memberToDelete.IsFinished
   150  }
   151  
   152  func (c *HaConfig) FinishDeleted(member *Member) {
   153  	memberToDelete := c.GetMemberToDelete(member)
   154  	memberToDelete.IsFinished = true
   155  	c.DeleteMembers[member.Name] = *memberToDelete
   156  }
   157  
   158  func (c *HaConfig) GetMemberToDelete(member *Member) *MemberToDelete {
   159  	memberToDelete, ok := c.DeleteMembers[member.Name]
   160  	if !ok {
   161  		return nil
   162  	}
   163  
   164  	if memberToDelete.UID != member.UID {
   165  		return nil
   166  	}
   167  	return &memberToDelete
   168  }
   169  
   170  func (c *HaConfig) AddMemberToDelete(member *Member) {
   171  	memberToDelete := MemberToDelete{
   172  		UID:        member.UID,
   173  		IsFinished: false,
   174  	}
   175  	c.DeleteMembers[member.Name] = memberToDelete
   176  }
   177  
   178  type Leader struct {
   179  	DBState     *DBState
   180  	Index       string
   181  	Name        string
   182  	AcquireTime int64
   183  	RenewTime   int64
   184  	TTL         int
   185  	Resource    any
   186  }
   187  
   188  type DBState struct {
   189  	OpTimestamp int64
   190  	Extra       map[string]string
   191  }
   192  type Member struct {
   193  	Index     string
   194  	Name      string
   195  	Role      string
   196  	PodIP     string
   197  	DBPort    string
   198  	LorryPort string
   199  	UID       string
   200  	resource  any
   201  }
   202  
   203  func (m *Member) GetName() string {
   204  	return m.Name
   205  }
   206  
   207  // func newMember(index string, name string, role string, url string) *Member {
   208  // 	return &Member{
   209  // 		Index: index,
   210  // 		Name:  name,
   211  // 		Role:  role,
   212  // 	}
   213  // }
   214  
   215  type Switchover struct {
   216  	Index       string
   217  	Leader      string
   218  	Candidate   string
   219  	ScheduledAt int64
   220  }
   221  
   222  func newSwitchover(index string, leader string, candidate string, scheduledAt int64) *Switchover {
   223  	return &Switchover{
   224  		Index:       index,
   225  		Leader:      leader,
   226  		Candidate:   candidate,
   227  		ScheduledAt: scheduledAt,
   228  	}
   229  }
   230  
   231  func (s *Switchover) GetLeader() string {
   232  	return s.Leader
   233  }
   234  
   235  func (s *Switchover) GetCandidate() string {
   236  	return s.Candidate
   237  }