// Copyright (C) 2019 Storj Labs, Inc. // See LICENSE for copying information package testplanet import ( "fmt" "os" "path/filepath" "strconv" "strings" "time" "storj.io/storj/internal/memory" "storj.io/storj/pkg/kademlia" "storj.io/storj/pkg/peertls/extensions" "storj.io/storj/pkg/peertls/tlsopts" "storj.io/storj/pkg/server" "storj.io/storj/storagenode" "storj.io/storj/storagenode/collector" "storj.io/storj/storagenode/console/consoleserver" "storj.io/storj/storagenode/monitor" "storj.io/storj/storagenode/orders" "storj.io/storj/storagenode/piecestore" "storj.io/storj/storagenode/storagenodedb" "storj.io/storj/storagenode/vouchers" ) // newStorageNodes initializes storage nodes func (planet *Planet) newStorageNodes(count int, whitelistedSatelliteIDs []string) ([]*storagenode.Peer, error) { var xs []*storagenode.Peer defer func() { for _, x := range xs { planet.peers = append(planet.peers, closablePeer{peer: x}) } }() for i := 0; i < count; i++ { prefix := "storage" + strconv.Itoa(i) log := planet.log.Named(prefix) storageDir := filepath.Join(planet.directory, prefix) if err := os.MkdirAll(storageDir, 0700); err != nil { return nil, err } identity, err := planet.NewIdentity() if err != nil { return nil, err } var db storagenode.DB if planet.config.Reconfigure.NewStorageNodeDB != nil { db, err = planet.config.Reconfigure.NewStorageNodeDB(i) } else { db, err = storagenodedb.NewInMemory(log.Named("db"), storageDir) } if err != nil { return nil, err } err = db.CreateTables() if err != nil { return nil, err } planet.databases = append(planet.databases, db) config := storagenode.Config{ Server: server.Config{ Address: "127.0.0.1:0", PrivateAddress: "127.0.0.1:0", Config: tlsopts.Config{ RevocationDBURL: "bolt://" + filepath.Join(storageDir, "revocation.db"), UsePeerCAWhitelist: true, PeerCAWhitelistPath: planet.whitelistPath, PeerIDVersions: "*", Extensions: extensions.Config{ Revocation: false, WhitelistSignedLeaf: false, }, }, }, Kademlia: kademlia.Config{ BootstrapBackoffBase: 500 * time.Millisecond, BootstrapBackoffMax: 2 * time.Second, Alpha: 5, DBPath: storageDir, // TODO: replace with master db Operator: kademlia.OperatorConfig{ Email: prefix + "@mail.test", Wallet: "0x" + strings.Repeat("00", 20), }, }, Storage: piecestore.OldConfig{ Path: "", // TODO: this argument won't be needed with master storagenodedb AllocatedDiskSpace: 1 * memory.GB, AllocatedBandwidth: memory.TB, KBucketRefreshInterval: time.Hour, SatelliteIDRestriction: true, WhitelistedSatelliteIDs: strings.Join(whitelistedSatelliteIDs, ","), }, Collector: collector.Config{ Interval: time.Minute, }, Console: consoleserver.Config{ Address: "127.0.0.1:0", StaticDir: filepath.Join(developmentRoot, "web/operator/"), }, Storage2: piecestore.Config{ Sender: orders.SenderConfig{ Interval: time.Hour, Timeout: time.Hour, }, Monitor: monitor.Config{ MinimumBandwidth: 100 * memory.MB, MinimumDiskSpace: 100 * memory.MB, }, }, Vouchers: vouchers.Config{ Interval: time.Hour, }, Version: planet.NewVersionConfig(), } if planet.config.Reconfigure.StorageNode != nil { planet.config.Reconfigure.StorageNode(i, &config) } newIPCount := planet.config.Reconfigure.NewIPCount if newIPCount > 0 { if i >= count-newIPCount { config.Server.Address = fmt.Sprintf("127.0.0.%d:0", i+1) config.Server.PrivateAddress = fmt.Sprintf("127.0.0.%d:0", i+1) } } verInfo := planet.NewVersionInfo() peer, err := storagenode.New(log, identity, db, config, verInfo) if err != nil { return xs, err } log.Debug("id=" + peer.ID().String() + " addr=" + peer.Addr()) xs = append(xs, peer) } return xs, nil }