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 }