diff --git a/pkg/controller/serviceaccount/tokens_controller_test.go b/pkg/controller/serviceaccount/tokens_controller_test.go index 2508253f6d9..f9ffe53b297 100644 --- a/pkg/controller/serviceaccount/tokens_controller_test.go +++ b/pkg/controller/serviceaccount/tokens_controller_test.go @@ -73,7 +73,7 @@ func tokenSecretReferences() []v1.ObjectReference { // addTokenSecretReference adds a reference to the ServiceAccountToken that will be created func addTokenSecretReference(refs []v1.ObjectReference) []v1.ObjectReference { - return addNamedTokenSecretReference(refs, "default-token-stdpg") + return addNamedTokenSecretReference(refs, "default-token-xn8fg") } // addNamedTokenSecretReference adds a reference to the named ServiceAccountToken @@ -118,9 +118,9 @@ func opaqueSecret() *v1.Secret { } // createdTokenSecret returns the ServiceAccountToken secret posted when creating a new token secret. -// Named "default-token-stdpg", since that is the first generated name after rand.Seed(1) +// Named "default-token-xn8fg", since that is the first generated name after rand.Seed(1) func createdTokenSecret(overrideName ...string) *v1.Secret { - return namedCreatedTokenSecret("default-token-stdpg") + return namedCreatedTokenSecret("default-token-xn8fg") } // namedTokenSecret returns the ServiceAccountToken secret posted when creating a new token secret with the given name. @@ -264,12 +264,12 @@ func TestTokenCreation(t *testing.T) { // Attempt 2 core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"), - core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-jk9rt")), + core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-txhzt")), // Attempt 3 core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"), - core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-684pg")), - core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, serviceAccount(addNamedTokenSecretReference(emptySecretReferences(), "default-token-684pg"))), + 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"))), }, }, "new serviceaccount with no secrets encountering unending create error": { @@ -293,10 +293,10 @@ func TestTokenCreation(t *testing.T) { core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, createdTokenSecret()), // Retry 1 core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"), - core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-jk9rt")), + core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-txhzt")), // Retry 2 core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"}, metav1.NamespaceDefault, "default"), - core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-684pg")), + core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, metav1.NamespaceDefault, namedCreatedTokenSecret("default-token-vnmz7")), }, }, "new serviceaccount with missing secrets": { diff --git a/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go b/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go index 4c593b3c4b3..9421edae866 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go @@ -70,16 +70,41 @@ func Perm(n int) []int { return rng.rand.Perm(n) } -// We omit vowels from the set of available characters to reduce the chances -// of "bad words" being formed. -var alphanums = []rune("bcdfghjklmnpqrstvwxz2456789") +const ( + // We omit vowels from the set of available characters to reduce the chances + // of "bad words" being formed. + alphanums = "bcdfghjklmnpqrstvwxz2456789" + // No. of bits required to index into alphanums string. + alphanumsIdxBits = 5 + // Mask used to extract last alphanumsIdxBits of an int. + alphanumsIdxMask = 1<>= alphanumsIdxBits + remaining-- } return string(b) } @@ -87,7 +112,7 @@ func String(length int) string { // SafeEncodeString encodes s using the same characters as rand.String. This reduces the chances of bad words and // ensures that strings generated from hash functions appear consistent throughout the API. func SafeEncodeString(s string) string { - r := make([]rune, len(s)) + r := make([]byte, len(s)) for i, b := range []rune(s) { r[i] = alphanums[(int(b) % len(alphanums))] } diff --git a/staging/src/k8s.io/apimachinery/pkg/util/rand/rand_test.go b/staging/src/k8s.io/apimachinery/pkg/util/rand/rand_test.go index 40fdb7d68d1..7be656c40ac 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/rand/rand_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/rand/rand_test.go @@ -24,6 +24,7 @@ import ( const ( maxRangeTestCount = 500 + testStringLength = 32 ) func TestString(t *testing.T) { @@ -99,3 +100,15 @@ func TestInt63nRange(t *testing.T) { } } } + +func BenchmarkRandomStringGeneration(b *testing.B) { + b.ResetTimer() + var s string + for i := 0; i < b.N; i++ { + s = String(testStringLength) + } + b.StopTimer() + if len(s) == 0 { + b.Fatal(s) + } +}