This repository has been archived by the owner on Nov 3, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathprocess_repository.go
141 lines (120 loc) · 4.22 KB
/
process_repository.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package repositories
import (
"context"
"errors"
workloadsv1alpha1 "code.cloudfoundry.org/cf-k8s-controllers/apis/workloads/v1alpha1"
"sigs.k8s.io/controller-runtime/pkg/client"
)
//+kubebuilder:rbac:groups=workloads.cloudfoundry.org,resources=cfprocesses,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=workloads.cloudfoundry.org,resources=cfprocesses/status,verbs=get
type ProcessRecord struct {
GUID string
SpaceGUID string
AppGUID string
Type string
Command string
Instances int
MemoryMB int64
DiskQuotaMB int64
Ports []int32
HealthCheck HealthCheck
Labels map[string]string
Annotations map[string]string
CreatedAt string
UpdatedAt string
}
type HealthCheck struct {
Type string
Data HealthCheckData
}
type HealthCheckData struct {
HTTPEndpoint string
InvocationTimeoutSeconds int64
TimeoutSeconds int64
}
type ProcessRepository struct{}
func (r *ProcessRepository) FetchProcess(ctx context.Context, client client.Client, processGUID string) (ProcessRecord, error) {
// TODO: Could look up namespace from guid => namespace cache to do Get
processList := &workloadsv1alpha1.CFProcessList{}
err := client.List(ctx, processList)
if err != nil { // untested
return ProcessRecord{}, err
}
allProcesses := processList.Items
matches := filterProcessesByMetadataName(allProcesses, processGUID)
return returnProcess(matches)
}
func (r *ProcessRepository) FetchProcessesForApp(ctx context.Context, k8sClient client.Client, appGUID, spaceGUID string) ([]ProcessRecord, error) {
processList := &workloadsv1alpha1.CFProcessList{}
options := []client.ListOption{
client.InNamespace(spaceGUID),
}
err := k8sClient.List(ctx, processList, options...)
if err != nil { // untested
return []ProcessRecord{}, err
}
allProcesses := processList.Items
matches := filterProcessesByAppGUID(allProcesses, appGUID)
return returnProcesses(matches)
}
func filterProcessesByMetadataName(processes []workloadsv1alpha1.CFProcess, name string) []workloadsv1alpha1.CFProcess {
var filtered []workloadsv1alpha1.CFProcess
for i, process := range processes {
if process.ObjectMeta.Name == name {
filtered = append(filtered, processes[i])
}
}
return filtered
}
func returnProcess(processes []workloadsv1alpha1.CFProcess) (ProcessRecord, error) {
if len(processes) == 0 {
return ProcessRecord{}, NotFoundError{}
}
if len(processes) > 1 {
return ProcessRecord{}, errors.New("duplicate processes exist")
}
return cfProcessToProcessRecord(processes[0]), nil
}
func filterProcessesByAppGUID(processes []workloadsv1alpha1.CFProcess, appGUID string) []workloadsv1alpha1.CFProcess {
var filtered []workloadsv1alpha1.CFProcess
for i, process := range processes {
if process.Spec.AppRef.Name == appGUID {
filtered = append(filtered, processes[i])
}
}
return filtered
}
func returnProcesses(processes []workloadsv1alpha1.CFProcess) ([]ProcessRecord, error) {
processRecords := make([]ProcessRecord, 0, len(processes))
for _, process := range processes {
processRecord := cfProcessToProcessRecord(process)
processRecords = append(processRecords, processRecord)
}
return processRecords, nil
}
func cfProcessToProcessRecord(cfProcess workloadsv1alpha1.CFProcess) ProcessRecord {
updatedAtTime, _ := getTimeLastUpdatedTimestamp(&cfProcess.ObjectMeta)
return ProcessRecord{
GUID: cfProcess.Name,
SpaceGUID: cfProcess.Namespace,
AppGUID: cfProcess.Spec.AppRef.Name,
Type: cfProcess.Spec.ProcessType,
Command: cfProcess.Spec.Command,
Instances: cfProcess.Spec.DesiredInstances,
MemoryMB: cfProcess.Spec.MemoryMB,
DiskQuotaMB: cfProcess.Spec.DiskQuotaMB,
Ports: cfProcess.Spec.Ports,
HealthCheck: HealthCheck{
Type: string(cfProcess.Spec.HealthCheck.Type),
Data: HealthCheckData{
HTTPEndpoint: cfProcess.Spec.HealthCheck.Data.HTTPEndpoint,
InvocationTimeoutSeconds: cfProcess.Spec.HealthCheck.Data.InvocationTimeoutSeconds,
TimeoutSeconds: cfProcess.Spec.HealthCheck.Data.TimeoutSeconds,
},
},
Labels: map[string]string{},
Annotations: map[string]string{},
CreatedAt: cfProcess.CreationTimestamp.UTC().Format(TimestampFormat),
UpdatedAt: updatedAtTime,
}
}