Files
my-rook-config/pkg/operator/ceph/cluster/mon/util.go
T
Artem Torubarov 0b2e830111 mon: support external mons in local rook cluster
Implements #14733. Allows to set IDs of external mons to
Cluster CRD. Rook will not remove external mons from quorum
and will add external mon addresses to mon endpoints.
Use-case for external mon is to maintain quorum for 2-AZ
k8s cluster in case of zone outage.

Signed-off-by: Artem Torubarov <artem.torubarov@clyso.com>
2025-03-03 14:49:39 +01:00

70 lines
1.8 KiB
Go

/*
Copyright 2017 The Rook Authors. All rights reserved.
Licensed 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 mon
import (
"slices"
"strings"
"github.com/rook/rook/pkg/daemon/ceph/client"
"github.com/rook/rook/pkg/operator/k8sutil"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/intstr"
)
func monInQuorum(monitor client.MonMapEntry, quorum []int) bool {
for _, rank := range quorum {
if rank == monitor.Rank {
return true
}
}
return false
}
func getMonByID(monID string, monMap client.MonStatusResponse) (info client.MonMapEntry, inQuorum bool) {
for _, mon := range monMap.MonMap.Mons {
if mon.Name != monID {
continue
}
monRank := mon.Rank
return mon, slices.Contains(monMap.Quorum, monRank)
}
return client.MonMapEntry{}, false
}
// convert the mon name to the numeric mon ID
func fullNameToIndex(name string) (int, error) {
// remove the "rook-ceph-mon" prefix
name = strings.TrimPrefix(name, AppName)
// remove the "-" prefix
name = strings.TrimPrefix(name, "-")
return k8sutil.NameToIndex(name)
}
// addServicePort adds a port to a service
func addServicePort(service *v1.Service, name string, port int32) {
if port == 0 {
return
}
service.Spec.Ports = append(service.Spec.Ports, v1.ServicePort{
Name: name,
Port: port,
TargetPort: intstr.FromInt(int(port)),
Protocol: v1.ProtocolTCP,
})
}