Don't mask k8s error returned from patch

This commit is contained in:
Zihong Zheng 2019-06-04 15:35:45 -07:00
parent d1e828f8df
commit 89a7a35607
3 changed files with 53 additions and 29 deletions

View File

@ -57,6 +57,7 @@ go_test(
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library",

View File

@ -37,11 +37,7 @@ func patch(c v1core.CoreV1Interface, oldSvc *v1.Service, newSvc *v1.Service) (*v
return nil, err return nil, err
} }
updatedSvc, err := c.Services(oldSvc.Namespace).Patch(oldSvc.Name, types.StrategicMergePatchType, patchBytes, "status") return c.Services(oldSvc.Namespace).Patch(oldSvc.Name, types.StrategicMergePatchType, patchBytes, "status")
if err != nil {
return nil, fmt.Errorf("failed to patch %q for svc %s/%s: %v", patchBytes, oldSvc.Namespace, oldSvc.Name, err)
}
return updatedSvc, nil
} }
func getPatchBytes(oldSvc *v1.Service, newSvc *v1.Service) ([]byte, error) { func getPatchBytes(oldSvc *v1.Service, newSvc *v1.Service) ([]byte, error) {

View File

@ -28,6 +28,7 @@ import (
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utilfeature "k8s.io/apiserver/pkg/util/feature" utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
@ -615,20 +616,43 @@ func TestProcessServiceCreateOrUpdate(t *testing.T) {
} }
// TestConflictWhenProcessServiceCreateOrUpdate tests if processServiceCreateOrUpdate will // TestProcessServiceCreateOrUpdateK8sError tests processServiceCreateOrUpdate
// retry creating the load balancer when the update operation returns a conflict // with various kubernetes errors.
// error. func TestProcessServiceCreateOrUpdateK8sError(t *testing.T) {
func TestConflictWhenProcessServiceCreateOrUpdate(t *testing.T) { svcName := "svc-k8s-err"
svcName := "conflict-lb" conflictErr := apierrors.NewConflict(schema.GroupResource{}, svcName, errors.New("Object conflict"))
notFoundErr := apierrors.NewNotFound(schema.GroupResource{}, svcName)
testCases := []struct {
desc string
k8sErr error
expectErr error
}{
{
desc: "conflict error",
k8sErr: conflictErr,
expectErr: fmt.Errorf("failed to update load balancer status: %v", conflictErr),
},
{
desc: "not found error",
k8sErr: notFoundErr,
expectErr: nil,
},
}
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
svc := newService(svcName, types.UID("123"), v1.ServiceTypeLoadBalancer) svc := newService(svcName, types.UID("123"), v1.ServiceTypeLoadBalancer)
controller, _, client := newController() controller, _, client := newController()
client.PrependReactor("update", "services", func(action core.Action) (bool, runtime.Object, error) { client.PrependReactor("patch", "services", func(action core.Action) (bool, runtime.Object, error) {
update := action.(core.UpdateAction) return true, nil, tc.k8sErr
return true, update.GetObject(), apierrors.NewConflict(action.GetResource().GroupResource(), svcName, errors.New("Object changed"))
}) })
if err := controller.processServiceCreateOrUpdate(svc, svcName); err == nil { if err := controller.processServiceCreateOrUpdate(svc, svcName); !reflect.DeepEqual(err, tc.expectErr) {
t.Fatalf("controller.processServiceCreateOrUpdate() = nil, want error") t.Fatalf("processServiceCreateOrUpdate() = %v, want %v", err, tc.expectErr)
}
if tc.expectErr == nil {
return
} }
errMsg := "Error syncing load balancer" errMsg := "Error syncing load balancer"
@ -642,8 +666,11 @@ func TestConflictWhenProcessServiceCreateOrUpdate(t *testing.T) {
} }
return false return false
}(); !gotEvent { }(); !gotEvent {
t.Errorf("controller.processServiceCreateOrUpdate() = can't find sync error event, want event contains %q", errMsg) t.Errorf("processServiceCreateOrUpdate() = can't find sync error event, want event contains %q", errMsg)
} }
})
}
} }
func TestSyncService(t *testing.T) { func TestSyncService(t *testing.T) {