github.com/rawahars/moby@v24.0.4+incompatible/libnetwork/store_test.go (about)

     1  package libnetwork
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/docker/docker/libnetwork/config"
     9  	"github.com/docker/docker/libnetwork/datastore"
    10  	"github.com/docker/docker/libnetwork/netlabel"
    11  	"github.com/docker/docker/libnetwork/options"
    12  	"github.com/docker/libkv/store"
    13  )
    14  
    15  func testLocalBackend(t *testing.T, provider, url string, storeConfig *store.Config) {
    16  	cfgOptions := []config.Option{}
    17  	cfgOptions = append(cfgOptions, config.OptionLocalKVProvider(provider))
    18  	cfgOptions = append(cfgOptions, config.OptionLocalKVProviderURL(url))
    19  	cfgOptions = append(cfgOptions, config.OptionLocalKVProviderConfig(storeConfig))
    20  
    21  	driverOptions := options.Generic{}
    22  	genericOption := make(map[string]interface{})
    23  	genericOption[netlabel.GenericData] = driverOptions
    24  	cfgOptions = append(cfgOptions, config.OptionDriverConfig("host", genericOption))
    25  
    26  	ctrl, err := New(cfgOptions...)
    27  	if err != nil {
    28  		t.Fatalf("Error new controller: %v", err)
    29  	}
    30  	defer ctrl.Stop()
    31  	nw, err := ctrl.NewNetwork("host", "host", "")
    32  	if err != nil {
    33  		t.Fatalf("Error creating default \"host\" network: %v", err)
    34  	}
    35  	ep, err := nw.CreateEndpoint("newendpoint", []EndpointOption{}...)
    36  	if err != nil {
    37  		t.Fatalf("Error creating endpoint: %v", err)
    38  	}
    39  	store := ctrl.getStore().KVStore()
    40  	if exists, err := store.Exists(datastore.Key(datastore.NetworkKeyPrefix, nw.ID())); !exists || err != nil {
    41  		t.Fatalf("Network key should have been created.")
    42  	}
    43  	if exists, err := store.Exists(datastore.Key([]string{datastore.EndpointKeyPrefix, nw.ID(), ep.ID()}...)); !exists || err != nil {
    44  		t.Fatalf("Endpoint key should have been created.")
    45  	}
    46  	store.Close()
    47  
    48  	// test restore of local store
    49  	ctrl, err = New(cfgOptions...)
    50  	if err != nil {
    51  		t.Fatalf("Error creating controller: %v", err)
    52  	}
    53  	defer ctrl.Stop()
    54  	if _, err = ctrl.NetworkByID(nw.ID()); err != nil {
    55  		t.Fatalf("Error getting network %v", err)
    56  	}
    57  }
    58  
    59  // OptionBoltdbWithRandomDBFile function returns a random dir for local store backend
    60  func OptionBoltdbWithRandomDBFile(t *testing.T) config.Option {
    61  	t.Helper()
    62  	tmp := filepath.Join(t.TempDir(), "bolt.db")
    63  	if err := os.WriteFile(tmp, nil, 0o600); err != nil {
    64  		t.Fatal(err)
    65  	}
    66  
    67  	return func(c *config.Config) {
    68  		config.OptionLocalKVProvider("boltdb")(c)
    69  		config.OptionLocalKVProviderURL(tmp)(c)
    70  		config.OptionLocalKVProviderConfig(&store.Config{Bucket: "testBackend"})(c)
    71  	}
    72  }
    73  
    74  func TestMultipleControllersWithSameStore(t *testing.T) {
    75  	cfgOptions := OptionBoltdbWithRandomDBFile(t)
    76  	ctrl1, err := New(cfgOptions)
    77  	if err != nil {
    78  		t.Fatalf("Error new controller: %v", err)
    79  	}
    80  	defer ctrl1.Stop()
    81  	// Use the same boltdb file without closing the previous controller
    82  	ctrl2, err := New(cfgOptions)
    83  	if err != nil {
    84  		t.Fatalf("Local store must support concurrent controllers")
    85  	}
    86  	ctrl2.Stop()
    87  }