From b1ce4b7a1d7088433b0202c06e1ae5b3f815c94c Mon Sep 17 00:00:00 2001 From: Random-Liu Date: Fri, 31 Mar 2017 13:52:26 -0700 Subject: [PATCH] Use DNSOptions passed by CRI in dockershim. --- pkg/kubelet/dockershim/docker_sandbox.go | 53 +++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/dockershim/docker_sandbox.go b/pkg/kubelet/dockershim/docker_sandbox.go index d83d68f3715..82bd130e8aa 100644 --- a/pkg/kubelet/dockershim/docker_sandbox.go +++ b/pkg/kubelet/dockershim/docker_sandbox.go @@ -18,6 +18,8 @@ package dockershim import ( "fmt" + "os" + "strings" dockertypes "github.com/docker/engine-api/types" dockercontainer "github.com/docker/engine-api/types/container" @@ -105,7 +107,7 @@ func (ds *dockerService) RunPodSandbox(config *runtimeapi.PodSandboxConfig) (str return createResp.ID, fmt.Errorf("failed to inspect sandbox container for pod %q: %v", config.Metadata.Name, err) } - if err := dockertools.RewriteResolvFile(containerInfo.ResolvConfPath, dnsConfig.Servers, dnsConfig.Searches, len(dnsConfig.Options) > 0); err != nil { + if err := rewriteResolvFile(containerInfo.ResolvConfPath, dnsConfig.Servers, dnsConfig.Searches, dnsConfig.Options); err != nil { return createResp.ID, fmt.Errorf("rewrite resolv.conf failed for pod %q: %v", config.Metadata.Name, err) } } @@ -587,3 +589,52 @@ func toCheckpointProtocol(protocol runtimeapi.Protocol) Protocol { glog.Warningf("Unknown protocol %q: defaulting to TCP", protocol) return protocolTCP } + +// rewriteResolvFile rewrites resolv.conf file generated by docker. +func rewriteResolvFile(resolvFilePath string, dns []string, dnsSearch []string, dnsOptions []string) error { + if len(resolvFilePath) == 0 { + glog.Errorf("ResolvConfPath is empty.") + return nil + } + + if _, err := os.Stat(resolvFilePath); os.IsNotExist(err) { + return fmt.Errorf("ResolvConfPath %q does not exist", resolvFilePath) + } + + var resolvFileContent []string + for _, srv := range dns { + resolvFileContent = append(resolvFileContent, "nameserver "+srv) + } + + if len(dnsSearch) > 0 { + resolvFileContent = append(resolvFileContent, "search "+strings.Join(dnsSearch, " ")) + } + + if len(dnsOptions) > 0 { + resolvFileContent = append(resolvFileContent, "options "+strings.Join(dnsOptions, " ")) + } + + if len(resolvFileContent) > 0 { + resolvFileContentStr := strings.Join(resolvFileContent, "\n") + resolvFileContentStr += "\n" + + glog.V(4).Infof("Will attempt to re-write config file %s with: \n%s", resolvFilePath, resolvFileContent) + if err := rewriteFile(resolvFilePath, resolvFileContentStr); err != nil { + glog.Errorf("resolv.conf could not be updated: %v", err) + return err + } + } + + return nil +} + +func rewriteFile(filePath, stringToWrite string) error { + f, err := os.OpenFile(filePath, os.O_TRUNC|os.O_WRONLY, 0644) + if err != nil { + return err + } + defer f.Close() + + _, err = f.WriteString(stringToWrite) + return err +}