Skip to content

Commit fc6b6ba

Browse files
Rotate only if enable-secret-rotation=true
1 parent 299d025 commit fc6b6ba

File tree

5 files changed

+48
-22
lines changed

5 files changed

+48
-22
lines changed

cmd/secrets-store-csi-driver/main.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ var (
5757
// https://github.com/kubernetes-sigs/secrets-store-csi-driver/issues/823.
5858
additionalProviderPaths = flag.String("additional-provider-volume-paths", "/etc/kubernetes/secrets-store-csi-providers", "Comma separated list of additional paths to communicate with providers")
5959
metricsAddr = flag.String("metrics-addr", ":8095", "The address the metric endpoint binds to")
60-
enableSecretRotation = flag.Bool("enable-secret-rotation", false, "[Deprecated] Enable secret rotation feature [alpha]")
61-
_ = flag.Duration("rotation-poll-interval", 2*time.Minute, "[Deprecated] Secret rotation poll interval duration")
60+
enableSecretRotation = flag.Bool("enable-secret-rotation", false, "Enable secret rotation feature [alpha]")
61+
rotationPollInterval = flag.Duration("rotation-poll-interval", 2*time.Minute, "Secret rotation poll interval duration")
6262
enableProfile = flag.Bool("enable-pprof", false, "enable pprof profiling")
6363
profilePort = flag.Int("pprof-port", 6065, "port for pprof profiling")
6464
maxCallRecvMsgSize = flag.Int("max-call-recv-msg-size", 1024*1024*4, "maximum size in bytes of gRPC response from plugins")
@@ -200,12 +200,7 @@ func mainErr() error {
200200
reconciler.RunPatcher(ctx)
201201
}()
202202

203-
// Secret rotation
204-
if *enableSecretRotation {
205-
klog.Warning("--enable-secret-rotation and --rotation-poll-interval are deprecated, use RequiresRepublish instead.")
206-
}
207-
208-
driver := secretsstore.NewSecretsStoreDriver(*driverName, *nodeID, *endpoint, providerClients, mgr.GetClient(), mgr.GetAPIReader())
203+
driver := secretsstore.NewSecretsStoreDriver(*driverName, *nodeID, *endpoint, providerClients, mgr.GetClient(), mgr.GetAPIReader(), *enableSecretRotation, *rotationPollInterval)
209204
driver.Run(ctx)
210205

211206
return nil

pkg/secrets-store/nodeserver.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type nodeServer struct {
4444
// This should be used sparingly and only when the client does not fit the use case.
4545
reader client.Reader
4646
providerClients *PluginClientBuilder
47+
rotationConfig *RotationConfig
4748
}
4849

4950
const (
@@ -73,6 +74,16 @@ func (ns *nodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis
7374
var targetPath string
7475
var mounted bool
7576
errorReason := internalerrors.FailedToMount
77+
rotationEnabled := ns.rotationConfig.enabled
78+
79+
if ns.rotationConfig.enabled {
80+
rotationEnabled = true
81+
if ns.rotationConfig.nextRotationTime.After(startTime) {
82+
klog.InfoS("Too soon !!!!, will rotate secret after", ns.rotationConfig.nextRotationTime)
83+
return &csi.NodePublishVolumeResponse{}, nil
84+
}
85+
ns.rotationConfig.nextRotationTime = ns.rotationConfig.nextRotationTime.Add(ns.rotationConfig.interval)
86+
}
7687

7788
defer func() {
7889
if err != nil {
@@ -130,10 +141,10 @@ func (ns *nodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis
130141
return nil, status.Errorf(codes.Internal, "failed to check if target path %s is mount point, err: %v", targetPath, err)
131142
}
132143
}
133-
// if mounted {
134-
// klog.InfoS("target path is already mounted", "targetPath", targetPath, "pod", klog.ObjectRef{Namespace: podNamespace, Name: podName})
135-
// return &csi.NodePublishVolumeResponse{}, nil
136-
// }
144+
if !rotationEnabled && mounted {
145+
klog.InfoS("target path is already mounted", "targetPath", targetPath, "pod", klog.ObjectRef{Namespace: podNamespace, Name: podName})
146+
return &csi.NodePublishVolumeResponse{}, nil
147+
}
137148

138149
klog.V(2).InfoS("node publish volume", "target", targetPath, "volumeId", volumeID, "mount flags", mountFlags)
139150

pkg/secrets-store/nodeserver_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import (
3737
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3838
)
3939

40-
func testNodeServer(t *testing.T, client client.Client, reporter StatsReporter) (*nodeServer, error) {
40+
func testNodeServer(t *testing.T, client client.Client, reporter StatsReporter, rotationConfig *RotationConfig) (*nodeServer, error) {
4141
t.Helper()
4242

4343
// Create a mock provider named "provider1".
@@ -53,7 +53,7 @@ func testNodeServer(t *testing.T, client client.Client, reporter StatsReporter)
5353
t.Cleanup(server.Stop)
5454

5555
providerClients := NewPluginClientBuilder([]string{socketPath})
56-
return newNodeServer("testnode", mount.NewFakeMounter([]mount.MountPoint{}), providerClients, client, client, reporter)
56+
return newNodeServer("testnode", mount.NewFakeMounter([]mount.MountPoint{}), providerClients, client, client, reporter, rotationConfig)
5757
}
5858

5959
func TestNodePublishVolume_Errors(t *testing.T) {
@@ -227,7 +227,7 @@ func TestNodePublishVolume_Errors(t *testing.T) {
227227
t.Run(test.name, func(t *testing.T) {
228228
r := mocks.NewFakeReporter()
229229

230-
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).WithObjects(test.initObjects...).Build(), r)
230+
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).WithObjects(test.initObjects...).Build(), r, &RotationConfig{})
231231
if err != nil {
232232
t.Fatalf("expected error to be nil, got: %+v", err)
233233
}
@@ -338,7 +338,7 @@ func TestNodePublishVolume(t *testing.T) {
338338
t.Run(test.name, func(t *testing.T) {
339339
r := mocks.NewFakeReporter()
340340

341-
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).WithObjects(test.initObjects...).Build(), r)
341+
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).WithObjects(test.initObjects...).Build(), r, &RotationConfig{})
342342
if err != nil {
343343
t.Fatalf("expected error to be nil, got: %+v", err)
344344
}
@@ -381,7 +381,7 @@ func TestNodeUnpublishVolume(t *testing.T) {
381381
)
382382

383383
r := mocks.NewFakeReporter()
384-
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).Build(), r)
384+
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).Build(), r, &RotationConfig{})
385385
if err != nil {
386386
t.Fatalf("expected error to be nil, got: %+v", err)
387387
}
@@ -460,7 +460,7 @@ func TestNodeUnpublishVolume_Error(t *testing.T) {
460460
for _, test := range tests {
461461
t.Run(test.name, func(t *testing.T) {
462462
r := mocks.NewFakeReporter()
463-
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).Build(), r)
463+
ns, err := testNodeServer(t, fake.NewClientBuilder().WithScheme(s).Build(), r, &RotationConfig{})
464464
if err != nil {
465465
t.Fatalf("expected error to be nil, got: %+v", err)
466466
}

pkg/secrets-store/secrets-store.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package secretsstore
1919
import (
2020
"context"
2121
"os"
22+
"time"
2223

2324
"sigs.k8s.io/secrets-store-csi-driver/pkg/version"
2425

@@ -37,18 +38,27 @@ type SecretsStore struct {
3738
ids *identityServer
3839
}
3940

41+
// RotationConfig stores the informarmation required to rotate the secrets.
42+
type RotationConfig struct {
43+
enabled bool
44+
interval time.Duration
45+
nextRotationTime time.Time
46+
}
47+
4048
func NewSecretsStoreDriver(driverName, nodeID, endpoint string,
4149
providerClients *PluginClientBuilder,
4250
client client.Client,
43-
reader client.Reader) *SecretsStore {
51+
reader client.Reader, rotationEnabled bool, interval time.Duration) *SecretsStore {
4452
klog.InfoS("Initializing Secrets Store CSI Driver", "driver", driverName, "version", version.BuildVersion, "buildTime", version.BuildTime)
4553

4654
sr, err := NewStatsReporter()
4755
if err != nil {
4856
klog.ErrorS(err, "failed to initialize stats reporter")
4957
os.Exit(1)
5058
}
51-
ns, err := newNodeServer(nodeID, mount.New(""), providerClients, client, reader, sr)
59+
60+
rc := NewRotationConfig(rotationEnabled, interval)
61+
ns, err := newNodeServer(nodeID, mount.New(""), providerClients, client, reader, sr, rc)
5262
if err != nil {
5363
klog.ErrorS(err, "failed to initialize node server")
5464
os.Exit(1)
@@ -67,17 +77,27 @@ func newNodeServer(nodeID string,
6777
providerClients *PluginClientBuilder,
6878
client client.Client,
6979
reader client.Reader,
70-
statsReporter StatsReporter) (*nodeServer, error) {
80+
statsReporter StatsReporter,
81+
rotationConfig *RotationConfig) (*nodeServer, error) {
7182
return &nodeServer{
7283
mounter: mounter,
7384
reporter: statsReporter,
7485
nodeID: nodeID,
7586
client: client,
7687
reader: reader,
7788
providerClients: providerClients,
89+
rotationConfig: rotationConfig,
7890
}, nil
7991
}
8092

93+
func NewRotationConfig(enabled bool, interval time.Duration) *RotationConfig {
94+
return &RotationConfig{
95+
enabled: enabled,
96+
interval: interval,
97+
nextRotationTime: time.Now(),
98+
}
99+
}
100+
81101
// Run starts the CSI plugin
82102
func (s *SecretsStore) Run(ctx context.Context) {
83103
server := NewNonBlockingGRPCServer()

test/sanity/sanity_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const (
3636
)
3737

3838
func TestSanity(t *testing.T) {
39-
driver := secretsstore.NewSecretsStoreDriver("secrets-store.csi.k8s.io", "somenodeid", endpoint, nil, nil, nil)
39+
driver := secretsstore.NewSecretsStoreDriver("secrets-store.csi.k8s.io", "somenodeid", endpoint, nil, nil, nil, false, time.Minute)
4040
go func() {
4141
driver.Run(context.Background())
4242
}()

0 commit comments

Comments
 (0)