Merge pull request #33866 from sjenning/fix-fed-flake

Automatic merge from submit-queue

wait for federation informer store to catch up before update

Fixes #33838 #33880 

There is a flake in the federation-controller code where an update to a resource is done too quickly after the create.  Because the resource is not yet in the federated informer store, when the reconcile<Resource>() is called, it can't find the resource and treats the change as a create rather than a update.

This causes a failure (actually a panic) in the test code, which expects an update event, not a create, in response to the resource modification.

@derekwaynecarr @apelisse @mwielgus
This commit is contained in:
Kubernetes Submit Queue 2016-10-03 19:20:02 -07:00 committed by GitHub
commit 889e976621
3 changed files with 25 additions and 0 deletions

View File

@ -31,6 +31,7 @@ import (
fake_kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/fake"
"k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/wait"
"github.com/stretchr/testify/assert"
)
@ -111,6 +112,12 @@ func TestNamespaceController(t *testing.T) {
assert.NotNil(t, createdNamespace)
assert.Equal(t, ns1.Name, createdNamespace.Name)
// Wait for the secret to appear in the informer store
err := WaitForStoreUpdate(
namespaceController.namespaceFederatedInformer.GetTargetStore(),
cluster1.Name, ns1.Name, wait.ForeverTestTimeout)
assert.Nil(t, err, "namespace should have appeared in the informer store")
// Test update federated namespace.
ns1.Annotations = map[string]string{
"A": "B",

View File

@ -29,6 +29,7 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
fake_kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/fake"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/wait"
"github.com/stretchr/testify/assert"
)
@ -96,6 +97,12 @@ func TestSecretController(t *testing.T) {
assert.Equal(t, secret1.Name, createdSecret.Name)
assert.True(t, secretsEqual(secret1, *createdSecret))
// Wait for the secret to appear in the informer store
err := WaitForStoreUpdate(
secretController.secretFederatedInformer.GetTargetStore(),
cluster1.Name, getSecretKey(secret1.Namespace, secret1.Name), wait.ForeverTestTimeout)
assert.Nil(t, err, "secret should have appeared in the informer store")
// Test update federated secret.
secret1.Annotations = map[string]string{
"A": "B",

View File

@ -28,6 +28,7 @@ import (
api_v1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/pkg/watch"
"github.com/golang/glog"
@ -211,3 +212,13 @@ func NewCluster(name string, readyStatus api_v1.ConditionStatus) *federation_api
},
}
}
// Ensure a key is in the store before returning (or timeout w/ error)
func WaitForStoreUpdate(store util.FederatedReadOnlyStore, clusterName, key string, timeout time.Duration) error {
retryInterval := 100 * time.Millisecond
err := wait.PollImmediate(retryInterval, timeout, func() (bool, error) {
_, found, err := store.GetByKey(clusterName, key)
return found, err
})
return err
}