diff --git a/pkg/controller/daemon/BUILD b/pkg/controller/daemon/BUILD index 29d9999169b..e6da555ba9c 100644 --- a/pkg/controller/daemon/BUILD +++ b/pkg/controller/daemon/BUILD @@ -25,6 +25,7 @@ go_library( "//plugin/pkg/scheduler/algorithm:go_default_library", "//plugin/pkg/scheduler/algorithm/predicates:go_default_library", "//plugin/pkg/scheduler/schedulercache:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/controller/daemon/update.go b/pkg/controller/daemon/update.go index ea3f973ae44..bbbb4d68f91 100644 --- a/pkg/controller/daemon/update.go +++ b/pkg/controller/daemon/update.go @@ -36,6 +36,7 @@ import ( "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/daemon/util" labelsutil "k8s.io/kubernetes/pkg/util/labels" + "k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/util/rand" ) // rollingUpdate deletes old daemon set pods making sure that no more than @@ -317,7 +318,7 @@ func (dsc *DaemonSetsController) snapshot(ds *extensions.DaemonSet, revision int return nil, err } hash := fmt.Sprint(controller.ComputeHash(&ds.Spec.Template, ds.Status.CollisionCount)) - name := ds.Name + "-" + hash + name := ds.Name + "-" + rand.SafeEncodeString(hash) history := &apps.ControllerRevision{ ObjectMeta: metav1.ObjectMeta{ Name: name, diff --git a/pkg/controller/deployment/BUILD b/pkg/controller/deployment/BUILD index 1165b0b405d..44b5cdea411 100644 --- a/pkg/controller/deployment/BUILD +++ b/pkg/controller/deployment/BUILD @@ -21,6 +21,7 @@ go_library( "//pkg/controller/deployment/util:go_default_library", "//pkg/util/labels:go_default_library", "//pkg/util/metrics:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", diff --git a/pkg/controller/deployment/sync.go b/pkg/controller/deployment/sync.go index 786676ccbd4..cd08decd60d 100644 --- a/pkg/controller/deployment/sync.go +++ b/pkg/controller/deployment/sync.go @@ -32,6 +32,7 @@ import ( "k8s.io/kubernetes/pkg/controller" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" labelsutil "k8s.io/kubernetes/pkg/util/labels" + "k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/util/rand" ) // syncStatusOnly only updates Deployments Status and doesn't take any mutating actions. @@ -295,7 +296,7 @@ func (dc *DeploymentController) getNewReplicaSet(d *extensions.Deployment, rsLis newRS := extensions.ReplicaSet{ ObjectMeta: metav1.ObjectMeta{ // Make the name deterministic, to ensure idempotence - Name: d.Name + "-" + podTemplateSpecHash, + Name: d.Name + "-" + rand.SafeEncodeString(podTemplateSpecHash), Namespace: d.Namespace, OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(d, controllerKind)}, }, diff --git a/pkg/controller/history/BUILD b/pkg/controller/history/BUILD index 6b3b0baf842..39ade7b6945 100644 --- a/pkg/controller/history/BUILD +++ b/pkg/controller/history/BUILD @@ -41,6 +41,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", "//vendor/k8s.io/client-go/informers/apps/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/listers/apps/v1beta1:go_default_library", diff --git a/pkg/controller/history/controller_history.go b/pkg/controller/history/controller_history.go index 1c3332ab092..40281adcf1b 100644 --- a/pkg/controller/history/controller_history.go +++ b/pkg/controller/history/controller_history.go @@ -37,6 +37,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/retry" ) @@ -50,7 +51,8 @@ func ControllerRevisionName(prefix string, hash uint32) string { if len(prefix) > 223 { prefix = prefix[:223] } - return fmt.Sprintf("%s-%d", prefix, hash) + + return fmt.Sprintf("%s-%s", prefix, rand.SafeEncodeString(strconv.FormatInt(int64(hash), 10))) } // NewControllerRevision returns a ControllerRevision with a ControllerRef pointing to parent and indicating that 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 daa0e1b2c84..4c593b3c4b3 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/rand/rand.go @@ -83,3 +83,13 @@ func String(length int) string { } return string(b) } + +// 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)) + for i, b := range []rune(s) { + r[i] = alphanums[(int(b) % len(alphanums))] + } + return string(r) +}