-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rkt: Don't require port_map with host networking #3615
Conversation
Also don't try to return a DriverNetwork with host networking. None will ever exist as that's the point of host networking: rkt won't create a network namespace.
0294a02
to
730e2aa
Compare
if len(driverConfig.PortMap) != 0 { | ||
pluginClient.Kill() | ||
return nil, fmt.Errorf("Trying to map ports but driver could not determine network information") | ||
} | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am concerned about nil pointer dereferencing in downstream code like
nomad/command/agent/consul/client.go
Line 575 in a52cb34
if net.Advertise() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So I have regrets about how I implemented DriverNetwork
, but it was designed to gracefully handle nil
s since the vast majority of drivers don't implement it (so they return nil).
Lines 199 to 201 in 730e2aa
// Network may be nil as not all drivers or configurations create | |
// networks. | |
Network *cstructs.DriverNetwork |
And if you look at each of the methods on DriverNetwork they handle nil
:
nomad/client/structs/structs.go
Lines 134 to 186 in 730e2aa
// DriverNetwork is the network created by driver's (eg Docker's bridge | |
// network) during Prestart. | |
type DriverNetwork struct { | |
// PortMap can be set by drivers to replace ports in environment | |
// variables with driver-specific mappings. | |
PortMap map[string]int | |
// IP is the IP address for the task created by the driver. | |
IP string | |
// AutoAdvertise indicates whether the driver thinks services that | |
// choose to auto-advertise-addresses should use this IP instead of the | |
// host's. eg If a Docker network plugin is used | |
AutoAdvertise bool | |
} | |
// Advertise returns true if the driver suggests using the IP set. May be | |
// called on a nil Network in which case it returns false. | |
func (d *DriverNetwork) Advertise() bool { | |
return d != nil && d.AutoAdvertise | |
} | |
// Copy a DriverNetwork struct. If it is nil, nil is returned. | |
func (d *DriverNetwork) Copy() *DriverNetwork { | |
if d == nil { | |
return nil | |
} | |
pm := make(map[string]int, len(d.PortMap)) | |
for k, v := range d.PortMap { | |
pm[k] = v | |
} | |
return &DriverNetwork{ | |
PortMap: pm, | |
IP: d.IP, | |
AutoAdvertise: d.AutoAdvertise, | |
} | |
} | |
// Hash the contents of a DriverNetwork struct to detect changes. If it is nil, | |
// an empty slice is returned. | |
func (d *DriverNetwork) Hash() []byte { | |
if d == nil { | |
return []byte{} | |
} | |
h := md5.New() | |
io.WriteString(h, d.IP) | |
io.WriteString(h, strconv.FormatBool(d.AutoAdvertise)) | |
for k, v := range d.PortMap { | |
io.WriteString(h, k) | |
io.WriteString(h, strconv.Itoa(v)) | |
} | |
return h.Sum(nil) | |
} |
Definitely something worth changing/fixing in the future, but I think it's out of scope for this PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed, thanks for the explain.
Actually, |
I'm going to lock this pull request because it has been closed for 120 days ⏳. This helps our maintainers find and focus on the active contributions. |
Also don't try to return a DriverNetwork with host networking. None will
ever exist as that's the point of host networking: rkt won't create a
network namespace.