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
package clusterkcp
import (
"context"
"fmt"
"sort"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"github.com/johnandersen777/socialweb-computer-kcp/internal/scale"
)
func appliedBy(meta metav1.ObjectMeta, manager string) bool {
for _, f := range meta.ManagedFields {
if f.Manager == manager && f.Operation == metav1.ManagedFieldsOperationApply {
return true
}
}
return false
}
func MeasureAddOnBaseline(ctx context.Context, cs kubernetes.Interface, manager string, now time.Time) (scale.Baseline, error) {
b := scale.Baseline{Manager: manager, MeasuredAt: now.UTC()}
add := func(kind string, meta metav1.ObjectMeta, spec any) error {
if !appliedBy(meta, manager) {
return nil
}
h, err := scale.SpecHash(spec)
if err != nil {
return err
}
b.Workloads = append(b.Workloads, scale.BaselineEntry{
WorkloadKey: scale.WorkloadKey{Kind: kind, Namespace: meta.Namespace, Name: meta.Name},
SpecHash: h,
})
return nil
}
deployments, err := cs.AppsV1().Deployments(metav1.NamespaceAll).List(ctx, metav1.ListOptions{})
if err != nil {
return scale.Baseline{}, fmt.Errorf("clusterprovider: listing deployments to measure the add-on baseline: %w", err)
}
for i := range deployments.Items {
if err := add(scale.KindDeployment, deployments.Items[i].ObjectMeta, deployments.Items[i].Spec); err != nil {
return scale.Baseline{}, err
}
}
statefulsets, err := cs.AppsV1().StatefulSets(metav1.NamespaceAll).List(ctx, metav1.ListOptions{})
if err != nil {
return scale.Baseline{}, fmt.Errorf("clusterprovider: listing statefulsets to measure the add-on baseline: %w", err)
}
for i := range statefulsets.Items {
if err := add(scale.KindStatefulSet, statefulsets.Items[i].ObjectMeta, statefulsets.Items[i].Spec); err != nil {
return scale.Baseline{}, err
}
}
daemonsets, err := cs.AppsV1().DaemonSets(metav1.NamespaceAll).List(ctx, metav1.ListOptions{})
if err != nil {
return scale.Baseline{}, fmt.Errorf("clusterprovider: listing daemonsets to measure the add-on baseline: %w", err)
}
for i := range daemonsets.Items {
if err := add(scale.KindDaemonSet, daemonsets.Items[i].ObjectMeta, daemonsets.Items[i].Spec); err != nil {
return scale.Baseline{}, err
}
}
jobs, err := cs.BatchV1().Jobs(metav1.NamespaceAll).List(ctx, metav1.ListOptions{})
if err != nil {
return scale.Baseline{}, fmt.Errorf("clusterprovider: listing jobs to measure the add-on baseline: %w", err)
}
for i := range jobs.Items {
if err := add(scale.KindJob, jobs.Items[i].ObjectMeta, jobs.Items[i].Spec); err != nil {
return scale.Baseline{}, err
}
}
sort.Slice(b.Workloads, func(i, j int) bool {
return b.Workloads[i].WorkloadKey.String() < b.Workloads[j].WorkloadKey.String()
})
return b, nil
}