Skip to content

Commit 0da1a3b

Browse files
Fix health check fails when x509 files aren't configured (#263)
* Fix health check fails when x509 files or JWT bundle isn't configured Signed-off-by: Keegan Witt <keeganwitt@gmail.com> * Omit status rather than "unconfigured" Signed-off-by: Keegan Witt <keeganwitt@gmail.com> * Lint fixes Signed-off-by: Keegan Witt <keeganwitt@gmail.com> * Cleanup Signed-off-by: Faisal Memon <fymemon@yahoo.com> * Avoid shadowing import Signed-off-by: Keegan Witt <keeganwitt@gmail.com> * Add logic checking which SVIDs are configured Signed-off-by: Keegan Witt <keeganwitt@gmail.com> --------- Signed-off-by: Keegan Witt <keeganwitt@gmail.com> Signed-off-by: Faisal Memon <fymemon@yahoo.com> Co-authored-by: Faisal Memon <fymemon@yahoo.com>
1 parent 4adfc45 commit 0da1a3b

File tree

2 files changed

+110
-14
lines changed

2 files changed

+110
-14
lines changed

pkg/sidecar/sidecar.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ type Health struct {
4242
}
4343

4444
type FileWriteStatuses struct {
45-
X509WriteStatus string `json:"x509_write_status"`
45+
X509WriteStatus *string `json:"x509_write_status,omitempty"`
4646
JWTWriteStatus map[string]string `json:"jwt_write_status"`
4747
}
4848

@@ -59,20 +59,29 @@ func New(config *Config) *Sidecar {
5959
certReadyChan: make(chan struct{}, 1),
6060
health: Health{
6161
FileWriteStatuses: FileWriteStatuses{
62-
X509WriteStatus: writeStatusUnwritten,
63-
JWTWriteStatus: make(map[string]string),
62+
JWTWriteStatus: make(map[string]string),
6463
},
6564
},
6665
}
67-
for _, jwtConfig := range config.JWTSVIDs {
68-
jwtSVIDFilename := path.Join(config.CertDir, jwtConfig.JWTSVIDFilename)
69-
sidecar.health.FileWriteStatuses.JWTWriteStatus[jwtSVIDFilename] = writeStatusUnwritten
70-
}
71-
jwtBundleFilePath := path.Join(config.CertDir, config.JWTBundleFilename)
72-
sidecar.health.FileWriteStatuses.JWTWriteStatus[jwtBundleFilePath] = writeStatusUnwritten
66+
sidecar.setupHealth()
7367
return sidecar
7468
}
7569

70+
func (s *Sidecar) setupHealth() {
71+
if s.x509Enabled() {
72+
writeStatus := writeStatusUnwritten
73+
s.health.FileWriteStatuses.X509WriteStatus = &writeStatus
74+
}
75+
if s.jwtBundleEnabled() {
76+
jwtBundleFilePath := path.Join(s.config.CertDir, s.config.JWTBundleFilename)
77+
s.health.FileWriteStatuses.JWTWriteStatus[jwtBundleFilePath] = writeStatusUnwritten
78+
}
79+
for _, jwtConfig := range s.config.JWTSVIDs {
80+
jwtSVIDFilename := path.Join(s.config.CertDir, jwtConfig.JWTSVIDFilename)
81+
s.health.FileWriteStatuses.JWTWriteStatus[jwtSVIDFilename] = writeStatusUnwritten
82+
}
83+
}
84+
7685
// RunDaemon starts the main loop
7786
// Starts the workload API client to listen for new SVID updates
7887
// When a new SVID is received on the updateChan, the SVID certificates
@@ -184,10 +193,12 @@ func (s *Sidecar) updateCertificates(svidResponse *workloadapi.X509Context) {
184193
s.config.Log.Debug("Updating X.509 certificates")
185194
if err := disk.WriteX509Context(svidResponse, s.config.AddIntermediatesToBundle, s.config.IncludeFederatedDomains, s.config.CertDir, s.config.SVIDFileName, s.config.SVIDKeyFileName, s.config.SVIDBundleFileName, s.config.CertFileMode, s.config.KeyFileMode, s.config.Hint); err != nil {
186195
s.config.Log.WithError(err).Error("Unable to dump bundle")
187-
s.health.FileWriteStatuses.X509WriteStatus = writeStatusFailed
196+
writeStatus := writeStatusFailed
197+
s.health.FileWriteStatuses.X509WriteStatus = &writeStatus
188198
return
189199
}
190-
s.health.FileWriteStatuses.X509WriteStatus = writeStatusWritten
200+
writeStatus := writeStatusWritten
201+
s.health.FileWriteStatuses.X509WriteStatus = &writeStatus
191202
s.config.Log.Info("X.509 certificates updated")
192203

193204
if s.config.Cmd != "" {
@@ -460,7 +471,10 @@ func (s *Sidecar) CheckLiveness() bool {
460471
return false
461472
}
462473
}
463-
return s.health.FileWriteStatuses.X509WriteStatus != writeStatusFailed
474+
if s.x509Enabled() && *s.health.FileWriteStatuses.X509WriteStatus == writeStatusFailed {
475+
return false
476+
}
477+
return true
464478
}
465479

466480
func (s *Sidecar) CheckReadiness() bool {
@@ -469,7 +483,7 @@ func (s *Sidecar) CheckReadiness() bool {
469483
return false
470484
}
471485
}
472-
return s.health.FileWriteStatuses.X509WriteStatus != writeStatusWritten
486+
return !s.x509Enabled() || *s.health.FileWriteStatuses.X509WriteStatus == writeStatusWritten
473487
}
474488

475489
func (s *Sidecar) GetHealth() Health {

pkg/sidecar/sidecar_test.go

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func TestSidecar_RunDaemon(t *testing.T) {
9696
certReadyChan: make(chan struct{}, 1),
9797
health: Health{
9898
FileWriteStatuses: FileWriteStatuses{
99-
X509WriteStatus: writeStatusUnwritten,
99+
X509WriteStatus: nil,
100100
JWTWriteStatus: make(map[string]string),
101101
},
102102
},
@@ -354,3 +354,85 @@ func TestSignalProcess(t *testing.T) {
354354
require.NoError(t, err)
355355
require.Equal(t, 1, len(files))
356356
}
357+
358+
func TestNew(t *testing.T) {
359+
log, _ := test.NewNullLogger()
360+
tmpdir := t.TempDir()
361+
unwrittenStatus := writeStatusUnwritten
362+
cases := []struct {
363+
certDir string
364+
svidFileName string
365+
svidKeyFileName string
366+
svidBundleFileName string
367+
jwtBundleFilename string
368+
jwtSVIDs []JWTConfig
369+
expectedErr string
370+
expectedFileWriteStatuses FileWriteStatuses
371+
}{
372+
{
373+
certDir: tmpdir,
374+
svidFileName: "svid.pem",
375+
svidKeyFileName: "svid_key.pem",
376+
svidBundleFileName: "svid_bundle.pem",
377+
jwtBundleFilename: "jwt_bundle.json",
378+
jwtSVIDs: []JWTConfig{
379+
{
380+
JWTAudience: "my-audience",
381+
JWTSVIDFilename: "jwt_svid.jwt",
382+
},
383+
},
384+
expectedFileWriteStatuses: FileWriteStatuses{
385+
X509WriteStatus: &unwrittenStatus,
386+
JWTWriteStatus: map[string]string{
387+
path.Join(tmpdir, "jwt_bundle.json"): writeStatusUnwritten,
388+
path.Join(tmpdir, "jwt_svid.jwt"): writeStatusUnwritten,
389+
},
390+
},
391+
},
392+
{
393+
jwtSVIDs: []JWTConfig{
394+
{
395+
JWTAudience: "my-audience",
396+
JWTSVIDFilename: "jwt_svid.jwt",
397+
},
398+
},
399+
expectedFileWriteStatuses: FileWriteStatuses{
400+
X509WriteStatus: nil,
401+
JWTWriteStatus: map[string]string{
402+
path.Join(tmpdir, "jwt_svid.jwt"): writeStatusUnwritten,
403+
},
404+
},
405+
},
406+
}
407+
408+
for _, c := range cases {
409+
c := c
410+
t.Run("New Sidecar", func(t *testing.T) {
411+
config := &Config{
412+
CertDir: tmpdir,
413+
SVIDFileName: c.svidFileName,
414+
SVIDKeyFileName: c.svidKeyFileName,
415+
SVIDBundleFileName: c.svidBundleFileName,
416+
JWTBundleFilename: c.jwtBundleFilename,
417+
JWTSVIDs: c.jwtSVIDs,
418+
Log: log,
419+
}
420+
sidecar := New(config)
421+
assert.NotNil(t, sidecar)
422+
assert.Equal(t, config, sidecar.config)
423+
assert.Equal(t, c.expectedFileWriteStatuses, sidecar.health.FileWriteStatuses)
424+
})
425+
}
426+
}
427+
428+
func Test_CheckReadiness(t *testing.T) {
429+
sidecar := Sidecar{
430+
config: &Config{},
431+
health: Health{
432+
FileWriteStatuses: FileWriteStatuses{
433+
X509WriteStatus: nil,
434+
},
435+
},
436+
}
437+
assert.True(t, sidecar.CheckReadiness())
438+
}

0 commit comments

Comments
 (0)