-
Notifications
You must be signed in to change notification settings - Fork 14
/
apimachinery.go
82 lines (69 loc) · 2.68 KB
/
apimachinery.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
Copyright 2023 The Kapacity Authors.
Copyright 2015 The Kubernetes Authors.
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 util
import (
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/utils/pointer"
"sigs.k8s.io/controller-runtime/pkg/client"
)
// SetConditionInList sets the specific condition type on the given condition list to the specified value with the given reason and message.
// The condition will be added if it is not present. The new list will be returned.
func SetConditionInList(inputList []metav1.Condition, conditionType string, status metav1.ConditionStatus, observedGeneration int64, reason, message string) []metav1.Condition {
resList := inputList
var existingCond *metav1.Condition
for i, condition := range resList {
if condition.Type == conditionType {
existingCond = &resList[i]
break
}
}
if existingCond == nil {
resList = append(resList, metav1.Condition{
Type: conditionType,
})
existingCond = &resList[len(resList)-1]
}
if existingCond.Status != status {
existingCond.LastTransitionTime = metav1.Now()
}
existingCond.Status = status
existingCond.ObservedGeneration = observedGeneration
existingCond.Reason = reason
existingCond.Message = message
return resList
}
// NewControllerRef creates a controller owner reference pointing to the given owner.
func NewControllerRef(obj client.Object) *metav1.OwnerReference {
return &metav1.OwnerReference{
APIVersion: obj.GetObjectKind().GroupVersionKind().GroupVersion().String(),
Kind: obj.GetObjectKind().GroupVersionKind().Kind,
Name: obj.GetName(),
UID: obj.GetUID(),
Controller: pointer.Bool(true),
BlockOwnerDeletion: pointer.Bool(true),
}
}
// ParseScaleSelector parses the selector string got from Kubernetes scale API to labels.Selector.
func ParseScaleSelector(selector string) (labels.Selector, error) {
if selector == "" {
return nil, fmt.Errorf("selector should not be empty")
}
parsedSelector, err := labels.Parse(selector)
if err != nil {
return nil, fmt.Errorf("failed to convert selector into a corresponding internal selector object: %v", err)
}
return parsedSelector, nil
}