Log when a hook timeout duration can't be parsed (#2610)

Signed-off-by: Nolan Brubaker <brubakern@vmware.com>
pull/2613/head
Nolan Brubaker 2020-06-05 15:45:50 -04:00 committed by GitHub
parent 1c80ba903e
commit d9d9dc60da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 6 deletions

View File

@ -0,0 +1 @@
When a timeout string can't be parsed, log the error as a warning instead of silently consuming the error.

View File

@ -83,10 +83,10 @@ func (h *defaultItemHookHandler) handleHooks(
name := metadata.GetName() name := metadata.GetName()
// If the pod has the hook specified via annotations, that takes priority. // If the pod has the hook specified via annotations, that takes priority.
hookFromAnnotations := getPodExecHookFromAnnotations(metadata.GetAnnotations(), phase) hookFromAnnotations := getPodExecHookFromAnnotations(metadata.GetAnnotations(), phase, log)
if phase == hookPhasePre && hookFromAnnotations == nil { if phase == hookPhasePre && hookFromAnnotations == nil {
// See if the pod has the legacy hook annotation keys (i.e. without a phase specified) // See if the pod has the legacy hook annotation keys (i.e. without a phase specified)
hookFromAnnotations = getPodExecHookFromAnnotations(metadata.GetAnnotations(), "") hookFromAnnotations = getPodExecHookFromAnnotations(metadata.GetAnnotations(), "", log)
} }
if hookFromAnnotations != nil { if hookFromAnnotations != nil {
hookLog := log.WithFields( hookLog := log.WithFields(
@ -164,7 +164,8 @@ func getHookAnnotation(annotations map[string]string, key string, phase hookPhas
// getPodExecHookFromAnnotations returns an ExecHook based on the annotations, as long as the // getPodExecHookFromAnnotations returns an ExecHook based on the annotations, as long as the
// 'command' annotation is present. If it is absent, this returns nil. // 'command' annotation is present. If it is absent, this returns nil.
func getPodExecHookFromAnnotations(annotations map[string]string, phase hookPhase) *api.ExecHook { // If there is an error in parsing a supplied timeout, it is logged.
func getPodExecHookFromAnnotations(annotations map[string]string, phase hookPhase, log logrus.FieldLogger) *api.ExecHook {
commandValue := getHookAnnotation(annotations, podBackupHookCommandAnnotationKey, phase) commandValue := getHookAnnotation(annotations, podBackupHookCommandAnnotationKey, phase)
if commandValue == "" { if commandValue == "" {
return nil return nil
@ -192,7 +193,7 @@ func getPodExecHookFromAnnotations(annotations map[string]string, phase hookPhas
if temp, err := time.ParseDuration(timeoutString); err == nil { if temp, err := time.ParseDuration(timeoutString); err == nil {
timeout = temp timeout = temp
} else { } else {
// TODO: log error that we couldn't parse duration log.Warn(errors.Wrapf(err, "Unable to parse provided timeout %s, using default", timeoutString))
} }
} }

View File

@ -575,7 +575,7 @@ func TestGetPodExecHookFromAnnotations(t *testing.T) {
}, },
}, },
{ {
name: "invalid timeout is ignored", name: "invalid timeout is logged",
annotations: map[string]string{ annotations: map[string]string{
phasedKey(phase, podBackupHookCommandAnnotationKey): "/usr/bin/foo", phasedKey(phase, podBackupHookCommandAnnotationKey): "/usr/bin/foo",
phasedKey(phase, podBackupHookTimeoutAnnotationKey): "invalid", phasedKey(phase, podBackupHookTimeoutAnnotationKey): "invalid",
@ -599,7 +599,8 @@ func TestGetPodExecHookFromAnnotations(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(fmt.Sprintf("%s (phase=%q)", test.name, phase), func(t *testing.T) { t.Run(fmt.Sprintf("%s (phase=%q)", test.name, phase), func(t *testing.T) {
hook := getPodExecHookFromAnnotations(test.annotations, phase) l := velerotest.NewLogger()
hook := getPodExecHookFromAnnotations(test.annotations, phase, l)
assert.Equal(t, test.expectedHook, hook) assert.Equal(t, test.expectedHook, hook)
}) })
} }