From 07630b570a18cd11e7ce68103f5f326658a7ee69 Mon Sep 17 00:00:00 2001 From: Nitesh Konkar Date: Wed, 4 Sep 2019 16:43:27 +0530 Subject: [PATCH] virtcontainers: Set sandbox dns in sandbox request If ociMounts has DNS file /etc/resolv.conf present, then pass the dns as part of CreateSandboxRequest to the agent. Depends-on: github.com/kata-containers/agent#625 Fixes: #1603 Signed-off-by: Nitesh Konkar --- virtcontainers/kata_agent.go | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index c933971106..7a85437318 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -87,6 +87,7 @@ var ( grpcMaxDataSize = int64(1024 * 1024) localDirOptions = []string{"mode=0777"} maxHostnameLen = 64 + GuestDNSFile = "/etc/resolv.conf" ) const ( @@ -742,6 +743,34 @@ func (k *kataAgent) setProxyFromGrpc(proxy proxy, pid int, url string) { k.state.URL = url } +func (k *kataAgent) getDNS(sandbox *Sandbox) ([]string, error) { + ociSpecJSON, ok := sandbox.config.Annotations[vcAnnotations.ConfigJSONKey] + if !ok { + return nil, errorMissingOCISpec + } + + ociSpec := &specs.Spec{} + if err := json.Unmarshal([]byte(ociSpecJSON), ociSpec); err != nil { + return nil, err + } + + ociMounts := ociSpec.Mounts + + for _, m := range ociMounts { + if m.Destination == GuestDNSFile { + content, err := ioutil.ReadFile(m.Source) + if err != nil { + return nil, fmt.Errorf("Could not read file %s: %s", m.Source, err) + } + dns := strings.Split(string(content), "\n") + return dns, nil + + } + } + k.Logger().Debug("DNS file not present in ociMounts. Sandbox DNS will not be set.") + return nil, nil +} + func (k *kataAgent) startSandbox(sandbox *Sandbox) error { span, _ := k.trace("startSandbox") defer span.Finish() @@ -756,12 +785,16 @@ func (k *kataAgent) startSandbox(sandbox *Sandbox) error { k.proxy.stop(k.state.ProxyPid) } }() - hostname := sandbox.config.Hostname if len(hostname) > maxHostnameLen { hostname = hostname[:maxHostnameLen] } + dns, err := k.getDNS(sandbox) + if err != nil { + return err + } + // check grpc server is serving if err = k.check(); err != nil { return err @@ -787,6 +820,7 @@ func (k *kataAgent) startSandbox(sandbox *Sandbox) error { req := &grpc.CreateSandboxRequest{ Hostname: hostname, + Dns: dns, Storages: storages, SandboxPidns: sandbox.sharePidNs, SandboxId: sandbox.id,