github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/libnetwork/drivers/bridge/port_mapping_test.go (about)

     1  package bridge
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/docker/docker/pkg/reexec"
     8  	"github.com/docker/libnetwork/netlabel"
     9  	"github.com/docker/libnetwork/testutils"
    10  	"github.com/docker/libnetwork/types"
    11  )
    12  
    13  func TestMain(m *testing.M) {
    14  	if reexec.Init() {
    15  		return
    16  	}
    17  	os.Exit(m.Run())
    18  }
    19  
    20  func TestPortMappingConfig(t *testing.T) {
    21  	defer testutils.SetupTestOSContext(t)()
    22  	d := newDriver()
    23  
    24  	config := &configuration{
    25  		EnableIPTables: true,
    26  	}
    27  	genericOption := make(map[string]interface{})
    28  	genericOption[netlabel.GenericData] = config
    29  
    30  	if err := d.configure(genericOption); err != nil {
    31  		t.Fatalf("Failed to setup driver config: %v", err)
    32  	}
    33  
    34  	binding1 := types.PortBinding{Proto: types.UDP, Port: uint16(400), HostPort: uint16(54000)}
    35  	binding2 := types.PortBinding{Proto: types.TCP, Port: uint16(500), HostPort: uint16(65000)}
    36  	binding3 := types.PortBinding{Proto: types.SCTP, Port: uint16(300), HostPort: uint16(65000)}
    37  	portBindings := []types.PortBinding{binding1, binding2, binding3}
    38  
    39  	sbOptions := make(map[string]interface{})
    40  	sbOptions[netlabel.PortMap] = portBindings
    41  
    42  	netConfig := &networkConfiguration{
    43  		BridgeName: DefaultBridgeName,
    44  	}
    45  	netOptions := make(map[string]interface{})
    46  	netOptions[netlabel.GenericData] = netConfig
    47  
    48  	ipdList := getIPv4Data(t, "")
    49  	err := d.CreateNetwork("dummy", netOptions, nil, ipdList, nil)
    50  	if err != nil {
    51  		t.Fatalf("Failed to create bridge: %v", err)
    52  	}
    53  
    54  	te := newTestEndpoint(ipdList[0].Pool, 11)
    55  	err = d.CreateEndpoint("dummy", "ep1", te.Interface(), nil)
    56  	if err != nil {
    57  		t.Fatalf("Failed to create the endpoint: %s", err.Error())
    58  	}
    59  
    60  	if err = d.Join("dummy", "ep1", "sbox", te, sbOptions); err != nil {
    61  		t.Fatalf("Failed to join the endpoint: %v", err)
    62  	}
    63  
    64  	if err = d.ProgramExternalConnectivity("dummy", "ep1", sbOptions); err != nil {
    65  		t.Fatalf("Failed to program external connectivity: %v", err)
    66  	}
    67  
    68  	network, ok := d.networks["dummy"]
    69  	if !ok {
    70  		t.Fatalf("Cannot find network %s inside driver", "dummy")
    71  	}
    72  	ep, _ := network.endpoints["ep1"]
    73  	if len(ep.portMapping) != 3 {
    74  		t.Fatalf("Failed to store the port bindings into the sandbox info. Found: %v", ep.portMapping)
    75  	}
    76  	if ep.portMapping[0].Proto != binding1.Proto || ep.portMapping[0].Port != binding1.Port ||
    77  		ep.portMapping[1].Proto != binding2.Proto || ep.portMapping[1].Port != binding2.Port ||
    78  		ep.portMapping[2].Proto != binding3.Proto || ep.portMapping[2].Port != binding3.Port {
    79  		t.Fatal("bridgeEndpoint has incorrect port mapping values")
    80  	}
    81  	if ep.portMapping[0].HostIP == nil || ep.portMapping[0].HostPort == 0 ||
    82  		ep.portMapping[1].HostIP == nil || ep.portMapping[1].HostPort == 0 ||
    83  		ep.portMapping[2].HostIP == nil || ep.portMapping[2].HostPort == 0 {
    84  		t.Fatal("operational port mapping data not found on bridgeEndpoint")
    85  	}
    86  
    87  	// release host mapped ports
    88  	err = d.Leave("dummy", "ep1")
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	}
    92  
    93  	err = d.RevokeExternalConnectivity("dummy", "ep1")
    94  	if err != nil {
    95  		t.Fatal(err)
    96  	}
    97  }
    98  
    99  func TestPortMappingV6Config(t *testing.T) {
   100  	t.Skip("FIXME: circleci does not have proper IPv6 support")
   101  
   102  	defer testutils.SetupTestOSContext(t)()
   103  	d := newDriver()
   104  
   105  	config := &configuration{
   106  		EnableIPTables:  true,
   107  		EnableIP6Tables: true,
   108  	}
   109  	genericOption := make(map[string]interface{})
   110  	genericOption[netlabel.GenericData] = config
   111  
   112  	if err := d.configure(genericOption); err != nil {
   113  		t.Fatalf("Failed to setup driver config: %v", err)
   114  	}
   115  
   116  	portBindings := []types.PortBinding{
   117  		{Proto: types.UDP, Port: uint16(400), HostPort: uint16(54000)},
   118  		{Proto: types.TCP, Port: uint16(500), HostPort: uint16(65000)},
   119  		{Proto: types.SCTP, Port: uint16(500), HostPort: uint16(65000)},
   120  	}
   121  
   122  	sbOptions := make(map[string]interface{})
   123  	sbOptions[netlabel.PortMap] = portBindings
   124  	netConfig := &networkConfiguration{
   125  		BridgeName: DefaultBridgeName,
   126  		EnableIPv6: true,
   127  	}
   128  	netOptions := make(map[string]interface{})
   129  	netOptions[netlabel.GenericData] = netConfig
   130  
   131  	ipdList := getIPv4Data(t, "")
   132  	err := d.CreateNetwork("dummy", netOptions, nil, ipdList, nil)
   133  	if err != nil {
   134  		t.Fatalf("Failed to create bridge: %v", err)
   135  	}
   136  
   137  	te := newTestEndpoint(ipdList[0].Pool, 11)
   138  	err = d.CreateEndpoint("dummy", "ep1", te.Interface(), nil)
   139  	if err != nil {
   140  		t.Fatalf("Failed to create the endpoint: %s", err.Error())
   141  	}
   142  
   143  	if err = d.Join("dummy", "ep1", "sbox", te, sbOptions); err != nil {
   144  		t.Fatalf("Failed to join the endpoint: %v", err)
   145  	}
   146  
   147  	if err = d.ProgramExternalConnectivity("dummy", "ep1", sbOptions); err != nil {
   148  		t.Fatalf("Failed to program external connectivity: %v", err)
   149  	}
   150  
   151  	network, ok := d.networks["dummy"]
   152  	if !ok {
   153  		t.Fatalf("Cannot find network %s inside driver", "dummy")
   154  	}
   155  	ep, _ := network.endpoints["ep1"]
   156  	if len(ep.portMapping) != 6 {
   157  		t.Fatalf("Failed to store the port bindings into the sandbox info. Found: %v", ep.portMapping)
   158  	}
   159  
   160  	// release host mapped ports
   161  	err = d.Leave("dummy", "ep1")
   162  	if err != nil {
   163  		t.Fatal(err)
   164  	}
   165  
   166  	err = d.RevokeExternalConnectivity("dummy", "ep1")
   167  	if err != nil {
   168  		t.Fatal(err)
   169  	}
   170  }