Skip to content

Commit f902570

Browse files
pooyaruncom
authored andcommitted
BACKPORT: Handle containers with different network drivers
Upstream reference: moby/libnetwork#1480 Fix BZ#1446526 There is no guarantees that the ep and extEp are using the same driver. If they are not using the same drivers, the driver for ep will not know about the networks of extEp and fails the RevokeExternalConnectivity call. Signed-off-by: Shayan Pooya <[email protected]> Signed-off-by: Antonio Murdaca <[email protected]>
1 parent 92b10e4 commit f902570

File tree

1 file changed

+19
-3
lines changed
  • vendor/src/github.com/docker/libnetwork

1 file changed

+19
-3
lines changed

vendor/src/github.com/docker/libnetwork/endpoint.go

+19-3
Original file line numberDiff line numberDiff line change
@@ -513,14 +513,22 @@ func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) error {
513513
if moveExtConn {
514514
if extEp != nil {
515515
log.Debugf("Revoking external connectivity on endpoint %s (%s)", extEp.Name(), extEp.ID())
516-
if err = d.RevokeExternalConnectivity(extEp.network.ID(), extEp.ID()); err != nil {
516+
extN, err := extEp.getNetworkFromStore()
517+
if err != nil {
518+
return fmt.Errorf("failed to get network from store during join: %v", err)
519+
}
520+
extD, err := extN.driver(true)
521+
if err != nil {
522+
return fmt.Errorf("failed to join endpoint: %v", err)
523+
}
524+
if err = extD.RevokeExternalConnectivity(extEp.network.ID(), extEp.ID()); err != nil {
517525
return types.InternalErrorf(
518526
"driver failed revoking external connectivity on endpoint %s (%s): %v",
519527
extEp.Name(), extEp.ID(), err)
520528
}
521529
defer func() {
522530
if err != nil {
523-
if e := d.ProgramExternalConnectivity(extEp.network.ID(), extEp.ID(), sb.Labels()); e != nil {
531+
if e := extD.ProgramExternalConnectivity(extEp.network.ID(), extEp.ID(), sb.Labels()); e != nil {
524532
log.Warnf("Failed to roll-back external connectivity on endpoint %s (%s): %v",
525533
extEp.Name(), extEp.ID(), e)
526534
}
@@ -699,7 +707,15 @@ func (ep *endpoint) sbLeave(sb *sandbox, force bool, options ...EndpointOption)
699707
extEp = sb.getGatewayEndpoint()
700708
if moveExtConn && extEp != nil {
701709
log.Debugf("Programming external connectivity on endpoint %s (%s)", extEp.Name(), extEp.ID())
702-
if err := d.ProgramExternalConnectivity(extEp.network.ID(), extEp.ID(), sb.Labels()); err != nil {
710+
extN, err := extEp.getNetworkFromStore()
711+
if err != nil {
712+
return fmt.Errorf("failed to get network from store during leave: %v", err)
713+
}
714+
extD, err := extN.driver(true)
715+
if err != nil {
716+
return fmt.Errorf("failed to leave endpoint: %v", err)
717+
}
718+
if err := extD.ProgramExternalConnectivity(extEp.network.ID(), extEp.ID(), sb.Labels()); err != nil {
703719
log.Warnf("driver failed programming external connectivity on endpoint %s: (%s) %v",
704720
extEp.Name(), extEp.ID(), err)
705721
}

0 commit comments

Comments
 (0)