Skip to content

Commit 5094224

Browse files
committed
create TUF PVC configMap and use it in Rekor monitor statefulSet
1 parent b5dd67a commit 5094224

File tree

9 files changed

+157
-23
lines changed

9 files changed

+157
-23
lines changed

api/v1alpha1/tuf_types.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ type TufKey struct {
7676
type TufStatus struct {
7777
Keys []TufKey `json:"keys,omitempty"`
7878
PvcName string `json:"pvcName,omitempty"`
79-
Url string `json:"url,omitempty"`
79+
// Reference to the ConfigMap created by TUF that stores the PVC name for other components to use.
80+
PvcConfig *LocalObjectReference `json:"pvcConfig,omitempty"`
81+
Url string `json:"url,omitempty"`
8082
// +listType=map
8183
// +listMapKey=type
8284
// +patchStrategy=merge

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,6 +1315,19 @@ spec:
13151315
- name
13161316
type: object
13171317
type: array
1318+
pvcConfig:
1319+
description: Reference to the ConfigMap created by TUF that stores
1320+
the PVC name for other components to use.
1321+
properties:
1322+
name:
1323+
description: |-
1324+
Name of the referent.
1325+
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
1326+
type: string
1327+
required:
1328+
- name
1329+
type: object
1330+
x-kubernetes-map-type: atomic
13181331
pvcName:
13191332
type: string
13201333
url:

config/default/images.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ RELATED_IMAGE_HTTP_SERVER=registry.redhat.io/ubi9/httpd-24@sha256:86a1a8b0d12c31
1414
RELATED_IMAGE_SEGMENT_REPORTING=registry.redhat.io/rhtas/segment-reporting-rhel9@sha256:e1790a0cac5eadef484e10d8f3f7ef6af9bdfabec4ab9fcc35c5ebd42b0205b3
1515
RELATED_IMAGE_TIMESTAMP_AUTHORITY=registry.redhat.io/rhtas/timestamp-authority-rhel9@sha256:be623422f3f636c39397a66416b02a79f1d59cf593ca258e1701d1728755dde9
1616
RELATED_IMAGE_CLIENT_SERVER=registry.redhat.io/rhtas/client-server-rhel9@sha256:f95046aba6fee4259df560bc1e69e83063b7a9b67e63efe43d4a46580b1809ae
17-
RELATED_IMAGE_REKOR_MONITOR=registry.redhat.io/rhtas/rekor-monitor-rhel9@sha256:1944eff9f103d84380b9efac6adec9cb22613643968e51f07db58df977b6b982
17+
RELATED_IMAGE_REKOR_MONITOR=registry.redhat.io/rhtas/rekor-monitor-rhel9@sha256:b7f9f8b24fe7db4e124f9e5e9289bc2d180a810e253f48feb7e1177bbef6d4d0

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/google/uuid v1.6.0
1414
github.com/onsi/ginkgo/v2 v2.23.4
1515
github.com/onsi/gomega v1.37.0
16-
github.com/openshift/api v0.0.0-20251023193535-8691c3014652
16+
github.com/openshift/api v0.0.0-20251016080153-44baf885fd37
1717
github.com/operator-framework/api v0.35.0
1818
github.com/operator-framework/operator-lib v0.19.0
1919
github.com/robfig/cron/v3 v3.0.1
@@ -31,7 +31,7 @@ require (
3131
require (
3232
github.com/beorn7/perks v1.0.1 // indirect
3333
github.com/cespare/xxhash/v2 v2.3.0 // indirect
34-
github.com/containerd/stargz-snapshotter/estargz v0.18.0 // indirect
34+
github.com/containerd/stargz-snapshotter/estargz v0.17.0 // indirect
3535
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
3636
github.com/docker/cli v28.2.2+incompatible // indirect
3737
github.com/docker/distribution v2.8.3+incompatible // indirect
@@ -62,7 +62,7 @@ require (
6262
github.com/google/pprof v0.0.0-20251007162407-5df77e3f7d1d // indirect
6363
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
6464
github.com/json-iterator/go v1.1.12 // indirect
65-
github.com/klauspost/compress v1.18.1 // indirect
65+
github.com/klauspost/compress v1.18.0 // indirect
6666
github.com/mitchellh/go-homedir v1.1.0 // indirect
6767
github.com/moby/spdystream v0.5.0 // indirect
6868
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
@@ -76,7 +76,7 @@ require (
7676
github.com/prometheus/client_golang v1.23.2 // indirect
7777
github.com/prometheus/client_model v0.6.2 // indirect
7878
github.com/prometheus/common v0.67.1 // indirect
79-
github.com/prometheus/procfs v0.19.1 // indirect
79+
github.com/prometheus/procfs v0.17.0 // indirect
8080
github.com/sirupsen/logrus v1.9.3 // indirect
8181
github.com/spf13/pflag v1.0.10 // indirect
8282
github.com/vbatts/tar-split v0.12.2 // indirect

go.sum

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM
66
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
77
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
88
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
9-
github.com/containerd/stargz-snapshotter/estargz v0.18.0 h1:Ny5yptQgEXSkDFKvlKJGTvf1YJ+4xD8V+hXqoRG0n74=
10-
github.com/containerd/stargz-snapshotter/estargz v0.18.0/go.mod h1:7hfU1BO2KB3axZl0dRQCdnHrIWw7TRDdK6L44Rdeuo0=
9+
github.com/containerd/stargz-snapshotter/estargz v0.17.0 h1:+TyQIsR/zSFI1Rm31EQBwpAA1ovYgIKHy7kctL3sLcE=
10+
github.com/containerd/stargz-snapshotter/estargz v0.17.0/go.mod h1:s06tWAiJcXQo9/8AReBCIo/QxcXFZ2n4qfsRnpl71SM=
1111
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1212
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1313
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -91,8 +91,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
9191
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
9292
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
9393
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
94-
github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co=
95-
github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0=
94+
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
95+
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
9696
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
9797
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
9898
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -121,8 +121,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
121121
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
122122
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
123123
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
124-
github.com/openshift/api v0.0.0-20251023193535-8691c3014652 h1:iFo7XEz9/q6qxZey/MCCBTqCC88DXbtUz7mUWtGkQzg=
125-
github.com/openshift/api v0.0.0-20251023193535-8691c3014652/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY=
124+
github.com/openshift/api v0.0.0-20251016080153-44baf885fd37 h1:LuZb5xyKz8PZXqV80NOLfda9DDLdax/XNjqc2pL4Efg=
125+
github.com/openshift/api v0.0.0-20251016080153-44baf885fd37/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY=
126126
github.com/operator-framework/api v0.35.0 h1:xKrffuGEagk3CWy6zqdK5YmIErlBtWUblNNK+q7ld7c=
127127
github.com/operator-framework/api v0.35.0/go.mod h1:A9UNu/pdcO1RauMHvV54unp4DNm/Y5fMVbGDpnIIF+M=
128128
github.com/operator-framework/operator-lib v0.19.0 h1:az6ogYj21rtU0SF9uYctRLyKp2dtlqTsmpfehFy6Ce8=
@@ -140,8 +140,8 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw
140140
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
141141
github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI=
142142
github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q=
143-
github.com/prometheus/procfs v0.19.1 h1:QVtROpTkphuXuNlnCv3m1ut3JytkXHtQ3xvck/YmzMM=
144-
github.com/prometheus/procfs v0.19.1/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
143+
github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=
144+
github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=
145145
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
146146
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
147147
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=

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

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ 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"
15+
tufConstants "github.com/securesign/operator/internal/controller/tuf/constants"
1416
"github.com/securesign/operator/internal/labels"
1517
cutils "github.com/securesign/operator/internal/utils"
1618
"github.com/securesign/operator/internal/utils/kubernetes"
@@ -20,12 +22,12 @@ import (
2022
"k8s.io/apimachinery/pkg/api/meta"
2123
"k8s.io/apimachinery/pkg/api/resource"
2224
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+
"k8s.io/apimachinery/pkg/types"
2326
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
24-
25-
rhtasv1alpha1 "github.com/securesign/operator/api/v1alpha1"
2627
)
2728

2829
const storageVolumeName = "monitor-storage"
30+
const tufRepoVolumeName = "tuf-repository"
2931

3032
func NewStatefulSetAction() action.Action[*rhtasv1alpha1.Rekor] {
3133
return &statefulSetAction{}
@@ -51,6 +53,7 @@ func (i statefulSetAction) Handle(ctx context.Context, instance *rhtasv1alpha1.R
5153
)
5254

5355
rekorServerHost := fmt.Sprintf("http://%s.%s.svc", actions.ServerComponentName, instance.Namespace)
56+
tufServerHost := fmt.Sprintf("http://%s.%s.svc", "tuf", instance.Namespace)
5457

5558
labels := labels.For(actions.MonitorComponentName, actions.MonitorStatefulSetName, instance.Name)
5659
if result, err = kubernetes.CreateOrUpdate(ctx, i.Client,
@@ -60,8 +63,8 @@ func (i statefulSetAction) Handle(ctx context.Context, instance *rhtasv1alpha1.R
6063
Namespace: instance.Namespace,
6164
},
6265
},
63-
i.ensureMonitorStatefulSet(instance, actions.RBACName, labels, rekorServerHost),
64-
i.ensureInitContainer(rekorServerHost),
66+
i.ensureMonitorStatefulSet(ctx, instance, actions.RBACName, labels, rekorServerHost, tufServerHost),
67+
i.ensureInitContainer(tufServerHost),
6568
ensure.ControllerReference[*v1.StatefulSet](instance, i.Client),
6669
ensure.Labels[*v1.StatefulSet](slices.Collect(maps.Keys(labels)), labels),
6770
func(object *v1.StatefulSet) error {
@@ -90,7 +93,7 @@ func (i statefulSetAction) Handle(ctx context.Context, instance *rhtasv1alpha1.R
9093
return i.Continue()
9194
}
9295

93-
func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Rekor, sa string, labels map[string]string, rekorServerHost string) func(*v1.StatefulSet) error {
96+
func (i statefulSetAction) ensureMonitorStatefulSet(ctx context.Context, instance *rhtasv1alpha1.Rekor, sa string, labels map[string]string, rekorServerHost string, tufServerHost string) func(*v1.StatefulSet) error {
9497
return func(ss *v1.StatefulSet) error {
9598

9699
spec := &ss.Spec
@@ -110,7 +113,13 @@ func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Reko
110113
container.Command = []string{
111114
"/bin/sh",
112115
"-c",
113-
fmt.Sprintf(`/rekor_monitor --file=/data/checkpoint_log.txt --once=false --interval=%s --url=%s`, interval.String(), rekorServerHost),
116+
fmt.Sprintf(`
117+
/rekor_monitor --file=/data/checkpoint_log.txt \
118+
--once=false \
119+
--interval=%s \
120+
--url=%s \
121+
--tuf-repository=%s \
122+
--tuf-root-path="/tuf-repository/root.json"`, interval.String(), rekorServerHost, tufServerHost),
114123
}
115124

116125
container.Ports = []core.ContainerPort{
@@ -141,19 +150,44 @@ func (i statefulSetAction) ensureMonitorStatefulSet(instance *rhtasv1alpha1.Reko
141150
},
142151
},
143152
}
153+
154+
var cm core.ConfigMap
155+
if err := i.Client.Get(ctx, types.NamespacedName{
156+
Namespace: instance.Namespace,
157+
Name: tufConstants.TufPvcConfigName,
158+
}, &cm); err != nil {
159+
i.Logger.Info("TUF PVC ConfigMap not yet available, waiting...", "name", tufConstants.TufPvcConfigName)
160+
return i.Requeue().Err
161+
}
162+
pvcName, ok := cm.Data["pvcName"]
163+
if !ok || pvcName == "" {
164+
return fmt.Errorf("PVC name not found in ConfigMap %q", tufConstants.TufPvcConfigName)
165+
}
166+
167+
tufRepositoryVolume := kubernetes.FindVolumeByNameOrCreate(&template.Spec, tufRepoVolumeName)
168+
if tufRepositoryVolume.PersistentVolumeClaim == nil {
169+
tufRepositoryVolume.PersistentVolumeClaim = &core.PersistentVolumeClaimVolumeSource{}
170+
}
171+
tufRepositoryVolume.PersistentVolumeClaim.ClaimName = pvcName
172+
tufRepositoryVolume.PersistentVolumeClaim.ReadOnly = true
173+
174+
tufVolumeMount := kubernetes.FindVolumeMountByNameOrCreate(container, tufRepoVolumeName)
175+
tufVolumeMount.MountPath = "/tuf-repository"
176+
tufVolumeMount.ReadOnly = true
177+
144178
return nil
145179
}
146180
}
147181

148-
func (i statefulSetAction) ensureInitContainer(rekorServerHost string) func(*v1.StatefulSet) error {
182+
func (i statefulSetAction) ensureInitContainer(tufHost string) func(*v1.StatefulSet) error {
149183
return func(ss *v1.StatefulSet) error {
150-
initContainer := kubernetes.FindInitContainerByNameOrCreate(&ss.Spec.Template.Spec, "wait-for-rekor-server")
184+
initContainer := kubernetes.FindInitContainerByNameOrCreate(&ss.Spec.Template.Spec, "wait-for-tuf")
151185
initContainer.Image = images.Registry.Get(images.RekorMonitor)
152186

153187
initContainer.Command = []string{
154188
"/bin/sh",
155189
"-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),
190+
fmt.Sprintf(`until curl %s > /dev/null 2>&1; do echo 'Waiting for tuf to be ready...'; sleep 5; done`, tufHost),
157191
}
158192

159193
return nil
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package actions
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
rhtasv1alpha1 "github.com/securesign/operator/api/v1alpha1"
8+
"github.com/securesign/operator/internal/action"
9+
"github.com/securesign/operator/internal/constants"
10+
tufConstants "github.com/securesign/operator/internal/controller/tuf/constants"
11+
"github.com/securesign/operator/internal/utils/kubernetes"
12+
"github.com/securesign/operator/internal/utils/kubernetes/ensure"
13+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
14+
15+
corev1 "k8s.io/api/core/v1"
16+
"k8s.io/apimachinery/pkg/api/meta"
17+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
18+
)
19+
20+
func NewPvcConfigAction() action.Action[*rhtasv1alpha1.Tuf] {
21+
return &pvcConfigAction{}
22+
}
23+
24+
type pvcConfigAction struct {
25+
action.BaseAction
26+
}
27+
28+
func (a pvcConfigAction) Name() string {
29+
return "ensure TUF PVC ConfigMap"
30+
}
31+
32+
func (a pvcConfigAction) CanHandle(ctx context.Context, instance *rhtasv1alpha1.Tuf) bool {
33+
if instance.Status.PvcName == "" {
34+
return false
35+
}
36+
37+
c := meta.FindStatusCondition(instance.Status.Conditions, constants.Ready)
38+
if c == nil {
39+
return false
40+
}
41+
42+
return c.Reason == constants.Creating || c.Reason == constants.Ready
43+
}
44+
45+
func (i pvcConfigAction) Handle(ctx context.Context, instance *rhtasv1alpha1.Tuf) *action.Result {
46+
var (
47+
err error
48+
result controllerutil.OperationResult
49+
)
50+
51+
configMap := &corev1.ConfigMap{
52+
ObjectMeta: metav1.ObjectMeta{
53+
Name: tufConstants.TufPvcConfigName,
54+
Namespace: instance.Namespace,
55+
},
56+
}
57+
58+
data := map[string]string{
59+
"pvcName": instance.Status.PvcName,
60+
}
61+
62+
if result, err = kubernetes.CreateOrUpdate(ctx, i.Client,
63+
configMap,
64+
ensure.ControllerReference[*corev1.ConfigMap](instance, i.Client),
65+
kubernetes.EnsureConfigMapData(true, data),
66+
); err != nil {
67+
return i.Error(ctx, fmt.Errorf("could not create TUF PVC config: %w", err), instance)
68+
}
69+
70+
i.Logger.Info("TUF PVC ConfigMap ensured", "name", configMap.Name, "pvcName", instance.Status.PvcName)
71+
72+
if result != controllerutil.OperationResultNone {
73+
meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{
74+
Type: constants.Ready,
75+
Status: metav1.ConditionFalse,
76+
Reason: constants.Creating,
77+
Message: "TUF PVC Config created",
78+
})
79+
_ = i.StatusUpdate(ctx, instance)
80+
}
81+
return i.Continue()
82+
83+
}

internal/controller/tuf/constants/constants.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ const (
1111
ContainerName = "tuf-server"
1212
VolumeName = "repository"
1313
RepositoryCondition = "repository"
14+
TufPvcConfigName = "tuf-pvc-config"
1415
)

internal/controller/tuf/tuf_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ func (r *tufReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
109109
actions.NewCreatePvcAction(),
110110
actions.NewInitJobAction(),
111111
actions.NewDeployAction(),
112+
actions.NewPvcConfigAction(),
112113
actions.NewServiceAction(),
113114
actions.NewIngressAction(),
114115
actions.NewStatusUrlAction(),

0 commit comments

Comments
 (0)