handle dns response from cni
when cni returns a list of dns servers, we should add them under the right conditions. the defined conditions are as follows: - if the user provides dns, it and only it are added. - if not above and you get a cni name server, it is added and a forwarding dns instance is created for what was in resolv.conf. - if not either above, the entries from the host's resolv.conf are used. Signed-off-by: baude <bbaude@redhat.com> Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
		
							parent
							
								
									03344fff1c
								
							
						
					
					
						commit
						8818e358bf
					
				|  | @ -1039,6 +1039,11 @@ func (c *Container) makeBindMounts() error { | ||||||
| 
 | 
 | ||||||
| // generateResolvConf generates a containers resolv.conf
 | // generateResolvConf generates a containers resolv.conf
 | ||||||
| func (c *Container) generateResolvConf() (string, error) { | func (c *Container) generateResolvConf() (string, error) { | ||||||
|  | 	var ( | ||||||
|  | 		nameservers    []string | ||||||
|  | 		cniNameServers []string | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
| 	resolvConf := "/etc/resolv.conf" | 	resolvConf := "/etc/resolv.conf" | ||||||
| 	for _, namespace := range c.config.Spec.Linux.Namespaces { | 	for _, namespace := range c.config.Spec.Linux.Namespaces { | ||||||
| 		if namespace.Type == spec.NetworkNamespace { | 		if namespace.Type == spec.NetworkNamespace { | ||||||
|  | @ -1074,18 +1079,31 @@ func (c *Container) generateResolvConf() (string, error) { | ||||||
| 		return "", errors.Wrapf(err, "error parsing host resolv.conf") | 		return "", errors.Wrapf(err, "error parsing host resolv.conf") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Make a new resolv.conf
 | 	// Check if CNI gave back and DNS servers for us to add in
 | ||||||
| 	nameservers := resolvconf.GetNameservers(resolv.Content) | 	cniResponse := c.state.NetworkStatus | ||||||
| 	// slirp4netns has a built in DNS server.
 | 	for _, i := range cniResponse { | ||||||
| 	if c.config.NetMode.IsSlirp4netns() { | 		if i.DNS.Nameservers != nil { | ||||||
| 		nameservers = append([]string{"10.0.2.3"}, nameservers...) | 			cniNameServers = append(cniNameServers, i.DNS.Nameservers...) | ||||||
|  | 			logrus.Debugf("adding nameserver(s) from cni response of '%q'", i.DNS.Nameservers) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	// If the user provided dns, it trumps all; then dns masq; then resolv.conf
 | ||||||
| 	if len(c.config.DNSServer) > 0 { | 	if len(c.config.DNSServer) > 0 { | ||||||
| 		// We store DNS servers as net.IP, so need to convert to string
 | 		// We store DNS servers as net.IP, so need to convert to string
 | ||||||
| 		nameservers = []string{} |  | ||||||
| 		for _, server := range c.config.DNSServer { | 		for _, server := range c.config.DNSServer { | ||||||
| 			nameservers = append(nameservers, server.String()) | 			nameservers = append(nameservers, server.String()) | ||||||
| 		} | 		} | ||||||
|  | 	} else if len(cniNameServers) > 0 { | ||||||
|  | 		nameservers = append(nameservers, cniNameServers...) | ||||||
|  | 	} else { | ||||||
|  | 		// Make a new resolv.conf
 | ||||||
|  | 		nameservers = resolvconf.GetNameservers(resolv.Content) | ||||||
|  | 		// slirp4netns has a built in DNS server.
 | ||||||
|  | 		if c.config.NetMode.IsSlirp4netns() { | ||||||
|  | 			nameservers = append([]string{"10.0.2.3"}, nameservers...) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	search := resolvconf.GetSearchDomains(resolv.Content) | 	search := resolvconf.GetSearchDomains(resolv.Content) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue