mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 04:55:31 +00:00
61 lines
1.9 KiB
Go
61 lines
1.9 KiB
Go
|
// Copyright (c) Tailscale Inc & AUTHORS
|
||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
|
||
|
//go:build !plan9
|
||
|
|
||
|
package kube
|
||
|
|
||
|
import (
|
||
|
"slices"
|
||
|
|
||
|
"go.uber.org/zap"
|
||
|
xslices "golang.org/x/exp/slices"
|
||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||
|
tsapi "tailscale.com/k8s-operator/apis/v1alpha1"
|
||
|
"tailscale.com/tstime"
|
||
|
)
|
||
|
|
||
|
// SetConnectorCondition ensures that Connector status has a condition with the
|
||
|
// given attributes. LastTransitionTime gets set every time condition's status
|
||
|
// changes
|
||
|
func SetConnectorCondition(cn *tsapi.Connector, conditionType tsapi.ConnectorConditionType, status metav1.ConditionStatus, reason, message string, gen int64, clock tstime.Clock, logger *zap.SugaredLogger) {
|
||
|
newCondition := tsapi.ConnectorCondition{
|
||
|
Type: conditionType,
|
||
|
Status: status,
|
||
|
Reason: reason,
|
||
|
Message: message,
|
||
|
ObservedGeneration: gen,
|
||
|
}
|
||
|
|
||
|
nowTime := metav1.NewTime(clock.Now())
|
||
|
newCondition.LastTransitionTime = &nowTime
|
||
|
|
||
|
idx := xslices.IndexFunc(cn.Status.Conditions, func(cond tsapi.ConnectorCondition) bool {
|
||
|
return cond.Type == conditionType
|
||
|
})
|
||
|
|
||
|
if idx == -1 {
|
||
|
cn.Status.Conditions = append(cn.Status.Conditions, newCondition)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Update the existing condition
|
||
|
cond := cn.Status.Conditions[idx]
|
||
|
// If this update doesn't contain a state transition, we don't update
|
||
|
// the conditions LastTransitionTime to Now()
|
||
|
if cond.Status == status {
|
||
|
newCondition.LastTransitionTime = cond.LastTransitionTime
|
||
|
} else {
|
||
|
logger.Info("Status change for Connector condition %s from %s to %s", conditionType, cond.Status, status)
|
||
|
}
|
||
|
|
||
|
cn.Status.Conditions[idx] = newCondition
|
||
|
}
|
||
|
|
||
|
// RemoveConnectorCondition will remove condition of the given type
|
||
|
func RemoveConnectorCondition(conn *tsapi.Connector, conditionType tsapi.ConnectorConditionType) {
|
||
|
conn.Status.Conditions = slices.DeleteFunc(conn.Status.Conditions, func(cond tsapi.ConnectorCondition) bool {
|
||
|
return cond.Type == conditionType
|
||
|
})
|
||
|
}
|