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 }