|
@@ -13,8 +13,8 @@ import (
|
|
|
)
|
|
|
|
|
|
type link struct {
|
|
|
- parentIP string
|
|
|
- childIP string
|
|
|
+ parentIP net.IP
|
|
|
+ childIP net.IP
|
|
|
ports []types.TransportPort
|
|
|
bridge string
|
|
|
}
|
|
@@ -23,61 +23,52 @@ func (l *link) String() string {
|
|
|
return fmt.Sprintf("%s <-> %s [%v] on %s", l.parentIP, l.childIP, l.ports, l.bridge)
|
|
|
}
|
|
|
|
|
|
-func newLink(parentIP, childIP string, ports []types.TransportPort, bridge string) *link {
|
|
|
+func newLink(parentIP, childIP net.IP, ports []types.TransportPort, bridge string) (*link, error) {
|
|
|
+ if parentIP == nil {
|
|
|
+ return nil, fmt.Errorf("cannot link to a container with an empty parent IP address")
|
|
|
+ }
|
|
|
+ if childIP == nil {
|
|
|
+ return nil, fmt.Errorf("cannot link to a container with an empty child IP address")
|
|
|
+ }
|
|
|
+
|
|
|
return &link{
|
|
|
childIP: childIP,
|
|
|
parentIP: parentIP,
|
|
|
ports: ports,
|
|
|
bridge: bridge,
|
|
|
- }
|
|
|
+ }, nil
|
|
|
}
|
|
|
|
|
|
func (l *link) Enable() error {
|
|
|
- // -A == iptables append flag
|
|
|
linkFunction := func() error {
|
|
|
- return linkContainers("-A", l.parentIP, l.childIP, l.ports, l.bridge, false)
|
|
|
+ return linkContainers(iptables.Append, l.parentIP, l.childIP, l.ports, l.bridge, false)
|
|
|
+ }
|
|
|
+ if err := linkFunction(); err != nil {
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
- iptables.OnReloaded(func() { linkFunction() })
|
|
|
- return linkFunction()
|
|
|
+ iptables.OnReloaded(func() { _ = linkFunction() })
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func (l *link) Disable() {
|
|
|
- // -D == iptables delete flag
|
|
|
- err := linkContainers("-D", l.parentIP, l.childIP, l.ports, l.bridge, true)
|
|
|
- if err != nil {
|
|
|
- log.G(context.TODO()).Errorf("Error removing IPTables rules for a link %s due to %s", l.String(), err.Error())
|
|
|
+ if err := linkContainers(iptables.Delete, l.parentIP, l.childIP, l.ports, l.bridge, true); err != nil {
|
|
|
+ // @TODO: Return error once we have the iptables package return typed errors.
|
|
|
+ log.G(context.TODO()).WithError(err).Errorf("Error removing IPTables rules for link: %s", l.String())
|
|
|
}
|
|
|
- // Return proper error once we move to use a proper iptables package
|
|
|
- // that returns typed errors
|
|
|
}
|
|
|
|
|
|
-func linkContainers(action, parentIP, childIP string, ports []types.TransportPort, bridge string, ignoreErrors bool) error {
|
|
|
- var nfAction iptables.Action
|
|
|
-
|
|
|
- switch action {
|
|
|
- case "-A":
|
|
|
- nfAction = iptables.Append
|
|
|
- case "-I":
|
|
|
- nfAction = iptables.Insert
|
|
|
- case "-D":
|
|
|
- nfAction = iptables.Delete
|
|
|
- default:
|
|
|
- return fmt.Errorf("invalid iptables action: %s", action)
|
|
|
- }
|
|
|
-
|
|
|
- ip1 := net.ParseIP(parentIP)
|
|
|
- if ip1 == nil {
|
|
|
- return fmt.Errorf("cannot link to a container with an invalid parent IP address %q", parentIP)
|
|
|
+func linkContainers(action iptables.Action, parentIP, childIP net.IP, ports []types.TransportPort, bridge string, ignoreErrors bool) error {
|
|
|
+ if parentIP == nil {
|
|
|
+ return fmt.Errorf("cannot link to a container with an empty parent IP address")
|
|
|
}
|
|
|
- ip2 := net.ParseIP(childIP)
|
|
|
- if ip2 == nil {
|
|
|
- return fmt.Errorf("cannot link to a container with an invalid child IP address %q", childIP)
|
|
|
+ if childIP == nil {
|
|
|
+ return fmt.Errorf("cannot link to a container with an empty child IP address")
|
|
|
}
|
|
|
|
|
|
chain := iptables.ChainInfo{Name: DockerChain}
|
|
|
for _, port := range ports {
|
|
|
- err := chain.Link(nfAction, ip1, ip2, int(port.Port), port.Proto.String(), bridge)
|
|
|
+ err := chain.Link(action, parentIP, childIP, int(port.Port), port.Proto.String(), bridge)
|
|
|
if !ignoreErrors && err != nil {
|
|
|
return err
|
|
|
}
|