From a6bab6e3bbc1c98afd8323f1e0505497a48369ed Mon Sep 17 00:00:00 2001 From: robbiezhang Date: Thu, 18 Oct 2018 19:15:05 +0000 Subject: [PATCH] Fix the potential runtime type casting error --- vkubelet/pod.go | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/vkubelet/pod.go b/vkubelet/pod.go index 0388431e9..a57d0a19a 100644 --- a/vkubelet/pod.go +++ b/vkubelet/pod.go @@ -3,6 +3,7 @@ package vkubelet import ( "context" "fmt" + "reflect" "time" pkgerrors "github.com/pkg/errors" @@ -30,11 +31,10 @@ func (s *Server) onAddPod(ctx context.Context, obj interface{}) { defer span.End() logger := log.G(ctx).WithField("method", "onAddPod") - pod := obj.(*corev1.Pod) - - if pod == nil { - span.SetStatus(trace.Status{Code: trace.StatusCodeInvalidArgument, Message: fmt.Sprintf("Unexpected object from event: %v", obj)}) - logger.Errorf("obj is not a valid pod: %v", obj) + pod, ok := obj.(*corev1.Pod) + if !ok { + span.SetStatus(trace.Status{Code: trace.StatusCodeInvalidArgument, Message: fmt.Sprintf("Unexpected object from event: %s", reflect.TypeOf(obj))}) + logger.Errorf("obj is not of a valid type: %s", reflect.TypeOf(obj)) return } @@ -53,11 +53,10 @@ func (s *Server) onUpdatePod(ctx context.Context, obj interface{}) { defer span.End() logger := log.G(ctx).WithField("method", "onUpdatePod") - pod := obj.(*corev1.Pod) - - if pod == nil { - span.SetStatus(trace.Status{Code: trace.StatusCodeInvalidArgument, Message: fmt.Sprintf("Unexpected object from event: %v", obj)}) - logger.Errorf("obj is not a valid pod: %v", obj) + pod, ok := obj.(*corev1.Pod) + if !ok { + span.SetStatus(trace.Status{Code: trace.StatusCodeInvalidArgument, Message: fmt.Sprintf("Unexpected object from event: %s", reflect.TypeOf(obj))}) + logger.Errorf("obj is not of a valid type: %s", reflect.TypeOf(obj)) return } @@ -76,12 +75,20 @@ func (s *Server) onDeletePod(ctx context.Context, obj interface{}) { defer span.End() logger := log.G(ctx).WithField("method", "onDeletePod") - pod := obj.(*corev1.Pod) + pod, ok := obj.(*corev1.Pod) + if !ok { + delta, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + span.SetStatus(trace.Status{Code: trace.StatusCodeInvalidArgument, Message: fmt.Sprintf("Unexpected object from event: %s", reflect.TypeOf(obj))}) + logger.Errorf("obj is not of a valid type: %s", reflect.TypeOf(obj)) + return + } - if pod == nil { - span.SetStatus(trace.Status{Code: trace.StatusCodeInvalidArgument, Message: fmt.Sprintf("Unexpected object from event: %v", obj)}) - logger.Errorf("obj is not a valid pod: %v", obj) - return + if pod, ok = delta.Obj.(*corev1.Pod); !ok { + span.SetStatus(trace.Status{Code: trace.StatusCodeInvalidArgument, Message: fmt.Sprintf("Unexpected object from event: %s", reflect.TypeOf(obj))}) + logger.Errorf("obj is not of a valid type: %s", reflect.TypeOf(obj)) + return + } } addPodAttributes(span, pod)