Skip to content

Commit 1e00fcb

Browse files
committed
Update RunsCollector logic
1 parent 5f59376 commit 1e00fcb

File tree

9 files changed

+187
-19
lines changed

9 files changed

+187
-19
lines changed

api/v1alpha2/agenttoken_types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ type AgentTokenStatus struct {
8484

8585
// +kubebuilder:object:root=true
8686
// +kubebuilder:subresource:status
87-
//+kubebuilder:printcolumn:name="Agent Pool Name",type=string,JSONPath=`.status.agentPool.name`
88-
//+kubebuilder:printcolumn:name="Agent Pool ID",type=string,JSONPath=`.status.agentPool.id`
89-
//+kubebuilder:metadata:labels="app.terraform.io/crd-schema-version=v25.9.0"
87+
//+kubebuilder:printcolumn:name="Pool Name",type=string,JSONPath=`.status.agentPool.name`
88+
//+kubebuilder:printcolumn:name="Pool ID",type=string,JSONPath=`.status.agentPool.id`
89+
//+kubebuilder:metadata:labels="app.terraform.io/crd-schema-version=v25.11.0"
9090

9191
// AgentToken manages HCP Terraform Agent Tokens.
9292
// More information:
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package v1alpha2
5+
6+
func (rc *RunsCollector) NeedUpdateStatus() bool {
7+
if rc.Status.AgentPool == nil {
8+
return true
9+
}
10+
if rc.Spec.AgentPool.Name != "" {
11+
return rc.Spec.AgentPool.Name != rc.Status.AgentPool.Name
12+
}
13+
if rc.Spec.AgentPool.ID != "" {
14+
return rc.Spec.AgentPool.ID != rc.Status.AgentPool.ID
15+
}
16+
17+
return false
18+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package v1alpha2
5+
6+
import (
7+
"testing"
8+
)
9+
10+
func TestNeedUpdateStatus(t *testing.T) {
11+
t.Parallel()
12+
13+
cases := map[string]struct {
14+
rc RunsCollector
15+
expected bool
16+
}{
17+
"NilStatus": {
18+
RunsCollector{
19+
Status: RunsCollectorStatus{AgentPool: nil},
20+
},
21+
true,
22+
},
23+
"SpecNameDoesNotMatchStatusName": {
24+
RunsCollector{
25+
Spec: RunsCollectorSpec{
26+
AgentPool: &AgentPoolRef{
27+
Name: "this",
28+
},
29+
},
30+
Status: RunsCollectorStatus{
31+
AgentPool: &AgentPoolRef{
32+
Name: "that",
33+
},
34+
},
35+
},
36+
true,
37+
},
38+
"SpecIDDoesNotMatchStatusID": {
39+
RunsCollector{
40+
Spec: RunsCollectorSpec{
41+
AgentPool: &AgentPoolRef{
42+
ID: "this",
43+
},
44+
},
45+
Status: RunsCollectorStatus{
46+
AgentPool: &AgentPoolRef{
47+
ID: "that",
48+
},
49+
},
50+
},
51+
true,
52+
},
53+
"SpecNameMatchesStatusName": {
54+
RunsCollector{
55+
Spec: RunsCollectorSpec{
56+
AgentPool: &AgentPoolRef{
57+
Name: "this",
58+
},
59+
},
60+
Status: RunsCollectorStatus{
61+
AgentPool: &AgentPoolRef{
62+
Name: "this",
63+
},
64+
},
65+
},
66+
false,
67+
},
68+
"SpecIDMatchesStatusID": {
69+
RunsCollector{
70+
Spec: RunsCollectorSpec{
71+
AgentPool: &AgentPoolRef{
72+
ID: "this",
73+
},
74+
},
75+
Status: RunsCollectorStatus{
76+
AgentPool: &AgentPoolRef{
77+
ID: "this",
78+
},
79+
},
80+
},
81+
false,
82+
},
83+
}
84+
85+
for n, c := range cases {
86+
t.Run(n, func(t *testing.T) {
87+
out := c.rc.NeedUpdateStatus()
88+
if out != c.expected {
89+
t.Fatalf("Error matching output and expected: %#v vs %#v", out, c.expected)
90+
}
91+
})
92+
}
93+
}

api/v1alpha2/runscollector_types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ type RunsCollectorStatus struct {
3232

3333
//+kubebuilder:object:root=true
3434
//+kubebuilder:subresource:status
35-
//+kubebuilder:printcolumn:name="Pool ID",type=string,JSONPath=`.status.pool.ID`
36-
//+kubebuilder:printcolumn:name="Pool Name",type=string,JSONPath=`.status.pool.Name`
37-
//+kubebuilder:metadata:labels="app.terraform.io/crd-schema-version=v25.9.0"
35+
//+kubebuilder:printcolumn:name="Pool ID",type=string,JSONPath=`.status.agentPool.ID`
36+
//+kubebuilder:printcolumn:name="Pool Name",type=string,JSONPath=`.status.agentPool.Name`
37+
//+kubebuilder:metadata:labels="app.terraform.io/crd-schema-version=v25.11.0"
3838

3939
// Runs Collector scraptes HCP Terraform Run statuses from a given Agent Pool and exposes them as Prometheus-compatible metrics.
4040
// More information:

charts/hcp-terraform-operator/crds/app.terraform.io_agenttokens.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ metadata:
88
annotations:
99
controller-gen.kubebuilder.io/version: v0.16.5
1010
labels:
11-
app.terraform.io/crd-schema-version: v25.9.0
11+
app.terraform.io/crd-schema-version: v25.11.0
1212
name: agenttokens.app.terraform.io
1313
spec:
1414
group: app.terraform.io
@@ -21,10 +21,10 @@ spec:
2121
versions:
2222
- additionalPrinterColumns:
2323
- jsonPath: .status.agentPool.name
24-
name: Agent Pool Name
24+
name: Pool Name
2525
type: string
2626
- jsonPath: .status.agentPool.id
27-
name: Agent Pool ID
27+
name: Pool ID
2828
type: string
2929
name: v1alpha2
3030
schema:

charts/hcp-terraform-operator/crds/app.terraform.io_runscollectors.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ metadata:
88
annotations:
99
controller-gen.kubebuilder.io/version: v0.16.5
1010
labels:
11-
app.terraform.io/crd-schema-version: v25.9.0
11+
app.terraform.io/crd-schema-version: v25.11.0
1212
name: runscollectors.app.terraform.io
1313
spec:
1414
group: app.terraform.io
@@ -20,10 +20,10 @@ spec:
2020
scope: Namespaced
2121
versions:
2222
- additionalPrinterColumns:
23-
- jsonPath: .status.pool.ID
23+
- jsonPath: .status.agentPool.ID
2424
name: Pool ID
2525
type: string
26-
- jsonPath: .status.pool.Name
26+
- jsonPath: .status.agentPool.Name
2727
name: Pool Name
2828
type: string
2929
name: v1alpha2

config/crd/bases/app.terraform.io_agenttokens.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ metadata:
55
annotations:
66
controller-gen.kubebuilder.io/version: v0.16.5
77
labels:
8-
app.terraform.io/crd-schema-version: v25.9.0
8+
app.terraform.io/crd-schema-version: v25.11.0
99
name: agenttokens.app.terraform.io
1010
spec:
1111
group: app.terraform.io
@@ -18,10 +18,10 @@ spec:
1818
versions:
1919
- additionalPrinterColumns:
2020
- jsonPath: .status.agentPool.name
21-
name: Agent Pool Name
21+
name: Pool Name
2222
type: string
2323
- jsonPath: .status.agentPool.id
24-
name: Agent Pool ID
24+
name: Pool ID
2525
type: string
2626
name: v1alpha2
2727
schema:

config/crd/bases/app.terraform.io_runscollectors.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ metadata:
55
annotations:
66
controller-gen.kubebuilder.io/version: v0.16.5
77
labels:
8-
app.terraform.io/crd-schema-version: v25.9.0
8+
app.terraform.io/crd-schema-version: v25.11.0
99
name: runscollectors.app.terraform.io
1010
spec:
1111
group: app.terraform.io
@@ -17,10 +17,10 @@ spec:
1717
scope: Namespaced
1818
versions:
1919
- additionalPrinterColumns:
20-
- jsonPath: .status.pool.ID
20+
- jsonPath: .status.agentPool.ID
2121
name: Pool ID
2222
type: string
23-
- jsonPath: .status.pool.Name
23+
- jsonPath: .status.agentPool.Name
2424
name: Pool Name
2525
type: string
2626
name: v1alpha2

internal/controller/runscollector_controller.go

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,68 @@ func (r *RunsCollectorReconciler) SetupWithManager(mgr ctrl.Manager) error {
200200
Complete(r)
201201
}
202202

203+
func (r *RunsCollectorReconciler) getAgentPoolIDByName(ctx context.Context, rc *runsCollectorInstance) (*tfc.AgentPool, error) {
204+
name := rc.instance.Spec.AgentPool.Name
205+
206+
listOpts := &tfc.AgentPoolListOptions{
207+
Query: name,
208+
ListOptions: tfc.ListOptions{
209+
PageSize: maxPageSize,
210+
},
211+
}
212+
for {
213+
ap, err := rc.tfClient.Client.AgentPools.List(ctx, rc.instance.Spec.Organization, listOpts)
214+
if err != nil {
215+
return nil, err
216+
}
217+
for _, a := range ap.Items {
218+
if a.Name == name {
219+
return a, nil
220+
}
221+
}
222+
if ap.NextPage == 0 {
223+
break
224+
}
225+
listOpts.PageNumber = ap.NextPage
226+
}
227+
228+
return nil, fmt.Errorf("agent pool ID not found for agent pool name %q", name)
229+
}
230+
231+
func (r *RunsCollectorReconciler) updateStatusAgentPool(ctx context.Context, rc *runsCollectorInstance) error {
232+
var pool *tfc.AgentPool
233+
var err error
234+
if rc.instance.Spec.AgentPool.Name != "" {
235+
pool, err = r.getAgentPoolIDByName(ctx, rc)
236+
if err != nil {
237+
return err
238+
}
239+
240+
}
241+
if rc.instance.Spec.AgentPool.ID != "" {
242+
pool, err = rc.tfClient.Client.AgentPools.Read(ctx, rc.instance.Spec.AgentPool.ID)
243+
if err != nil {
244+
return err
245+
}
246+
247+
}
248+
rc.instance.Status.AgentPool = &appv1alpha2.AgentPoolRef{
249+
ID: pool.ID,
250+
Name: pool.Name,
251+
}
252+
253+
return nil
254+
}
255+
203256
func (r *RunsCollectorReconciler) reconcileRuns(ctx context.Context, rc *runsCollectorInstance) error {
204257
runs := map[tfc.RunStatus]float64{}
205258
var runsTotal float64
259+
if rc.instance.NeedUpdateStatus() {
260+
r.updateStatusAgentPool(ctx, rc)
261+
}
262+
206263
listOpts := &tfc.RunListForOrganizationOptions{
207-
AgentPoolNames: rc.instance.Spec.AgentPool.Name,
264+
AgentPoolNames: rc.instance.Status.AgentPool.Name,
208265
StatusGroup: "non_final",
209266
ListOptions: tfc.ListOptions{
210267
PageSize: maxPageSize,

0 commit comments

Comments
 (0)