From e9f1b0f972ae136a84fa0ddb9d21e33bf17292de Mon Sep 17 00:00:00 2001 From: Random-Liu Date: Wed, 16 Nov 2016 17:42:39 -0800 Subject: [PATCH] Fix hostname truncate. --- pkg/kubelet/kubelet_pods.go | 26 +++++++++++++++++++++----- pkg/kubelet/kubelet_pods_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index d2b8406887b..c56f25745ef 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -228,13 +228,29 @@ func makePortMappings(container *api.Container) (ports []kubecontainer.PortMappi return } +// truncatePodHostnameIfNeeded truncates the pod hostname if it's longer than 63 chars. +func truncatePodHostnameIfNeeded(podName, hostname string) (string, error) { + // Cap hostname at 63 chars (specification is 64bytes which is 63 chars and the null terminating char). + const hostnameMaxLen = 63 + if len(hostname) <= hostnameMaxLen { + return hostname, nil + } + truncated := hostname[:hostnameMaxLen] + glog.Errorf("hostname for pod:%q was longer than %d. Truncated hostname to :%q", podName, hostnameMaxLen, truncated) + // hostname should not end with '-' or '.' + truncated = strings.TrimRight(truncated, "-.") + if len(truncated) == 0 { + // This should never happen. + return "", fmt.Errorf("hostname for pod %q was invalid: %q", podName, hostname) + } + return truncated, nil +} + // GeneratePodHostNameAndDomain creates a hostname and domain name for a pod, // given that pod's spec and annotations or returns an error. func (kl *Kubelet) GeneratePodHostNameAndDomain(pod *api.Pod) (string, string, error) { // TODO(vmarmol): Handle better. - // Cap hostname at 63 chars (specification is 64bytes which is 63 chars and the null terminating char). clusterDomain := kl.clusterDomain - const hostnameMaxLen = 63 podAnnotations := pod.Annotations if podAnnotations == nil { podAnnotations = make(map[string]string) @@ -252,9 +268,9 @@ func (kl *Kubelet) GeneratePodHostNameAndDomain(pod *api.Pod) (string, string, e hostname = hostnameCandidate } } - if len(hostname) > hostnameMaxLen { - hostname = hostname[:hostnameMaxLen] - glog.Errorf("hostname for pod:%q was longer than %d. Truncated hostname to :%q", pod.Name, hostnameMaxLen, hostname) + hostname, err := truncatePodHostnameIfNeeded(pod.Name, hostname) + if err != nil { + return "", "", err } hostDomain := "" diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index 6a02500d3a4..b38372e4c35 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -1494,3 +1494,32 @@ func TestHasHostNamespace(t *testing.T) { } } } + +func TestTruncatePodHostname(t *testing.T) { + for c, test := range map[string]struct { + input string + output string + }{ + "valid hostname": { + input: "test.pod.hostname", + output: "test.pod.hostname", + }, + "too long hostname": { + input: "1234567.1234567.1234567.1234567.1234567.1234567.1234567.1234567.1234567.", // 8*9=72 chars + output: "1234567.1234567.1234567.1234567.1234567.1234567.1234567.1234567", //8*8-1=63 chars + }, + "hostname end with .": { + input: "1234567.1234567.1234567.1234567.1234567.1234567.1234567.123456.1234567.", // 8*9-1=71 chars + output: "1234567.1234567.1234567.1234567.1234567.1234567.1234567.123456", //8*8-2=62 chars + }, + "hostname end with -": { + input: "1234567.1234567.1234567.1234567.1234567.1234567.1234567.123456-1234567.", // 8*9-1=71 chars + output: "1234567.1234567.1234567.1234567.1234567.1234567.1234567.123456", //8*8-2=62 chars + }, + } { + t.Logf("TestCase: %q", c) + output, err := truncatePodHostnameIfNeeded("test-pod", test.input) + assert.NoError(t, err) + assert.Equal(t, test.output, output) + } +}