2015-04-21 03:25:56 +00:00
|
|
|
/*
|
2016-06-03 00:25:58 +00:00
|
|
|
Copyright 2014 The Kubernetes Authors.
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package serviceaccount
|
|
|
|
|
|
|
|
import (
|
2016-05-23 16:51:02 +00:00
|
|
|
"errors"
|
2015-04-21 03:25:56 +00:00
|
|
|
"reflect"
|
|
|
|
"testing"
|
2016-05-23 16:51:02 +00:00
|
|
|
"time"
|
|
|
|
|
2016-11-21 17:18:57 +00:00
|
|
|
"github.com/davecgh/go-spew/spew"
|
2016-05-23 16:51:02 +00:00
|
|
|
"github.com/golang/glog"
|
2015-04-21 03:25:56 +00:00
|
|
|
|
2017-06-22 18:24:23 +00:00
|
|
|
"k8s.io/api/core/v1"
|
2017-01-13 17:48:50 +00:00
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
2017-01-17 03:38:19 +00:00
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
2017-01-11 14:09:48 +00:00
|
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
2017-01-16 14:50:37 +00:00
|
|
|
utilrand "k8s.io/apimachinery/pkg/util/rand"
|
2017-06-23 20:56:37 +00:00
|
|
|
"k8s.io/client-go/informers"
|
|
|
|
"k8s.io/client-go/kubernetes/fake"
|
2017-01-25 20:07:10 +00:00
|
|
|
core "k8s.io/client-go/testing"
|
2015-08-05 22:03:47 +00:00
|
|
|
"k8s.io/kubernetes/pkg/api"
|
2017-05-17 04:01:50 +00:00
|
|
|
"k8s.io/kubernetes/pkg/controller"
|
2015-04-21 03:25:56 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type testGenerator struct {
|
2016-11-18 20:50:17 +00:00
|
|
|
GeneratedServiceAccounts []v1.ServiceAccount
|
|
|
|
GeneratedSecrets []v1.Secret
|
2015-04-21 03:25:56 +00:00
|
|
|
Token string
|
|
|
|
Err error
|
|
|
|
}
|
|
|
|
|
2016-11-18 20:50:17 +00:00
|
|
|
func (t *testGenerator) GenerateToken(serviceAccount v1.ServiceAccount, secret v1.Secret) (string, error) {
|
2015-04-21 03:25:56 +00:00
|
|
|
t.GeneratedSecrets = append(t.GeneratedSecrets, secret)
|
|
|
|
t.GeneratedServiceAccounts = append(t.GeneratedServiceAccounts, serviceAccount)
|
|
|
|
return t.Token, t.Err
|
|
|
|
}
|
|
|
|
|
|
|
|
// emptySecretReferences is used by a service account without any secrets
|
2016-11-18 20:50:17 +00:00
|
|
|
func emptySecretReferences() []v1.ObjectReference {
|
|
|
|
return []v1.ObjectReference{}
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// missingSecretReferences is used by a service account that references secrets which do no exist
|
2016-11-18 20:50:17 +00:00
|
|
|
func missingSecretReferences() []v1.ObjectReference {
|
|
|
|
return []v1.ObjectReference{{Name: "missing-secret-1"}}
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// regularSecretReferences is used by a service account that references secrets which are not ServiceAccountTokens
|
2016-11-18 20:50:17 +00:00
|
|
|
func regularSecretReferences() []v1.ObjectReference {
|
|
|
|
return []v1.ObjectReference{{Name: "regular-secret-1"}}
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// tokenSecretReferences is used by a service account that references a ServiceAccountToken secret
|
2016-11-18 20:50:17 +00:00
|
|
|
func tokenSecretReferences() []v1.ObjectReference {
|
|
|
|
return []v1.ObjectReference{{Name: "token-secret-1"}}
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// addTokenSecretReference adds a reference to the ServiceAccountToken that will be created
|
2016-11-18 20:50:17 +00:00
|
|
|
func addTokenSecretReference(refs []v1.ObjectReference) []v1.ObjectReference {
|
2017-10-12 11:40:00 +00:00
|
|
|
return addNamedTokenSecretReference(refs, "default-token-xn8fg")
|
2016-05-23 16:51:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// addNamedTokenSecretReference adds a reference to the named ServiceAccountToken
|
2016-11-18 20:50:17 +00:00
|
|
|
func addNamedTokenSecretReference(refs []v1.ObjectReference, name string) []v1.ObjectReference {
|
|
|
|
return append(refs, v1.ObjectReference{Name: name})
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// serviceAccount returns a service account with the given secret refs
|
2016-11-18 20:50:17 +00:00
|
|
|
func serviceAccount(secretRefs []v1.ObjectReference) *v1.ServiceAccount {
|
|
|
|
return &v1.ServiceAccount{
|
2017-01-17 03:38:19 +00:00
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
2015-04-21 03:25:56 +00:00
|
|
|
Name: "default",
|
|
|
|
UID: "12345",
|
|
|
|
Namespace: "default",
|
|
|
|
ResourceVersion: "1",
|
|
|
|
},
|
|
|
|
Secrets: secretRefs,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-02 05:36:18 +00:00
|
|
|
// updatedServiceAccount returns a service account with the resource version modified
|
2016-11-18 20:50:17 +00:00
|
|
|
func updatedServiceAccount(secretRefs []v1.ObjectReference) *v1.ServiceAccount {
|
2015-06-02 05:36:18 +00:00
|
|
|
sa := serviceAccount(secretRefs)
|
|
|
|
sa.ResourceVersion = "2"
|
|
|
|
return sa
|
|
|
|
}
|
|
|
|
|
2015-04-21 03:25:56 +00:00
|
|
|
// opaqueSecret returns a persisted non-ServiceAccountToken secret named "regular-secret-1"
|
2016-11-18 20:50:17 +00:00
|
|
|
func opaqueSecret() *v1.Secret {
|
|
|
|
return &v1.Secret{
|
2017-01-17 03:38:19 +00:00
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
2015-04-21 03:25:56 +00:00
|
|
|
Name: "regular-secret-1",
|
|
|
|
Namespace: "default",
|
|
|
|
UID: "23456",
|
|
|
|
ResourceVersion: "1",
|
|
|
|
},
|
|
|
|
Type: "Opaque",
|
|
|
|
Data: map[string][]byte{
|
|
|
|
"mykey": []byte("mydata"),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// createdTokenSecret returns the ServiceAccountToken secret posted when creating a new token secret.
|
2017-10-12 11:40:00 +00:00
|
|
|
// Named "default-token-xn8fg", since that is the first generated name after rand.Seed(1)
|
2016-11-18 20:50:17 +00:00
|
|
|
func createdTokenSecret(overrideName ...string) *v1.Secret {
|
2017-10-12 11:40:00 +00:00
|
|
|
return namedCreatedTokenSecret("default-token-xn8fg")
|
2016-05-23 16:51:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// namedTokenSecret returns the ServiceAccountToken secret posted when creating a new token secret with the given name.
|
2016-11-18 20:50:17 +00:00
|
|
|
func namedCreatedTokenSecret(name string) *v1.Secret {
|
|
|
|
return &v1.Secret{
|
2017-01-17 03:38:19 +00:00
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
2016-05-23 16:51:02 +00:00
|
|
|
Name: name,
|
2015-04-21 03:25:56 +00:00
|
|
|
Namespace: "default",
|
|
|
|
Annotations: map[string]string{
|
2016-11-18 20:50:17 +00:00
|
|
|
v1.ServiceAccountNameKey: "default",
|
|
|
|
v1.ServiceAccountUIDKey: "12345",
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
2016-11-18 20:50:17 +00:00
|
|
|
Type: v1.SecretTypeServiceAccountToken,
|
2015-04-21 03:25:56 +00:00
|
|
|
Data: map[string][]byte{
|
2016-02-11 19:46:56 +00:00
|
|
|
"token": []byte("ABC"),
|
|
|
|
"ca.crt": []byte("CA Data"),
|
|
|
|
"namespace": []byte("default"),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// serviceAccountTokenSecret returns an existing ServiceAccountToken secret named "token-secret-1"
|
2016-11-18 20:50:17 +00:00
|
|
|
func serviceAccountTokenSecret() *v1.Secret {
|
|
|
|
return &v1.Secret{
|
2017-01-17 03:38:19 +00:00
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
2015-04-21 03:25:56 +00:00
|
|
|
Name: "token-secret-1",
|
|
|
|
Namespace: "default",
|
|
|
|
UID: "23456",
|
|
|
|
ResourceVersion: "1",
|
|
|
|
Annotations: map[string]string{
|
2016-11-18 20:50:17 +00:00
|
|
|
v1.ServiceAccountNameKey: "default",
|
|
|
|
v1.ServiceAccountUIDKey: "12345",
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
2016-11-18 20:50:17 +00:00
|
|
|
Type: v1.SecretTypeServiceAccountToken,
|
2015-04-21 03:25:56 +00:00
|
|
|
Data: map[string][]byte{
|
2016-02-11 19:46:56 +00:00
|
|
|
"token": []byte("ABC"),
|
|
|
|
"ca.crt": []byte("CA Data"),
|
|
|
|
"namespace": []byte("default"),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// serviceAccountTokenSecretWithoutTokenData returns an existing ServiceAccountToken secret that lacks token data
|
2016-11-18 20:50:17 +00:00
|
|
|
func serviceAccountTokenSecretWithoutTokenData() *v1.Secret {
|
2015-04-21 03:25:56 +00:00
|
|
|
secret := serviceAccountTokenSecret()
|
2016-11-18 20:50:17 +00:00
|
|
|
delete(secret.Data, v1.ServiceAccountTokenKey)
|
2015-07-15 12:53:21 +00:00
|
|
|
return secret
|
|
|
|
}
|
|
|
|
|
|
|
|
// serviceAccountTokenSecretWithoutCAData returns an existing ServiceAccountToken secret that lacks ca data
|
2016-11-18 20:50:17 +00:00
|
|
|
func serviceAccountTokenSecretWithoutCAData() *v1.Secret {
|
2015-07-15 12:53:21 +00:00
|
|
|
secret := serviceAccountTokenSecret()
|
2016-11-18 20:50:17 +00:00
|
|
|
delete(secret.Data, v1.ServiceAccountRootCAKey)
|
2015-07-15 12:53:21 +00:00
|
|
|
return secret
|
|
|
|
}
|
|
|
|
|
|
|
|
// serviceAccountTokenSecretWithCAData returns an existing ServiceAccountToken secret with the specified ca data
|
2016-11-18 20:50:17 +00:00
|
|
|
func serviceAccountTokenSecretWithCAData(data []byte) *v1.Secret {
|
2015-07-15 12:53:21 +00:00
|
|
|
secret := serviceAccountTokenSecret()
|
2016-11-18 20:50:17 +00:00
|
|
|
secret.Data[v1.ServiceAccountRootCAKey] = data
|
2015-04-21 03:25:56 +00:00
|
|
|
return secret
|
|
|
|
}
|
|
|
|
|
2016-02-11 19:46:56 +00:00
|
|
|
// serviceAccountTokenSecretWithoutNamespaceData returns an existing ServiceAccountToken secret that lacks namespace data
|
2016-11-18 20:50:17 +00:00
|
|
|
func serviceAccountTokenSecretWithoutNamespaceData() *v1.Secret {
|
2016-02-11 19:46:56 +00:00
|
|
|
secret := serviceAccountTokenSecret()
|
2016-11-18 20:50:17 +00:00
|
|
|
delete(secret.Data, v1.ServiceAccountNamespaceKey)
|
2016-02-11 19:46:56 +00:00
|
|
|
return secret
|
|
|
|
}
|
|
|
|
|
|
|
|
// serviceAccountTokenSecretWithNamespaceData returns an existing ServiceAccountToken secret with the specified namespace data
|
2016-11-18 20:50:17 +00:00
|
|
|
func serviceAccountTokenSecretWithNamespaceData(data []byte) *v1.Secret {
|
2016-02-11 19:46:56 +00:00
|
|
|
secret := serviceAccountTokenSecret()
|
2016-11-18 20:50:17 +00:00
|
|
|
secret.Data[v1.ServiceAccountNamespaceKey] = data
|
2016-02-11 19:46:56 +00:00
|
|
|
return secret
|
|
|
|
}
|
|
|
|
|
2016-05-23 16:51:02 +00:00
|
|
|
type reaction struct {
|
|
|
|
verb string
|
|
|
|
resource string
|
|
|
|
reactor func(t *testing.T) core.ReactionFunc
|
|
|
|
}
|
|
|
|
|
2015-04-21 03:25:56 +00:00
|
|
|
func TestTokenCreation(t *testing.T) {
|
|
|
|
testcases := map[string]struct {
|
|
|
|
ClientObjects []runtime.Object
|
|
|
|
|
2016-05-23 16:51:02 +00:00
|
|
|
IsAsync bool
|
|
|
|
MaxRetries int
|
|
|
|
|
|
|
|
Reactors []reaction
|
2015-06-05 18:21:28 +00:00
|
|
|
|
2016-11-18 20:50:17 +00:00
|
|
|
ExistingServiceAccount *v1.ServiceAccount
|
|
|
|
ExistingSecrets []*v1.Secret
|
2015-04-21 03:25:56 +00:00
|
|
|
|
2016-11-18 20:50:17 +00:00
|
|
|
AddedServiceAccount *v1.ServiceAccount
|
|
|
|
UpdatedServiceAccount *v1.ServiceAccount
|
|
|
|
DeletedServiceAccount *v1.ServiceAccount
|
|
|
|
AddedSecret *v1.Secret
|
2017-05-17 04:01:50 +00:00
|
|
|
AddedSecretLocal *v1.Secret
|
2016-11-18 20:50:17 +00:00
|
|
|
UpdatedSecret *v1.Secret
|
|
|
|
DeletedSecret *v1.Secret
|
2015-04-21 03:25:56 +00:00
|
|
|
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions []core.Action
|
2015-04-21 03:25:56 +00:00
|
|
|
}{
|
|
|
|
"new serviceaccount with no secrets": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences())},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
AddedServiceAccount: serviceAccount(emptySecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
2016-05-23 16:51:02 +00:00
|
|
|
"new serviceaccount with no secrets encountering create error": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences())},
|
2016-05-23 16:51:02 +00:00
|
|
|
MaxRetries: 10,
|
|
|
|
IsAsync: true,
|
|
|
|
Reactors: []reaction{{
|
|
|
|
verb: "create",
|
|
|
|
resource: "secrets",
|
|
|
|
reactor: func(t *testing.T) core.ReactionFunc {
|
|
|
|
i := 0
|
|
|
|
return func(core.Action) (bool, runtime.Object, error) {
|
|
|
|
i++
|
|
|
|
if i < 3 {
|
|
|
|
return true, nil, apierrors.NewForbidden(api.Resource("secrets"), "foo", errors.New("No can do"))
|
|
|
|
}
|
|
|
|
return false, nil, nil
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
AddedServiceAccount: serviceAccount(emptySecretReferences()),
|
|
|
|
ExpectedActions: []core.Action{
|
|
|
|
// Attempt 1
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
2016-05-23 16:51:02 +00:00
|
|
|
|
|
|
|
// Attempt 2
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2017-10-12 11:40:00 +00:00
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-txhzt")),
|
2016-05-23 16:51:02 +00:00
|
|
|
|
|
|
|
// Attempt 3
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2017-10-12 11:40:00 +00:00
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-vnmz7")),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addNamedTokenSecretReference(emptySecretReferences(), "default-token-vnmz7"))),
|
2016-05-23 16:51:02 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"new serviceaccount with no secrets encountering unending create error": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()},
|
|
|
|
MaxRetries: 2,
|
|
|
|
IsAsync: true,
|
|
|
|
Reactors: []reaction{{
|
|
|
|
verb: "create",
|
|
|
|
resource: "secrets",
|
|
|
|
reactor: func(t *testing.T) core.ReactionFunc {
|
|
|
|
return func(core.Action) (bool, runtime.Object, error) {
|
|
|
|
return true, nil, apierrors.NewForbidden(api.Resource("secrets"), "foo", errors.New("No can do"))
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}},
|
2015-06-05 18:21:28 +00:00
|
|
|
|
|
|
|
AddedServiceAccount: serviceAccount(emptySecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2016-05-23 16:51:02 +00:00
|
|
|
// Attempt
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
2016-05-23 16:51:02 +00:00
|
|
|
// Retry 1
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2017-10-12 11:40:00 +00:00
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-txhzt")),
|
2016-05-23 16:51:02 +00:00
|
|
|
// Retry 2
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2017-10-12 11:40:00 +00:00
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-vnmz7")),
|
2015-06-05 18:21:28 +00:00
|
|
|
},
|
|
|
|
},
|
2015-04-21 03:25:56 +00:00
|
|
|
"new serviceaccount with missing secrets": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences())},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
AddedServiceAccount: serviceAccount(missingSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addTokenSecretReference(missingSecretReferences()))),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
2017-05-17 04:01:50 +00:00
|
|
|
"new serviceaccount with missing secrets and a local secret in the cache": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences())},
|
|
|
|
|
|
|
|
AddedServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
AddedSecretLocal: serviceAccountTokenSecret(),
|
|
|
|
ExpectedActions: []core.Action{},
|
|
|
|
},
|
2015-04-21 03:25:56 +00:00
|
|
|
"new serviceaccount with non-token secrets": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{serviceAccount(regularSecretReferences()), opaqueSecret()},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
AddedServiceAccount: serviceAccount(regularSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addTokenSecretReference(regularSecretReferences()))),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"new serviceaccount with token secrets": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccount(tokenSecretReferences()), serviceAccountTokenSecret()},
|
2016-11-18 20:50:17 +00:00
|
|
|
ExistingSecrets: []*v1.Secret{serviceAccountTokenSecret()},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
AddedServiceAccount: serviceAccount(tokenSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
2015-06-02 05:36:18 +00:00
|
|
|
"new serviceaccount with no secrets with resource conflict": {
|
|
|
|
ClientObjects: []runtime.Object{updatedServiceAccount(emptySecretReferences()), createdTokenSecret()},
|
2017-04-30 02:23:39 +00:00
|
|
|
IsAsync: true,
|
|
|
|
MaxRetries: 1,
|
2015-06-02 05:36:18 +00:00
|
|
|
|
|
|
|
AddedServiceAccount: serviceAccount(emptySecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2017-04-30 02:23:39 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2015-06-02 05:36:18 +00:00
|
|
|
},
|
|
|
|
},
|
2015-04-21 03:25:56 +00:00
|
|
|
"updated serviceaccount with no secrets": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences())},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
UpdatedServiceAccount: serviceAccount(emptySecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"updated serviceaccount with missing secrets": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences())},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
UpdatedServiceAccount: serviceAccount(missingSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addTokenSecretReference(missingSecretReferences()))),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"updated serviceaccount with non-token secrets": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{serviceAccount(regularSecretReferences()), opaqueSecret()},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
UpdatedServiceAccount: serviceAccount(regularSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addTokenSecretReference(regularSecretReferences()))),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"updated serviceaccount with token secrets": {
|
2016-11-18 20:50:17 +00:00
|
|
|
ExistingSecrets: []*v1.Secret{serviceAccountTokenSecret()},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
UpdatedServiceAccount: serviceAccount(tokenSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
2015-06-02 05:36:18 +00:00
|
|
|
"updated serviceaccount with no secrets with resource conflict": {
|
2016-06-02 01:47:36 +00:00
|
|
|
ClientObjects: []runtime.Object{updatedServiceAccount(emptySecretReferences())},
|
2017-04-27 04:33:27 +00:00
|
|
|
IsAsync: true,
|
|
|
|
MaxRetries: 1,
|
2015-06-02 05:36:18 +00:00
|
|
|
|
|
|
|
UpdatedServiceAccount: serviceAccount(emptySecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2017-04-27 04:33:27 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2015-06-02 05:36:18 +00:00
|
|
|
},
|
|
|
|
},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
"deleted serviceaccount with no secrets": {
|
|
|
|
DeletedServiceAccount: serviceAccount(emptySecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
"deleted serviceaccount with missing secrets": {
|
|
|
|
DeletedServiceAccount: serviceAccount(missingSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
"deleted serviceaccount with non-token secrets": {
|
|
|
|
ClientObjects: []runtime.Object{opaqueSecret()},
|
|
|
|
|
|
|
|
DeletedServiceAccount: serviceAccount(regularSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
"deleted serviceaccount with token secrets": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecret()},
|
2016-11-18 20:50:17 +00:00
|
|
|
ExistingSecrets: []*v1.Secret{serviceAccountTokenSecret()},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
DeletedServiceAccount: serviceAccount(tokenSecretReferences()),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewDeleteAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"added secret without serviceaccount": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecret()},
|
|
|
|
|
|
|
|
AddedSecret: serviceAccountTokenSecret(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewDeleteAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"added secret with serviceaccount": {
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
AddedSecret: serviceAccountTokenSecret(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
"added token secret without token data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutTokenData()},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
AddedSecret: serviceAccountTokenSecretWithoutTokenData(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
2015-07-15 12:53:21 +00:00
|
|
|
"added token secret without ca data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutCAData()},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
AddedSecret: serviceAccountTokenSecretWithoutCAData(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2015-07-15 12:53:21 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"added token secret with mismatched ca data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithCAData([]byte("mismatched"))},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
AddedSecret: serviceAccountTokenSecretWithCAData([]byte("mismatched")),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2015-07-15 12:53:21 +00:00
|
|
|
},
|
|
|
|
},
|
2016-02-11 19:46:56 +00:00
|
|
|
"added token secret without namespace data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutNamespaceData()},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
AddedSecret: serviceAccountTokenSecretWithoutNamespaceData(),
|
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2016-02-11 19:46:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"added token secret with custom namespace data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithNamespaceData([]byte("custom"))},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
AddedSecret: serviceAccountTokenSecretWithNamespaceData([]byte("custom")),
|
|
|
|
ExpectedActions: []core.Action{
|
|
|
|
// no update is performed... the custom namespace is preserved
|
|
|
|
},
|
|
|
|
},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
"updated secret without serviceaccount": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecret()},
|
|
|
|
|
|
|
|
UpdatedSecret: serviceAccountTokenSecret(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewDeleteAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"updated secret with serviceaccount": {
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
UpdatedSecret: serviceAccountTokenSecret(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
"updated token secret without token data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutTokenData()},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
UpdatedSecret: serviceAccountTokenSecretWithoutTokenData(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
2015-07-15 12:53:21 +00:00
|
|
|
"updated token secret without ca data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutCAData()},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
UpdatedSecret: serviceAccountTokenSecretWithoutCAData(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2015-07-15 12:53:21 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"updated token secret with mismatched ca data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithCAData([]byte("mismatched"))},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
UpdatedSecret: serviceAccountTokenSecretWithCAData([]byte("mismatched")),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2015-07-15 12:53:21 +00:00
|
|
|
},
|
|
|
|
},
|
2016-02-11 19:46:56 +00:00
|
|
|
"updated token secret without namespace data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutNamespaceData()},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
UpdatedSecret: serviceAccountTokenSecretWithoutNamespaceData(),
|
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, "token-secret-1"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, serviceAccountTokenSecret()),
|
2016-02-11 19:46:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"updated token secret with custom namespace data": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccountTokenSecretWithNamespaceData([]byte("custom"))},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
UpdatedSecret: serviceAccountTokenSecretWithNamespaceData([]byte("custom")),
|
|
|
|
ExpectedActions: []core.Action{
|
|
|
|
// no update is performed... the custom namespace is preserved
|
|
|
|
},
|
|
|
|
},
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
"deleted secret without serviceaccount": {
|
|
|
|
DeletedSecret: serviceAccountTokenSecret(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
"deleted secret with serviceaccount with reference": {
|
|
|
|
ClientObjects: []runtime.Object{serviceAccount(tokenSecretReferences())},
|
|
|
|
ExistingServiceAccount: serviceAccount(tokenSecretReferences()),
|
|
|
|
|
|
|
|
DeletedSecret: serviceAccountTokenSecret(),
|
2016-01-29 06:34:08 +00:00
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
|
|
|
core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(emptySecretReferences())),
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"deleted secret with serviceaccount without reference": {
|
|
|
|
ExistingServiceAccount: serviceAccount(emptySecretReferences()),
|
|
|
|
|
2016-02-29 05:01:00 +00:00
|
|
|
DeletedSecret: serviceAccountTokenSecret(),
|
|
|
|
ExpectedActions: []core.Action{
|
2017-01-22 03:36:02 +00:00
|
|
|
core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"),
|
2016-02-29 05:01:00 +00:00
|
|
|
},
|
2015-04-21 03:25:56 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, tc := range testcases {
|
2016-05-23 16:51:02 +00:00
|
|
|
glog.Infof(k)
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
// Re-seed to reset name generation
|
2015-07-22 22:01:51 +00:00
|
|
|
utilrand.Seed(1)
|
2015-04-21 03:25:56 +00:00
|
|
|
|
|
|
|
generator := &testGenerator{Token: "ABC"}
|
|
|
|
|
2016-01-29 06:34:08 +00:00
|
|
|
client := fake.NewSimpleClientset(tc.ClientObjects...)
|
2016-05-23 16:51:02 +00:00
|
|
|
for _, reactor := range tc.Reactors {
|
|
|
|
client.Fake.PrependReactor(reactor.verb, reactor.resource, reactor.reactor(t))
|
|
|
|
}
|
2017-05-17 04:01:50 +00:00
|
|
|
informers := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc())
|
|
|
|
secretInformer := informers.Core().V1().Secrets().Informer()
|
|
|
|
secrets := secretInformer.GetStore()
|
|
|
|
serviceAccounts := informers.Core().V1().ServiceAccounts().Informer().GetStore()
|
|
|
|
controller := NewTokensController(informers.Core().V1().ServiceAccounts(), informers.Core().V1().Secrets(), client, TokensControllerOptions{TokenGenerator: generator, RootCA: []byte("CA Data"), MaxRetries: tc.MaxRetries})
|
2015-05-19 09:24:17 +00:00
|
|
|
|
2015-04-21 03:25:56 +00:00
|
|
|
if tc.ExistingServiceAccount != nil {
|
2017-05-17 04:01:50 +00:00
|
|
|
serviceAccounts.Add(tc.ExistingServiceAccount)
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
for _, s := range tc.ExistingSecrets {
|
2017-05-17 04:01:50 +00:00
|
|
|
secrets.Add(s)
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if tc.AddedServiceAccount != nil {
|
2017-05-17 04:01:50 +00:00
|
|
|
serviceAccounts.Add(tc.AddedServiceAccount)
|
2016-05-23 16:51:02 +00:00
|
|
|
controller.queueServiceAccountSync(tc.AddedServiceAccount)
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
if tc.UpdatedServiceAccount != nil {
|
2017-05-17 04:01:50 +00:00
|
|
|
serviceAccounts.Add(tc.UpdatedServiceAccount)
|
2016-05-23 16:51:02 +00:00
|
|
|
controller.queueServiceAccountUpdateSync(nil, tc.UpdatedServiceAccount)
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
if tc.DeletedServiceAccount != nil {
|
2017-05-17 04:01:50 +00:00
|
|
|
serviceAccounts.Delete(tc.DeletedServiceAccount)
|
2016-05-23 16:51:02 +00:00
|
|
|
controller.queueServiceAccountSync(tc.DeletedServiceAccount)
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
if tc.AddedSecret != nil {
|
2017-05-17 04:01:50 +00:00
|
|
|
secrets.Add(tc.AddedSecret)
|
2016-05-23 16:51:02 +00:00
|
|
|
controller.queueSecretSync(tc.AddedSecret)
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
2017-05-17 04:01:50 +00:00
|
|
|
if tc.AddedSecretLocal != nil {
|
|
|
|
controller.updatedSecrets.Mutation(tc.AddedSecretLocal)
|
|
|
|
}
|
2015-04-21 03:25:56 +00:00
|
|
|
if tc.UpdatedSecret != nil {
|
2017-05-17 04:01:50 +00:00
|
|
|
secrets.Add(tc.UpdatedSecret)
|
2016-05-23 16:51:02 +00:00
|
|
|
controller.queueSecretUpdateSync(nil, tc.UpdatedSecret)
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
if tc.DeletedSecret != nil {
|
2017-05-17 04:01:50 +00:00
|
|
|
secrets.Delete(tc.DeletedSecret)
|
2016-05-23 16:51:02 +00:00
|
|
|
controller.queueSecretSync(tc.DeletedSecret)
|
|
|
|
}
|
|
|
|
|
|
|
|
// This is the longest we'll wait for async tests
|
|
|
|
timeout := time.Now().Add(30 * time.Second)
|
|
|
|
waitedForAdditionalActions := false
|
|
|
|
|
|
|
|
for {
|
|
|
|
if controller.syncServiceAccountQueue.Len() > 0 {
|
|
|
|
controller.syncServiceAccount()
|
|
|
|
}
|
|
|
|
if controller.syncSecretQueue.Len() > 0 {
|
|
|
|
controller.syncSecret()
|
|
|
|
}
|
|
|
|
|
|
|
|
// The queues still have things to work on
|
|
|
|
if controller.syncServiceAccountQueue.Len() > 0 || controller.syncSecretQueue.Len() > 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we expect this test to work asynchronously...
|
|
|
|
if tc.IsAsync {
|
|
|
|
// if we're still missing expected actions within our test timeout
|
|
|
|
if len(client.Actions()) < len(tc.ExpectedActions) && time.Now().Before(timeout) {
|
|
|
|
// wait for the expected actions (without hotlooping)
|
|
|
|
time.Sleep(time.Millisecond)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// if we exactly match our expected actions, wait a bit to make sure no other additional actions show up
|
|
|
|
if len(client.Actions()) == len(tc.ExpectedActions) && !waitedForAdditionalActions {
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
waitedForAdditionalActions = true
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
if controller.syncServiceAccountQueue.Len() > 0 {
|
|
|
|
t.Errorf("%s: unexpected items in service account queue: %d", k, controller.syncServiceAccountQueue.Len())
|
|
|
|
}
|
|
|
|
if controller.syncSecretQueue.Len() > 0 {
|
|
|
|
t.Errorf("%s: unexpected items in secret queue: %d", k, controller.syncSecretQueue.Len())
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
|
2015-07-06 21:37:46 +00:00
|
|
|
actions := client.Actions()
|
|
|
|
for i, action := range actions {
|
2015-04-21 03:25:56 +00:00
|
|
|
if len(tc.ExpectedActions) < i+1 {
|
2015-07-06 21:37:46 +00:00
|
|
|
t.Errorf("%s: %d unexpected actions: %+v", k, len(actions)-len(tc.ExpectedActions), actions[i:])
|
2015-04-21 03:25:56 +00:00
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
expectedAction := tc.ExpectedActions[i]
|
2015-08-03 13:21:11 +00:00
|
|
|
if !reflect.DeepEqual(expectedAction, action) {
|
2016-11-21 17:18:57 +00:00
|
|
|
t.Errorf("%s:\nExpected:\n%s\ngot:\n%s", k, spew.Sdump(expectedAction), spew.Sdump(action))
|
2015-04-21 03:25:56 +00:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-06 21:37:46 +00:00
|
|
|
if len(tc.ExpectedActions) > len(actions) {
|
2016-05-23 16:51:02 +00:00
|
|
|
t.Errorf("%s: %d additional expected actions", k, len(tc.ExpectedActions)-len(actions))
|
|
|
|
for _, a := range tc.ExpectedActions[len(actions):] {
|
|
|
|
t.Logf(" %+v", a)
|
|
|
|
}
|
2015-04-21 03:25:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|