Skip to content

Commit 2385ff0

Browse files
chris-rockclaude
andcommitted
Add OperatorImageDigest to status reporting and fix interface signatures
Extend the OperatorCustomState to include OperatorImageDigest alongside the existing CnspecVersion and CnspecImageDigest fields. This ensures both cnspec and operator image name, tag, and SHA are reported to the Mondoo platform. Also fixes the ContainerImageResolverMock to match the current 4-param CnspecImage/MondooOperatorImage interface signatures (with userDigest). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent f96d38f commit 2385ff0

3 files changed

Lines changed: 24 additions & 10 deletions

File tree

controllers/status/operator_status.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package status
55

66
import (
7+
"context"
78
"strings"
89

910
"github.com/go-logr/logr"
@@ -30,6 +31,7 @@ type OperatorCustomState struct {
3031
Nodes []string
3132
MondooAuditConfig MondooAuditConfig
3233
OperatorVersion string
34+
OperatorImageDigest string
3335
CnspecVersion string
3436
CnspecImageDigest string
3537
K8sResourcesScanning bool
@@ -44,7 +46,7 @@ type MondooAuditConfig struct {
4446
}
4547

4648
func ReportStatusRequestFromAuditConfig(
47-
integrationMrn string, m v1alpha2.MondooAuditConfig, nodes []v1.Node, k8sVersion *k8sversion.Info, containerImageResolver mondoo.ContainerImageResolver, log logr.Logger,
49+
ctx context.Context, integrationMrn string, m v1alpha2.MondooAuditConfig, nodes []v1.Node, k8sVersion *k8sversion.Info, containerImageResolver mondoo.ContainerImageResolver, log logr.Logger,
4850
) mondooclient.ReportStatusRequest {
4951
nodeNames := make([]string, len(nodes))
5052
for i := range nodes {
@@ -164,10 +166,10 @@ func ReportStatusRequestFromAuditConfig(
164166
}
165167
}
166168

167-
// Resolve cnspec image to get version and digest
168-
var cnspecVersion, cnspecImageDigest string
169+
// Resolve cnspec and operator images to get version and digest
170+
var cnspecVersion, cnspecImageDigest, operatorImageDigest string
169171
if containerImageResolver != nil {
170-
resolvedImage, err := containerImageResolver.CnspecImage(m.Spec.Scanner.Image.Name, m.Spec.Scanner.Image.Tag, "", false)
172+
resolvedImage, err := containerImageResolver.CnspecImage(m.Spec.Scanner.Image.Name, m.Spec.Scanner.Image.Tag, m.Spec.Scanner.Image.Digest, false)
171173
if err != nil {
172174
log.Error(err, "Failed to resolve cnspec image for status reporting")
173175
} else {
@@ -177,10 +179,20 @@ func ReportStatusRequestFromAuditConfig(
177179
}
178180
}
179181
// Get the tag separately (without resolution) for the version field
180-
tagImage, _ := containerImageResolver.CnspecImage(m.Spec.Scanner.Image.Name, m.Spec.Scanner.Image.Tag, "", true)
182+
tagImage, _ := containerImageResolver.CnspecImage(m.Spec.Scanner.Image.Name, m.Spec.Scanner.Image.Tag, m.Spec.Scanner.Image.Digest, true)
181183
if idx := strings.LastIndex(tagImage, ":"); idx != -1 {
182184
cnspecVersion = tagImage[idx+1:]
183185
}
186+
187+
// Resolve operator image digest
188+
resolvedOperator, err := containerImageResolver.MondooOperatorImage(ctx, "", "", "", false)
189+
if err != nil {
190+
log.Error(err, "Failed to resolve operator image for status reporting")
191+
} else {
192+
if idx := strings.Index(resolvedOperator, "@"); idx != -1 {
193+
operatorImageDigest = resolvedOperator[idx+1:]
194+
}
195+
}
184196
}
185197

186198
return mondooclient.ReportStatusRequest{
@@ -191,6 +203,7 @@ func ReportStatusRequestFromAuditConfig(
191203
KubernetesVersion: k8sVersion.GitVersion,
192204
MondooAuditConfig: MondooAuditConfig{Name: m.Name, Namespace: m.Namespace},
193205
OperatorVersion: version.Version,
206+
OperatorImageDigest: operatorImageDigest,
194207
CnspecVersion: cnspecVersion,
195208
CnspecImageDigest: cnspecImageDigest,
196209
K8sResourcesScanning: m.Spec.KubernetesResources.Enable,

controllers/status/operator_status_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package status
55

66
import (
7+
"context"
78
"testing"
89

910
"github.com/go-logr/logr"
@@ -29,7 +30,7 @@ func TestReportStatusRequestFromAuditConfig_AllDisabled(t *testing.T) {
2930
v := &k8sversion.Info{GitVersion: "v1.24.0"}
3031

3132
m := testMondooAuditConfig()
32-
reportStatus := ReportStatusRequestFromAuditConfig(integrationMrn, m, nodes, v, nil, logger)
33+
reportStatus := ReportStatusRequestFromAuditConfig(context.Background(), integrationMrn, m, nodes, v, nil, logger)
3334
assert.Equal(t, integrationMrn, reportStatus.Mrn)
3435
assert.Equal(t, mondooclient.Status_ACTIVE, reportStatus.Status)
3536
assert.Equal(t, OperatorCustomState{
@@ -73,7 +74,7 @@ func TestReportStatusRequestFromAuditConfig_AllEnabled(t *testing.T) {
7374
{Message: "Mondoo Operator controller is available", Status: v1.ConditionFalse, Type: v1alpha2.MondooOperatorDegraded},
7475
}
7576

76-
reportStatus := ReportStatusRequestFromAuditConfig(integrationMrn, m, nodes, v, nil, logger)
77+
reportStatus := ReportStatusRequestFromAuditConfig(context.Background(), integrationMrn, m, nodes, v, nil, logger)
7778
assert.Equal(t, integrationMrn, reportStatus.Mrn)
7879
assert.Equal(t, mondooclient.Status_ACTIVE, reportStatus.Status)
7980
assert.Equal(t, OperatorCustomState{
@@ -125,7 +126,7 @@ func TestReportStatusRequestFromAuditConfig_AllEnabled_DeprecatedFields(t *testi
125126
{Message: "Mondoo Operator controller is available", Status: v1.ConditionFalse, Type: v1alpha2.MondooOperatorDegraded},
126127
}
127128

128-
reportStatus := ReportStatusRequestFromAuditConfig(integrationMrn, m, nodes, v, nil, logger)
129+
reportStatus := ReportStatusRequestFromAuditConfig(context.Background(), integrationMrn, m, nodes, v, nil, logger)
129130
assert.Equal(t, integrationMrn, reportStatus.Mrn)
130131
assert.Equal(t, mondooclient.Status_ACTIVE, reportStatus.Status)
131132
assert.Equal(t, OperatorCustomState{
@@ -173,7 +174,7 @@ func TestReportStatusRequestFromAuditConfig_AllError(t *testing.T) {
173174
{Message: "Mondoo Operator controller is unavailable", Status: v1.ConditionTrue, Type: v1alpha2.MondooOperatorDegraded},
174175
}
175176

176-
reportStatus := ReportStatusRequestFromAuditConfig(integrationMrn, m, nodes, v, nil, logger)
177+
reportStatus := ReportStatusRequestFromAuditConfig(context.Background(), integrationMrn, m, nodes, v, nil, logger)
177178
assert.Equal(t, integrationMrn, reportStatus.Mrn)
178179
assert.Equal(t, mondooclient.Status_ERROR, reportStatus.Status)
179180
assert.Equal(t, OperatorCustomState{

controllers/status/status_reporter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (r *StatusReporter) Report(ctx context.Context, m v1alpha2.MondooAuditConfi
5858
return err
5959
}
6060

61-
operatorStatus := ReportStatusRequestFromAuditConfig(integrationMrn, m, nodes.Items, r.k8sVersion, r.containerImageResolver, logger)
61+
operatorStatus := ReportStatusRequestFromAuditConfig(ctx, integrationMrn, m, nodes.Items, r.k8sVersion, r.containerImageResolver, logger)
6262

6363
r.mu.RLock()
6464
statusUnchanged := reflect.DeepEqual(operatorStatus, r.lastReportedStatus)

0 commit comments

Comments
 (0)