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  }