Skip to content

Commit d0dacfa

Browse files
authored
Updates to use the latest Rekor Monitor (#1416)
1 parent b590ddb commit d0dacfa

File tree

8 files changed

+130
-58
lines changed

8 files changed

+130
-58
lines changed

api/v1alpha1/common.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ type MonitoringWithTLogConfig struct {
4343
// Configuration for Rekor transparency log monitoring
4444
//+optional
4545
TLog TlogMonitoring `json:"tlog"`
46+
// TUF service configuration
47+
//+optional
48+
Tuf TufService `json:"tuf,omitempty"`
4649
}
4750

4851
// TrillianService configuration to connect Trillian server
@@ -58,6 +61,18 @@ type TrillianService struct {
5861
Port *int32 `json:"port,omitempty"`
5962
}
6063

64+
// TufService configuration to connect TUF server
65+
type TufService struct {
66+
// Address to TUF Server End point
67+
//+optional
68+
Address string `json:"address,omitempty"`
69+
// Port of TUF Server End point
70+
//+kubebuilder:validation:Minimum:=1
71+
//+kubebuilder:validation:Maximum:=65535
72+
//+optional
73+
Port *int32 `json:"port,omitempty"`
74+
}
75+
6176
// CtlogService configuration to connect Ctlog server
6277
type CtlogService struct {
6378
// Address to Ctlog Log Server End point

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/rhtas.redhat.com_rekors.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,19 @@ spec:
12811281
required:
12821282
- enabled
12831283
type: object
1284+
tuf:
1285+
description: TUF service configuration
1286+
properties:
1287+
address:
1288+
description: Address to TUF Server End point
1289+
type: string
1290+
port:
1291+
description: Port of TUF Server End point
1292+
format: int32
1293+
maximum: 65535
1294+
minimum: 1
1295+
type: integer
1296+
type: object
12841297
required:
12851298
- enabled
12861299
type: object

config/crd/bases/rhtas.redhat.com_securesigns.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3894,6 +3894,19 @@ spec:
38943894
required:
38953895
- enabled
38963896
type: object
3897+
tuf:
3898+
description: TUF service configuration
3899+
properties:
3900+
address:
3901+
description: Address to TUF Server End point
3902+
type: string
3903+
port:
3904+
description: Port of TUF Server End point
3905+
format: int32
3906+
maximum: 65535
3907+
minimum: 1
3908+
type: integer
3909+
type: object
38973910
required:
38983911
- enabled
38993912
type: object

config/default/images.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ RELATED_IMAGE_CTLOG=registry.redhat.io/rhtas/certificate-transparency-rhel9@sha2
1313
RELATED_IMAGE_HTTP_SERVER=registry.redhat.io/ubi9/httpd-24@sha256:8536169e5537fe6c330eba814248abdcf39cdd8f7e7336034d74e6fda9544050
1414
RELATED_IMAGE_TIMESTAMP_AUTHORITY=registry.redhat.io/rhtas/timestamp-authority-rhel9@sha256:be623422f3f636c39397a66416b02a79f1d59cf593ca258e1701d1728755dde9
1515
RELATED_IMAGE_CLIENT_SERVER=registry.redhat.io/rhtas/client-server-rhel9@sha256:c81aaa8f300021d7cdbb964524fc5e89ea2c79fdab5507f0ec036bf96b219332
16-
RELATED_IMAGE_REKOR_MONITOR=registry.redhat.io/rhtas/rekor-monitor-rhel9@sha256:1944eff9f103d84380b9efac6adec9cb22613643968e51f07db58df977b6b982
16+
RELATED_IMAGE_REKOR_MONITOR=registry.redhat.io/rhtas/rekor-monitor-rhel9@sha256:b7f9f8b24fe7db4e124f9e5e9289bc2d180a810e253f48feb7e1177bbef6d4d0

internal/controller/rekor/actions/monitor/statefulset.go

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/securesign/operator/internal/images"
1010

11+
rhtasv1alpha1 "github.com/securesign/operator/api/v1alpha1"
1112
"github.com/securesign/operator/internal/action"
1213
"github.com/securesign/operator/internal/constants"
1314
"github.com/securesign/operator/internal/controller/rekor/actions"
@@ -21,11 +22,13 @@ import (
2122
"k8s.io/apimachinery/pkg/api/resource"
2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2324
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
24-
25-
rhtasv1alpha1 "github.com/securesign/operator/api/v1alpha1"
2625
)
2726

28-
const storageVolumeName = "monitor-storage"
27+
const (
28+
storageVolumeName = "monitor-storage"
29+
tufRepoVolumeName = "tuf-repository"
30+
mountPath = "/data"
31+
)
2932

3033
func NewStatefulSetAction() action.Action[*rhtasv1alpha1.Rekor] {
3134
return &statefulSetAction{}
@@ -50,6 +53,7 @@ func (i statefulSetAction) Handle(ctx context.Context, instance *rhtasv1alpha1.R
5053
result controllerutil.OperationResult
5154
)
5255

56+
tufServerHost := i.resolveTufUrl(instance)
5357
rekorServerHost := fmt.Sprintf("http://%s.%s.svc", actions.ServerComponentName, instance.Namespace)
5458

5559
labels := labels.For(actions.MonitorComponentName, actions.MonitorStatefulSetName, instance.Name)
@@ -60,8 +64,8 @@ func (i statefulSetAction) Handle(ctx context.Context, instance *rhtasv1alpha1.R
6064
Namespace: instance.Namespace,
6165
},
6266
},
63-
i.ensureMonitorStatefulSet(instance, actions.RBACName, labels, rekorServerHost),
64-
i.ensureInitContainer(rekorServerHost),
67+
i.ensureMonitorStatefulSet(instance, actions.RBACName, labels, rekorServerHost, tufServerHost),
68+
i.ensureInitContainer(rekorServerHost, tufServerHost),
6569
ensure.ControllerReference[*v1.StatefulSet](instance, i.Client),
6670
ensure.Labels[*v1.StatefulSet](slices.Collect(maps.Keys(labels)), labels),
6771
func(object *v1.StatefulSet) error {
@@ -90,7 +94,18 @@ func (i statefulSetAction) Handle(ctx context.Context, instance *rhtasv1alpha1.R
9094
return i.Continue()
9195
}
9296

93-
func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Rekor, sa string, labels map[string]string, rekorServerHost string) func(*v1.StatefulSet) error {
97+
func (i statefulSetAction) resolveTufUrl(instance *rhtasv1alpha1.Rekor) string {
98+
if instance.Spec.Monitoring.Tuf.Address != "" {
99+
url := instance.Spec.Monitoring.Tuf.Address
100+
if instance.Spec.Monitoring.Tuf.Port != nil {
101+
url = fmt.Sprintf("%s:%d", url, *instance.Spec.Monitoring.Tuf.Port)
102+
}
103+
return url
104+
}
105+
return fmt.Sprintf("http://tuf.%s.svc", instance.Namespace)
106+
}
107+
108+
func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Rekor, sa string, labels map[string]string, rekorServerHost string, tufServerHost string) func(*v1.StatefulSet) error {
94109
return func(ss *v1.StatefulSet) error {
95110

96111
spec := &ss.Spec
@@ -110,7 +125,9 @@ func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Reko
110125
container.Command = []string{
111126
"/bin/sh",
112127
"-c",
113-
fmt.Sprintf(`/rekor_monitor --file=/data/checkpoint_log.txt --once=false --interval=%s --url=%s`, interval.String(), rekorServerHost),
128+
fmt.Sprintf(
129+
`/rekor_monitor --file=/data/checkpoint_log.txt --once=false --interval=%s --url=%s --tuf-repository=%s --tuf-root-path="%s/root.json"`,
130+
interval.String(), rekorServerHost, tufServerHost, mountPath),
114131
}
115132

116133
container.Ports = []core.ContainerPort{
@@ -120,9 +137,15 @@ func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Reko
120137
Protocol: core.ProtocolTCP,
121138
},
122139
}
140+
container.Env = []core.EnvVar{
141+
{
142+
Name: "HOME",
143+
Value: mountPath,
144+
},
145+
}
123146

124147
volumeMount := kubernetes.FindVolumeMountByNameOrCreate(container, storageVolumeName)
125-
volumeMount.MountPath = "/data"
148+
volumeMount.MountPath = mountPath
126149

127150
spec.VolumeClaimTemplates = []core.PersistentVolumeClaim{
128151
{
@@ -141,19 +164,35 @@ func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Reko
141164
},
142165
},
143166
}
167+
144168
return nil
145169
}
146170
}
147171

148-
func (i statefulSetAction) ensureInitContainer(rekorServerHost string) func(*v1.StatefulSet) error {
172+
func (i statefulSetAction) ensureInitContainer(rekorServerHost string, tufHost string) func(*v1.StatefulSet) error {
149173
return func(ss *v1.StatefulSet) error {
150-
initContainer := kubernetes.FindInitContainerByNameOrCreate(&ss.Spec.Template.Spec, "wait-for-rekor-server")
174+
initContainer := kubernetes.FindInitContainerByNameOrCreate(&ss.Spec.Template.Spec, "tuf-init")
151175
initContainer.Image = images.Registry.Get(images.RekorMonitor)
152-
176+
volumeMount := kubernetes.FindVolumeMountByNameOrCreate(initContainer, storageVolumeName)
177+
volumeMount.MountPath = mountPath
153178
initContainer.Command = []string{
154179
"/bin/sh",
155180
"-c",
156-
fmt.Sprintf(`until curl -sf %s > /dev/null 2>&1; do echo 'Waiting for rekor-server to be ready...'; sleep 5; done`, rekorServerHost),
181+
fmt.Sprintf(`
182+
echo "Waiting for rekor-server...";
183+
until curl -sf %s > /dev/null 2>&1; do
184+
echo "rekor-server not ready...";
185+
sleep 5;
186+
done;
187+
echo "Waiting for TUF server...";
188+
until curl %s > /dev/null 2>&1; do
189+
echo "TUF server not ready...";
190+
sleep 5;
191+
done;
192+
echo "Downloading root.json";
193+
curl %s/root.json > %s/root.json
194+
echo "tuf-init completed."
195+
`, rekorServerHost, tufHost, tufHost, mountPath),
157196
}
158197

159198
return nil

test/e2e/rekor_monitor_log_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,8 @@ var _ = Describe("Rekor Monitor Log", Ordered, func() {
254254
g.Expect(err).ToNot(HaveOccurred())
255255
g.Expect(strings.Contains(logContent, "Root hash consistency verified")).To(BeFalse(),
256256
fmt.Sprintf("Expected 'Root hash consistency verified' NOT to be in logs, but got: %s", logContent))
257-
g.Expect(strings.Contains(logContent, "empty log")).To(BeTrue(),
258-
fmt.Sprintf("Expected 'empty log' to be in logs, but got: %s", logContent))
257+
g.Expect(strings.Contains(logContent, "skipping write of checkpoint: size is 0")).To(BeTrue(),
258+
fmt.Sprintf("Expected 'skipping write of checkpoint: size is 0' to be in logs, but got: %s", logContent))
259259
}, 30*time.Second, 1*time.Second).Should(Succeed(),
260260
"Monitor log should be empty and not contain root hash consistency verification")
261261
})

test/e2e/rekor_monitor_test.go

Lines changed: 14 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,13 @@ import (
1414
"github.com/securesign/operator/internal/labels"
1515
"github.com/securesign/operator/test/e2e/support"
1616
"github.com/securesign/operator/test/e2e/support/steps"
17-
rekorSupport "github.com/securesign/operator/test/e2e/support/tas/rekor"
18-
"github.com/securesign/operator/test/e2e/support/tas/trillian"
17+
"github.com/securesign/operator/test/e2e/support/tas"
18+
"github.com/securesign/operator/test/e2e/support/tas/securesign"
1919
appsv1 "k8s.io/api/apps/v1"
2020
v1 "k8s.io/api/core/v1"
2121
"k8s.io/apimachinery/pkg/api/meta"
2222
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2323
"k8s.io/apimachinery/pkg/types"
24-
"k8s.io/utils/ptr"
2524
ctrl "sigs.k8s.io/controller-runtime/pkg/client"
2625
)
2726

@@ -30,58 +29,30 @@ var _ = Describe("Rekor Monitor", Ordered, func() {
3029

3130
var (
3231
namespace *v1.Namespace
33-
trillianCR *v1alpha1.Trillian
34-
rekorCR *v1alpha1.Rekor
3532
rekorMonitorPod v1.Pod
3633
rekorMonitorContainer v1.Container
34+
s *v1alpha1.Securesign
3735
)
3836

3937
BeforeAll(steps.CreateNamespace(cli, func(new *v1.Namespace) {
4038
namespace = new
4139
}))
4240

4341
BeforeAll(func(ctx SpecContext) {
44-
trillianCR = &v1alpha1.Trillian{
45-
ObjectMeta: metav1.ObjectMeta{
46-
Name: "test-trillian",
47-
Namespace: namespace.Name,
42+
s = securesign.Create(namespace.Name, "test",
43+
securesign.WithDefaults(),
44+
securesign.WithMonitoring(),
45+
func(v *v1alpha1.Securesign) {
46+
v.Spec.Rekor.Monitoring.TLog.Enabled = true
47+
v.Spec.Rekor.Monitoring.TLog.Interval = metav1.Duration{Duration: time.Second * 10}
4848
},
49-
Spec: v1alpha1.TrillianSpec{
50-
Db: v1alpha1.TrillianDB{Create: ptr.To(true)},
51-
},
52-
}
53-
Expect(cli.Create(ctx, trillianCR)).To(Succeed())
54-
55-
By("Waiting for Trillian to be ready")
56-
trillian.Verify(ctx, cli, namespace.Name, trillianCR.Name, true)
49+
)
5750
})
5851

5952
BeforeAll(func(ctx SpecContext) {
60-
rekorCR = &v1alpha1.Rekor{
61-
ObjectMeta: metav1.ObjectMeta{
62-
Name: "test-rekor-monitor",
63-
Namespace: namespace.Name,
64-
},
65-
Spec: v1alpha1.RekorSpec{
66-
Monitoring: v1alpha1.MonitoringWithTLogConfig{
67-
MonitoringConfig: v1alpha1.MonitoringConfig{
68-
Enabled: true,
69-
},
70-
TLog: v1alpha1.TlogMonitoring{
71-
Enabled: true,
72-
Interval: metav1.Duration{Duration: time.Minute * 10},
73-
},
74-
},
75-
Trillian: v1alpha1.TrillianService{
76-
Address: fmt.Sprintf("trillian-logserver.%s.svc.cluster.local", namespace.Name),
77-
Port: ptr.To(int32(8091)),
78-
},
79-
},
80-
}
81-
Expect(cli.Create(ctx, rekorCR)).To(Succeed())
82-
83-
By("Waiting for Rekor to be ready")
84-
rekorSupport.Verify(ctx, cli, namespace.Name, rekorCR.Name, true)
53+
Expect(cli.Create(ctx, s)).To(Succeed())
54+
By("Waiting for all TAS components to be ready")
55+
tas.VerifyAllComponents(ctx, cli, s, true)
8556
})
8657

8758
Describe("Monitor Pod Deployment", func() {
@@ -123,7 +94,7 @@ var _ = Describe("Rekor Monitor", Ordered, func() {
12394
updated := &v1alpha1.Rekor{}
12495
err := cli.Get(ctx, types.NamespacedName{
12596
Namespace: namespace.Name,
126-
Name: rekorCR.Name,
97+
Name: s.Name,
12798
}, updated)
12899
g.Expect(err).ToNot(HaveOccurred())
129100

0 commit comments

Comments
 (0)