github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/manager/controlapi/network_test.go (about) 1 package controlapi 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/docker/swarmkit/testutils" 8 9 "google.golang.org/grpc/codes" 10 11 "github.com/docker/swarmkit/api" 12 "github.com/docker/swarmkit/identity" 13 "github.com/docker/swarmkit/manager/state/store" 14 "github.com/stretchr/testify/assert" 15 ) 16 17 func createNetworkSpec(name string) *api.NetworkSpec { 18 return &api.NetworkSpec{ 19 Annotations: api.Annotations{ 20 Name: name, 21 }, 22 } 23 } 24 25 // createInternalNetwork creates an internal network for testing. it is the same 26 // as Server.CreateNetwork except without the label check. 27 func (s *Server) createInternalNetwork(ctx context.Context, request *api.CreateNetworkRequest) (*api.CreateNetworkResponse, error) { 28 if err := validateNetworkSpec(request.Spec, nil); err != nil { 29 return nil, err 30 } 31 32 // TODO(mrjana): Consider using `Name` as a primary key to handle 33 // duplicate creations. See #65 34 n := &api.Network{ 35 ID: identity.NewID(), 36 Spec: *request.Spec, 37 } 38 39 err := s.store.Update(func(tx store.Tx) error { 40 return store.CreateNetwork(tx, n) 41 }) 42 if err != nil { 43 return nil, err 44 } 45 46 return &api.CreateNetworkResponse{ 47 Network: n, 48 }, nil 49 } 50 51 func createServiceInNetworkSpec(name, image string, nwid string, instances uint64) *api.ServiceSpec { 52 return &api.ServiceSpec{ 53 Annotations: api.Annotations{ 54 Name: name, 55 Labels: map[string]string{ 56 "common": "yes", 57 "unique": name, 58 }, 59 }, 60 Task: api.TaskSpec{ 61 Runtime: &api.TaskSpec_Container{ 62 Container: &api.ContainerSpec{ 63 Image: image, 64 }, 65 }, 66 }, 67 Mode: &api.ServiceSpec_Replicated{ 68 Replicated: &api.ReplicatedService{ 69 Replicas: instances, 70 }, 71 }, 72 Networks: []*api.NetworkAttachmentConfig{ 73 { 74 Target: nwid, 75 }, 76 }, 77 } 78 } 79 80 func createServiceInNetwork(t *testing.T, ts *testServer, name, image string, nwid string, instances uint64) *api.Service { 81 spec := createServiceInNetworkSpec(name, image, nwid, instances) 82 r, err := ts.Client.CreateService(context.Background(), &api.CreateServiceRequest{Spec: spec}) 83 assert.NoError(t, err) 84 return r.Service 85 } 86 87 func TestValidateDriver(t *testing.T) { 88 assert.NoError(t, validateDriver(nil, nil, "")) 89 90 err := validateDriver(&api.Driver{Name: ""}, nil, "") 91 assert.Error(t, err) 92 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 93 } 94 95 func TestValidateIPAMConfiguration(t *testing.T) { 96 err := validateIPAMConfiguration(nil) 97 assert.Error(t, err) 98 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 99 100 IPAMConf := &api.IPAMConfig{ 101 Subnet: "", 102 } 103 104 err = validateIPAMConfiguration(IPAMConf) 105 assert.Error(t, err) 106 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 107 108 IPAMConf.Subnet = "bad" 109 err = validateIPAMConfiguration(IPAMConf) 110 assert.Error(t, err) 111 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 112 113 IPAMConf.Subnet = "192.168.0.0/16" 114 err = validateIPAMConfiguration(IPAMConf) 115 assert.NoError(t, err) 116 117 IPAMConf.Range = "bad" 118 err = validateIPAMConfiguration(IPAMConf) 119 assert.Error(t, err) 120 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 121 122 IPAMConf.Range = "192.169.1.0/24" 123 err = validateIPAMConfiguration(IPAMConf) 124 assert.Error(t, err) 125 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 126 127 IPAMConf.Range = "192.168.1.0/24" 128 err = validateIPAMConfiguration(IPAMConf) 129 assert.NoError(t, err) 130 131 IPAMConf.Gateway = "bad" 132 err = validateIPAMConfiguration(IPAMConf) 133 assert.Error(t, err) 134 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 135 136 IPAMConf.Gateway = "192.169.1.1" 137 err = validateIPAMConfiguration(IPAMConf) 138 assert.Error(t, err) 139 assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) 140 141 IPAMConf.Gateway = "192.168.1.1" 142 err = validateIPAMConfiguration(IPAMConf) 143 assert.NoError(t, err) 144 } 145 146 func TestCreateNetwork(t *testing.T) { 147 ts := newTestServer(t) 148 defer ts.Stop() 149 nr, err := ts.Client.CreateNetwork(context.Background(), &api.CreateNetworkRequest{ 150 Spec: createNetworkSpec("testnet1"), 151 }) 152 assert.NoError(t, err) 153 assert.NotEqual(t, nr.Network, nil) 154 assert.NotEqual(t, nr.Network.ID, "") 155 } 156 157 func TestGetNetwork(t *testing.T) { 158 ts := newTestServer(t) 159 defer ts.Stop() 160 nr, err := ts.Client.CreateNetwork(context.Background(), &api.CreateNetworkRequest{ 161 Spec: createNetworkSpec("testnet2"), 162 }) 163 assert.NoError(t, err) 164 assert.NotEqual(t, nr.Network, nil) 165 assert.NotEqual(t, nr.Network.ID, "") 166 167 _, err = ts.Client.GetNetwork(context.Background(), &api.GetNetworkRequest{NetworkID: nr.Network.ID}) 168 assert.NoError(t, err) 169 } 170 171 func TestRemoveNetwork(t *testing.T) { 172 ts := newTestServer(t) 173 defer ts.Stop() 174 nr, err := ts.Client.CreateNetwork(context.Background(), &api.CreateNetworkRequest{ 175 Spec: createNetworkSpec("testnet3"), 176 }) 177 assert.NoError(t, err) 178 assert.NotEqual(t, nr.Network, nil) 179 assert.NotEqual(t, nr.Network.ID, "") 180 181 _, err = ts.Client.RemoveNetwork(context.Background(), &api.RemoveNetworkRequest{NetworkID: nr.Network.ID}) 182 assert.NoError(t, err) 183 } 184 185 func TestRemoveNetworkWithAttachedService(t *testing.T) { 186 ts := newTestServer(t) 187 defer ts.Stop() 188 nr, err := ts.Client.CreateNetwork(context.Background(), &api.CreateNetworkRequest{ 189 Spec: createNetworkSpec("testnet4"), 190 }) 191 assert.NoError(t, err) 192 assert.NotEqual(t, nr.Network, nil) 193 assert.NotEqual(t, nr.Network.ID, "") 194 createServiceInNetwork(t, ts, "name", "image", nr.Network.ID, 1) 195 _, err = ts.Client.RemoveNetwork(context.Background(), &api.RemoveNetworkRequest{NetworkID: nr.Network.ID}) 196 assert.Error(t, err) 197 } 198 199 func TestCreateNetworkInvalidDriver(t *testing.T) { 200 ts := newTestServer(t) 201 defer ts.Stop() 202 spec := createNetworkSpec("baddrivernet") 203 spec.DriverConfig = &api.Driver{ 204 Name: "invalid-must-never-exist", 205 } 206 _, err := ts.Client.CreateNetwork(context.Background(), &api.CreateNetworkRequest{ 207 Spec: spec, 208 }) 209 assert.Error(t, err) 210 } 211 212 func TestListNetworks(t *testing.T) { 213 ts := newTestServer(t) 214 defer ts.Stop() 215 216 nr1, err := ts.Client.CreateNetwork(context.Background(), &api.CreateNetworkRequest{ 217 Spec: createNetworkSpec("listtestnet1"), 218 }) 219 assert.NoError(t, err) 220 assert.NotEqual(t, nr1.Network, nil) 221 assert.NotEqual(t, nr1.Network.ID, "") 222 223 nr2, err := ts.Client.CreateNetwork(context.Background(), &api.CreateNetworkRequest{ 224 Spec: createNetworkSpec("listtestnet2"), 225 }) 226 assert.NoError(t, err) 227 assert.NotEqual(t, nr2.Network, nil) 228 assert.NotEqual(t, nr2.Network.ID, "") 229 230 r, err := ts.Client.ListNetworks(context.Background(), &api.ListNetworksRequest{}) 231 assert.NoError(t, err) 232 assert.Equal(t, 3, len(r.Networks)) // Account ingress network 233 for _, nw := range r.Networks { 234 if nw.Spec.Ingress { 235 continue 236 } 237 assert.True(t, nw.ID == nr1.Network.ID || nw.ID == nr2.Network.ID) 238 } 239 }