github.com/moby/docker@v26.1.3+incompatible/api/server/router/container/container_routes_test.go (about)

     1  package container
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/docker/docker/api/types/container"
     7  	"github.com/docker/docker/api/types/network"
     8  	"gotest.tools/v3/assert"
     9  	is "gotest.tools/v3/assert/cmp"
    10  )
    11  
    12  func TestHandleMACAddressBC(t *testing.T) {
    13  	testcases := []struct {
    14  		name                string
    15  		apiVersion          string
    16  		ctrWideMAC          string
    17  		networkMode         container.NetworkMode
    18  		epConfig            map[string]*network.EndpointSettings
    19  		expEpWithCtrWideMAC string
    20  		expEpWithNoMAC      string
    21  		expCtrWideMAC       string
    22  		expWarning          string
    23  		expError            string
    24  	}{
    25  		{
    26  			name:                "old api ctr-wide mac mix id and name",
    27  			apiVersion:          "1.43",
    28  			ctrWideMAC:          "11:22:33:44:55:66",
    29  			networkMode:         "aNetId",
    30  			epConfig:            map[string]*network.EndpointSettings{"aNetName": {}},
    31  			expEpWithCtrWideMAC: "aNetName",
    32  			expCtrWideMAC:       "11:22:33:44:55:66",
    33  		},
    34  		{
    35  			name:           "old api clear ep mac",
    36  			apiVersion:     "1.43",
    37  			networkMode:    "aNetId",
    38  			epConfig:       map[string]*network.EndpointSettings{"aNetName": {MacAddress: "11:22:33:44:55:66"}},
    39  			expEpWithNoMAC: "aNetName",
    40  		},
    41  		{
    42  			name:          "old api no-network ctr-wide mac",
    43  			apiVersion:    "1.43",
    44  			networkMode:   "none",
    45  			ctrWideMAC:    "11:22:33:44:55:66",
    46  			expError:      "conflicting options: mac-address and the network mode",
    47  			expCtrWideMAC: "11:22:33:44:55:66",
    48  		},
    49  		{
    50  			name:                "old api create ep",
    51  			apiVersion:          "1.43",
    52  			networkMode:         "aNetId",
    53  			ctrWideMAC:          "11:22:33:44:55:66",
    54  			epConfig:            map[string]*network.EndpointSettings{},
    55  			expEpWithCtrWideMAC: "aNetId",
    56  			expCtrWideMAC:       "11:22:33:44:55:66",
    57  		},
    58  		{
    59  			name:                "old api migrate ctr-wide mac",
    60  			apiVersion:          "1.43",
    61  			ctrWideMAC:          "11:22:33:44:55:66",
    62  			networkMode:         "aNetName",
    63  			epConfig:            map[string]*network.EndpointSettings{"aNetName": {}},
    64  			expEpWithCtrWideMAC: "aNetName",
    65  			expCtrWideMAC:       "11:22:33:44:55:66",
    66  		},
    67  		{
    68  			name:        "new api no macs",
    69  			apiVersion:  "1.44",
    70  			networkMode: "aNetId",
    71  			epConfig:    map[string]*network.EndpointSettings{"aNetName": {}},
    72  		},
    73  		{
    74  			name:        "new api ep specific mac",
    75  			apiVersion:  "1.44",
    76  			networkMode: "aNetName",
    77  			epConfig:    map[string]*network.EndpointSettings{"aNetName": {MacAddress: "11:22:33:44:55:66"}},
    78  		},
    79  		{
    80  			name:                "new api migrate ctr-wide mac to new ep",
    81  			apiVersion:          "1.44",
    82  			ctrWideMAC:          "11:22:33:44:55:66",
    83  			networkMode:         "aNetName",
    84  			epConfig:            map[string]*network.EndpointSettings{},
    85  			expEpWithCtrWideMAC: "aNetName",
    86  			expWarning:          "The container-wide MacAddress field is now deprecated",
    87  			expCtrWideMAC:       "",
    88  		},
    89  		{
    90  			name:                "new api migrate ctr-wide mac to existing ep",
    91  			apiVersion:          "1.44",
    92  			ctrWideMAC:          "11:22:33:44:55:66",
    93  			networkMode:         "aNetName",
    94  			epConfig:            map[string]*network.EndpointSettings{"aNetName": {}},
    95  			expEpWithCtrWideMAC: "aNetName",
    96  			expWarning:          "The container-wide MacAddress field is now deprecated",
    97  			expCtrWideMAC:       "",
    98  		},
    99  		{
   100  			name:          "new api mode vs name mismatch",
   101  			apiVersion:    "1.44",
   102  			ctrWideMAC:    "11:22:33:44:55:66",
   103  			networkMode:   "aNetId",
   104  			epConfig:      map[string]*network.EndpointSettings{"aNetName": {}},
   105  			expError:      "if a container-wide MAC address is supplied, HostConfig.NetworkMode must match the identity of a network in NetworkSettings.Networks",
   106  			expCtrWideMAC: "11:22:33:44:55:66",
   107  		},
   108  		{
   109  			name:          "new api mac mismatch",
   110  			apiVersion:    "1.44",
   111  			ctrWideMAC:    "11:22:33:44:55:66",
   112  			networkMode:   "aNetName",
   113  			epConfig:      map[string]*network.EndpointSettings{"aNetName": {MacAddress: "00:11:22:33:44:55"}},
   114  			expError:      "the container-wide MAC address must match the endpoint-specific MAC address",
   115  			expCtrWideMAC: "11:22:33:44:55:66",
   116  		},
   117  	}
   118  
   119  	for _, tc := range testcases {
   120  		t.Run(tc.name, func(t *testing.T) {
   121  			cfg := &container.Config{
   122  				MacAddress: tc.ctrWideMAC, //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44.
   123  			}
   124  			hostCfg := &container.HostConfig{
   125  				NetworkMode: tc.networkMode,
   126  			}
   127  			epConfig := make(map[string]*network.EndpointSettings, len(tc.epConfig))
   128  			for k, v := range tc.epConfig {
   129  				v := v
   130  				epConfig[k] = v
   131  			}
   132  			netCfg := &network.NetworkingConfig{
   133  				EndpointsConfig: epConfig,
   134  			}
   135  
   136  			warning, err := handleMACAddressBC(cfg, hostCfg, netCfg, tc.apiVersion)
   137  
   138  			if tc.expError == "" {
   139  				assert.Check(t, err)
   140  			} else {
   141  				assert.Check(t, is.ErrorContains(err, tc.expError))
   142  			}
   143  			if tc.expWarning == "" {
   144  				assert.Check(t, is.Equal(warning, ""))
   145  			} else {
   146  				assert.Check(t, is.Contains(warning, tc.expWarning))
   147  			}
   148  			if tc.expEpWithCtrWideMAC != "" {
   149  				got := netCfg.EndpointsConfig[tc.expEpWithCtrWideMAC].MacAddress
   150  				assert.Check(t, is.Equal(got, tc.ctrWideMAC))
   151  			}
   152  			if tc.expEpWithNoMAC != "" {
   153  				got := netCfg.EndpointsConfig[tc.expEpWithNoMAC].MacAddress
   154  				assert.Check(t, is.Equal(got, ""))
   155  			}
   156  			gotCtrWideMAC := cfg.MacAddress //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44.
   157  			assert.Check(t, is.Equal(gotCtrWideMAC, tc.expCtrWideMAC))
   158  		})
   159  	}
   160  }