github.com/xeptore/docker-cli@v20.10.14+incompatible/cli/command/network/create_test.go (about) 1 package network 2 3 import ( 4 "context" 5 "io/ioutil" 6 "strings" 7 "testing" 8 9 "github.com/docker/cli/internal/test" 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/network" 12 "github.com/pkg/errors" 13 "gotest.tools/v3/assert" 14 is "gotest.tools/v3/assert/cmp" 15 ) 16 17 func TestNetworkCreateErrors(t *testing.T) { 18 testCases := []struct { 19 args []string 20 flags map[string]string 21 networkCreateFunc func(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) 22 expectedError string 23 }{ 24 { 25 expectedError: "exactly 1 argument", 26 }, 27 { 28 args: []string{"toto"}, 29 networkCreateFunc: func(ctx context.Context, name string, createBody types.NetworkCreate) (types.NetworkCreateResponse, error) { 30 return types.NetworkCreateResponse{}, errors.Errorf("error creating network") 31 }, 32 expectedError: "error creating network", 33 }, 34 { 35 args: []string{"toto"}, 36 flags: map[string]string{ 37 "ip-range": "255.255.0.0/24", 38 "gateway": "255.0.255.0/24", 39 "subnet": "10.1.2.0.30.50", 40 }, 41 expectedError: "invalid CIDR address: 10.1.2.0.30.50", 42 }, 43 { 44 args: []string{"toto"}, 45 flags: map[string]string{ 46 "ip-range": "255.255.0.0.30/24", 47 "gateway": "255.0.255.0/24", 48 "subnet": "255.0.0.0/24", 49 }, 50 expectedError: "invalid CIDR address: 255.255.0.0.30/24", 51 }, 52 { 53 args: []string{"toto"}, 54 flags: map[string]string{ 55 "gateway": "255.0.0.0/24", 56 }, 57 expectedError: "every ip-range or gateway must have a corresponding subnet", 58 }, 59 { 60 args: []string{"toto"}, 61 flags: map[string]string{ 62 "ip-range": "255.0.0.0/24", 63 }, 64 expectedError: "every ip-range or gateway must have a corresponding subnet", 65 }, 66 { 67 args: []string{"toto"}, 68 flags: map[string]string{ 69 "ip-range": "255.0.0.0/24", 70 "gateway": "255.0.0.0/24", 71 }, 72 expectedError: "every ip-range or gateway must have a corresponding subnet", 73 }, 74 { 75 args: []string{"toto"}, 76 flags: map[string]string{ 77 "ip-range": "255.255.0.0/24", 78 "gateway": "255.0.255.0/24", 79 "subnet": "10.1.2.0/23,10.1.3.248/30", 80 }, 81 expectedError: "multiple overlapping subnet configuration is not supported", 82 }, 83 { 84 args: []string{"toto"}, 85 flags: map[string]string{ 86 "ip-range": "192.168.1.0/24,192.168.1.200/24", 87 "gateway": "192.168.1.1,192.168.1.4", 88 "subnet": "192.168.2.0/24,192.168.1.250/24", 89 }, 90 expectedError: "cannot configure multiple ranges (192.168.1.200/24, 192.168.1.0/24) on the same subnet (192.168.1.250/24)", 91 }, 92 { 93 args: []string{"toto"}, 94 flags: map[string]string{ 95 "ip-range": "255.255.200.0/24,255.255.120.0/24", 96 "gateway": "255.0.255.0/24", 97 "subnet": "255.255.255.0/24,255.255.0.255/24", 98 }, 99 expectedError: "no matching subnet for range 255.255.200.0/24", 100 }, 101 { 102 args: []string{"toto"}, 103 flags: map[string]string{ 104 "ip-range": "192.168.1.0/24", 105 "gateway": "192.168.1.1,192.168.1.4", 106 "subnet": "192.168.2.0/24,192.168.1.250/24", 107 }, 108 expectedError: "cannot configure multiple gateways (192.168.1.4, 192.168.1.1) for the same subnet (192.168.1.250/24)", 109 }, 110 { 111 args: []string{"toto"}, 112 flags: map[string]string{ 113 "ip-range": "192.168.1.0/24", 114 "gateway": "192.168.4.1,192.168.5.4", 115 "subnet": "192.168.2.0/24,192.168.1.250/24", 116 }, 117 expectedError: "no matching subnet for gateway 192.168.4.1", 118 }, 119 { 120 args: []string{"toto"}, 121 flags: map[string]string{ 122 "gateway": "255.255.0.0/24", 123 "subnet": "255.255.0.0/24", 124 "aux-address": "255.255.0.30/24", 125 }, 126 expectedError: "no matching subnet for aux-address", 127 }, 128 } 129 130 for _, tc := range testCases { 131 cmd := newCreateCommand( 132 test.NewFakeCli(&fakeClient{ 133 networkCreateFunc: tc.networkCreateFunc, 134 }), 135 ) 136 cmd.SetArgs(tc.args) 137 for key, value := range tc.flags { 138 assert.NilError(t, cmd.Flags().Set(key, value)) 139 } 140 cmd.SetOut(ioutil.Discard) 141 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 142 143 } 144 } 145 func TestNetworkCreateWithFlags(t *testing.T) { 146 expectedDriver := "foo" 147 expectedOpts := []network.IPAMConfig{ 148 { 149 Subnet: "192.168.4.0/24", 150 IPRange: "192.168.4.0/24", 151 Gateway: "192.168.4.1/24", 152 AuxAddress: map[string]string{}, 153 }, 154 } 155 cli := test.NewFakeCli(&fakeClient{ 156 networkCreateFunc: func(ctx context.Context, name string, createBody types.NetworkCreate) (types.NetworkCreateResponse, error) { 157 assert.Check(t, is.Equal(expectedDriver, createBody.Driver), "not expected driver error") 158 assert.Check(t, is.DeepEqual(expectedOpts, createBody.IPAM.Config), "not expected driver error") 159 return types.NetworkCreateResponse{ 160 ID: name, 161 }, nil 162 }, 163 }) 164 args := []string{"banana"} 165 cmd := newCreateCommand(cli) 166 167 cmd.SetArgs(args) 168 cmd.Flags().Set("driver", "foo") 169 cmd.Flags().Set("ip-range", "192.168.4.0/24") 170 cmd.Flags().Set("gateway", "192.168.4.1/24") 171 cmd.Flags().Set("subnet", "192.168.4.0/24") 172 assert.NilError(t, cmd.Execute()) 173 assert.Check(t, is.Equal("banana", strings.TrimSpace(cli.OutBuffer().String()))) 174 }