Merge pull request #9730 from thockin/main

CRI: An empty DNSConfig != unspecified
This commit is contained in:
Derek McGowan 2024-02-02 17:32:45 +00:00 committed by GitHub
commit db1e16da34
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 85 additions and 13 deletions

View File

@ -268,25 +268,21 @@ func (c *Controller) setupSandboxFiles(id string, config *runtime.PodSandboxConf
} }
// Set DNS options. Maintain a resolv.conf for the sandbox. // Set DNS options. Maintain a resolv.conf for the sandbox.
var err error resolvPath := c.getResolvPath(id)
resolvContent := ""
if dnsConfig := config.GetDnsConfig(); dnsConfig != nil { if dnsConfig := config.GetDnsConfig(); dnsConfig != nil {
resolvContent, err = parseDNSOptions(dnsConfig.Servers, dnsConfig.Searches, dnsConfig.Options) resolvContent, err := parseDNSOptions(dnsConfig.Servers, dnsConfig.Searches, dnsConfig.Options)
if err != nil { if err != nil {
return fmt.Errorf("failed to parse sandbox DNSConfig %+v: %w", dnsConfig, err) return fmt.Errorf("failed to parse sandbox DNSConfig %+v: %w", dnsConfig, err)
} }
} if err := c.os.WriteFile(resolvPath, []byte(resolvContent), 0644); err != nil {
resolvPath := c.getResolvPath(id) return fmt.Errorf("failed to write resolv content to %q: %w", resolvPath, err)
if resolvContent == "" {
// copy host's resolv.conf to resolvPath
err = c.os.CopyFile(resolvConfPath, resolvPath, 0644)
if err != nil {
return fmt.Errorf("failed to copy host's resolv.conf to %q: %w", resolvPath, err)
} }
} else { } else {
err = c.os.WriteFile(resolvPath, []byte(resolvContent), 0644) // The DnsConfig was nil - we interpret that to mean "use the global
if err != nil { // default", which is dubious but backwards-compatible.
return fmt.Errorf("failed to write resolv content to %q: %w", resolvPath, err) if err := c.os.CopyFile(resolvConfPath, resolvPath, 0644); err != nil {
return fmt.Errorf("failed to copy host's resolv.conf to %q: %w", resolvPath, err)
} }
} }

View File

@ -511,6 +511,82 @@ options timeout:1
}, },
}, },
}, },
{
desc: "should create empty /etc/resolv.conf if DNSOptions is empty",
dnsConfig: &runtime.DNSConfig{},
ipcMode: runtime.NamespaceMode_NODE,
expectedCalls: []ostesting.CalledDetail{
{
Name: "Hostname",
},
{
Name: "WriteFile",
Arguments: []interface{}{
filepath.Join(testRootDir, sandboxesDir, testID, "hostname"),
[]byte(realhostname + "\n"),
os.FileMode(0644),
},
},
{
Name: "CopyFile",
Arguments: []interface{}{
"/etc/hosts",
filepath.Join(testRootDir, sandboxesDir, testID, "hosts"),
os.FileMode(0644),
},
},
{
Name: "WriteFile",
Arguments: []interface{}{
filepath.Join(testRootDir, sandboxesDir, testID, "resolv.conf"),
[]byte{},
os.FileMode(0644),
},
},
{
Name: "Stat",
Arguments: []interface{}{"/dev/shm"},
},
},
},
{
desc: "should copy host /etc/resolv.conf if DNSOptions is not set",
dnsConfig: nil,
ipcMode: runtime.NamespaceMode_NODE,
expectedCalls: []ostesting.CalledDetail{
{
Name: "Hostname",
},
{
Name: "WriteFile",
Arguments: []interface{}{
filepath.Join(testRootDir, sandboxesDir, testID, "hostname"),
[]byte(realhostname + "\n"),
os.FileMode(0644),
},
},
{
Name: "CopyFile",
Arguments: []interface{}{
"/etc/hosts",
filepath.Join(testRootDir, sandboxesDir, testID, "hosts"),
os.FileMode(0644),
},
},
{
Name: "CopyFile",
Arguments: []interface{}{
filepath.Join("/etc/resolv.conf"),
filepath.Join(testRootDir, sandboxesDir, testID, "resolv.conf"),
os.FileMode(0644),
},
},
{
Name: "Stat",
Arguments: []interface{}{"/dev/shm"},
},
},
},
{ {
desc: "should create sandbox shm when ipc namespace mode is not NODE", desc: "should create sandbox shm when ipc namespace mode is not NODE",
ipcMode: runtime.NamespaceMode_POD, ipcMode: runtime.NamespaceMode_POD,