From 222d718ccddfadd924a808538496ad173016972e Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Jun 2020 14:57:55 +0200 Subject: [PATCH 01/13] wip --- lotus-soup/go.mod | 3 +++ lotus-soup/node.go | 59 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/lotus-soup/go.mod b/lotus-soup/go.mod index 7941e310c..fb96ceb15 100644 --- a/lotus-soup/go.mod +++ b/lotus-soup/go.mod @@ -6,9 +6,11 @@ require ( github.com/drand/drand v0.9.2-0.20200616080806-a94e9c1636a4 github.com/filecoin-project/go-address v0.0.2-0.20200504173055-8b6f2fb2b3ef github.com/filecoin-project/go-fil-markets v0.3.0 + github.com/filecoin-project/go-jsonrpc v0.1.1-0.20200602181149-522144ab4e24 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/lotus v0.4.1-0.20200623211458-e8642442267b github.com/filecoin-project/specs-actors v0.6.2-0.20200617175406-de392ca14121 + github.com/gorilla/mux v1.7.4 github.com/ipfs/go-cid v0.0.6 github.com/ipfs/go-datastore v0.4.4 github.com/ipfs/go-ipfs-files v0.0.8 @@ -21,6 +23,7 @@ require ( github.com/libp2p/go-libp2p-core v0.6.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.2.2 + github.com/multiformats/go-multiaddr-net v0.1.5 github.com/testground/sdk-go v0.2.3-0.20200626214218-7a87893cf56c ) diff --git a/lotus-soup/node.go b/lotus-soup/node.go index 0375d545b..6bfc81bb3 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -6,14 +6,18 @@ import ( "crypto/rand" "fmt" "io/ioutil" + "net/http" "os" "sort" "strings" "time" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-storedcounter" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/beacon" @@ -25,12 +29,12 @@ import ( "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node" "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/impl" "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/lp2p" modtest "github.com/filecoin-project/lotus/node/modules/testing" "github.com/filecoin-project/lotus/node/repo" - "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/filecoin-project/specs-actors/actors/builtin" @@ -38,13 +42,13 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin/power" "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" "github.com/filecoin-project/specs-actors/actors/crypto" - + "github.com/gorilla/mux" "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" libp2p_crypto "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" - + manet "github.com/multiformats/go-multiaddr-net" "github.com/testground/sdk-go/run" "github.com/testground/sdk-go/runtime" "github.com/testground/sdk-go/sync" @@ -416,6 +420,7 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { return err1 } + // Bootstrap with full node remoteAddrs, err := n.fullApi.NetAddrsListen(ctx) if err != nil { panic(err) @@ -435,6 +440,54 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { } } + endpoint, err := minerRepo.APIEndpoint() + if err != nil { + return nil, err + } + + lst, err := manet.Listen(endpoint) + if err != nil { + return nil, fmt.Errorf("could not listen: %w", err) + } + + mux := mux.NewRouter() + + rpcServer := jsonrpc.NewServer() + rpcServer.Register("Filecoin", apistruct.PermissionedStorMinerAPI(n.minerApi)) + + mux.Handle("/rpc/v0", rpcServer) + mux.PathPrefix("/remote").HandlerFunc(n.minerApi.(*impl.StorageMinerAPI).ServeRemote) + mux.PathPrefix("/").Handler(http.DefaultServeMux) // pprof + + ah := &auth.Handler{ + Verify: n.minerApi.AuthVerify, + Next: mux.ServeHTTP, + } + + srv := &http.Server{Handler: ah} + + //sigChan := make(chan os.Signal, 2) + //go func() { + //select { + //case <-sigChan: + //case <-shutdownChan: + //} + + //log.Warn("Shutting down...") + //if err := stop(context.TODO()); err != nil { + //log.Errorf("graceful shutting down failed: %s", err) + //} + //if err := srv.Shutdown(context.TODO()); err != nil { + //log.Errorf("shutting down RPC server failed: %s", err) + //} + //log.Warn("Graceful shutdown successful") + //}() + //signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT) + + go func() { + _ = srv.Serve(manet.NetListener(lst)) + }() + // add local storage for presealed sectors err = n.minerApi.StorageAddLocal(ctx, presealDir) if err != nil { From c4347c0485d50fe6ba22e85e62523af7df4f7336 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Jun 2020 17:10:31 +0200 Subject: [PATCH 02/13] wip --- lotus-soup/common_roles.go | 9 +++++---- lotus-soup/compositions/composition-k8s-10-3.toml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lotus-soup/common_roles.go b/lotus-soup/common_roles.go index 9d5c1d1b7..27017bf8a 100644 --- a/lotus-soup/common_roles.go +++ b/lotus-soup/common_roles.go @@ -3,7 +3,6 @@ package main import ( "context" "fmt" - "math/rand" "time" "github.com/filecoin-project/lotus/build" @@ -54,15 +53,15 @@ func runMiner(t *TestEnvironment) error { stateMineNext := sync.State(fmt.Sprintf("mine-block-%d", i)) t.SyncClient.MustSignalAndWait(ctx, stateMineNext, miners) - // add some random delay to encourage a different miner winning each round - time.Sleep(time.Duration(100 + rand.Intn(int(100*time.Millisecond)))) - + ch := make(chan struct{}) err := miner.MineOne(ctx, func(mined bool) { t.D().Counter(fmt.Sprintf("block.mine,miner=%s", myActorAddr)).Inc(1) + close(ch) }) if err != nil { panic(err) } + <-ch } // signal the last block to make sure no miners are left stuck waiting for the next block signal @@ -81,6 +80,8 @@ func runMiner(t *TestEnvironment) error { t.RecordMessage("shutting down mining") <-done + time.Sleep(3600 * time.Second) + t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) return nil } diff --git a/lotus-soup/compositions/composition-k8s-10-3.toml b/lotus-soup/compositions/composition-k8s-10-3.toml index 7110e8114..91b0276d7 100644 --- a/lotus-soup/compositions/composition-k8s-10-3.toml +++ b/lotus-soup/compositions/composition-k8s-10-3.toml @@ -20,7 +20,7 @@ miners = "3" genesis_timestamp_offset = "100000" balance = "2000" - sectors = "10" + sectors = "20" [[groups]] id = "bootstrapper" From eec5c23671ed07c2a8643a5c24886d238d3d7561 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 13:18:02 +0200 Subject: [PATCH 03/13] working client rpc --- lotus-soup/node.go | 107 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) diff --git a/lotus-soup/node.go b/lotus-soup/node.go index 6bfc81bb3..d5aedc6ee 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -47,6 +47,7 @@ import ( logging "github.com/ipfs/go-log/v2" libp2p_crypto "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" + "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" "github.com/testground/sdk-go/run" @@ -205,6 +206,13 @@ func prepareBootstrapper(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(repo.NewMemory(nil)), node.Override(new(modules.Genesis), modtest.MakeGenesisMem(&genesisBuffer, genesisTemplate)), + node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + if err != nil { + return err + } + return lr.SetAPIEndpoint(apima) + }), withListenAddress(bootstrapperIP), withBootstrapper(nil), withPubsubConfig(true, pubsubTracer), @@ -376,11 +384,20 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { // we need both a full node _and_ and storage miner node n := &Node{} + nodeRepo := repo.NewMemory(nil) + stop1, err := node.New(context.Background(), node.FullAPI(&n.fullApi), node.Online(), - node.Repo(repo.NewMemory(nil)), + node.Repo(nodeRepo), withGenesis(genesisMsg.Genesis), + node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + if err != nil { + return err + } + return lr.SetAPIEndpoint(apima) + }), withListenAddress(minerIP), withBootstrapper(genesisMsg.Bootstrapper), withPubsubConfig(false, pubsubTracer), @@ -403,6 +420,13 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(minerRepo), node.Override(new(api.FullNode), n.fullApi), + //node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + //apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + //if err != nil { + //return err + //} + //return lr.SetAPIEndpoint(apima) + //}), node.Override(new(*miner.Miner), miner.NewTestMiner(mineBlock, minerAddr)), withMinerListenAddress(minerIP), ) @@ -488,6 +512,50 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { _ = srv.Serve(manet.NetListener(lst)) }() + //endpoint, err = nodeRepo.APIEndpoint() + //if err != nil { + //return nil, err + //} + + //lst, err = manet.Listen(endpoint) + //if err != nil { + //return nil, fmt.Errorf("could not listen: %w", err) + //} + + //rpcServer = jsonrpc.NewServer() + //rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(n.fullApi)) + + //ah = &auth.Handler{ + //Verify: n.fullApi.AuthVerify, + //Next: rpcServer.ServeHTTP, + //} + + //http.Handle("/rpc/v0", ah) + + //srv = &http.Server{Handler: http.DefaultServeMux} + + //sigChan := make(chan os.Signal, 2) + //go func() { + //select { + //case <-sigChan: + //case <-shutdownChan: + //} + + //log.Warn("Shutting down...") + //if err := stop(context.TODO()); err != nil { + //log.Errorf("graceful shutting down failed: %s", err) + //} + //if err := srv.Shutdown(context.TODO()); err != nil { + //log.Errorf("shutting down RPC server failed: %s", err) + //} + //log.Warn("Graceful shutdown successful") + //}() + //signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT) + + go func() { + _ = srv.Serve(manet.NetListener(lst)) + }() + // add local storage for presealed sectors err = n.minerApi.StorageAddLocal(ctx, presealDir) if err != nil { @@ -567,12 +635,21 @@ func prepareClient(t *TestEnvironment) (*Node, error) { clientIP := t.NetClient.MustGetDataNetworkIP().String() + nodeRepo := repo.NewMemory(nil) + // create the node n := &Node{} stop, err := node.New(context.Background(), node.FullAPI(&n.fullApi), node.Online(), - node.Repo(repo.NewMemory(nil)), + node.Repo(nodeRepo), + node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + if err != nil { + return err + } + return lr.SetAPIEndpoint(apima) + }), withGenesis(genesisMsg.Genesis), withListenAddress(clientIP), withBootstrapper(genesisMsg.Bootstrapper), @@ -591,6 +668,32 @@ func prepareClient(t *TestEnvironment) (*Node, error) { return nil, err } + endpoint, err := nodeRepo.APIEndpoint() + if err != nil { + return nil, err + } + + lst, err := manet.Listen(endpoint) + if err != nil { + return nil, fmt.Errorf("could not listen: %w", err) + } + + rpcServer := jsonrpc.NewServer() + rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(n.fullApi)) + + ah := &auth.Handler{ + Verify: n.fullApi.AuthVerify, + Next: rpcServer.ServeHTTP, + } + + http.Handle("/rpc/v0", ah) + + srv := &http.Server{Handler: http.DefaultServeMux} + + go func() { + _ = srv.Serve(manet.NetListener(lst)) + }() + t.RecordMessage("publish our address to the clients addr topic") addrinfo, err := n.fullApi.NetAddrsListen(ctx) if err != nil { From 204714a01f74fa711d5bc6ba9ecc43935ee0c550 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 13:20:10 +0200 Subject: [PATCH 04/13] wip --- lotus-soup/node.go | 90 ++++++++-------------------------------------- 1 file changed, 14 insertions(+), 76 deletions(-) diff --git a/lotus-soup/node.go b/lotus-soup/node.go index d5aedc6ee..395bba8b8 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -391,13 +391,13 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(nodeRepo), withGenesis(genesisMsg.Genesis), - node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { - apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") - if err != nil { - return err - } - return lr.SetAPIEndpoint(apima) - }), + //node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + //apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + //if err != nil { + //return err + //} + //return lr.SetAPIEndpoint(apima) + //}), withListenAddress(minerIP), withBootstrapper(genesisMsg.Bootstrapper), withPubsubConfig(false, pubsubTracer), @@ -420,13 +420,13 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(minerRepo), node.Override(new(api.FullNode), n.fullApi), - //node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { - //apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") - //if err != nil { - //return err - //} - //return lr.SetAPIEndpoint(apima) - //}), + node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + if err != nil { + return err + } + return lr.SetAPIEndpoint(apima) + }), node.Override(new(*miner.Miner), miner.NewTestMiner(mineBlock, minerAddr)), withMinerListenAddress(minerIP), ) @@ -490,68 +490,6 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { srv := &http.Server{Handler: ah} - //sigChan := make(chan os.Signal, 2) - //go func() { - //select { - //case <-sigChan: - //case <-shutdownChan: - //} - - //log.Warn("Shutting down...") - //if err := stop(context.TODO()); err != nil { - //log.Errorf("graceful shutting down failed: %s", err) - //} - //if err := srv.Shutdown(context.TODO()); err != nil { - //log.Errorf("shutting down RPC server failed: %s", err) - //} - //log.Warn("Graceful shutdown successful") - //}() - //signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT) - - go func() { - _ = srv.Serve(manet.NetListener(lst)) - }() - - //endpoint, err = nodeRepo.APIEndpoint() - //if err != nil { - //return nil, err - //} - - //lst, err = manet.Listen(endpoint) - //if err != nil { - //return nil, fmt.Errorf("could not listen: %w", err) - //} - - //rpcServer = jsonrpc.NewServer() - //rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(n.fullApi)) - - //ah = &auth.Handler{ - //Verify: n.fullApi.AuthVerify, - //Next: rpcServer.ServeHTTP, - //} - - //http.Handle("/rpc/v0", ah) - - //srv = &http.Server{Handler: http.DefaultServeMux} - - //sigChan := make(chan os.Signal, 2) - //go func() { - //select { - //case <-sigChan: - //case <-shutdownChan: - //} - - //log.Warn("Shutting down...") - //if err := stop(context.TODO()); err != nil { - //log.Errorf("graceful shutting down failed: %s", err) - //} - //if err := srv.Shutdown(context.TODO()); err != nil { - //log.Errorf("shutting down RPC server failed: %s", err) - //} - //log.Warn("Graceful shutdown successful") - //}() - //signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT) - go func() { _ = srv.Serve(manet.NetListener(lst)) }() From 954ad1f396fcf9ee406dc7af6f50d5be166da248 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 13:31:50 +0200 Subject: [PATCH 05/13] fixup --- lotus-soup/common_roles.go | 3 --- lotus-soup/node.go | 7 ------- 2 files changed, 10 deletions(-) diff --git a/lotus-soup/common_roles.go b/lotus-soup/common_roles.go index cddcc25c0..f6aa2454f 100644 --- a/lotus-soup/common_roles.go +++ b/lotus-soup/common_roles.go @@ -3,7 +3,6 @@ package main import ( "context" "fmt" - "time" "github.com/filecoin-project/lotus/build" "github.com/testground/sdk-go/sync" @@ -88,8 +87,6 @@ func runMiner(t *TestEnvironment) error { mine = false <-done - time.Sleep(3600 * time.Second) - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) return nil } diff --git a/lotus-soup/node.go b/lotus-soup/node.go index 52f57f28e..c5d492593 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -395,13 +395,6 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(nodeRepo), withGenesis(genesisMsg.Genesis), - //node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { - //apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") - //if err != nil { - //return err - //} - //return lr.SetAPIEndpoint(apima) - //}), withListenAddress(minerIP), withBootstrapper(genesisMsg.Bootstrapper), withPubsubConfig(false, pubsubTracer), From 63bce1a4266a0e31906ad69162608e9e7a5bbab7 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 13:50:46 +0200 Subject: [PATCH 06/13] extract starting of rpc servers --- lotus-soup/node.go | 114 ++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 48 deletions(-) diff --git a/lotus-soup/node.go b/lotus-soup/node.go index c5d492593..f9d62d73b 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -466,36 +466,11 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { panic(err) } - endpoint, err := minerRepo.APIEndpoint() + err = startStorMinerAPIServer(minerRepo, n.minerApi) if err != nil { return nil, err } - lst, err := manet.Listen(endpoint) - if err != nil { - return nil, fmt.Errorf("could not listen: %w", err) - } - - mux := mux.NewRouter() - - rpcServer := jsonrpc.NewServer() - rpcServer.Register("Filecoin", apistruct.PermissionedStorMinerAPI(n.minerApi)) - - mux.Handle("/rpc/v0", rpcServer) - mux.PathPrefix("/remote").HandlerFunc(n.minerApi.(*impl.StorageMinerAPI).ServeRemote) - mux.PathPrefix("/").Handler(http.DefaultServeMux) // pprof - - ah := &auth.Handler{ - Verify: n.minerApi.AuthVerify, - Next: mux.ServeHTTP, - } - - srv := &http.Server{Handler: ah} - - go func() { - _ = srv.Serve(manet.NetListener(lst)) - }() - // add local storage for presealed sectors err = n.minerApi.StorageAddLocal(ctx, presealDir) if err != nil { @@ -608,32 +583,11 @@ func prepareClient(t *TestEnvironment) (*Node, error) { return nil, err } - endpoint, err := nodeRepo.APIEndpoint() + err = startClientAPIServer(nodeRepo, n.fullApi) if err != nil { return nil, err } - lst, err := manet.Listen(endpoint) - if err != nil { - return nil, fmt.Errorf("could not listen: %w", err) - } - - rpcServer := jsonrpc.NewServer() - rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(n.fullApi)) - - ah := &auth.Handler{ - Verify: n.fullApi.AuthVerify, - Next: rpcServer.ServeHTTP, - } - - http.Handle("/rpc/v0", ah) - - srv := &http.Server{Handler: http.DefaultServeMux} - - go func() { - _ = srv.Serve(manet.NetListener(lst)) - }() - t.RecordMessage("publish our address to the clients addr topic") addrinfo, err := n.fullApi.NetAddrsListen(ctx) if err != nil { @@ -838,3 +792,67 @@ func getDrandConfig(ctx context.Context, t *TestEnvironment) (node.Option, error return nil, fmt.Errorf("unknown random_beacon_type: %s", beaconType) } } + +func startStorMinerAPIServer(repo *repo.MemRepo, minerApi api.StorageMiner) error { + endpoint, err := repo.APIEndpoint() + if err != nil { + return err + } + + lst, err := manet.Listen(endpoint) + if err != nil { + return fmt.Errorf("could not listen: %w", err) + } + + mux := mux.NewRouter() + + rpcServer := jsonrpc.NewServer() + rpcServer.Register("Filecoin", apistruct.PermissionedStorMinerAPI(minerApi)) + + mux.Handle("/rpc/v0", rpcServer) + mux.PathPrefix("/remote").HandlerFunc(minerApi.(*impl.StorageMinerAPI).ServeRemote) + mux.PathPrefix("/").Handler(http.DefaultServeMux) // pprof + + ah := &auth.Handler{ + Verify: minerApi.AuthVerify, + Next: mux.ServeHTTP, + } + + srv := &http.Server{Handler: ah} + + go func() { + _ = srv.Serve(manet.NetListener(lst)) + }() + + return nil +} + +func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { + endpoint, err := repo.APIEndpoint() + if err != nil { + return err + } + + lst, err := manet.Listen(endpoint) + if err != nil { + return fmt.Errorf("could not listen: %w", err) + } + + rpcServer := jsonrpc.NewServer() + rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(api)) + + ah := &auth.Handler{ + Verify: api.AuthVerify, + Next: rpcServer.ServeHTTP, + } + + http.Handle("/rpc/v0", ah) + + srv := &http.Server{Handler: http.DefaultServeMux} + + go func() { + _ = srv.Serve(manet.NetListener(lst)) + }() + + return nil +} From b62878c260035946276d9706d443a9298f962a34 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 14:47:09 +0200 Subject: [PATCH 07/13] upgrade go-sdk --- lotus-soup/go.mod | 2 +- lotus-soup/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lotus-soup/go.mod b/lotus-soup/go.mod index fb96ceb15..e2973ffdb 100644 --- a/lotus-soup/go.mod +++ b/lotus-soup/go.mod @@ -24,7 +24,7 @@ require ( github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.2.2 github.com/multiformats/go-multiaddr-net v0.1.5 - github.com/testground/sdk-go v0.2.3-0.20200626214218-7a87893cf56c + github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd ) // This will work in all build modes: docker:go, exec:go, and local go build. diff --git a/lotus-soup/go.sum b/lotus-soup/go.sum index d6cb1893c..23f4aa17a 100644 --- a/lotus-soup/go.sum +++ b/lotus-soup/go.sum @@ -1343,6 +1343,8 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/testground/sdk-go v0.2.3-0.20200626214218-7a87893cf56c h1:fZXuBXPwBL2Z4UdH1YVkWs7rqNCaVwSmpu3SmVeayZ0= github.com/testground/sdk-go v0.2.3-0.20200626214218-7a87893cf56c/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= +github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd h1:e4QpR+UgiQUfFMz3LjMT2ey1VO5+Wa6R0MJBu3BpwIk= +github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= From e3d2d2e7c1f99f4571b3959a702408353e244cf4 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 17:50:21 +0200 Subject: [PATCH 08/13] extract withApiEndpoint --- lotus-soup/node.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/lotus-soup/node.go b/lotus-soup/node.go index f9d62d73b..33749add6 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -207,13 +207,7 @@ func prepareBootstrapper(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(repo.NewMemory(nil)), node.Override(new(modules.Genesis), modtest.MakeGenesisMem(&genesisBuffer, genesisTemplate)), - node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { - apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") - if err != nil { - return err - } - return lr.SetAPIEndpoint(apima) - }), + node.Override(node.SetApiEndpointKey, withApiEndpoint), withListenAddress(bootstrapperIP), withBootstrapper(nil), withPubsubConfig(true, pubsubTracer), @@ -416,13 +410,7 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(minerRepo), node.Override(new(api.FullNode), n.fullApi), - node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { - apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") - if err != nil { - return err - } - return lr.SetAPIEndpoint(apima) - }), + node.Override(node.SetApiEndpointKey, withApiEndpoint), withMinerListenAddress(minerIP), } @@ -856,3 +844,11 @@ func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { return nil } + +func withApiEndpoint(lr repo.LockedRepo) error { + apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + if err != nil { + return err + } + return lr.SetAPIEndpoint(apima) +} From 0a9af6ad5c9733686967dd07eac3cfb06af77db5 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 17:53:27 +0200 Subject: [PATCH 09/13] extract startServer --- lotus-soup/go.sum | 2 -- lotus-soup/node.go | 50 +++++++++++++++++++--------------------------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/lotus-soup/go.sum b/lotus-soup/go.sum index 23f4aa17a..0aea93b72 100644 --- a/lotus-soup/go.sum +++ b/lotus-soup/go.sum @@ -1341,8 +1341,6 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/testground/sdk-go v0.2.3-0.20200626214218-7a87893cf56c h1:fZXuBXPwBL2Z4UdH1YVkWs7rqNCaVwSmpu3SmVeayZ0= -github.com/testground/sdk-go v0.2.3-0.20200626214218-7a87893cf56c/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd h1:e4QpR+UgiQUfFMz3LjMT2ey1VO5+Wa6R0MJBu3BpwIk= github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= diff --git a/lotus-soup/node.go b/lotus-soup/node.go index 33749add6..344c52163 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -782,16 +782,6 @@ func getDrandConfig(ctx context.Context, t *TestEnvironment) (node.Option, error } func startStorMinerAPIServer(repo *repo.MemRepo, minerApi api.StorageMiner) error { - endpoint, err := repo.APIEndpoint() - if err != nil { - return err - } - - lst, err := manet.Listen(endpoint) - if err != nil { - return fmt.Errorf("could not listen: %w", err) - } - mux := mux.NewRouter() rpcServer := jsonrpc.NewServer() @@ -808,24 +798,10 @@ func startStorMinerAPIServer(repo *repo.MemRepo, minerApi api.StorageMiner) erro srv := &http.Server{Handler: ah} - go func() { - _ = srv.Serve(manet.NetListener(lst)) - }() - - return nil + return startServer(repo, srv) } func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { - endpoint, err := repo.APIEndpoint() - if err != nil { - return err - } - - lst, err := manet.Listen(endpoint) - if err != nil { - return fmt.Errorf("could not listen: %w", err) - } - rpcServer := jsonrpc.NewServer() rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(api)) @@ -838,11 +814,7 @@ func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { srv := &http.Server{Handler: http.DefaultServeMux} - go func() { - _ = srv.Serve(manet.NetListener(lst)) - }() - - return nil + return startServer(repo, srv) } func withApiEndpoint(lr repo.LockedRepo) error { @@ -852,3 +824,21 @@ func withApiEndpoint(lr repo.LockedRepo) error { } return lr.SetAPIEndpoint(apima) } + +func startServer(repo *repo.MemRepo, srv *http.Server) error { + endpoint, err := repo.APIEndpoint() + if err != nil { + return err + } + + lst, err := manet.Listen(endpoint) + if err != nil { + return fmt.Errorf("could not listen: %w", err) + } + + go func() { + _ = srv.Serve(manet.NetListener(lst)) + }() + + return nil +} From 46beab3cf16c02c5f9ebe1c5f8eb216ef3057e3e Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 17:59:02 +0200 Subject: [PATCH 10/13] fixup --- lotus-soup/node.go | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/lotus-soup/node.go b/lotus-soup/node.go index 344c52163..34262fe70 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -207,7 +207,7 @@ func prepareBootstrapper(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(repo.NewMemory(nil)), node.Override(new(modules.Genesis), modtest.MakeGenesisMem(&genesisBuffer, genesisTemplate)), - node.Override(node.SetApiEndpointKey, withApiEndpoint), + withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), withListenAddress(bootstrapperIP), withBootstrapper(nil), withPubsubConfig(true, pubsubTracer), @@ -410,7 +410,7 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { node.Online(), node.Repo(minerRepo), node.Override(new(api.FullNode), n.fullApi), - node.Override(node.SetApiEndpointKey, withApiEndpoint), + withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), withMinerListenAddress(minerIP), } @@ -546,13 +546,7 @@ func prepareClient(t *TestEnvironment) (*Node, error) { node.FullAPI(&n.fullApi), node.Online(), node.Repo(nodeRepo), - node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { - apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") - if err != nil { - return err - } - return lr.SetAPIEndpoint(apima) - }), + withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), withGenesis(genesisMsg.Genesis), withListenAddress(clientIP), withBootstrapper(genesisMsg.Bootstrapper), @@ -645,6 +639,16 @@ func withMinerListenAddress(ip string) node.Option { return node.Override(node.StartListeningKey, lp2p.StartListening(addrs)) } +func withApiEndpoint(addr string) node.Option { + return node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + apima, err := multiaddr.NewMultiaddr(addr) + if err != nil { + return err + } + return lr.SetAPIEndpoint(apima) + }) +} + func waitForBalances(t *TestEnvironment, ctx context.Context, nodes int) ([]*InitialBalanceMsg, error) { ch := make(chan *InitialBalanceMsg) sub := t.SyncClient.MustSubscribe(ctx, balanceTopic, ch) @@ -817,14 +821,6 @@ func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { return startServer(repo, srv) } -func withApiEndpoint(lr repo.LockedRepo) error { - apima, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") - if err != nil { - return err - } - return lr.SetAPIEndpoint(apima) -} - func startServer(repo *repo.MemRepo, srv *http.Server) error { endpoint, err := repo.APIEndpoint() if err != nil { From af582aff02861ec498722f9c41ebfab0472586ba Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Jun 2020 18:02:02 +0200 Subject: [PATCH 11/13] register and export lotus metrics (#84) --- lotus-soup/go.mod | 5 ++- lotus-soup/go.sum | 106 +++++++++++++++++++++++++++++++++------------ lotus-soup/node.go | 35 +++++++++++++++ 3 files changed, 117 insertions(+), 29 deletions(-) diff --git a/lotus-soup/go.mod b/lotus-soup/go.mod index e2973ffdb..332ebec9d 100644 --- a/lotus-soup/go.mod +++ b/lotus-soup/go.mod @@ -11,6 +11,7 @@ require ( github.com/filecoin-project/lotus v0.4.1-0.20200623211458-e8642442267b github.com/filecoin-project/specs-actors v0.6.2-0.20200617175406-de392ca14121 github.com/gorilla/mux v1.7.4 + github.com/influxdata/influxdb v1.8.0 // indirect github.com/ipfs/go-cid v0.0.6 github.com/ipfs/go-datastore v0.4.4 github.com/ipfs/go-ipfs-files v0.0.8 @@ -19,12 +20,14 @@ require ( github.com/ipfs/go-merkledag v0.3.1 github.com/ipfs/go-unixfs v0.2.4 github.com/ipld/go-car v0.1.1-0.20200526133713-1c7508d55aae + github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c github.com/libp2p/go-libp2p v0.10.0 github.com/libp2p/go-libp2p-core v0.6.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.2.2 github.com/multiformats/go-multiaddr-net v0.1.5 - github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd + github.com/testground/sdk-go v0.2.3-0.20200630131002-c16b558f6ca9 + go.opencensus.io v0.22.4 ) // This will work in all build modes: docker:go, exec:go, and local go build. diff --git a/lotus-soup/go.sum b/lotus-soup/go.sum index 0aea93b72..3b1748960 100644 --- a/lotus-soup/go.sum +++ b/lotus-soup/go.sum @@ -3,17 +3,20 @@ cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -22,6 +25,7 @@ cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIA cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -36,6 +40,7 @@ github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOv github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= @@ -57,14 +62,17 @@ github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -88,6 +96,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= @@ -104,6 +114,7 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -146,6 +157,7 @@ github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -167,6 +179,7 @@ github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KP github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -188,6 +201,7 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/go-sysinfo v1.3.0 h1:eb2XFGTMlSwG/yyU9Y8jVAYLIzU2sFzWXwo2gmetyrE= github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= @@ -261,6 +275,7 @@ github.com/filecoin-project/specs-storage v0.1.0/go.mod h1:Pr5ntAaxsh+sLG/LYiL4t github.com/filecoin-project/storage-fsm v0.0.0-20200617183754-4380106d3e94 h1:zPKiZPMgkFF0Lq13hsk8lcWlxeVAs6vvJaa3uHn9v70= github.com/filecoin-project/storage-fsm v0.0.0-20200617183754-4380106d3e94/go.mod h1:q1YCutTSMq/yGYvDPHReT37bPfDLHltnwJutzR9kOY0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -271,6 +286,8 @@ github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -290,6 +307,7 @@ github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNI github.com/go-redis/redis/v7 v7.2.0 h1:CrCexy/jYWZjW0AyVoHlcJUeZN19VWlbepTh1Vq6dJs= github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -307,6 +325,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -346,6 +366,7 @@ github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -443,8 +464,17 @@ github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7 github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY= +github.com/influxdata/influxdb v1.8.0 h1:/X+G+i3udzHVxpBMuXdPZcUbkIE0ouT+6U+CzQTsOys= +github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= @@ -661,10 +691,13 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3 h1:Iy7Ifq2ysilWU4QlCx/97OoI4xT1IV7i8byT/EyIT/M= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= @@ -676,12 +709,18 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c h1:3pM6OrLfkfe0rKZjE6MHdcTaI0ohcHbRUZJeJqkvPb4= +github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod h1:ESXZSm2iaF+1P5o6VFEWpeARTQpcil4e1DwumnTopdg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -691,6 +730,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= @@ -1026,8 +1066,11 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -1069,6 +1112,7 @@ github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3 h1:v+sk57XuaCKGXpWtVBX8YJzO7hMGx4Aajh4TQbdEFdc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= @@ -1169,6 +1213,7 @@ github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1 github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= @@ -1178,9 +1223,12 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1189,6 +1237,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= @@ -1242,6 +1291,7 @@ github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1253,7 +1303,10 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= @@ -1329,6 +1382,7 @@ github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= @@ -1341,9 +1395,10 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd h1:e4QpR+UgiQUfFMz3LjMT2ey1VO5+Wa6R0MJBu3BpwIk= -github.com/testground/sdk-go v0.2.3-0.20200630123819-17fe227923bd/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= +github.com/testground/sdk-go v0.2.3-0.20200630131002-c16b558f6ca9 h1:4whMCXEdgHQkg4i5OTE2fqDFIPbpiE5y8uOMfiGSEBg= +github.com/testground/sdk-go v0.2.3-0.20200630131002-c16b558f6ca9/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible h1:uArBYHQR0HqLFFAypI7RsWTzPSj/bDpmZZuQjMLSg1A= @@ -1352,16 +1407,13 @@ github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeND github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= @@ -1399,7 +1451,6 @@ github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDb github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= @@ -1410,8 +1461,10 @@ github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d/go.mod h1:g7c github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= @@ -1423,7 +1476,6 @@ go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRL go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -1435,8 +1487,9 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1456,14 +1509,13 @@ go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20190218023631-ce4c26f7be8e h1:m9LfARr2VIOW0vsV19kEKp/sWQvZnGobA8JHui/XJoY= go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20190313082347-94abd6928b1d h1:JkRdGP3zvTtTbabWSAC6n67ka30y7gOzWAah4XYJSfw= go4.org v0.0.0-20190313082347-94abd6928b1d/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= @@ -1495,13 +1547,14 @@ golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200427165652-729f1e841bcc h1:ZGI/fILM2+ueot/UixBSoj9188jCAxVHEZEGhqq67I4= golang.org/x/crypto v0.0.0-20200427165652-729f1e841bcc/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -1511,6 +1564,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1520,7 +1574,6 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -1564,11 +1617,9 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343 h1:00ohfJ4K98s3m6BGUoBd8nyfp4Yl0GoIKvw5abItTjI= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1576,7 +1627,6 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476 h1:E7ct1C6/33eOdrGZKMoyntcEvs2dwZnDe30crG5vpYU= golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -1593,7 +1643,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1650,7 +1699,6 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1661,10 +1709,8 @@ golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200427175716-29b57079015a h1:08u6b1caTT9MQY4wSbmsd4Ulm6DmgNYnbImBuZjGJow= golang.org/x/sys v0.0.0-20200427175716-29b57079015a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1678,12 +1724,14 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1699,14 +1747,12 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f h1:kDxGY2VmgABOe55qheT/TFqUMtcTHnomIPS1iv3G4Ms= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1714,6 +1760,7 @@ golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108195415-316d2f248479/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1722,7 +1769,6 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200318150045-ba25ddc85566 h1:OXjomkWHhzUx4+HldlJ2TsMxJdWgEo5CTtspD1wdhdk= golang.org/x/tools v0.0.0-20200318150045-ba25ddc85566/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4 h1:kDtqNkeBrZb8B+atrj50B5XLHpzXXqcCdZPP/ApQ5NY= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= @@ -1730,6 +1776,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -1764,6 +1816,7 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1771,6 +1824,7 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= @@ -1795,7 +1849,6 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= @@ -1807,7 +1860,6 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= @@ -1821,7 +1873,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -1836,7 +1887,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1850,7 +1900,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= @@ -1859,6 +1908,7 @@ howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCU launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/lotus-soup/node.go b/lotus-soup/node.go index 34262fe70..13bb959f7 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -26,6 +26,7 @@ import ( "github.com/filecoin-project/lotus/chain/wallet" "github.com/filecoin-project/lotus/cmd/lotus-seed/seed" "github.com/filecoin-project/lotus/genesis" + "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node" "github.com/filecoin-project/lotus/node/config" @@ -45,6 +46,8 @@ import ( "github.com/gorilla/mux" "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" + influxdb "github.com/kpacha/opencensus-influxdb" + libp2p_crypto "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/multiformats/go-multiaddr" @@ -53,6 +56,9 @@ import ( "github.com/testground/sdk-go/run" "github.com/testground/sdk-go/runtime" "github.com/testground/sdk-go/sync" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" ) func init() { @@ -443,6 +449,8 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { return err1 } + registerAndExportMetrics(minerAddr.String()) + // Bootstrap with full node remoteAddrs, err := n.fullApi.NetAddrsListen(ctx) if err != nil { @@ -570,6 +578,8 @@ func prepareClient(t *TestEnvironment) (*Node, error) { return nil, err } + registerAndExportMetrics(fmt.Sprintf("client_%d", t.GroupSeq)) + t.RecordMessage("publish our address to the clients addr topic") addrinfo, err := n.fullApi.NetAddrsListen(ctx) if err != nil { @@ -838,3 +848,28 @@ func startServer(repo *repo.MemRepo, srv *http.Server) error { return nil } + +func registerAndExportMetrics(instanceName string) { + // Register all Lotus metric views + err := view.Register(metrics.DefaultViews...) + if err != nil { + panic(err) + } + + // Set the metric to one so it is published to the exporter + stats.Record(context.Background(), metrics.LotusInfo.M(1)) + + // Register our custom exporter to opencensus + e, err := influxdb.NewExporter(context.Background(), influxdb.Options{ + Database: "testground", + Address: os.Getenv("INFLUXDB_URL"), + Username: "", + Password: "", + InstanceName: instanceName, + }) + if err != nil { + panic(err) + } + view.RegisterExporter(e) + view.SetReportingPeriod(5 * time.Second) +} From 7f3716504bde5b6e578186ef2a9a2067f8593d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 30 Jun 2020 23:02:01 +0100 Subject: [PATCH 12/13] refactor lotus recipes to make them more manageable. (#86) - Each role now has its own file (role_*.go). - Options have their own file (lotus_opts.go). - Sync service constructions have their own file (sync.go). - Utilities are functionally grouped in files ({deals,retrieval}.go). --- lotus-soup/baseline.go | 253 ------- lotus-soup/common_roles.go | 106 --- lotus-soup/deals.go | 55 ++ lotus-soup/lotus_opts.go | 67 ++ lotus-soup/main.go | 2 +- lotus-soup/node.go | 619 +----------------- lotus-soup/retrieval.go | 103 +++ lotus-soup/role_bootstrapper.go | 161 +++++ lotus-soup/role_client.go | 194 ++++++ lotus-soup/{drand.go => role_drand.go} | 55 +- lotus-soup/role_miner.go | 377 +++++++++++ .../{tracer.go => role_pubsub_tracer.go} | 12 +- lotus-soup/roles.go | 27 + lotus-soup/sync.go | 55 ++ 14 files changed, 1078 insertions(+), 1008 deletions(-) delete mode 100644 lotus-soup/baseline.go delete mode 100644 lotus-soup/common_roles.go create mode 100644 lotus-soup/deals.go create mode 100644 lotus-soup/lotus_opts.go create mode 100644 lotus-soup/retrieval.go create mode 100644 lotus-soup/role_bootstrapper.go create mode 100644 lotus-soup/role_client.go rename lotus-soup/{drand.go => role_drand.go} (94%) create mode 100644 lotus-soup/role_miner.go rename lotus-soup/{tracer.go => role_pubsub_tracer.go} (89%) create mode 100644 lotus-soup/roles.go create mode 100644 lotus-soup/sync.go diff --git a/lotus-soup/baseline.go b/lotus-soup/baseline.go deleted file mode 100644 index 134d42fec..000000000 --- a/lotus-soup/baseline.go +++ /dev/null @@ -1,253 +0,0 @@ -package main - -import ( - "bytes" - "context" - "fmt" - "io/ioutil" - "math/rand" - "os" - "path/filepath" - "time" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/types" - - "github.com/ipfs/go-cid" - files "github.com/ipfs/go-ipfs-files" - ipld "github.com/ipfs/go-ipld-format" - dag "github.com/ipfs/go-merkledag" - dstest "github.com/ipfs/go-merkledag/test" - unixfile "github.com/ipfs/go-unixfs/file" - "github.com/ipld/go-car" -) - -// This is the basline test; Filecoin 101. -// -// A network with a bootstrapper, a number of miners, and a number of clients/full nodes -// is constructed and connected through the bootstrapper. -// Some funds are allocated to each node and a number of sectors are presealed in the genesis block. -// -// The test plan: -// One or more clients store content to one or more miners, testing storage deals. -// The plan ensures that the storage deals hit the blockchain and measure the time it took. -// Verification: one or more clients retrieve and verify the hashes of stored content. -// The plan ensures that all (previously) published content can be correctly retrieved -// and measures the time it took. -// -// Preparation of the genesis block: this is the responsibility of the bootstrapper. -// In order to compute the genesis block, we need to collect identities and presealed -// sectors from each node. -// The we create a genesis block that allocates some funds to each node and collects -// the presealed sectors. -var baselineRoles = map[string]func(*TestEnvironment) error{ - "bootstrapper": runBootstrapper, - "miner": runMiner, - "client": runBaselineClient, - "drand": runDrandNode, - "pubsub-tracer": runPubsubTracer, -} - -func runBaselineClient(t *TestEnvironment) error { - t.RecordMessage("running client") - cl, err := prepareClient(t) - if err != nil { - return err - } - - ctx := context.Background() - addrs, err := collectMinerAddrs(t, ctx, t.IntParam("miners")) - if err != nil { - return err - } - t.RecordMessage("got %v miner addrs", len(addrs)) - - client := cl.fullApi - - // select a random miner - minerAddr := addrs[rand.Intn(len(addrs))] - if err := client.NetConnect(ctx, minerAddr.PeerAddr); err != nil { - return err - } - t.D().Counter(fmt.Sprintf("send-data-to,miner=%s", minerAddr.ActorAddr)).Inc(1) - - t.RecordMessage("selected %s as the miner", minerAddr.ActorAddr) - - time.Sleep(2 * time.Second) - - // generate random data - data := make([]byte, 1600) - rand.New(rand.NewSource(time.Now().UnixNano())).Read(data) - - file, err := ioutil.TempFile("/tmp", "data") - if err != nil { - return err - } - defer os.Remove(file.Name()) - - _, err = file.Write(data) - if err != nil { - return err - } - - fcid, err := client.ClientImport(ctx, api.FileRef{Path: file.Name(), IsCAR: false}) - if err != nil { - return err - } - t.RecordMessage("file cid: %s", fcid) - - // start deal - t1 := time.Now() - deal := startDeal(ctx, minerAddr.ActorAddr, client, fcid) - t.RecordMessage("started deal: %s", deal) - - // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this - time.Sleep(2 * time.Second) - - t.RecordMessage("waiting for deal to be sealed") - waitDealSealed(t, ctx, client, deal) - t.D().ResettingHistogram("deal.sealed").Update(int64(time.Since(t1))) - - carExport := true - - t.RecordMessage("trying to retrieve %s", fcid) - retrieveData(t, ctx, err, client, fcid, carExport, data) - t.D().ResettingHistogram("deal.retrieved").Update(int64(time.Since(t1))) - - t.SyncClient.MustSignalEntry(ctx, stateStopMining) - - time.Sleep(10 * time.Second) // wait for metrics to be emitted - - // TODO broadcast published content CIDs to other clients - // TODO select a random piece of content published by some other client and retrieve it - - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) - return nil -} - -func startDeal(ctx context.Context, minerActorAddr address.Address, client api.FullNode, fcid cid.Cid) *cid.Cid { - addr, err := client.WalletDefaultAddress(ctx) - if err != nil { - panic(err) - } - - deal, err := client.ClientStartDeal(ctx, &api.StartDealParams{ - Data: &storagemarket.DataRef{Root: fcid}, - Wallet: addr, - Miner: minerActorAddr, - EpochPrice: types.NewInt(1000000), - MinBlocksDuration: 1000, - }) - if err != nil { - panic(err) - } - return deal -} - -func waitDealSealed(t *TestEnvironment, ctx context.Context, client api.FullNode, deal *cid.Cid) { -loop: - for { - di, err := client.ClientGetDealInfo(ctx, *deal) - if err != nil { - panic(err) - } - switch di.State { - case storagemarket.StorageDealProposalRejected: - panic("deal rejected") - case storagemarket.StorageDealFailing: - panic("deal failed") - case storagemarket.StorageDealError: - panic(fmt.Sprintf("deal errored %s", di.Message)) - case storagemarket.StorageDealActive: - t.RecordMessage("completed deal: %s", di) - break loop - } - t.RecordMessage("deal state: %s", storagemarket.DealStates[di.State]) - time.Sleep(2 * time.Second) - } -} - -func retrieveData(t *TestEnvironment, ctx context.Context, err error, client api.FullNode, fcid cid.Cid, carExport bool, data []byte) { - t1 := time.Now() - offers, err := client.ClientFindData(ctx, fcid) - if err != nil { - panic(err) - } - for _, o := range offers { - t.D().Counter(fmt.Sprintf("find-data.offer,miner=%s", o.Miner)).Inc(1) - } - t.D().ResettingHistogram("find-data").Update(int64(time.Since(t1))) - - if len(offers) < 1 { - panic("no offers") - } - - rpath, err := ioutil.TempDir("", "lotus-retrieve-test-") - if err != nil { - panic(err) - } - defer os.RemoveAll(rpath) - - caddr, err := client.WalletDefaultAddress(ctx) - if err != nil { - panic(err) - } - - ref := &api.FileRef{ - Path: filepath.Join(rpath, "ret"), - IsCAR: carExport, - } - t1 = time.Now() - err = client.ClientRetrieve(ctx, offers[0].Order(caddr), ref) - if err != nil { - panic(err) - } - t.D().ResettingHistogram("retrieve-data").Update(int64(time.Since(t1))) - - rdata, err := ioutil.ReadFile(filepath.Join(rpath, "ret")) - if err != nil { - panic(err) - } - - if carExport { - rdata = extractCarData(ctx, rdata, rpath) - } - - if !bytes.Equal(rdata, data) { - panic("wrong data retrieved") - } - - t.RecordMessage("retrieved successfully") -} - -func extractCarData(ctx context.Context, rdata []byte, rpath string) []byte { - bserv := dstest.Bserv() - ch, err := car.LoadCar(bserv.Blockstore(), bytes.NewReader(rdata)) - if err != nil { - panic(err) - } - b, err := bserv.GetBlock(ctx, ch.Roots[0]) - if err != nil { - panic(err) - } - nd, err := ipld.Decode(b) - if err != nil { - panic(err) - } - dserv := dag.NewDAGService(bserv) - fil, err := unixfile.NewUnixfsFile(ctx, dserv, nd) - if err != nil { - panic(err) - } - outPath := filepath.Join(rpath, "retLoadedCAR") - if err := files.WriteTo(fil, outPath); err != nil { - panic(err) - } - rdata, err = ioutil.ReadFile(outPath) - if err != nil { - panic(err) - } - return rdata -} diff --git a/lotus-soup/common_roles.go b/lotus-soup/common_roles.go deleted file mode 100644 index f6aa2454f..000000000 --- a/lotus-soup/common_roles.go +++ /dev/null @@ -1,106 +0,0 @@ -package main - -import ( - "context" - "fmt" - - "github.com/filecoin-project/lotus/build" - "github.com/testground/sdk-go/sync" -) - -func runBootstrapper(t *TestEnvironment) error { - t.RecordMessage("running bootstrapper") - _, err := prepareBootstrapper(t) - if err != nil { - return err - } - - ctx := context.Background() - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) - return nil -} - -func runMiner(t *TestEnvironment) error { - t.RecordMessage("running miner") - miner, err := prepareMiner(t) - if err != nil { - return err - } - - t.RecordMessage("block delay: %v", build.BlockDelay) - t.D().Gauge("miner.block-delay").Update(build.BlockDelay) - - ctx := context.Background() - - clients := t.IntParam("clients") - miners := t.IntParam("miners") - - myActorAddr, err := miner.minerApi.ActorAddress(ctx) - if err != nil { - return err - } - - // mine / stop mining - mine := true - done := make(chan struct{}) - - if miner.MineOne != nil { - go func() { - defer t.RecordMessage("shutting down mining") - defer close(done) - - var i int - for i = 0; mine; i++ { - // synchronize all miners to mine the next block - t.RecordMessage("synchronizing all miners to mine next block [%d]", i) - stateMineNext := sync.State(fmt.Sprintf("mine-block-%d", i)) - t.SyncClient.MustSignalAndWait(ctx, stateMineNext, miners) - - ch := make(chan struct{}) - err := miner.MineOne(ctx, func(mined bool) { - if mined { - t.D().Counter(fmt.Sprintf("block.mine,miner=%s", myActorAddr)).Inc(1) - } - close(ch) - }) - if err != nil { - panic(err) - } - <-ch - } - - // signal the last block to make sure no miners are left stuck waiting for the next block signal - // while the others have stopped - stateMineLast := sync.State(fmt.Sprintf("mine-block-%d", i)) - t.SyncClient.MustSignalEntry(ctx, stateMineLast) - }() - } else { - close(done) - } - - // wait for a signal from all clients to stop mining - err = <-t.SyncClient.MustBarrier(ctx, stateStopMining, clients).C - if err != nil { - return err - } - - mine = false - <-done - - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) - return nil -} - -func runDrandNode(t *TestEnvironment) error { - t.RecordMessage("running drand node") - dr, err := prepareDrandNode(t) - if err != nil { - return err - } - defer dr.Cleanup() - - // TODO add ability to halt / recover on demand - ctx := context.Background() - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) - return nil -} diff --git a/lotus-soup/deals.go b/lotus-soup/deals.go new file mode 100644 index 000000000..5ae2699a5 --- /dev/null +++ b/lotus-soup/deals.go @@ -0,0 +1,55 @@ +package main + +import ( + "context" + "fmt" + "time" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + "github.com/ipfs/go-cid" +) + +func startDeal(ctx context.Context, minerActorAddr address.Address, client api.FullNode, fcid cid.Cid) *cid.Cid { + addr, err := client.WalletDefaultAddress(ctx) + if err != nil { + panic(err) + } + + deal, err := client.ClientStartDeal(ctx, &api.StartDealParams{ + Data: &storagemarket.DataRef{Root: fcid}, + Wallet: addr, + Miner: minerActorAddr, + EpochPrice: types.NewInt(1000000), + MinBlocksDuration: 1000, + }) + if err != nil { + panic(err) + } + return deal +} + +func waitDealSealed(t *TestEnvironment, ctx context.Context, client api.FullNode, deal *cid.Cid) { +loop: + for { + di, err := client.ClientGetDealInfo(ctx, *deal) + if err != nil { + panic(err) + } + switch di.State { + case storagemarket.StorageDealProposalRejected: + panic("deal rejected") + case storagemarket.StorageDealFailing: + panic("deal failed") + case storagemarket.StorageDealError: + panic(fmt.Sprintf("deal errored %s", di.Message)) + case storagemarket.StorageDealActive: + t.RecordMessage("completed deal: %s", di) + break loop + } + t.RecordMessage("deal state: %s", storagemarket.DealStates[di.State]) + time.Sleep(2 * time.Second) + } +} diff --git a/lotus-soup/lotus_opts.go b/lotus-soup/lotus_opts.go new file mode 100644 index 000000000..a02befb56 --- /dev/null +++ b/lotus-soup/lotus_opts.go @@ -0,0 +1,67 @@ +package main + +import ( + "fmt" + + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules" + "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/lp2p" + "github.com/filecoin-project/lotus/node/repo" + + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" +) + +func withGenesis(gb []byte) node.Option { + return node.Override(new(modules.Genesis), modules.LoadGenesis(gb)) +} + +func withBootstrapper(ab []byte) node.Option { + return node.Override(new(dtypes.BootstrapPeers), + func() (dtypes.BootstrapPeers, error) { + if ab == nil { + return dtypes.BootstrapPeers{}, nil + } + + a, err := ma.NewMultiaddrBytes(ab) + if err != nil { + return nil, err + } + ai, err := peer.AddrInfoFromP2pAddr(a) + if err != nil { + return nil, err + } + return dtypes.BootstrapPeers{*ai}, nil + }) +} + +func withPubsubConfig(bootstrapper bool, pubsubTracer string) node.Option { + return node.Override(new(*config.Pubsub), func() *config.Pubsub { + return &config.Pubsub{ + Bootstrapper: bootstrapper, + RemoteTracer: pubsubTracer, + } + }) +} + +func withListenAddress(ip string) node.Option { + addrs := []string{fmt.Sprintf("/ip4/%s/tcp/4001", ip)} + return node.Override(node.StartListeningKey, lp2p.StartListening(addrs)) +} + +func withMinerListenAddress(ip string) node.Option { + addrs := []string{fmt.Sprintf("/ip4/%s/tcp/4002", ip)} + return node.Override(node.StartListeningKey, lp2p.StartListening(addrs)) +} + +func withApiEndpoint(addr string) node.Option { + return node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { + apima, err := ma.NewMultiaddr(addr) + if err != nil { + return err + } + return lr.SetAPIEndpoint(apima) + }) +} diff --git a/lotus-soup/main.go b/lotus-soup/main.go index e0906be1e..051f51eb6 100644 --- a/lotus-soup/main.go +++ b/lotus-soup/main.go @@ -8,7 +8,7 @@ import ( ) var testplans = map[string]interface{}{ - "lotus-baseline": doRun(baselineRoles), + "lotus-baseline": doRun(basicRoles), } func main() { diff --git a/lotus-soup/node.go b/lotus-soup/node.go index 13bb959f7..95a628607 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/node.go @@ -1,62 +1,35 @@ package main import ( - "bytes" "context" - "crypto/rand" "fmt" - "io/ioutil" "net/http" "os" "sort" "strings" "time" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-jsonrpc" - "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/go-storedcounter" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/beacon" - genesis_chain "github.com/filecoin-project/lotus/chain/gen/genesis" - "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet" - "github.com/filecoin-project/lotus/cmd/lotus-seed/seed" - "github.com/filecoin-project/lotus/genesis" "github.com/filecoin-project/lotus/metrics" - "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node" - "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/impl" - "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/node/modules/lp2p" modtest "github.com/filecoin-project/lotus/node/modules/testing" "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/abi/big" - "github.com/filecoin-project/specs-actors/actors/builtin" saminer "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/builtin/power" "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - "github.com/filecoin-project/specs-actors/actors/crypto" - "github.com/gorilla/mux" - "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" influxdb "github.com/kpacha/opencensus-influxdb" - libp2p_crypto "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" - "github.com/multiformats/go-multiaddr" - ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" "github.com/testground/sdk-go/run" "github.com/testground/sdk-go/runtime" - "github.com/testground/sdk-go/sync" - "go.opencensus.io/stats" "go.opencensus.io/stats/view" ) @@ -76,21 +49,7 @@ func init() { verifreg.MinVerifiedDealSize = big.NewInt(256) } -var ( - PrepareNodeTimeout = time.Minute - - genesisTopic = sync.NewTopic("genesis", &GenesisMsg{}) - balanceTopic = sync.NewTopic("balance", &InitialBalanceMsg{}) - presealTopic = sync.NewTopic("preseal", &PresealMsg{}) - - clientsAddrsTopic = sync.NewTopic("clientsAddrsTopic", &peer.AddrInfo{}) - minersAddrsTopic = sync.NewTopic("minersAddrsTopic", &MinerAddresses{}) - - stateReady = sync.State("ready") - stateDone = sync.State("done") - stateStopMining = sync.State("stop-mining") - stateMinerPickSeqNum = sync.State("miner-pick-seq-num") -) +var PrepareNodeTimeout = time.Minute type TestEnvironment struct { *runtime.RunEnv @@ -117,482 +76,6 @@ type Node struct { MineOne func(context.Context, func(bool)) error } -type InitialBalanceMsg struct { - Addr address.Address - Balance int -} - -type PresealMsg struct { - Miner genesis.Miner - Seqno int64 -} - -type GenesisMsg struct { - Genesis []byte - Bootstrapper []byte -} - -type MinerAddresses struct { - PeerAddr peer.AddrInfo - ActorAddr address.Address -} - -func prepareBootstrapper(t *TestEnvironment) (*Node, error) { - ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) - defer cancel() - - pubsubTracer, err := getPubsubTracerConfig(ctx, t) - if err != nil { - return nil, err - } - - clients := t.IntParam("clients") - miners := t.IntParam("miners") - nodes := clients + miners - - drandOpt, err := getDrandConfig(ctx, t) - if err != nil { - return nil, err - } - - // the first duty of the boostrapper is to construct the genesis block - // first collect all client and miner balances to assign initial funds - balances, err := waitForBalances(t, ctx, nodes) - if err != nil { - return nil, err - } - - // then collect all preseals from miners - preseals, err := collectPreseals(t, ctx, miners) - if err != nil { - return nil, err - } - - // now construct the genesis block - var genesisActors []genesis.Actor - var genesisMiners []genesis.Miner - - for _, bm := range balances { - genesisActors = append(genesisActors, - genesis.Actor{ - Type: genesis.TAccount, - Balance: big.Mul(big.NewInt(int64(bm.Balance)), types.NewInt(build.FilecoinPrecision)), - Meta: (&genesis.AccountMeta{Owner: bm.Addr}).ActorMeta(), - }) - } - - for _, pm := range preseals { - genesisMiners = append(genesisMiners, pm.Miner) - } - - genesisTemplate := genesis.Template{ - Accounts: genesisActors, - Miners: genesisMiners, - Timestamp: uint64(time.Now().Unix()) - uint64(t.IntParam("genesis_timestamp_offset")), // this needs to be in the past - } - - // dump the genesis block - // var jsonBuf bytes.Buffer - // jsonEnc := json.NewEncoder(&jsonBuf) - // err := jsonEnc.Encode(genesisTemplate) - // if err != nil { - // panic(err) - // } - // runenv.RecordMessage(fmt.Sprintf("Genesis template: %s", string(jsonBuf.Bytes()))) - - // this is horrendously disgusting, we use this contraption to side effect the construction - // of the genesis block in the buffer -- yes, a side effect of dependency injection. - // I remember when software was straightforward... - var genesisBuffer bytes.Buffer - - bootstrapperIP := t.NetClient.MustGetDataNetworkIP().String() - - n := &Node{} - stop, err := node.New(context.Background(), - node.FullAPI(&n.fullApi), - node.Online(), - node.Repo(repo.NewMemory(nil)), - node.Override(new(modules.Genesis), modtest.MakeGenesisMem(&genesisBuffer, genesisTemplate)), - withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), - withListenAddress(bootstrapperIP), - withBootstrapper(nil), - withPubsubConfig(true, pubsubTracer), - drandOpt, - ) - if err != nil { - return nil, err - } - n.stop = stop - - var bootstrapperAddr ma.Multiaddr - - bootstrapperAddrs, err := n.fullApi.NetAddrsListen(ctx) - if err != nil { - stop(context.TODO()) - return nil, err - } - for _, a := range bootstrapperAddrs.Addrs { - ip, err := a.ValueForProtocol(ma.P_IP4) - if err != nil { - continue - } - if ip != bootstrapperIP { - continue - } - addrs, err := peer.AddrInfoToP2pAddrs(&peer.AddrInfo{ - ID: bootstrapperAddrs.ID, - Addrs: []ma.Multiaddr{a}, - }) - if err != nil { - panic(err) - } - bootstrapperAddr = addrs[0] - break - } - - if bootstrapperAddr == nil { - panic("failed to determine bootstrapper address") - } - - genesisMsg := &GenesisMsg{ - Genesis: genesisBuffer.Bytes(), - Bootstrapper: bootstrapperAddr.Bytes(), - } - t.SyncClient.MustPublish(ctx, genesisTopic, genesisMsg) - - t.RecordMessage("waiting for all nodes to be ready") - t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) - - return n, nil -} - -func prepareMiner(t *TestEnvironment) (*Node, error) { - ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) - defer cancel() - - pubsubTracer, err := getPubsubTracerConfig(ctx, t) - if err != nil { - return nil, err - } - - drandOpt, err := getDrandConfig(ctx, t) - if err != nil { - return nil, err - } - - // first create a wallet - walletKey, err := wallet.GenerateKey(crypto.SigTypeBLS) - if err != nil { - return nil, err - } - - // publish the account ID/balance - balance := t.IntParam("balance") - balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance} - t.SyncClient.Publish(ctx, balanceTopic, balanceMsg) - - // create and publish the preseal commitment - priv, _, err := libp2p_crypto.GenerateEd25519Key(rand.Reader) - if err != nil { - return nil, err - } - - minerID, err := peer.IDFromPrivateKey(priv) - if err != nil { - return nil, err - } - - // pick unique sequence number for each miner, no matter in which group they are - seq := t.SyncClient.MustSignalAndWait(ctx, stateMinerPickSeqNum, t.IntParam("miners")) - - minerAddr, err := address.NewIDAddress(genesis_chain.MinerStart + uint64(seq-1)) - if err != nil { - return nil, err - } - - presealDir, err := ioutil.TempDir("", "preseal") - if err != nil { - return nil, err - } - - sectors := t.IntParam("sectors") - genMiner, _, err := seed.PreSeal(minerAddr, abi.RegisteredSealProof_StackedDrg2KiBV1, 0, sectors, presealDir, []byte("TODO: randomize this"), &walletKey.KeyInfo) - if err != nil { - return nil, err - } - genMiner.PeerId = minerID - - t.RecordMessage("Miner Info: Owner: %s Worker: %s", genMiner.Owner, genMiner.Worker) - - presealMsg := &PresealMsg{Miner: *genMiner, Seqno: seq} - t.SyncClient.Publish(ctx, presealTopic, presealMsg) - - // then collect the genesis block and bootstrapper address - genesisMsg, err := waitForGenesis(t, ctx) - if err != nil { - return nil, err - } - - // prepare the repo - minerRepo := repo.NewMemory(nil) - - lr, err := minerRepo.Lock(repo.StorageMiner) - if err != nil { - return nil, err - } - - ks, err := lr.KeyStore() - if err != nil { - return nil, err - } - - kbytes, err := priv.Bytes() - if err != nil { - return nil, err - } - - err = ks.Put("libp2p-host", types.KeyInfo{ - Type: "libp2p-host", - PrivateKey: kbytes, - }) - if err != nil { - return nil, err - } - - ds, err := lr.Datastore("/metadata") - if err != nil { - return nil, err - } - - err = ds.Put(datastore.NewKey("miner-address"), minerAddr.Bytes()) - if err != nil { - return nil, err - } - - nic := storedcounter.New(ds, datastore.NewKey(modules.StorageCounterDSPrefix)) - for i := 0; i < (sectors + 1); i++ { - _, err = nic.Next() - if err != nil { - return nil, err - } - } - - err = lr.Close() - if err != nil { - return nil, err - } - - minerIP := t.NetClient.MustGetDataNetworkIP().String() - - // create the node - // we need both a full node _and_ and storage miner node - n := &Node{} - - nodeRepo := repo.NewMemory(nil) - - stop1, err := node.New(context.Background(), - node.FullAPI(&n.fullApi), - node.Online(), - node.Repo(nodeRepo), - withGenesis(genesisMsg.Genesis), - withListenAddress(minerIP), - withBootstrapper(genesisMsg.Bootstrapper), - withPubsubConfig(false, pubsubTracer), - drandOpt, - ) - if err != nil { - return nil, err - } - - // set the wallet - err = n.setWallet(ctx, walletKey) - if err != nil { - stop1(context.TODO()) - return nil, err - } - - minerOpts := []node.Option{ - node.StorageMiner(&n.minerApi), - node.Online(), - node.Repo(minerRepo), - node.Override(new(api.FullNode), n.fullApi), - withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), - withMinerListenAddress(minerIP), - } - - if t.StringParam("mining_mode") != "natural" { - mineBlock := make(chan func(bool)) - minerOpts = append(minerOpts, - node.Override(new(*miner.Miner), miner.NewTestMiner(mineBlock, minerAddr))) - n.MineOne = func(ctx context.Context, cb func(bool)) error { - select { - case mineBlock <- cb: - return nil - case <-ctx.Done(): - return ctx.Err() - } - } - } - - stop2, err := node.New(context.Background(), minerOpts...) - if err != nil { - stop1(context.TODO()) - return nil, err - } - n.stop = func(ctx context.Context) error { - // TODO use a multierror for this - err2 := stop2(ctx) - err1 := stop1(ctx) - if err2 != nil { - return err2 - } - return err1 - } - - registerAndExportMetrics(minerAddr.String()) - - // Bootstrap with full node - remoteAddrs, err := n.fullApi.NetAddrsListen(ctx) - if err != nil { - panic(err) - } - - err = n.minerApi.NetConnect(ctx, remoteAddrs) - if err != nil { - panic(err) - } - - err = startStorMinerAPIServer(minerRepo, n.minerApi) - if err != nil { - return nil, err - } - - // add local storage for presealed sectors - err = n.minerApi.StorageAddLocal(ctx, presealDir) - if err != nil { - n.stop(context.TODO()) - return nil, err - } - - // set the miner PeerID - minerIDEncoded, err := actors.SerializeParams(&saminer.ChangePeerIDParams{NewID: abi.PeerID(minerID)}) - if err != nil { - return nil, err - } - - changeMinerID := &types.Message{ - To: minerAddr, - From: genMiner.Worker, - Method: builtin.MethodsMiner.ChangePeerID, - Params: minerIDEncoded, - Value: types.NewInt(0), - GasPrice: types.NewInt(0), - GasLimit: 1000000, - } - - _, err = n.fullApi.MpoolPushMessage(ctx, changeMinerID) - if err != nil { - n.stop(context.TODO()) - return nil, err - } - - t.RecordMessage("publish our address to the miners addr topic") - actoraddress, err := n.minerApi.ActorAddress(ctx) - if err != nil { - return nil, err - } - addrinfo, err := n.minerApi.NetAddrsListen(ctx) - if err != nil { - return nil, err - } - t.SyncClient.MustPublish(ctx, minersAddrsTopic, MinerAddresses{addrinfo, actoraddress}) - - t.RecordMessage("waiting for all nodes to be ready") - t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) - - return n, err -} - -func prepareClient(t *TestEnvironment) (*Node, error) { - ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) - defer cancel() - - pubsubTracer, err := getPubsubTracerConfig(ctx, t) - if err != nil { - return nil, err - } - - drandOpt, err := getDrandConfig(ctx, t) - if err != nil { - return nil, err - } - - // first create a wallet - walletKey, err := wallet.GenerateKey(crypto.SigTypeBLS) - if err != nil { - return nil, err - } - - // publish the account ID/balance - balance := t.IntParam("balance") - balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance} - t.SyncClient.Publish(ctx, balanceTopic, balanceMsg) - - // then collect the genesis block and bootstrapper address - genesisMsg, err := waitForGenesis(t, ctx) - if err != nil { - return nil, err - } - - clientIP := t.NetClient.MustGetDataNetworkIP().String() - - nodeRepo := repo.NewMemory(nil) - - // create the node - n := &Node{} - stop, err := node.New(context.Background(), - node.FullAPI(&n.fullApi), - node.Online(), - node.Repo(nodeRepo), - withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), - withGenesis(genesisMsg.Genesis), - withListenAddress(clientIP), - withBootstrapper(genesisMsg.Bootstrapper), - withPubsubConfig(false, pubsubTracer), - drandOpt, - ) - if err != nil { - return nil, err - } - n.stop = stop - - // set the wallet - err = n.setWallet(ctx, walletKey) - if err != nil { - stop(context.TODO()) - return nil, err - } - - err = startClientAPIServer(nodeRepo, n.fullApi) - if err != nil { - return nil, err - } - - registerAndExportMetrics(fmt.Sprintf("client_%d", t.GroupSeq)) - - t.RecordMessage("publish our address to the clients addr topic") - addrinfo, err := n.fullApi.NetAddrsListen(ctx) - if err != nil { - return nil, err - } - t.SyncClient.MustPublish(ctx, clientsAddrsTopic, addrinfo) - - t.RecordMessage("waiting for all nodes to be ready") - t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) - - return n, nil -} - func (n *Node) setWallet(ctx context.Context, walletKey *wallet.Key) error { _, err := n.fullApi.WalletImport(ctx, &walletKey.KeyInfo) if err != nil { @@ -607,58 +90,6 @@ func (n *Node) setWallet(ctx context.Context, walletKey *wallet.Key) error { return nil } -func withGenesis(gb []byte) node.Option { - return node.Override(new(modules.Genesis), modules.LoadGenesis(gb)) -} - -func withBootstrapper(ab []byte) node.Option { - return node.Override(new(dtypes.BootstrapPeers), - func() (dtypes.BootstrapPeers, error) { - if ab == nil { - return dtypes.BootstrapPeers{}, nil - } - - a, err := ma.NewMultiaddrBytes(ab) - if err != nil { - return nil, err - } - ai, err := peer.AddrInfoFromP2pAddr(a) - if err != nil { - return nil, err - } - return dtypes.BootstrapPeers{*ai}, nil - }) -} - -func withPubsubConfig(bootstrapper bool, pubsubTracer string) node.Option { - return node.Override(new(*config.Pubsub), func() *config.Pubsub { - return &config.Pubsub{ - Bootstrapper: bootstrapper, - RemoteTracer: pubsubTracer, - } - }) -} - -func withListenAddress(ip string) node.Option { - addrs := []string{fmt.Sprintf("/ip4/%s/tcp/4001", ip)} - return node.Override(node.StartListeningKey, lp2p.StartListening(addrs)) -} - -func withMinerListenAddress(ip string) node.Option { - addrs := []string{fmt.Sprintf("/ip4/%s/tcp/4002", ip)} - return node.Override(node.StartListeningKey, lp2p.StartListening(addrs)) -} - -func withApiEndpoint(addr string) node.Option { - return node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error { - apima, err := multiaddr.NewMultiaddr(addr) - if err != nil { - return err - } - return lr.SetAPIEndpoint(apima) - }) -} - func waitForBalances(t *TestEnvironment, ctx context.Context, nodes int) ([]*InitialBalanceMsg, error) { ch := make(chan *InitialBalanceMsg) sub := t.SyncClient.MustSubscribe(ctx, balanceTopic, ch) @@ -709,11 +140,11 @@ func waitForGenesis(t *TestEnvironment, ctx context.Context) (*GenesisMsg, error } } -func collectMinerAddrs(t *TestEnvironment, ctx context.Context, miners int) ([]MinerAddresses, error) { - ch := make(chan MinerAddresses) +func collectMinerAddrs(t *TestEnvironment, ctx context.Context, miners int) ([]MinerAddressesMsg, error) { + ch := make(chan MinerAddressesMsg) sub := t.SyncClient.MustSubscribe(ctx, minersAddrsTopic, ch) - addrs := make([]MinerAddresses, 0, miners) + addrs := make([]MinerAddressesMsg, 0, miners) for i := 0; i < miners; i++ { select { case a := <-ch: @@ -743,7 +174,7 @@ func collectClientAddrs(t *TestEnvironment, ctx context.Context, clients int) ([ return addrs, nil } -func getPubsubTracerConfig(ctx context.Context, t *TestEnvironment) (string, error) { +func getPubsubTracerMaddr(ctx context.Context, t *TestEnvironment) (string, error) { if !t.BooleanParam("enable_pubsub_tracer") { return "", nil } @@ -753,13 +184,13 @@ func getPubsubTracerConfig(ctx context.Context, t *TestEnvironment) (string, err select { case m := <-ch: - return m.Tracer, nil + return m.Multiaddr, nil case err := <-sub.Done(): return "", fmt.Errorf("got error while waiting for pubsub tracer config: %w", err) } } -func getDrandConfig(ctx context.Context, t *TestEnvironment) (node.Option, error) { +func getDrandOpts(ctx context.Context, t *TestEnvironment) (node.Option, error) { beaconType := t.StringParam("random_beacon_type") switch beaconType { case "external-drand": @@ -795,42 +226,6 @@ func getDrandConfig(ctx context.Context, t *TestEnvironment) (node.Option, error } } -func startStorMinerAPIServer(repo *repo.MemRepo, minerApi api.StorageMiner) error { - mux := mux.NewRouter() - - rpcServer := jsonrpc.NewServer() - rpcServer.Register("Filecoin", apistruct.PermissionedStorMinerAPI(minerApi)) - - mux.Handle("/rpc/v0", rpcServer) - mux.PathPrefix("/remote").HandlerFunc(minerApi.(*impl.StorageMinerAPI).ServeRemote) - mux.PathPrefix("/").Handler(http.DefaultServeMux) // pprof - - ah := &auth.Handler{ - Verify: minerApi.AuthVerify, - Next: mux.ServeHTTP, - } - - srv := &http.Server{Handler: ah} - - return startServer(repo, srv) -} - -func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { - rpcServer := jsonrpc.NewServer() - rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(api)) - - ah := &auth.Handler{ - Verify: api.AuthVerify, - Next: rpcServer.ServeHTTP, - } - - http.Handle("/rpc/v0", ah) - - srv := &http.Server{Handler: http.DefaultServeMux} - - return startServer(repo, srv) -} - func startServer(repo *repo.MemRepo, srv *http.Server) error { endpoint, err := repo.APIEndpoint() if err != nil { diff --git a/lotus-soup/retrieval.go b/lotus-soup/retrieval.go new file mode 100644 index 000000000..97cadaca6 --- /dev/null +++ b/lotus-soup/retrieval.go @@ -0,0 +1,103 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "time" + + "github.com/filecoin-project/lotus/api" + "github.com/ipfs/go-cid" + files "github.com/ipfs/go-ipfs-files" + ipld "github.com/ipfs/go-ipld-format" + dag "github.com/ipfs/go-merkledag" + dstest "github.com/ipfs/go-merkledag/test" + unixfile "github.com/ipfs/go-unixfs/file" + "github.com/ipld/go-car" +) + +func retrieveData(t *TestEnvironment, ctx context.Context, err error, client api.FullNode, fcid cid.Cid, carExport bool, data []byte) { + t1 := time.Now() + offers, err := client.ClientFindData(ctx, fcid) + if err != nil { + panic(err) + } + for _, o := range offers { + t.D().Counter(fmt.Sprintf("find-data.offer,miner=%s", o.Miner)).Inc(1) + } + t.D().ResettingHistogram("find-data").Update(int64(time.Since(t1))) + + if len(offers) < 1 { + panic("no offers") + } + + rpath, err := ioutil.TempDir("", "lotus-retrieve-test-") + if err != nil { + panic(err) + } + defer os.RemoveAll(rpath) + + caddr, err := client.WalletDefaultAddress(ctx) + if err != nil { + panic(err) + } + + ref := &api.FileRef{ + Path: filepath.Join(rpath, "ret"), + IsCAR: carExport, + } + t1 = time.Now() + err = client.ClientRetrieve(ctx, offers[0].Order(caddr), ref) + if err != nil { + panic(err) + } + t.D().ResettingHistogram("retrieve-data").Update(int64(time.Since(t1))) + + rdata, err := ioutil.ReadFile(filepath.Join(rpath, "ret")) + if err != nil { + panic(err) + } + + if carExport { + rdata = extractCarData(ctx, rdata, rpath) + } + + if !bytes.Equal(rdata, data) { + panic("wrong data retrieved") + } + + t.RecordMessage("retrieved successfully") +} + +func extractCarData(ctx context.Context, rdata []byte, rpath string) []byte { + bserv := dstest.Bserv() + ch, err := car.LoadCar(bserv.Blockstore(), bytes.NewReader(rdata)) + if err != nil { + panic(err) + } + b, err := bserv.GetBlock(ctx, ch.Roots[0]) + if err != nil { + panic(err) + } + nd, err := ipld.Decode(b) + if err != nil { + panic(err) + } + dserv := dag.NewDAGService(bserv) + fil, err := unixfile.NewUnixfsFile(ctx, dserv, nd) + if err != nil { + panic(err) + } + outPath := filepath.Join(rpath, "retLoadedCAR") + if err := files.WriteTo(fil, outPath); err != nil { + panic(err) + } + rdata, err = ioutil.ReadFile(outPath) + if err != nil { + panic(err) + } + return rdata +} diff --git a/lotus-soup/role_bootstrapper.go b/lotus-soup/role_bootstrapper.go new file mode 100644 index 000000000..a6bfa42c3 --- /dev/null +++ b/lotus-soup/role_bootstrapper.go @@ -0,0 +1,161 @@ +package main + +import ( + "bytes" + "context" + "time" + + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/genesis" + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/modules" + modtest "github.com/filecoin-project/lotus/node/modules/testing" + "github.com/filecoin-project/lotus/node/repo" + + "github.com/filecoin-project/specs-actors/actors/abi/big" + + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" +) + +func runBootstrapper(t *TestEnvironment) error { + t.RecordMessage("running bootstrapper") + _, err := prepareBootstrapper(t) + if err != nil { + return err + } + + ctx := context.Background() + t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) + return nil +} + +func prepareBootstrapper(t *TestEnvironment) (*Node, error) { + ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) + defer cancel() + + pubsubTracer, err := getPubsubTracerMaddr(ctx, t) + if err != nil { + return nil, err + } + + clients := t.IntParam("clients") + miners := t.IntParam("miners") + nodes := clients + miners + + drandOpt, err := getDrandOpts(ctx, t) + if err != nil { + return nil, err + } + + // the first duty of the boostrapper is to construct the genesis block + // first collect all client and miner balances to assign initial funds + balances, err := waitForBalances(t, ctx, nodes) + if err != nil { + return nil, err + } + + // then collect all preseals from miners + preseals, err := collectPreseals(t, ctx, miners) + if err != nil { + return nil, err + } + + // now construct the genesis block + var genesisActors []genesis.Actor + var genesisMiners []genesis.Miner + + for _, bm := range balances { + genesisActors = append(genesisActors, + genesis.Actor{ + Type: genesis.TAccount, + Balance: big.Mul(big.NewInt(int64(bm.Balance)), types.NewInt(build.FilecoinPrecision)), + Meta: (&genesis.AccountMeta{Owner: bm.Addr}).ActorMeta(), + }) + } + + for _, pm := range preseals { + genesisMiners = append(genesisMiners, pm.Miner) + } + + genesisTemplate := genesis.Template{ + Accounts: genesisActors, + Miners: genesisMiners, + Timestamp: uint64(time.Now().Unix()) - uint64(t.IntParam("genesis_timestamp_offset")), // this needs to be in the past + } + + // dump the genesis block + // var jsonBuf bytes.Buffer + // jsonEnc := json.NewEncoder(&jsonBuf) + // err := jsonEnc.Encode(genesisTemplate) + // if err != nil { + // panic(err) + // } + // runenv.RecordMessage(fmt.Sprintf("Genesis template: %s", string(jsonBuf.Bytes()))) + + // this is horrendously disgusting, we use this contraption to side effect the construction + // of the genesis block in the buffer -- yes, a side effect of dependency injection. + // I remember when software was straightforward... + var genesisBuffer bytes.Buffer + + bootstrapperIP := t.NetClient.MustGetDataNetworkIP().String() + + n := &Node{} + stop, err := node.New(context.Background(), + node.FullAPI(&n.fullApi), + node.Online(), + node.Repo(repo.NewMemory(nil)), + node.Override(new(modules.Genesis), modtest.MakeGenesisMem(&genesisBuffer, genesisTemplate)), + withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), + withListenAddress(bootstrapperIP), + withBootstrapper(nil), + withPubsubConfig(true, pubsubTracer), + drandOpt, + ) + if err != nil { + return nil, err + } + n.stop = stop + + var bootstrapperAddr ma.Multiaddr + + bootstrapperAddrs, err := n.fullApi.NetAddrsListen(ctx) + if err != nil { + stop(context.TODO()) + return nil, err + } + for _, a := range bootstrapperAddrs.Addrs { + ip, err := a.ValueForProtocol(ma.P_IP4) + if err != nil { + continue + } + if ip != bootstrapperIP { + continue + } + addrs, err := peer.AddrInfoToP2pAddrs(&peer.AddrInfo{ + ID: bootstrapperAddrs.ID, + Addrs: []ma.Multiaddr{a}, + }) + if err != nil { + panic(err) + } + bootstrapperAddr = addrs[0] + break + } + + if bootstrapperAddr == nil { + panic("failed to determine bootstrapper address") + } + + genesisMsg := &GenesisMsg{ + Genesis: genesisBuffer.Bytes(), + Bootstrapper: bootstrapperAddr.Bytes(), + } + t.SyncClient.MustPublish(ctx, genesisTopic, genesisMsg) + + t.RecordMessage("waiting for all nodes to be ready") + t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) + + return n, nil +} diff --git a/lotus-soup/role_client.go b/lotus-soup/role_client.go new file mode 100644 index 000000000..b3cbe4b02 --- /dev/null +++ b/lotus-soup/role_client.go @@ -0,0 +1,194 @@ +package main + +import ( + "context" + "fmt" + "io/ioutil" + "math/rand" + "net/http" + "os" + "time" + + "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/chain/wallet" + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/repo" + + "github.com/filecoin-project/specs-actors/actors/crypto" +) + +func runBaselineClient(t *TestEnvironment) error { + t.RecordMessage("running client") + cl, err := prepareClient(t) + if err != nil { + return err + } + + ctx := context.Background() + addrs, err := collectMinerAddrs(t, ctx, t.IntParam("miners")) + if err != nil { + return err + } + t.RecordMessage("got %v miner addrs", len(addrs)) + + client := cl.fullApi + + // select a random miner + minerAddr := addrs[rand.Intn(len(addrs))] + if err := client.NetConnect(ctx, minerAddr.PeerAddr); err != nil { + return err + } + t.D().Counter(fmt.Sprintf("send-data-to,miner=%s", minerAddr.ActorAddr)).Inc(1) + + t.RecordMessage("selected %s as the miner", minerAddr.ActorAddr) + + time.Sleep(2 * time.Second) + + // generate 1600 bytes of random data + data := make([]byte, 1600) + rand.New(rand.NewSource(time.Now().UnixNano())).Read(data) + + file, err := ioutil.TempFile("/tmp", "data") + if err != nil { + return err + } + defer os.Remove(file.Name()) + + _, err = file.Write(data) + if err != nil { + return err + } + + fcid, err := client.ClientImport(ctx, api.FileRef{Path: file.Name(), IsCAR: false}) + if err != nil { + return err + } + t.RecordMessage("file cid: %s", fcid) + + // start deal + t1 := time.Now() + deal := startDeal(ctx, minerAddr.ActorAddr, client, fcid) + t.RecordMessage("started deal: %s", deal) + + // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this + time.Sleep(2 * time.Second) + + t.RecordMessage("waiting for deal to be sealed") + waitDealSealed(t, ctx, client, deal) + t.D().ResettingHistogram("deal.sealed").Update(int64(time.Since(t1))) + + carExport := true + + t.RecordMessage("trying to retrieve %s", fcid) + retrieveData(t, ctx, err, client, fcid, carExport, data) + t.D().ResettingHistogram("deal.retrieved").Update(int64(time.Since(t1))) + + t.SyncClient.MustSignalEntry(ctx, stateStopMining) + + time.Sleep(10 * time.Second) // wait for metrics to be emitted + + // TODO broadcast published content CIDs to other clients + // TODO select a random piece of content published by some other client and retrieve it + + t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) + return nil +} + +func prepareClient(t *TestEnvironment) (*Node, error) { + ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) + defer cancel() + + pubsubTracer, err := getPubsubTracerMaddr(ctx, t) + if err != nil { + return nil, err + } + + drandOpt, err := getDrandOpts(ctx, t) + if err != nil { + return nil, err + } + + // first create a wallet + walletKey, err := wallet.GenerateKey(crypto.SigTypeBLS) + if err != nil { + return nil, err + } + + // publish the account ID/balance + balance := t.IntParam("balance") + balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance} + t.SyncClient.Publish(ctx, balanceTopic, balanceMsg) + + // then collect the genesis block and bootstrapper address + genesisMsg, err := waitForGenesis(t, ctx) + if err != nil { + return nil, err + } + + clientIP := t.NetClient.MustGetDataNetworkIP().String() + + nodeRepo := repo.NewMemory(nil) + + // create the node + n := &Node{} + stop, err := node.New(context.Background(), + node.FullAPI(&n.fullApi), + node.Online(), + node.Repo(nodeRepo), + withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), + withGenesis(genesisMsg.Genesis), + withListenAddress(clientIP), + withBootstrapper(genesisMsg.Bootstrapper), + withPubsubConfig(false, pubsubTracer), + drandOpt, + ) + if err != nil { + return nil, err + } + n.stop = stop + + // set the wallet + err = n.setWallet(ctx, walletKey) + if err != nil { + stop(context.TODO()) + return nil, err + } + + err = startClientAPIServer(nodeRepo, n.fullApi) + if err != nil { + return nil, err + } + + registerAndExportMetrics(fmt.Sprintf("client_%d", t.GroupSeq)) + + t.RecordMessage("publish our address to the clients addr topic") + addrinfo, err := n.fullApi.NetAddrsListen(ctx) + if err != nil { + return nil, err + } + t.SyncClient.MustPublish(ctx, clientsAddrsTopic, addrinfo) + + t.RecordMessage("waiting for all nodes to be ready") + t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) + + return n, nil +} + +func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { + rpcServer := jsonrpc.NewServer() + rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(api)) + + ah := &auth.Handler{ + Verify: api.AuthVerify, + Next: rpcServer.ServeHTTP, + } + + http.Handle("/rpc/v0", ah) + + srv := &http.Server{Handler: http.DefaultServeMux} + + return startServer(repo, srv) +} diff --git a/lotus-soup/drand.go b/lotus-soup/role_drand.go similarity index 94% rename from lotus-soup/drand.go rename to lotus-soup/role_drand.go index 507b05060..bd855c69a 100644 --- a/lotus-soup/drand.go +++ b/lotus-soup/role_drand.go @@ -14,28 +14,19 @@ import ( "github.com/drand/drand/chain" hclient "github.com/drand/drand/client/http" + "github.com/drand/drand/demo/node" "github.com/drand/drand/log" "github.com/drand/drand/lp2p" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" "github.com/testground/sdk-go/sync" - - "github.com/drand/drand/demo/node" ) -var ( - PrepareDrandTimeout = time.Minute - drandConfigTopic = sync.NewTopic("drand-config", &DrandRuntimeInfo{}) -) - -type DrandRuntimeInfo struct { - Config dtypes.DrandConfig - GossipBootstrap dtypes.DrandBootstrap -} +var PrepareDrandTimeout = time.Minute type DrandInstance struct { - Node node.Node + Node node.Node GossipRelay *lp2p.GossipRelayNode stateDir string @@ -45,17 +36,18 @@ func (d *DrandInstance) Cleanup() error { return os.RemoveAll(d.stateDir) } -// waitForDrandConfig should be called by filecoin instances before constructing the lotus Node -// you can use the returned dtypes.DrandConfig to override the default production config. -func waitForDrandConfig(ctx context.Context, client sync.Client) (*DrandRuntimeInfo, error) { - ch := make(chan *DrandRuntimeInfo, 1) - sub := client.MustSubscribe(ctx, drandConfigTopic, ch) - select { - case cfg := <-ch: - return cfg, nil - case err := <-sub.Done(): - return nil, err +func runDrandNode(t *TestEnvironment) error { + t.RecordMessage("running drand node") + dr, err := prepareDrandNode(t) + if err != nil { + return err } + defer dr.Cleanup() + + // TODO add ability to halt / recover on demand + ctx := context.Background() + t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) + return nil } // prepareDrandNode starts a drand instance and runs a DKG with the other members of the composition group. @@ -228,12 +220,25 @@ func prepareDrandNode(t *TestEnvironment) (*DrandInstance, error) { } return &DrandInstance{ - Node: n, + Node: n, GossipRelay: gossipRelay, - stateDir: stateDir, + stateDir: stateDir, }, nil } +// waitForDrandConfig should be called by filecoin instances before constructing the lotus Node +// you can use the returned dtypes.DrandConfig to override the default production config. +func waitForDrandConfig(ctx context.Context, client sync.Client) (*DrandRuntimeInfo, error) { + ch := make(chan *DrandRuntimeInfo, 1) + sub := client.MustSubscribe(ctx, drandConfigTopic, ch) + select { + case cfg := <-ch: + return cfg, nil + case err := <-sub.Done(): + return nil, err + } +} + func relayAddrInfo(addrs []ma.Multiaddr, dataIP net.IP) (*peer.AddrInfo, error) { for _, a := range addrs { if ip, _ := a.ValueForProtocol(ma.P_IP4); ip != dataIP.String() { @@ -242,4 +247,4 @@ func relayAddrInfo(addrs []ma.Multiaddr, dataIP net.IP) (*peer.AddrInfo, error) return peer.AddrInfoFromP2pAddr(a) } return nil, fmt.Errorf("no addr found with data ip %s in addrs: %v", dataIP, addrs) -} \ No newline at end of file +} diff --git a/lotus-soup/role_miner.go b/lotus-soup/role_miner.go new file mode 100644 index 000000000..fa022592c --- /dev/null +++ b/lotus-soup/role_miner.go @@ -0,0 +1,377 @@ +package main + +import ( + "context" + "crypto/rand" + "fmt" + "io/ioutil" + "net/http" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/go-storedcounter" + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors" + genesis_chain "github.com/filecoin-project/lotus/chain/gen/genesis" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/wallet" + "github.com/filecoin-project/lotus/cmd/lotus-seed/seed" + "github.com/filecoin-project/lotus/miner" + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/impl" + "github.com/filecoin-project/lotus/node/modules" + "github.com/filecoin-project/lotus/node/repo" + "github.com/gorilla/mux" + libp2p_crypto "github.com/libp2p/go-libp2p-core/crypto" + + "github.com/filecoin-project/specs-actors/actors/abi" + "github.com/filecoin-project/specs-actors/actors/builtin" + saminer "github.com/filecoin-project/specs-actors/actors/builtin/miner" + "github.com/filecoin-project/specs-actors/actors/crypto" + + "github.com/ipfs/go-datastore" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/testground/sdk-go/sync" +) + +func runMiner(t *TestEnvironment) error { + t.RecordMessage("running miner") + miner, err := prepareMiner(t) + if err != nil { + return err + } + + t.RecordMessage("block delay: %v", build.BlockDelay) + t.D().Gauge("miner.block-delay").Update(build.BlockDelay) + + ctx := context.Background() + + clients := t.IntParam("clients") + miners := t.IntParam("miners") + + myActorAddr, err := miner.minerApi.ActorAddress(ctx) + if err != nil { + return err + } + + // mine / stop mining + mine := true + done := make(chan struct{}) + + if miner.MineOne != nil { + go func() { + defer t.RecordMessage("shutting down mining") + defer close(done) + + var i int + for i = 0; mine; i++ { + // synchronize all miners to mine the next block + t.RecordMessage("synchronizing all miners to mine next block [%d]", i) + stateMineNext := sync.State(fmt.Sprintf("mine-block-%d", i)) + t.SyncClient.MustSignalAndWait(ctx, stateMineNext, miners) + + ch := make(chan struct{}) + err := miner.MineOne(ctx, func(mined bool) { + if mined { + t.D().Counter(fmt.Sprintf("block.mine,miner=%s", myActorAddr)).Inc(1) + } + close(ch) + }) + if err != nil { + panic(err) + } + <-ch + } + + // signal the last block to make sure no miners are left stuck waiting for the next block signal + // while the others have stopped + stateMineLast := sync.State(fmt.Sprintf("mine-block-%d", i)) + t.SyncClient.MustSignalEntry(ctx, stateMineLast) + }() + } else { + close(done) + } + + // wait for a signal from all clients to stop mining + err = <-t.SyncClient.MustBarrier(ctx, stateStopMining, clients).C + if err != nil { + return err + } + + mine = false + <-done + + t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) + return nil +} + +func prepareMiner(t *TestEnvironment) (*Node, error) { + ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) + defer cancel() + + pubsubTracer, err := getPubsubTracerMaddr(ctx, t) + if err != nil { + return nil, err + } + + drandOpt, err := getDrandOpts(ctx, t) + if err != nil { + return nil, err + } + + // first create a wallet + walletKey, err := wallet.GenerateKey(crypto.SigTypeBLS) + if err != nil { + return nil, err + } + + // publish the account ID/balance + balance := t.IntParam("balance") + balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance} + t.SyncClient.Publish(ctx, balanceTopic, balanceMsg) + + // create and publish the preseal commitment + priv, _, err := libp2p_crypto.GenerateEd25519Key(rand.Reader) + if err != nil { + return nil, err + } + + minerID, err := peer.IDFromPrivateKey(priv) + if err != nil { + return nil, err + } + + // pick unique sequence number for each miner, no matter in which group they are + seq := t.SyncClient.MustSignalAndWait(ctx, stateMinerPickSeqNum, t.IntParam("miners")) + + minerAddr, err := address.NewIDAddress(genesis_chain.MinerStart + uint64(seq-1)) + if err != nil { + return nil, err + } + + presealDir, err := ioutil.TempDir("", "preseal") + if err != nil { + return nil, err + } + + sectors := t.IntParam("sectors") + genMiner, _, err := seed.PreSeal(minerAddr, abi.RegisteredSealProof_StackedDrg2KiBV1, 0, sectors, presealDir, []byte("TODO: randomize this"), &walletKey.KeyInfo) + if err != nil { + return nil, err + } + genMiner.PeerId = minerID + + t.RecordMessage("Miner Info: Owner: %s Worker: %s", genMiner.Owner, genMiner.Worker) + + presealMsg := &PresealMsg{Miner: *genMiner, Seqno: seq} + t.SyncClient.Publish(ctx, presealTopic, presealMsg) + + // then collect the genesis block and bootstrapper address + genesisMsg, err := waitForGenesis(t, ctx) + if err != nil { + return nil, err + } + + // prepare the repo + minerRepo := repo.NewMemory(nil) + + lr, err := minerRepo.Lock(repo.StorageMiner) + if err != nil { + return nil, err + } + + ks, err := lr.KeyStore() + if err != nil { + return nil, err + } + + kbytes, err := priv.Bytes() + if err != nil { + return nil, err + } + + err = ks.Put("libp2p-host", types.KeyInfo{ + Type: "libp2p-host", + PrivateKey: kbytes, + }) + if err != nil { + return nil, err + } + + ds, err := lr.Datastore("/metadata") + if err != nil { + return nil, err + } + + err = ds.Put(datastore.NewKey("miner-address"), minerAddr.Bytes()) + if err != nil { + return nil, err + } + + nic := storedcounter.New(ds, datastore.NewKey(modules.StorageCounterDSPrefix)) + for i := 0; i < (sectors + 1); i++ { + _, err = nic.Next() + if err != nil { + return nil, err + } + } + + err = lr.Close() + if err != nil { + return nil, err + } + + minerIP := t.NetClient.MustGetDataNetworkIP().String() + + // create the node + // we need both a full node _and_ and storage miner node + n := &Node{} + + nodeRepo := repo.NewMemory(nil) + + stop1, err := node.New(context.Background(), + node.FullAPI(&n.fullApi), + node.Online(), + node.Repo(nodeRepo), + withGenesis(genesisMsg.Genesis), + withListenAddress(minerIP), + withBootstrapper(genesisMsg.Bootstrapper), + withPubsubConfig(false, pubsubTracer), + drandOpt, + ) + if err != nil { + return nil, err + } + + // set the wallet + err = n.setWallet(ctx, walletKey) + if err != nil { + stop1(context.TODO()) + return nil, err + } + + minerOpts := []node.Option{ + node.StorageMiner(&n.minerApi), + node.Online(), + node.Repo(minerRepo), + node.Override(new(api.FullNode), n.fullApi), + withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), + withMinerListenAddress(minerIP), + } + + if t.StringParam("mining_mode") != "natural" { + mineBlock := make(chan func(bool)) + minerOpts = append(minerOpts, + node.Override(new(*miner.Miner), miner.NewTestMiner(mineBlock, minerAddr))) + n.MineOne = func(ctx context.Context, cb func(bool)) error { + select { + case mineBlock <- cb: + return nil + case <-ctx.Done(): + return ctx.Err() + } + } + } + + stop2, err := node.New(context.Background(), minerOpts...) + if err != nil { + stop1(context.TODO()) + return nil, err + } + n.stop = func(ctx context.Context) error { + // TODO use a multierror for this + err2 := stop2(ctx) + err1 := stop1(ctx) + if err2 != nil { + return err2 + } + return err1 + } + + registerAndExportMetrics(minerAddr.String()) + + // Bootstrap with full node + remoteAddrs, err := n.fullApi.NetAddrsListen(ctx) + if err != nil { + panic(err) + } + + err = n.minerApi.NetConnect(ctx, remoteAddrs) + if err != nil { + panic(err) + } + + err = startStorMinerAPIServer(minerRepo, n.minerApi) + if err != nil { + return nil, err + } + + // add local storage for presealed sectors + err = n.minerApi.StorageAddLocal(ctx, presealDir) + if err != nil { + n.stop(context.TODO()) + return nil, err + } + + // set the miner PeerID + minerIDEncoded, err := actors.SerializeParams(&saminer.ChangePeerIDParams{NewID: abi.PeerID(minerID)}) + if err != nil { + return nil, err + } + + changeMinerID := &types.Message{ + To: minerAddr, + From: genMiner.Worker, + Method: builtin.MethodsMiner.ChangePeerID, + Params: minerIDEncoded, + Value: types.NewInt(0), + GasPrice: types.NewInt(0), + GasLimit: 1000000, + } + + _, err = n.fullApi.MpoolPushMessage(ctx, changeMinerID) + if err != nil { + n.stop(context.TODO()) + return nil, err + } + + t.RecordMessage("publish our address to the miners addr topic") + actoraddress, err := n.minerApi.ActorAddress(ctx) + if err != nil { + return nil, err + } + addrinfo, err := n.minerApi.NetAddrsListen(ctx) + if err != nil { + return nil, err + } + t.SyncClient.MustPublish(ctx, minersAddrsTopic, MinerAddressesMsg{addrinfo, actoraddress}) + + t.RecordMessage("waiting for all nodes to be ready") + t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) + + return n, err +} + +func startStorMinerAPIServer(repo *repo.MemRepo, minerApi api.StorageMiner) error { + mux := mux.NewRouter() + + rpcServer := jsonrpc.NewServer() + rpcServer.Register("Filecoin", apistruct.PermissionedStorMinerAPI(minerApi)) + + mux.Handle("/rpc/v0", rpcServer) + mux.PathPrefix("/remote").HandlerFunc(minerApi.(*impl.StorageMinerAPI).ServeRemote) + mux.PathPrefix("/").Handler(http.DefaultServeMux) // pprof + + ah := &auth.Handler{ + Verify: minerApi.AuthVerify, + Next: mux.ServeHTTP, + } + + srv := &http.Server{Handler: ah} + + return startServer(repo, srv) +} diff --git a/lotus-soup/tracer.go b/lotus-soup/role_pubsub_tracer.go similarity index 89% rename from lotus-soup/tracer.go rename to lotus-soup/role_pubsub_tracer.go index 17a287615..e91e94847 100644 --- a/lotus-soup/tracer.go +++ b/lotus-soup/role_pubsub_tracer.go @@ -5,8 +5,6 @@ import ( "crypto/rand" "fmt" - "github.com/testground/sdk-go/sync" - "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/host" @@ -15,19 +13,11 @@ import ( ma "github.com/multiformats/go-multiaddr" ) -var ( - pubsubTracerTopic = sync.NewTopic("pubsubTracer", &PubsubTracerMsg{}) -) - type PubsubTracer struct { host host.Host traced *traced.TraceCollector } -type PubsubTracerMsg struct { - Tracer string -} - func (tr *PubsubTracer) Stop() error { tr.traced.Stop() return tr.host.Close() @@ -63,7 +53,7 @@ func preparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) { t.RecordMessage("I am %s", tracedMultiaddrStr) _ = ma.StringCast(tracedMultiaddrStr) - tracedMsg := &PubsubTracerMsg{Tracer: tracedMultiaddrStr} + tracedMsg := &PubsubTracerMsg{Multiaddr: tracedMultiaddrStr} t.SyncClient.MustPublish(ctx, pubsubTracerTopic, tracedMsg) t.RecordMessage("waiting for all nodes to be ready") diff --git a/lotus-soup/roles.go b/lotus-soup/roles.go new file mode 100644 index 000000000..a5d77db5a --- /dev/null +++ b/lotus-soup/roles.go @@ -0,0 +1,27 @@ +package main + +// This is the baseline test; Filecoin 101. +// +// A network with a bootstrapper, a number of miners, and a number of clients/full nodes +// is constructed and connected through the bootstrapper. +// Some funds are allocated to each node and a number of sectors are presealed in the genesis block. +// +// The test plan: +// One or more clients store content to one or more miners, testing storage deals. +// The plan ensures that the storage deals hit the blockchain and measure the time it took. +// Verification: one or more clients retrieve and verify the hashes of stored content. +// The plan ensures that all (previously) published content can be correctly retrieved +// and measures the time it took. +// +// Preparation of the genesis block: this is the responsibility of the bootstrapper. +// In order to compute the genesis block, we need to collect identities and presealed +// sectors from each node. +// Then we create a genesis block that allocates some funds to each node and collects +// the presealed sectors. +var basicRoles = map[string]func(*TestEnvironment) error{ + "bootstrapper": runBootstrapper, + "miner": runMiner, + "client": runBaselineClient, + "drand": runDrandNode, + "pubsub-tracer": runPubsubTracer, +} diff --git a/lotus-soup/sync.go b/lotus-soup/sync.go new file mode 100644 index 000000000..099d31283 --- /dev/null +++ b/lotus-soup/sync.go @@ -0,0 +1,55 @@ +package main + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/lotus/genesis" + "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/testground/sdk-go/sync" +) + +var ( + genesisTopic = sync.NewTopic("genesis", &GenesisMsg{}) + balanceTopic = sync.NewTopic("balance", &InitialBalanceMsg{}) + presealTopic = sync.NewTopic("preseal", &PresealMsg{}) + clientsAddrsTopic = sync.NewTopic("clientsAddrsTopic", &peer.AddrInfo{}) + minersAddrsTopic = sync.NewTopic("minersAddrsTopic", &MinerAddressesMsg{}) + pubsubTracerTopic = sync.NewTopic("pubsubTracer", &PubsubTracerMsg{}) + drandConfigTopic = sync.NewTopic("drand-config", &DrandRuntimeInfo{}) +) + +var ( + stateReady = sync.State("ready") + stateDone = sync.State("done") + stateStopMining = sync.State("stop-mining") + stateMinerPickSeqNum = sync.State("miner-pick-seq-num") +) + +type InitialBalanceMsg struct { + Addr address.Address + Balance int +} + +type PresealMsg struct { + Miner genesis.Miner + Seqno int64 +} + +type GenesisMsg struct { + Genesis []byte + Bootstrapper []byte +} + +type MinerAddressesMsg struct { + PeerAddr peer.AddrInfo + ActorAddr address.Address +} + +type PubsubTracerMsg struct { + Multiaddr string +} + +type DrandRuntimeInfo struct { + Config dtypes.DrandConfig + GossipBootstrap dtypes.DrandBootstrap +} From e7488209c82e58fe297a6b013a5b831278cd171d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 1 Jul 2020 17:29:09 +0100 Subject: [PATCH 13/13] refactor soup: assemble testkit; separate test case logic from node templates. (#88) --- .../compositions/composition-k8s-10-3.toml | 2 +- .../compositions/composition-k8s-3-1.toml | 2 +- .../compositions/composition-k8s-3-2.toml | 2 +- lotus-soup/compositions/composition-k8s.toml | 2 +- .../compositions/composition-local-drand.toml | 2 +- .../compositions/composition-natural.toml | 2 +- .../compositions/composition-tracer.toml | 2 +- lotus-soup/compositions/composition.toml | 2 +- lotus-soup/go.mod | 2 +- lotus-soup/go.sum | 65 +----- lotus-soup/main.go | 116 +++++++++- lotus-soup/manifest.toml | 18 +- lotus-soup/role_client.go | 194 ---------------- lotus-soup/roles.go | 27 --- lotus-soup/{ => testkit}/deals.go | 6 +- lotus-soup/testkit/defaults.go | 55 +++++ lotus-soup/{ => testkit}/lotus_opts.go | 2 +- lotus-soup/{ => testkit}/node.go | 67 ++---- lotus-soup/{ => testkit}/retrieval.go | 8 +- lotus-soup/{ => testkit}/role_bootstrapper.go | 62 +++--- lotus-soup/testkit/role_client.go | 139 ++++++++++++ lotus-soup/{ => testkit}/role_drand.go | 62 +++--- lotus-soup/{ => testkit}/role_miner.go | 210 +++++++++--------- .../{ => testkit}/role_pubsub_tracer.go | 37 ++- lotus-soup/{ => testkit}/sync.go | 24 +- lotus-soup/testkit/testenv.go | 48 ++++ 26 files changed, 600 insertions(+), 558 deletions(-) delete mode 100644 lotus-soup/role_client.go delete mode 100644 lotus-soup/roles.go rename lotus-soup/{ => testkit}/deals.go (89%) create mode 100644 lotus-soup/testkit/defaults.go rename lotus-soup/{ => testkit}/lotus_opts.go (99%) rename lotus-soup/{ => testkit}/node.go (75%) rename lotus-soup/{ => testkit}/retrieval.go (91%) rename lotus-soup/{ => testkit}/role_bootstrapper.go (74%) create mode 100644 lotus-soup/testkit/role_client.go rename lotus-soup/{ => testkit}/role_drand.go (87%) rename lotus-soup/{ => testkit}/role_miner.go (80%) rename lotus-soup/{ => testkit}/role_pubsub_tracer.go (68%) rename lotus-soup/{ => testkit}/sync.go (51%) create mode 100644 lotus-soup/testkit/testenv.go diff --git a/lotus-soup/compositions/composition-k8s-10-3.toml b/lotus-soup/compositions/composition-k8s-10-3.toml index bc4a44220..061a1c984 100644 --- a/lotus-soup/compositions/composition-k8s-10-3.toml +++ b/lotus-soup/compositions/composition-k8s-10-3.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 14 builder = "docker:go" runner = "cluster:k8s" diff --git a/lotus-soup/compositions/composition-k8s-3-1.toml b/lotus-soup/compositions/composition-k8s-3-1.toml index a4fb82ce2..3470c3093 100644 --- a/lotus-soup/compositions/composition-k8s-3-1.toml +++ b/lotus-soup/compositions/composition-k8s-3-1.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 5 builder = "docker:go" runner = "cluster:k8s" diff --git a/lotus-soup/compositions/composition-k8s-3-2.toml b/lotus-soup/compositions/composition-k8s-3-2.toml index b0c7f3c74..8740d4f0c 100644 --- a/lotus-soup/compositions/composition-k8s-3-2.toml +++ b/lotus-soup/compositions/composition-k8s-3-2.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 6 builder = "docker:go" runner = "cluster:k8s" diff --git a/lotus-soup/compositions/composition-k8s.toml b/lotus-soup/compositions/composition-k8s.toml index b4e2d563e..548293588 100644 --- a/lotus-soup/compositions/composition-k8s.toml +++ b/lotus-soup/compositions/composition-k8s.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 3 builder = "docker:go" runner = "cluster:k8s" diff --git a/lotus-soup/compositions/composition-local-drand.toml b/lotus-soup/compositions/composition-local-drand.toml index 9994008e7..50e969a49 100644 --- a/lotus-soup/compositions/composition-local-drand.toml +++ b/lotus-soup/compositions/composition-local-drand.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 6 builder = "docker:go" runner = "local:docker" diff --git a/lotus-soup/compositions/composition-natural.toml b/lotus-soup/compositions/composition-natural.toml index e82c6a397..36e8908bd 100644 --- a/lotus-soup/compositions/composition-natural.toml +++ b/lotus-soup/compositions/composition-natural.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 6 builder = "docker:go" runner = "local:docker" diff --git a/lotus-soup/compositions/composition-tracer.toml b/lotus-soup/compositions/composition-tracer.toml index d632d287e..af9207fb0 100644 --- a/lotus-soup/compositions/composition-tracer.toml +++ b/lotus-soup/compositions/composition-tracer.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 7 builder = "docker:go" runner = "local:docker" diff --git a/lotus-soup/compositions/composition.toml b/lotus-soup/compositions/composition.toml index 1b24f3b94..cad741422 100644 --- a/lotus-soup/compositions/composition.toml +++ b/lotus-soup/compositions/composition.toml @@ -4,7 +4,7 @@ [global] plan = "lotus-soup" - case = "lotus-baseline" + case = "deals-e2e" total_instances = 6 builder = "docker:go" runner = "local:docker" diff --git a/lotus-soup/go.mod b/lotus-soup/go.mod index 332ebec9d..15a67024f 100644 --- a/lotus-soup/go.mod +++ b/lotus-soup/go.mod @@ -26,7 +26,7 @@ require ( github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.2.2 github.com/multiformats/go-multiaddr-net v0.1.5 - github.com/testground/sdk-go v0.2.3-0.20200630131002-c16b558f6ca9 + github.com/testground/sdk-go v0.2.3-0.20200630140907-cda3c5ac055b go.opencensus.io v0.22.4 ) diff --git a/lotus-soup/go.sum b/lotus-soup/go.sum index 3b1748960..ce096f015 100644 --- a/lotus-soup/go.sum +++ b/lotus-soup/go.sum @@ -87,7 +87,6 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.1 h1:lVM1R/o5khtrr7t3qAr+sS6uagZOP+7iprc7gS3V9CE= github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2 h1:Z0CN0Yb4ig9sGPXkvAQcGJfnrrMQ5QYLCMPRi9iD7YE= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -146,7 +145,6 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -228,9 +226,7 @@ github.com/filecoin-project/go-address v0.0.2-0.20200504173055-8b6f2fb2b3ef/go.m github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200424220931-6263827e49f2 h1:jamfsxfK0Q9yCMHt8MPWx7Aa/O9k2Lve8eSc6FILYGQ= github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200424220931-6263827e49f2/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= -github.com/filecoin-project/go-bitfield v0.0.0-20200416002808-b3ee67ec9060 h1:/3qjGMn6ukXgZJHsIbuwGL7ipla8DOV3uHZDBJkBYfU= github.com/filecoin-project/go-bitfield v0.0.0-20200416002808-b3ee67ec9060/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= -github.com/filecoin-project/go-bitfield v0.0.1 h1:Xg/JnrqqE77aJVKdbEyR04n9FZQWhwrN+buDgQCVpZU= github.com/filecoin-project/go-bitfield v0.0.1/go.mod h1:Ry9/iUlWSyjPUzlAvdnfy4Gtvrq4kWmWDztCU1yEgJY= github.com/filecoin-project/go-bitfield v0.0.2-0.20200518150651-562fdb554b6e h1:gkG/7G+iKy4He+IiQNeQn+nndFznb/vCoOR8iRQsm60= github.com/filecoin-project/go-bitfield v0.0.2-0.20200518150651-562fdb554b6e/go.mod h1:Ry9/iUlWSyjPUzlAvdnfy4Gtvrq4kWmWDztCU1yEgJY= @@ -252,7 +248,6 @@ github.com/filecoin-project/go-paramfetch v0.0.1/go.mod h1:fZzmf4tftbwf9S37XRifo github.com/filecoin-project/go-paramfetch v0.0.2-0.20200218225740-47c639bab663/go.mod h1:fZzmf4tftbwf9S37XRifoJlz7nCjRdIrMGLR07dKLCc= github.com/filecoin-project/go-paramfetch v0.0.2-0.20200605171344-fcac609550ca h1:OGykrCr6mSn/ckk2IFbIlkc76nsgEs7tSLhZXQt7+z4= github.com/filecoin-project/go-paramfetch v0.0.2-0.20200605171344-fcac609550ca/go.mod h1:fZzmf4tftbwf9S37XRifoJlz7nCjRdIrMGLR07dKLCc= -github.com/filecoin-project/go-statemachine v0.0.0-20200226041606-2074af6d51d9 h1:k9qVR9ItcziSB2rxtlkN/MDWNlbsI6yzec+zjUatLW0= github.com/filecoin-project/go-statemachine v0.0.0-20200226041606-2074af6d51d9/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v0.0.0-20200612181802-4eb3d0c68eba h1:GEWb/6KQyNZt4jm8fgVcIFPH0ElAGXfHM59ZSiqPTvY= github.com/filecoin-project/go-statemachine v0.0.0-20200612181802-4eb3d0c68eba/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= @@ -268,6 +263,7 @@ github.com/filecoin-project/sector-storage v0.0.0-20200618073200-d9de9b7cb4b4/go github.com/filecoin-project/specs-actors v0.0.0-20200210130641-2d1fbd8672cf/go.mod h1:xtDZUB6pe4Pksa/bAJbJ693OilaC5Wbot9jMhLm3cZA= github.com/filecoin-project/specs-actors v0.3.0/go.mod h1:nQYnFbQ7Y0bHZyq6HDEuVlCPR+U3z5Q3wMOQ+2aiV+Y= github.com/filecoin-project/specs-actors v0.6.0/go.mod h1:dRdy3cURykh2R8O/DKqy8olScl70rmIS7GrB4hB1IDY= +github.com/filecoin-project/specs-actors v0.6.1/go.mod h1:dRdy3cURykh2R8O/DKqy8olScl70rmIS7GrB4hB1IDY= github.com/filecoin-project/specs-actors v0.6.2-0.20200617175406-de392ca14121 h1:oRA+b4iN4H86xXDXbU3TOyvmBZp7//c5VqTc0oJ6nLg= github.com/filecoin-project/specs-actors v0.6.2-0.20200617175406-de392ca14121/go.mod h1:dRdy3cURykh2R8O/DKqy8olScl70rmIS7GrB4hB1IDY= github.com/filecoin-project/specs-storage v0.1.0 h1:PkDgTOT5W5Ao7752onjDl4QSv+sgOVdJbvFjOnD5w94= @@ -294,7 +290,6 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -327,36 +322,29 @@ github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0 h1:Rd1kQnQu0Hq3qvJppYSG0HtP+f5LPPUiDswTLiEegLg= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= @@ -455,7 +443,6 @@ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0m github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= @@ -499,7 +486,6 @@ github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUP github.com/ipfs/go-cid v0.0.4-0.20191112011718-79e75dffeb10/go.mod h1:/BYOuUoxkE+0f6tGzlzMvycuN+5l35VOR4Bpg2sCmds= github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00 h1:QN88Q0kT2QiDaLxpR/SDsqOBtNIEF/F3n96gSDUimkA= github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6 h1:go0y+GcDOGeJIV01FeBsta4FHngoA4Wz7KMeLkXAhMs= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= @@ -539,7 +525,6 @@ github.com/ipfs/go-graphsync v0.0.6-0.20200504202014-9d5f2c26a103 h1:SD+bXod/pOW github.com/ipfs/go-graphsync v0.0.6-0.20200504202014-9d5f2c26a103/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.0.15-0.20200204200533-99b8553ef242/go.mod h1:kq3Pi+UP3oHhAdKexE+kHHYRKMoFNuGero0R7q3hWGg= -github.com/ipfs/go-hamt-ipld v0.1.1-0.20200501020327-d53d20a7063e h1:Klv6s+kbuhh0JVpGFmFK2t6AtZxJfAnVneQHh1DlFOo= github.com/ipfs/go-hamt-ipld v0.1.1-0.20200501020327-d53d20a7063e/go.mod h1:giiPqWYCnRBYpNTsJ/EX1ojldX5kTXrXYckSJQ7ko9M= github.com/ipfs/go-hamt-ipld v0.1.1-0.20200605182717-0310ad2b0b1f h1:mchhWiYYUSoCuE3wDfRCo8cho5kqSoxkgnOtGcnNMZw= github.com/ipfs/go-hamt-ipld v0.1.1-0.20200605182717-0310ad2b0b1f/go.mod h1:phOFBB7W73N9dg1glcb1fQ9HtQFDUpeyJgatW8ns0bw= @@ -585,7 +570,6 @@ github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7 github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= @@ -612,9 +596,7 @@ github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kP github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.5 h1:fL4YI+1g5V/b1Yxr1qAiXTMg1H8z9vx/VmJxBuQMHvU= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.0.8 h1:3b3YNopMHlj4AvyhWAx0pDxqSQWYi4/WuWO7yRV6/Qg= github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.2-0.20200609205458-f8d20c392cb7 h1:LtL/rvdfbKSthZGmAAD9o4KKg6HA6Qn8gXCCdgnj7lw= github.com/ipfs/go-log/v2 v2.1.2-0.20200609205458-f8d20c392cb7/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= @@ -722,7 +704,6 @@ github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfo github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c h1:3pM6OrLfkfe0rKZjE6MHdcTaI0ohcHbRUZJeJqkvPb4= github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod h1:ESXZSm2iaF+1P5o6VFEWpeARTQpcil4e1DwumnTopdg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -732,7 +713,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= @@ -746,7 +726,6 @@ github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2h github.com/libp2p/go-conn-security-multistream v0.2.0 h1:uNiDjS58vrvJTg9jO6bySd1rMKejieG7v45ekqHbZ1M= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= -github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvMfzQ= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= @@ -765,7 +744,6 @@ github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZk github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.2/go.mod h1:NQDA/F/qArMHGe0J7sDScaKjW8Jh4y/ozQqBbYJ+BnA= -github.com/libp2p/go-libp2p v0.8.3 h1:IFWeNzxkBaNO1N8stN9ayFGdC6RmVuSsKd5bou7qpK0= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.10.0 h1:7ooOvK1wi8eLpyTppy8TeH43UHy5uI75GAHGJxenUi0= @@ -776,7 +754,6 @@ github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3Pt github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= -github.com/libp2p/go-libp2p-autonat v0.2.2 h1:4dlgcEEugTFWSvdG2UIFxhnOMpX76QaZSRAtXmYB8n4= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3 h1:w46bKK3KTOUWDe5mDYMRjJu1uryqBp8HCNDp/TWMqKw= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= @@ -784,7 +761,6 @@ github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6 github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= -github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6 h1:CkPp1/zaCrCnBo0AdsQA0O1VkUYoUOtyHOnoa8gKIcE= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= @@ -795,13 +771,10 @@ github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.2.2 h1:87RLabJ9lrhoiSDDZyCJ80ZlI5TLJMwfyoGAaWXzWqA= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.2.3 h1:3Uw1fPHWrp1tgIhBz0vSOxRUmnKL8L/NGUyEd5WfSGM= github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-connmgr v0.1.1 h1:BIul1BPoN1vPAByMh6CeD33NpGjD+PkavmUjTS7uai8= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3 h1:v7skKI9n+0obPpzMIO6aIlOSdQOmhxTf40cbpzqaGMQ= github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= @@ -821,12 +794,10 @@ github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZas github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.2/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.3 h1:b9W3w7AZR2n/YJhG8d0qPFGhGhCWKIvPuJgp4hhc4MM= github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.5.7 h1:QK3xRwFxqd0Xd9bSZL+8yZ8ncZZbl6Zngd/+Y+A6sgQ= github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= github.com/libp2p/go-libp2p-core v0.6.0 h1:u03qofNYTBN+yVg08PuAKylZogVf0xcTEeM8skGf+ak= github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= @@ -886,16 +857,13 @@ github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVd github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.3 h1:MofRq2l3c15vQpEygTetV+zRRrncz+ktiXW7H2EKoEQ= github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= -github.com/libp2p/go-libp2p-peerstore v0.2.4 h1:jU9S4jYN30kdzTpDAR7SlHUD+meDUjTODh4waLWF1ws= github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6 h1:2ACefBX23iMdJU9Ke+dcXt3w86MIryes9v7In4+Qq3U= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-protocol v0.1.0 h1:HdqhEyhg0ToCaxgMhnOmUO8snQtt/kQlcjVk3UoJU3c= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= @@ -903,7 +871,6 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2 h1:k3cJm5JW5mjaWZkobS50sJLJWaB2mBi0HW4 github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= -github.com/libp2p/go-libp2p-quic-transport v0.1.1 h1:MFMJzvsxIEDEVKzO89BnB/FgvMj9WI4GDGUW2ArDPUA= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0 h1:BUN1lgYNUrtv4WLLQ5rQmC9MCJ6uEXusezGvYRNoJXE= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= @@ -928,7 +895,6 @@ github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= -github.com/libp2p/go-libp2p-swarm v0.2.3 h1:uVkCb8Blfg7HQ/f30TyHn1g/uCwXsAET7pU0U59gx/A= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= github.com/libp2p/go-libp2p-swarm v0.2.7 h1:4lV/sf7f0NuVqunOpt1I11+Z54+xp+m0eeAvxj/LyRc= @@ -948,7 +914,6 @@ github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwq github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-transport-upgrader v0.2.0 h1:5EhPgQhXZNyfL22ERZTUoVp9UVVbNowWNVtELQaKCHk= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0 h1:q3ULhsknEQ34eVDhv4YwKS8iet69ffs9+Fir6a7weN4= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= @@ -958,13 +923,11 @@ github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8ME github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= -github.com/libp2p/go-libp2p-yamux v0.2.7 h1:vzKu0NVtxvEIDGCv6mjKRcK0gipSgaXmJZ6jFv0d/dk= github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= github.com/libp2p/go-libp2p-yamux v0.2.8 h1:0s3ELSLu2O7hWKfX1YjzudBKCP0kZ+m9e2+0veXzkn4= github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-maddr-filter v0.0.5 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= @@ -988,7 +951,6 @@ github.com/libp2p/go-netroute v0.1.2 h1:UHhB35chwgvcRI392znJA3RCBtZ3MpE3ahNCN5MR github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.4 h1:d27YZvLoTyMhIN4njrkr8zMDOM4lfpHIp6A+TK9fovg= github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.5 h1:pQkejVhF0xp08D4CQUcw8t+BFJeXowja6RVcb5p++EA= github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= @@ -998,7 +960,6 @@ github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA2 github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3 h1:zzOeXnTooCkRvoH+bSXEfXhn76+LAiwoneM0gnXjF2M= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-sockaddr v0.0.2 h1:tCuXfpA9rq7llM/v834RKc/Xvovy/AqM9kHvTV/jY/Q= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0 h1:Y4s3/jNoryVRKEBrkJ576F17CPOaMIzUeCsg7dlTDj0= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= @@ -1029,15 +990,12 @@ github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.5 h1:ibuz4naPAully0pN6J/kmUARiqLpnDQIzI/8GCOrljg= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6 h1:O5qcBXRcfqecvQ/My9NqDNHB3/5t58yuJYqthcKhhgE= github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7 h1:v40A1eSPJDIZwz2AvrV3cxpTZEGDP11QJbukmEhYyQI= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucas-clemente/quic-go v0.11.2 h1:Mop0ac3zALaBR3wGs6j8OYe/tcFvFsxTUFMkE/7yUOI= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.16.0 h1:jJw36wfzGJhmOhAOaOC2lS36WgeqXQszH47A7spo1LI= github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= @@ -1048,7 +1006,6 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= -github.com/marten-seemann/qtls v0.2.3 h1:0yWJ43C62LsZt08vuQJDK1uC1czUc3FJeCLPoNAI4vA= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/marten-seemann/qtls v0.9.1 h1:O0YKQxNVPaiFgMng0suWEOY2Sb4LT2sRn9Qimq3Z1IQ= github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= @@ -1061,7 +1018,6 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -1123,7 +1079,6 @@ github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1 h1:SgG/cw5vqyB5QQe5FPe2TqggU9WtrA9X4nZw7LlVqOI= github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= github.com/multiformats/go-multiaddr v0.2.2 h1:XZLDTszBIJe6m0zF6ITBrEcZR73OPUhCBBS9rYAuUzI= github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= @@ -1144,9 +1099,7 @@ github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= github.com/multiformats/go-multiaddr-net v0.1.5 h1:QoRKvu0xHN1FCFJcMQLbG/yQE2z441L5urvG3+qyz7g= github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.2 h1:2pAgScmS1g9XjH7EtAfNhTuyrWYEWcxy0G5Wo85hWDA= github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= @@ -1188,16 +1141,13 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= @@ -1232,7 +1182,6 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1254,7 +1203,6 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= @@ -1271,7 +1219,6 @@ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= @@ -1283,7 +1230,6 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.0 h1:jhMy6QXfi3y2HEzFoyuCj40z4OZIIHHPtFyCMftmvKA= @@ -1348,12 +1294,10 @@ github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHei github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= -github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFCbQYJ3KJlPs/FvPz2dy1tkpxyeNESVyCNNzRXFR0= @@ -1378,16 +1322,13 @@ github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3 github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= @@ -1395,8 +1336,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/testground/sdk-go v0.2.3-0.20200630131002-c16b558f6ca9 h1:4whMCXEdgHQkg4i5OTE2fqDFIPbpiE5y8uOMfiGSEBg= -github.com/testground/sdk-go v0.2.3-0.20200630131002-c16b558f6ca9/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= +github.com/testground/sdk-go v0.2.3-0.20200630140907-cda3c5ac055b h1:W8EDNshcIaO7LaGVFc7DI9VlAnhGzRDVmGx+h9Mer8g= +github.com/testground/sdk-go v0.2.3-0.20200630140907-cda3c5ac055b/go.mod h1:3auzMDXaoK7NQ+CLQS3pqp4hmREECWO9V+TJi/IWmms= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= diff --git a/lotus-soup/main.go b/lotus-soup/main.go index 051f51eb6..042310eb7 100644 --- a/lotus-soup/main.go +++ b/lotus-soup/main.go @@ -1,27 +1,119 @@ package main import ( + "context" "fmt" + "io/ioutil" + "math/rand" + "os" + "time" + "github.com/filecoin-project/lotus/api" "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" + + "github.com/filecoin-project/oni/lotus-soup/testkit" ) -var testplans = map[string]interface{}{ - "lotus-baseline": doRun(basicRoles), +var cases = map[string]interface{}{ + "deals-e2e": testkit.WrapTestEnvironment(dealsE2E), } func main() { - run.InvokeMap(testplans) + run.InvokeMap(cases) } -func doRun(roles map[string]func(*TestEnvironment) error) run.InitializedTestCaseFn { - return func(runenv *runtime.RunEnv, initCtx *run.InitContext) error { - role := runenv.StringParam("role") - proc, ok := roles[role] - if ok { - return proc(&TestEnvironment{RunEnv: runenv, InitContext: initCtx}) - } - return fmt.Errorf("Unknown role: %s", role) +// This is the baseline test; Filecoin 101. +// +// A network with a bootstrapper, a number of miners, and a number of clients/full nodes +// is constructed and connected through the bootstrapper. +// Some funds are allocated to each node and a number of sectors are presealed in the genesis block. +// +// The test plan: +// One or more clients store content to one or more miners, testing storage deals. +// The plan ensures that the storage deals hit the blockchain and measure the time it took. +// Verification: one or more clients retrieve and verify the hashes of stored content. +// The plan ensures that all (previously) published content can be correctly retrieved +// and measures the time it took. +// +// Preparation of the genesis block: this is the responsibility of the bootstrapper. +// In order to compute the genesis block, we need to collect identities and presealed +// sectors from each node. +// Then we create a genesis block that allocates some funds to each node and collects +// the presealed sectors. +func dealsE2E(t *testkit.TestEnvironment) error { + // Dispatch/forward non-client roles to defaults. + if t.Role != "client" { + return testkit.HandleDefaultRole(t) } + + cl, err := testkit.PrepareClient(t) + if err != nil { + return err + } + + // This is a client role + t.RecordMessage("running client") + + ctx := context.Background() + client := cl.FullApi + + // select a random miner + minerAddr := cl.MinerAddrs[rand.Intn(len(cl.MinerAddrs))] + if err := client.NetConnect(ctx, minerAddr.PeerAddr); err != nil { + return err + } + t.D().Counter(fmt.Sprintf("send-data-to,miner=%s", minerAddr.ActorAddr)).Inc(1) + + t.RecordMessage("selected %s as the miner", minerAddr.ActorAddr) + + time.Sleep(2 * time.Second) + + // generate 1600 bytes of random data + data := make([]byte, 1600) + rand.New(rand.NewSource(time.Now().UnixNano())).Read(data) + + file, err := ioutil.TempFile("/tmp", "data") + if err != nil { + return err + } + defer os.Remove(file.Name()) + + _, err = file.Write(data) + if err != nil { + return err + } + + fcid, err := client.ClientImport(ctx, api.FileRef{Path: file.Name(), IsCAR: false}) + if err != nil { + return err + } + t.RecordMessage("file cid: %s", fcid) + + // start deal + t1 := time.Now() + deal := testkit.StartDeal(ctx, minerAddr.ActorAddr, client, fcid) + t.RecordMessage("started deal: %s", deal) + + // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this + time.Sleep(2 * time.Second) + + t.RecordMessage("waiting for deal to be sealed") + testkit.WaitDealSealed(t, ctx, client, deal) + t.D().ResettingHistogram("deal.sealed").Update(int64(time.Since(t1))) + + carExport := true + + t.RecordMessage("trying to retrieve %s", fcid) + testkit.RetrieveData(t, ctx, err, client, fcid, carExport, data) + t.D().ResettingHistogram("deal.retrieved").Update(int64(time.Since(t1))) + + t.SyncClient.MustSignalEntry(ctx, testkit.StateStopMining) + + time.Sleep(10 * time.Second) // wait for metrics to be emitted + + // TODO broadcast published content CIDs to other clients + // TODO select a random piece of content published by some other client and retrieve it + + t.SyncClient.MustSignalAndWait(ctx, testkit.StateDone, t.TestInstanceCount) + return nil } diff --git a/lotus-soup/manifest.toml b/lotus-soup/manifest.toml index 7227fdd35..291b7a76f 100644 --- a/lotus-soup/manifest.toml +++ b/lotus-soup/manifest.toml @@ -17,15 +17,15 @@ enabled = true enabled = true [[testcases]] -name = "lotus-baseline" +name = "deals-e2e" instances = { min = 1, max = 100, default = 5 } [testcases.params] - clients = { type = "int", default = 1 } - miners = { type = "int", default = 1 } - balance = { type = "int", default = 1 } - sectors = { type = "int", default = 1 } - role = { type = "string" } + clients = { type = "int", default = 1 } + miners = { type = "int", default = 1 } + balance = { type = "int", default = 1 } + sectors = { type = "int", default = 1 } + role = { type = "string" } genesis_timestamp_offset = { type = "int", default = 0 } @@ -35,9 +35,9 @@ instances = { min = 1, max = 100, default = 5 } # in the same composition group. There must be at least threshold drand nodes. # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand" # for the lotus node groups. - drand_period = { type = "duration", default="10s" } - drand_threshold = { type = "int", default = 2 } - drand_gossip_relay = { type = "bool", default = true } + drand_period = { type = "duration", default="10s" } + drand_threshold = { type = "int", default = 2 } + drand_gossip_relay = { type = "bool", default = true } # Params relevant to pubsub tracing enable_pubsub_tracer = { type = "bool", default = false } diff --git a/lotus-soup/role_client.go b/lotus-soup/role_client.go deleted file mode 100644 index b3cbe4b02..000000000 --- a/lotus-soup/role_client.go +++ /dev/null @@ -1,194 +0,0 @@ -package main - -import ( - "context" - "fmt" - "io/ioutil" - "math/rand" - "net/http" - "os" - "time" - - "github.com/filecoin-project/go-jsonrpc" - "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" - "github.com/filecoin-project/lotus/chain/wallet" - "github.com/filecoin-project/lotus/node" - "github.com/filecoin-project/lotus/node/repo" - - "github.com/filecoin-project/specs-actors/actors/crypto" -) - -func runBaselineClient(t *TestEnvironment) error { - t.RecordMessage("running client") - cl, err := prepareClient(t) - if err != nil { - return err - } - - ctx := context.Background() - addrs, err := collectMinerAddrs(t, ctx, t.IntParam("miners")) - if err != nil { - return err - } - t.RecordMessage("got %v miner addrs", len(addrs)) - - client := cl.fullApi - - // select a random miner - minerAddr := addrs[rand.Intn(len(addrs))] - if err := client.NetConnect(ctx, minerAddr.PeerAddr); err != nil { - return err - } - t.D().Counter(fmt.Sprintf("send-data-to,miner=%s", minerAddr.ActorAddr)).Inc(1) - - t.RecordMessage("selected %s as the miner", minerAddr.ActorAddr) - - time.Sleep(2 * time.Second) - - // generate 1600 bytes of random data - data := make([]byte, 1600) - rand.New(rand.NewSource(time.Now().UnixNano())).Read(data) - - file, err := ioutil.TempFile("/tmp", "data") - if err != nil { - return err - } - defer os.Remove(file.Name()) - - _, err = file.Write(data) - if err != nil { - return err - } - - fcid, err := client.ClientImport(ctx, api.FileRef{Path: file.Name(), IsCAR: false}) - if err != nil { - return err - } - t.RecordMessage("file cid: %s", fcid) - - // start deal - t1 := time.Now() - deal := startDeal(ctx, minerAddr.ActorAddr, client, fcid) - t.RecordMessage("started deal: %s", deal) - - // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this - time.Sleep(2 * time.Second) - - t.RecordMessage("waiting for deal to be sealed") - waitDealSealed(t, ctx, client, deal) - t.D().ResettingHistogram("deal.sealed").Update(int64(time.Since(t1))) - - carExport := true - - t.RecordMessage("trying to retrieve %s", fcid) - retrieveData(t, ctx, err, client, fcid, carExport, data) - t.D().ResettingHistogram("deal.retrieved").Update(int64(time.Since(t1))) - - t.SyncClient.MustSignalEntry(ctx, stateStopMining) - - time.Sleep(10 * time.Second) // wait for metrics to be emitted - - // TODO broadcast published content CIDs to other clients - // TODO select a random piece of content published by some other client and retrieve it - - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) - return nil -} - -func prepareClient(t *TestEnvironment) (*Node, error) { - ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) - defer cancel() - - pubsubTracer, err := getPubsubTracerMaddr(ctx, t) - if err != nil { - return nil, err - } - - drandOpt, err := getDrandOpts(ctx, t) - if err != nil { - return nil, err - } - - // first create a wallet - walletKey, err := wallet.GenerateKey(crypto.SigTypeBLS) - if err != nil { - return nil, err - } - - // publish the account ID/balance - balance := t.IntParam("balance") - balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance} - t.SyncClient.Publish(ctx, balanceTopic, balanceMsg) - - // then collect the genesis block and bootstrapper address - genesisMsg, err := waitForGenesis(t, ctx) - if err != nil { - return nil, err - } - - clientIP := t.NetClient.MustGetDataNetworkIP().String() - - nodeRepo := repo.NewMemory(nil) - - // create the node - n := &Node{} - stop, err := node.New(context.Background(), - node.FullAPI(&n.fullApi), - node.Online(), - node.Repo(nodeRepo), - withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), - withGenesis(genesisMsg.Genesis), - withListenAddress(clientIP), - withBootstrapper(genesisMsg.Bootstrapper), - withPubsubConfig(false, pubsubTracer), - drandOpt, - ) - if err != nil { - return nil, err - } - n.stop = stop - - // set the wallet - err = n.setWallet(ctx, walletKey) - if err != nil { - stop(context.TODO()) - return nil, err - } - - err = startClientAPIServer(nodeRepo, n.fullApi) - if err != nil { - return nil, err - } - - registerAndExportMetrics(fmt.Sprintf("client_%d", t.GroupSeq)) - - t.RecordMessage("publish our address to the clients addr topic") - addrinfo, err := n.fullApi.NetAddrsListen(ctx) - if err != nil { - return nil, err - } - t.SyncClient.MustPublish(ctx, clientsAddrsTopic, addrinfo) - - t.RecordMessage("waiting for all nodes to be ready") - t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) - - return n, nil -} - -func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { - rpcServer := jsonrpc.NewServer() - rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(api)) - - ah := &auth.Handler{ - Verify: api.AuthVerify, - Next: rpcServer.ServeHTTP, - } - - http.Handle("/rpc/v0", ah) - - srv := &http.Server{Handler: http.DefaultServeMux} - - return startServer(repo, srv) -} diff --git a/lotus-soup/roles.go b/lotus-soup/roles.go deleted file mode 100644 index a5d77db5a..000000000 --- a/lotus-soup/roles.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -// This is the baseline test; Filecoin 101. -// -// A network with a bootstrapper, a number of miners, and a number of clients/full nodes -// is constructed and connected through the bootstrapper. -// Some funds are allocated to each node and a number of sectors are presealed in the genesis block. -// -// The test plan: -// One or more clients store content to one or more miners, testing storage deals. -// The plan ensures that the storage deals hit the blockchain and measure the time it took. -// Verification: one or more clients retrieve and verify the hashes of stored content. -// The plan ensures that all (previously) published content can be correctly retrieved -// and measures the time it took. -// -// Preparation of the genesis block: this is the responsibility of the bootstrapper. -// In order to compute the genesis block, we need to collect identities and presealed -// sectors from each node. -// Then we create a genesis block that allocates some funds to each node and collects -// the presealed sectors. -var basicRoles = map[string]func(*TestEnvironment) error{ - "bootstrapper": runBootstrapper, - "miner": runMiner, - "client": runBaselineClient, - "drand": runDrandNode, - "pubsub-tracer": runPubsubTracer, -} diff --git a/lotus-soup/deals.go b/lotus-soup/testkit/deals.go similarity index 89% rename from lotus-soup/deals.go rename to lotus-soup/testkit/deals.go index 5ae2699a5..f019aca81 100644 --- a/lotus-soup/deals.go +++ b/lotus-soup/testkit/deals.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "context" @@ -12,7 +12,7 @@ import ( "github.com/ipfs/go-cid" ) -func startDeal(ctx context.Context, minerActorAddr address.Address, client api.FullNode, fcid cid.Cid) *cid.Cid { +func StartDeal(ctx context.Context, minerActorAddr address.Address, client api.FullNode, fcid cid.Cid) *cid.Cid { addr, err := client.WalletDefaultAddress(ctx) if err != nil { panic(err) @@ -31,7 +31,7 @@ func startDeal(ctx context.Context, minerActorAddr address.Address, client api.F return deal } -func waitDealSealed(t *TestEnvironment, ctx context.Context, client api.FullNode, deal *cid.Cid) { +func WaitDealSealed(t *TestEnvironment, ctx context.Context, client api.FullNode, deal *cid.Cid) { loop: for { di, err := client.ClientGetDealInfo(ctx, *deal) diff --git a/lotus-soup/testkit/defaults.go b/lotus-soup/testkit/defaults.go new file mode 100644 index 000000000..a0681f37c --- /dev/null +++ b/lotus-soup/testkit/defaults.go @@ -0,0 +1,55 @@ +package testkit + +import "fmt" + +type RoleName = string + +var DefaultRoles = map[RoleName]func(*TestEnvironment) error{ + "bootstrapper": func(t *TestEnvironment) error { + b, err := PrepareBootstrapper(t) + if err != nil { + return err + } + return b.RunDefault() + }, + "miner": func(t *TestEnvironment) error { + m, err := PrepareMiner(t) + if err != nil { + return err + } + return m.RunDefault() + }, + "client": func(t *TestEnvironment) error { + c, err := PrepareClient(t) + if err != nil { + return err + } + return c.RunDefault() + }, + "drand": func(t *TestEnvironment) error { + d, err := PrepareDrandInstance(t) + if err != nil { + return err + } + return d.RunDefault() + }, + "pubsub-tracer": func(t *TestEnvironment) error { + tr, err := PreparePubsubTracer(t) + if err != nil { + return err + } + return tr.RunDefault() + }, +} + +// HandleDefaultRole handles a role by running its default behaviour. +// +// This function is suitable to forward to when a test case doesn't need to +// explicitly handle/alter a role. +func HandleDefaultRole(t *TestEnvironment) error { + f, ok := DefaultRoles[t.Role] + if !ok { + panic(fmt.Sprintf("unrecognized role: %s", t.Role)) + } + return f(t) +} diff --git a/lotus-soup/lotus_opts.go b/lotus-soup/testkit/lotus_opts.go similarity index 99% rename from lotus-soup/lotus_opts.go rename to lotus-soup/testkit/lotus_opts.go index a02befb56..baf93bc71 100644 --- a/lotus-soup/lotus_opts.go +++ b/lotus-soup/testkit/lotus_opts.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "fmt" diff --git a/lotus-soup/node.go b/lotus-soup/testkit/node.go similarity index 75% rename from lotus-soup/node.go rename to lotus-soup/testkit/node.go index 95a628607..83427a1a3 100644 --- a/lotus-soup/node.go +++ b/lotus-soup/testkit/node.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "context" @@ -6,7 +6,6 @@ import ( "net/http" "os" "sort" - "strings" "time" "github.com/filecoin-project/lotus/api" @@ -28,16 +27,14 @@ import ( "github.com/libp2p/go-libp2p-core/peer" manet "github.com/multiformats/go-multiaddr-net" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" "go.opencensus.io/stats" "go.opencensus.io/stats/view" ) func init() { - logging.SetLogLevel("*", "ERROR") + _ = logging.SetLogLevel("*", "ERROR") - os.Setenv("BELLMAN_NO_GPU", "1") + _ = os.Setenv("BELLMAN_NO_GPU", "1") build.InsecurePoStValidation = true build.DisableBuiltinAssets = true @@ -51,38 +48,20 @@ func init() { var PrepareNodeTimeout = time.Minute -type TestEnvironment struct { - *runtime.RunEnv - *run.InitContext -} - -// workaround for default params being wrapped in quote chars -func (t *TestEnvironment) StringParam(name string) string { - return strings.Trim(t.RunEnv.StringParam(name), "\"") -} - -func (t *TestEnvironment) DurationParam(name string) time.Duration { - d, err := time.ParseDuration(t.StringParam(name)) - if err != nil { - panic(fmt.Errorf("invalid duration value for param '%s': %w", name, err)) - } - return d -} - -type Node struct { - fullApi api.FullNode - minerApi api.StorageMiner - stop node.StopFunc +type LotusNode struct { + FullApi api.FullNode + MinerApi api.StorageMiner + StopFn node.StopFunc MineOne func(context.Context, func(bool)) error } -func (n *Node) setWallet(ctx context.Context, walletKey *wallet.Key) error { - _, err := n.fullApi.WalletImport(ctx, &walletKey.KeyInfo) +func (n *LotusNode) setWallet(ctx context.Context, walletKey *wallet.Key) error { + _, err := n.FullApi.WalletImport(ctx, &walletKey.KeyInfo) if err != nil { return err } - err = n.fullApi.WalletSetDefault(ctx, walletKey.Address) + err = n.FullApi.WalletSetDefault(ctx, walletKey.Address) if err != nil { return err } @@ -90,9 +69,9 @@ func (n *Node) setWallet(ctx context.Context, walletKey *wallet.Key) error { return nil } -func waitForBalances(t *TestEnvironment, ctx context.Context, nodes int) ([]*InitialBalanceMsg, error) { +func WaitForBalances(t *TestEnvironment, ctx context.Context, nodes int) ([]*InitialBalanceMsg, error) { ch := make(chan *InitialBalanceMsg) - sub := t.SyncClient.MustSubscribe(ctx, balanceTopic, ch) + sub := t.SyncClient.MustSubscribe(ctx, BalanceTopic, ch) balances := make([]*InitialBalanceMsg, 0, nodes) for i := 0; i < nodes; i++ { @@ -107,9 +86,9 @@ func waitForBalances(t *TestEnvironment, ctx context.Context, nodes int) ([]*Ini return balances, nil } -func collectPreseals(t *TestEnvironment, ctx context.Context, miners int) ([]*PresealMsg, error) { +func CollectPreseals(t *TestEnvironment, ctx context.Context, miners int) ([]*PresealMsg, error) { ch := make(chan *PresealMsg) - sub := t.SyncClient.MustSubscribe(ctx, presealTopic, ch) + sub := t.SyncClient.MustSubscribe(ctx, PresealTopic, ch) preseals := make([]*PresealMsg, 0, miners) for i := 0; i < miners; i++ { @@ -128,9 +107,9 @@ func collectPreseals(t *TestEnvironment, ctx context.Context, miners int) ([]*Pr return preseals, nil } -func waitForGenesis(t *TestEnvironment, ctx context.Context) (*GenesisMsg, error) { +func WaitForGenesis(t *TestEnvironment, ctx context.Context) (*GenesisMsg, error) { genesisCh := make(chan *GenesisMsg) - sub := t.SyncClient.MustSubscribe(ctx, genesisTopic, genesisCh) + sub := t.SyncClient.MustSubscribe(ctx, GenesisTopic, genesisCh) select { case genesisMsg := <-genesisCh: @@ -140,9 +119,9 @@ func waitForGenesis(t *TestEnvironment, ctx context.Context) (*GenesisMsg, error } } -func collectMinerAddrs(t *TestEnvironment, ctx context.Context, miners int) ([]MinerAddressesMsg, error) { +func CollectMinerAddrs(t *TestEnvironment, ctx context.Context, miners int) ([]MinerAddressesMsg, error) { ch := make(chan MinerAddressesMsg) - sub := t.SyncClient.MustSubscribe(ctx, minersAddrsTopic, ch) + sub := t.SyncClient.MustSubscribe(ctx, MinersAddrsTopic, ch) addrs := make([]MinerAddressesMsg, 0, miners) for i := 0; i < miners; i++ { @@ -157,9 +136,9 @@ func collectMinerAddrs(t *TestEnvironment, ctx context.Context, miners int) ([]M return addrs, nil } -func collectClientAddrs(t *TestEnvironment, ctx context.Context, clients int) ([]peer.AddrInfo, error) { +func CollectClientAddrs(t *TestEnvironment, ctx context.Context, clients int) ([]peer.AddrInfo, error) { ch := make(chan peer.AddrInfo) - sub := t.SyncClient.MustSubscribe(ctx, clientsAddrsTopic, ch) + sub := t.SyncClient.MustSubscribe(ctx, ClientsAddrsTopic, ch) addrs := make([]peer.AddrInfo, 0, clients) for i := 0; i < clients; i++ { @@ -174,13 +153,13 @@ func collectClientAddrs(t *TestEnvironment, ctx context.Context, clients int) ([ return addrs, nil } -func getPubsubTracerMaddr(ctx context.Context, t *TestEnvironment) (string, error) { +func GetPubsubTracerMaddr(ctx context.Context, t *TestEnvironment) (string, error) { if !t.BooleanParam("enable_pubsub_tracer") { return "", nil } ch := make(chan *PubsubTracerMsg) - sub := t.SyncClient.MustSubscribe(ctx, pubsubTracerTopic, ch) + sub := t.SyncClient.MustSubscribe(ctx, PubsubTracerTopic, ch) select { case m := <-ch: @@ -190,7 +169,7 @@ func getPubsubTracerMaddr(ctx context.Context, t *TestEnvironment) (string, erro } } -func getDrandOpts(ctx context.Context, t *TestEnvironment) (node.Option, error) { +func GetRandomBeaconOpts(ctx context.Context, t *TestEnvironment) (node.Option, error) { beaconType := t.StringParam("random_beacon_type") switch beaconType { case "external-drand": diff --git a/lotus-soup/retrieval.go b/lotus-soup/testkit/retrieval.go similarity index 91% rename from lotus-soup/retrieval.go rename to lotus-soup/testkit/retrieval.go index 97cadaca6..352cf513d 100644 --- a/lotus-soup/retrieval.go +++ b/lotus-soup/testkit/retrieval.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "bytes" @@ -19,7 +19,7 @@ import ( "github.com/ipld/go-car" ) -func retrieveData(t *TestEnvironment, ctx context.Context, err error, client api.FullNode, fcid cid.Cid, carExport bool, data []byte) { +func RetrieveData(t *TestEnvironment, ctx context.Context, err error, client api.FullNode, fcid cid.Cid, carExport bool, data []byte) { t1 := time.Now() offers, err := client.ClientFindData(ctx, fcid) if err != nil { @@ -62,7 +62,7 @@ func retrieveData(t *TestEnvironment, ctx context.Context, err error, client api } if carExport { - rdata = extractCarData(ctx, rdata, rpath) + rdata = ExtractCarData(ctx, rdata, rpath) } if !bytes.Equal(rdata, data) { @@ -72,7 +72,7 @@ func retrieveData(t *TestEnvironment, ctx context.Context, err error, client api t.RecordMessage("retrieved successfully") } -func extractCarData(ctx context.Context, rdata []byte, rpath string) []byte { +func ExtractCarData(ctx context.Context, rdata []byte, rpath string) []byte { bserv := dstest.Bserv() ch, err := car.LoadCar(bserv.Blockstore(), bytes.NewReader(rdata)) if err != nil { diff --git a/lotus-soup/role_bootstrapper.go b/lotus-soup/testkit/role_bootstrapper.go similarity index 74% rename from lotus-soup/role_bootstrapper.go rename to lotus-soup/testkit/role_bootstrapper.go index a6bfa42c3..d7d6e293b 100644 --- a/lotus-soup/role_bootstrapper.go +++ b/lotus-soup/testkit/role_bootstrapper.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "bytes" @@ -19,45 +19,43 @@ import ( ma "github.com/multiformats/go-multiaddr" ) -func runBootstrapper(t *TestEnvironment) error { - t.RecordMessage("running bootstrapper") - _, err := prepareBootstrapper(t) - if err != nil { - return err - } +// Bootstrapper is a special kind of process that produces a genesis block with +// the initial wallet balances and preseals for all enlisted miners and clients. +type Bootstrapper struct { + *LotusNode - ctx := context.Background() - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) - return nil + t *TestEnvironment } -func prepareBootstrapper(t *TestEnvironment) (*Node, error) { +func PrepareBootstrapper(t *TestEnvironment) (*Bootstrapper, error) { + var ( + clients = t.IntParam("clients") + miners = t.IntParam("miners") + nodes = clients + miners + ) + ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) defer cancel() - pubsubTracer, err := getPubsubTracerMaddr(ctx, t) + pubsubTracerMaddr, err := GetPubsubTracerMaddr(ctx, t) if err != nil { return nil, err } - clients := t.IntParam("clients") - miners := t.IntParam("miners") - nodes := clients + miners - - drandOpt, err := getDrandOpts(ctx, t) + randomBeaconOpt, err := GetRandomBeaconOpts(ctx, t) if err != nil { return nil, err } // the first duty of the boostrapper is to construct the genesis block // first collect all client and miner balances to assign initial funds - balances, err := waitForBalances(t, ctx, nodes) + balances, err := WaitForBalances(t, ctx, nodes) if err != nil { return nil, err } // then collect all preseals from miners - preseals, err := collectPreseals(t, ctx, miners) + preseals, err := CollectPreseals(t, ctx, miners) if err != nil { return nil, err } @@ -101,26 +99,26 @@ func prepareBootstrapper(t *TestEnvironment) (*Node, error) { bootstrapperIP := t.NetClient.MustGetDataNetworkIP().String() - n := &Node{} + n := &LotusNode{} stop, err := node.New(context.Background(), - node.FullAPI(&n.fullApi), + node.FullAPI(&n.FullApi), node.Online(), node.Repo(repo.NewMemory(nil)), node.Override(new(modules.Genesis), modtest.MakeGenesisMem(&genesisBuffer, genesisTemplate)), withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), withListenAddress(bootstrapperIP), withBootstrapper(nil), - withPubsubConfig(true, pubsubTracer), - drandOpt, + withPubsubConfig(true, pubsubTracerMaddr), + randomBeaconOpt, ) if err != nil { return nil, err } - n.stop = stop + n.StopFn = stop var bootstrapperAddr ma.Multiaddr - bootstrapperAddrs, err := n.fullApi.NetAddrsListen(ctx) + bootstrapperAddrs, err := n.FullApi.NetAddrsListen(ctx) if err != nil { stop(context.TODO()) return nil, err @@ -152,10 +150,18 @@ func prepareBootstrapper(t *TestEnvironment) (*Node, error) { Genesis: genesisBuffer.Bytes(), Bootstrapper: bootstrapperAddr.Bytes(), } - t.SyncClient.MustPublish(ctx, genesisTopic, genesisMsg) + t.SyncClient.MustPublish(ctx, GenesisTopic, genesisMsg) t.RecordMessage("waiting for all nodes to be ready") - t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) + t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount) - return n, nil + return &Bootstrapper{n, t}, nil +} + +// RunDefault runs a default bootstrapper. +func (b *Bootstrapper) RunDefault() error { + b.t.RecordMessage("running bootstrapper") + ctx := context.Background() + b.t.SyncClient.MustSignalAndWait(ctx, StateDone, b.t.TestInstanceCount) + return nil } diff --git a/lotus-soup/testkit/role_client.go b/lotus-soup/testkit/role_client.go new file mode 100644 index 000000000..399023306 --- /dev/null +++ b/lotus-soup/testkit/role_client.go @@ -0,0 +1,139 @@ +package testkit + +import ( + "context" + "fmt" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/chain/wallet" + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/repo" + + "github.com/filecoin-project/specs-actors/actors/crypto" +) + +type LotusClient struct { + *LotusNode + + t *TestEnvironment + MinerAddrs []MinerAddressesMsg +} + +func PrepareClient(t *TestEnvironment) (*LotusClient, error) { + ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) + defer cancel() + + pubsubTracer, err := GetPubsubTracerMaddr(ctx, t) + if err != nil { + return nil, err + } + + drandOpt, err := GetRandomBeaconOpts(ctx, t) + if err != nil { + return nil, err + } + + // first create a wallet + walletKey, err := wallet.GenerateKey(crypto.SigTypeBLS) + if err != nil { + return nil, err + } + + // publish the account ID/balance + balance := t.IntParam("balance") + balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance} + t.SyncClient.Publish(ctx, BalanceTopic, balanceMsg) + + // then collect the genesis block and bootstrapper address + genesisMsg, err := WaitForGenesis(t, ctx) + if err != nil { + return nil, err + } + + clientIP := t.NetClient.MustGetDataNetworkIP().String() + + nodeRepo := repo.NewMemory(nil) + + // create the node + n := &LotusNode{} + stop, err := node.New(context.Background(), + node.FullAPI(&n.FullApi), + node.Online(), + node.Repo(nodeRepo), + withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), + withGenesis(genesisMsg.Genesis), + withListenAddress(clientIP), + withBootstrapper(genesisMsg.Bootstrapper), + withPubsubConfig(false, pubsubTracer), + drandOpt, + ) + if err != nil { + return nil, err + } + n.StopFn = stop + + // set the wallet + err = n.setWallet(ctx, walletKey) + if err != nil { + _ = stop(context.TODO()) + return nil, err + } + + err = startClientAPIServer(nodeRepo, n.FullApi) + if err != nil { + return nil, err + } + + registerAndExportMetrics(fmt.Sprintf("client_%d", t.GroupSeq)) + + t.RecordMessage("publish our address to the clients addr topic") + addrinfo, err := n.FullApi.NetAddrsListen(ctx) + if err != nil { + return nil, err + } + t.SyncClient.MustPublish(ctx, ClientsAddrsTopic, addrinfo) + + t.RecordMessage("waiting for all nodes to be ready") + t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount) + + // collect miner addresses. + addrs, err := CollectMinerAddrs(t, ctx, t.IntParam("miners")) + if err != nil { + return nil, err + } + t.RecordMessage("got %v miner addrs", len(addrs)) + + cl := &LotusClient{ + t: t, + LotusNode: n, + MinerAddrs: addrs, + } + return cl, nil +} + +func (c *LotusClient) RunDefault() error { + // run forever + c.t.RecordMessage("running default client forever") + c.t.WaitUntilAllDone() + return nil +} + +func startClientAPIServer(repo *repo.MemRepo, api api.FullNode) error { + rpcServer := jsonrpc.NewServer() + rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(api)) + + ah := &auth.Handler{ + Verify: api.AuthVerify, + Next: rpcServer.ServeHTTP, + } + + http.Handle("/rpc/v0", ah) + + srv := &http.Server{Handler: http.DefaultServeMux} + + return startServer(repo, srv) +} diff --git a/lotus-soup/role_drand.go b/lotus-soup/testkit/role_drand.go similarity index 87% rename from lotus-soup/role_drand.go rename to lotus-soup/testkit/role_drand.go index bd855c69a..ec285b9f9 100644 --- a/lotus-soup/role_drand.go +++ b/lotus-soup/testkit/role_drand.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "bytes" @@ -26,6 +26,8 @@ import ( var PrepareDrandTimeout = time.Minute type DrandInstance struct { + t *TestEnvironment + Node node.Node GossipRelay *lp2p.GossipRelayNode @@ -36,40 +38,38 @@ func (d *DrandInstance) Cleanup() error { return os.RemoveAll(d.stateDir) } -func runDrandNode(t *TestEnvironment) error { - t.RecordMessage("running drand node") - dr, err := prepareDrandNode(t) - if err != nil { - return err - } - defer dr.Cleanup() +func (d *DrandInstance) RunDefault() error { + d.t.RecordMessage("running drand node") + defer d.Cleanup() // TODO add ability to halt / recover on demand - ctx := context.Background() - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) + d.t.WaitUntilAllDone() return nil } -// prepareDrandNode starts a drand instance and runs a DKG with the other members of the composition group. -// Once the chain is running, the leader publishes the chain info needed by lotus nodes on -// drandConfigTopic -func prepareDrandNode(t *TestEnvironment) (*DrandInstance, error) { +// PrepareDrandInstance starts a drand instance and runs a DKG with the other +// members of the composition group. +// +// Once the chain is running, the leader publishes the chain info needed by +// lotus nodes on DrandConfigTopic. +func PrepareDrandInstance(t *TestEnvironment) (*DrandInstance, error) { + var ( + startTime = time.Now() + seq = t.GroupSeq + isLeader = seq == 1 + nNodes = t.TestGroupInstanceCount + + myAddr = t.NetClient.MustGetDataNetworkIP() + period = t.DurationParam("drand_period") + threshold = t.IntParam("drand_threshold") + runGossipRelay = t.BooleanParam("drand_gossip_relay") + + beaconOffset = 3 + ) + ctx, cancel := context.WithTimeout(context.Background(), PrepareDrandTimeout) defer cancel() - startTime := time.Now() - - seq := t.GroupSeq - isLeader := seq == 1 - nNodes := t.TestGroupInstanceCount - - myAddr := t.NetClient.MustGetDataNetworkIP() - period := t.DurationParam("drand_period") - threshold := t.IntParam("drand_threshold") - runGossipRelay := t.BooleanParam("drand_gossip_relay") - - beaconOffset := 3 - stateDir, err := ioutil.TempDir("", fmt.Sprintf("drand-%d", t.GroupSeq)) if err != nil { return nil, err @@ -85,6 +85,7 @@ func prepareDrandNode(t *TestEnvironment) (*DrandInstance, error) { PublicAddr string IsLeader bool } + addrTopic := sync.NewTopic("drand-addrs", &NodeAddr{}) var publicAddrs []string var leaderAddr string @@ -94,6 +95,7 @@ func prepareDrandNode(t *TestEnvironment) (*DrandInstance, error) { PublicAddr: n.PublicAddr(), IsLeader: isLeader, }, ch) + for i := 0; i < nNodes; i++ { select { case msg := <-ch: @@ -105,6 +107,7 @@ func prepareDrandNode(t *TestEnvironment) (*DrandInstance, error) { return nil, fmt.Errorf("unable to read drand addrs from sync service: %w", err) } } + if leaderAddr == "" { return nil, fmt.Errorf("got %d drand addrs, but no leader", len(publicAddrs)) } @@ -216,10 +219,11 @@ func prepareDrandNode(t *TestEnvironment) (*DrandInstance, error) { } dump, _ := json.Marshal(cfg) t.RecordMessage("publishing drand config on sync topic: %s", string(dump)) - t.SyncClient.MustPublish(ctx, drandConfigTopic, &cfg) + t.SyncClient.MustPublish(ctx, DrandConfigTopic, &cfg) } return &DrandInstance{ + t: t, Node: n, GossipRelay: gossipRelay, stateDir: stateDir, @@ -230,7 +234,7 @@ func prepareDrandNode(t *TestEnvironment) (*DrandInstance, error) { // you can use the returned dtypes.DrandConfig to override the default production config. func waitForDrandConfig(ctx context.Context, client sync.Client) (*DrandRuntimeInfo, error) { ch := make(chan *DrandRuntimeInfo, 1) - sub := client.MustSubscribe(ctx, drandConfigTopic, ch) + sub := client.MustSubscribe(ctx, DrandConfigTopic, ch) select { case cfg := <-ch: return cfg, nil diff --git a/lotus-soup/role_miner.go b/lotus-soup/testkit/role_miner.go similarity index 80% rename from lotus-soup/role_miner.go rename to lotus-soup/testkit/role_miner.go index fa022592c..200d0ef39 100644 --- a/lotus-soup/role_miner.go +++ b/lotus-soup/testkit/role_miner.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "context" @@ -24,101 +24,33 @@ import ( "github.com/filecoin-project/lotus/node/impl" "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/repo" - "github.com/gorilla/mux" - libp2p_crypto "github.com/libp2p/go-libp2p-core/crypto" - "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/builtin" saminer "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/crypto" - + "github.com/gorilla/mux" "github.com/ipfs/go-datastore" + libp2pcrypto "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" - "github.com/testground/sdk-go/sync" ) -func runMiner(t *TestEnvironment) error { - t.RecordMessage("running miner") - miner, err := prepareMiner(t) - if err != nil { - return err - } +type LotusMiner struct { + *LotusNode - t.RecordMessage("block delay: %v", build.BlockDelay) - t.D().Gauge("miner.block-delay").Update(build.BlockDelay) - - ctx := context.Background() - - clients := t.IntParam("clients") - miners := t.IntParam("miners") - - myActorAddr, err := miner.minerApi.ActorAddress(ctx) - if err != nil { - return err - } - - // mine / stop mining - mine := true - done := make(chan struct{}) - - if miner.MineOne != nil { - go func() { - defer t.RecordMessage("shutting down mining") - defer close(done) - - var i int - for i = 0; mine; i++ { - // synchronize all miners to mine the next block - t.RecordMessage("synchronizing all miners to mine next block [%d]", i) - stateMineNext := sync.State(fmt.Sprintf("mine-block-%d", i)) - t.SyncClient.MustSignalAndWait(ctx, stateMineNext, miners) - - ch := make(chan struct{}) - err := miner.MineOne(ctx, func(mined bool) { - if mined { - t.D().Counter(fmt.Sprintf("block.mine,miner=%s", myActorAddr)).Inc(1) - } - close(ch) - }) - if err != nil { - panic(err) - } - <-ch - } - - // signal the last block to make sure no miners are left stuck waiting for the next block signal - // while the others have stopped - stateMineLast := sync.State(fmt.Sprintf("mine-block-%d", i)) - t.SyncClient.MustSignalEntry(ctx, stateMineLast) - }() - } else { - close(done) - } - - // wait for a signal from all clients to stop mining - err = <-t.SyncClient.MustBarrier(ctx, stateStopMining, clients).C - if err != nil { - return err - } - - mine = false - <-done - - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) - return nil + t *TestEnvironment } -func prepareMiner(t *TestEnvironment) (*Node, error) { +func PrepareMiner(t *TestEnvironment) (*LotusMiner, error) { ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout) defer cancel() - pubsubTracer, err := getPubsubTracerMaddr(ctx, t) + pubsubTracer, err := GetPubsubTracerMaddr(ctx, t) if err != nil { return nil, err } - drandOpt, err := getDrandOpts(ctx, t) + drandOpt, err := GetRandomBeaconOpts(ctx, t) if err != nil { return nil, err } @@ -132,10 +64,10 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { // publish the account ID/balance balance := t.IntParam("balance") balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance} - t.SyncClient.Publish(ctx, balanceTopic, balanceMsg) + t.SyncClient.Publish(ctx, BalanceTopic, balanceMsg) // create and publish the preseal commitment - priv, _, err := libp2p_crypto.GenerateEd25519Key(rand.Reader) + priv, _, err := libp2pcrypto.GenerateEd25519Key(rand.Reader) if err != nil { return nil, err } @@ -146,7 +78,7 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { } // pick unique sequence number for each miner, no matter in which group they are - seq := t.SyncClient.MustSignalAndWait(ctx, stateMinerPickSeqNum, t.IntParam("miners")) + seq := t.SyncClient.MustSignalAndWait(ctx, StateMinerPickSeqNum, t.IntParam("miners")) minerAddr, err := address.NewIDAddress(genesis_chain.MinerStart + uint64(seq-1)) if err != nil { @@ -168,10 +100,10 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { t.RecordMessage("Miner Info: Owner: %s Worker: %s", genMiner.Owner, genMiner.Worker) presealMsg := &PresealMsg{Miner: *genMiner, Seqno: seq} - t.SyncClient.Publish(ctx, presealTopic, presealMsg) + t.SyncClient.Publish(ctx, PresealTopic, presealMsg) // then collect the genesis block and bootstrapper address - genesisMsg, err := waitForGenesis(t, ctx) + genesisMsg, err := WaitForGenesis(t, ctx) if err != nil { return nil, err } @@ -229,12 +161,12 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { // create the node // we need both a full node _and_ and storage miner node - n := &Node{} + n := &LotusNode{} nodeRepo := repo.NewMemory(nil) stop1, err := node.New(context.Background(), - node.FullAPI(&n.fullApi), + node.FullAPI(&n.FullApi), node.Online(), node.Repo(nodeRepo), withGenesis(genesisMsg.Genesis), @@ -255,10 +187,10 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { } minerOpts := []node.Option{ - node.StorageMiner(&n.minerApi), + node.StorageMiner(&n.MinerApi), node.Online(), node.Repo(minerRepo), - node.Override(new(api.FullNode), n.fullApi), + node.Override(new(api.FullNode), n.FullApi), withApiEndpoint("/ip4/127.0.0.1/tcp/1234"), withMinerListenAddress(minerIP), } @@ -282,7 +214,7 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { stop1(context.TODO()) return nil, err } - n.stop = func(ctx context.Context) error { + n.StopFn = func(ctx context.Context) error { // TODO use a multierror for this err2 := stop2(ctx) err1 := stop1(ctx) @@ -295,25 +227,20 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { registerAndExportMetrics(minerAddr.String()) // Bootstrap with full node - remoteAddrs, err := n.fullApi.NetAddrsListen(ctx) + remoteAddrs, err := n.FullApi.NetAddrsListen(ctx) if err != nil { panic(err) } - err = n.minerApi.NetConnect(ctx, remoteAddrs) + err = n.MinerApi.NetConnect(ctx, remoteAddrs) if err != nil { panic(err) } - err = startStorMinerAPIServer(minerRepo, n.minerApi) - if err != nil { - return nil, err - } - // add local storage for presealed sectors - err = n.minerApi.StorageAddLocal(ctx, presealDir) + err = n.MinerApi.StorageAddLocal(ctx, presealDir) if err != nil { - n.stop(context.TODO()) + n.StopFn(context.TODO()) return nil, err } @@ -333,30 +260,105 @@ func prepareMiner(t *TestEnvironment) (*Node, error) { GasLimit: 1000000, } - _, err = n.fullApi.MpoolPushMessage(ctx, changeMinerID) + _, err = n.FullApi.MpoolPushMessage(ctx, changeMinerID) if err != nil { - n.stop(context.TODO()) + n.StopFn(context.TODO()) return nil, err } t.RecordMessage("publish our address to the miners addr topic") - actoraddress, err := n.minerApi.ActorAddress(ctx) + actoraddress, err := n.MinerApi.ActorAddress(ctx) if err != nil { return nil, err } - addrinfo, err := n.minerApi.NetAddrsListen(ctx) + addrinfo, err := n.MinerApi.NetAddrsListen(ctx) if err != nil { return nil, err } - t.SyncClient.MustPublish(ctx, minersAddrsTopic, MinerAddressesMsg{addrinfo, actoraddress}) + t.SyncClient.MustPublish(ctx, MinersAddrsTopic, MinerAddressesMsg{addrinfo, actoraddress}) t.RecordMessage("waiting for all nodes to be ready") - t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) + t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount) - return n, err + m := &LotusMiner{n, t} + + err = m.startStorageMinerAPIServer(minerRepo, n.MinerApi) + if err != nil { + return nil, err + } + + return m, err } -func startStorMinerAPIServer(repo *repo.MemRepo, minerApi api.StorageMiner) error { +func (m *LotusMiner) RunDefault() error { + var ( + t = m.t + clients = t.IntParam("clients") + miners = t.IntParam("miners") + ) + + t.RecordMessage("running miner") + t.RecordMessage("block delay: %v", build.BlockDelay) + t.D().Gauge("miner.block-delay").Update(build.BlockDelay) + + ctx := context.Background() + myActorAddr, err := m.MinerApi.ActorAddress(ctx) + if err != nil { + return err + } + + // mine / stop mining + mine := true + done := make(chan struct{}) + + if m.MineOne != nil { + go func() { + defer t.RecordMessage("shutting down mining") + defer close(done) + + var i int + for i = 0; mine; i++ { + // synchronize all miners to mine the next block + t.RecordMessage("synchronizing all miners to mine next block [%d]", i) + stateMineNext := sync.State(fmt.Sprintf("mine-block-%d", i)) + t.SyncClient.MustSignalAndWait(ctx, stateMineNext, miners) + + ch := make(chan struct{}) + err := m.MineOne(ctx, func(mined bool) { + if mined { + t.D().Counter(fmt.Sprintf("block.mine,miner=%s", myActorAddr)).Inc(1) + } + close(ch) + }) + if err != nil { + panic(err) + } + <-ch + } + + // signal the last block to make sure no miners are left stuck waiting for the next block signal + // while the others have stopped + stateMineLast := sync.State(fmt.Sprintf("mine-block-%d", i)) + t.SyncClient.MustSignalEntry(ctx, stateMineLast) + }() + } else { + close(done) + } + + // wait for a signal from all clients to stop mining + err = <-t.SyncClient.MustBarrier(ctx, StateStopMining, clients).C + if err != nil { + return err + } + + mine = false + <-done + + t.SyncClient.MustSignalAndWait(ctx, StateDone, t.TestInstanceCount) + return nil +} + +func (m *LotusMiner) startStorageMinerAPIServer(repo *repo.MemRepo, minerApi api.StorageMiner) error { mux := mux.NewRouter() rpcServer := jsonrpc.NewServer() diff --git a/lotus-soup/role_pubsub_tracer.go b/lotus-soup/testkit/role_pubsub_tracer.go similarity index 68% rename from lotus-soup/role_pubsub_tracer.go rename to lotus-soup/testkit/role_pubsub_tracer.go index e91e94847..5b13e6b81 100644 --- a/lotus-soup/role_pubsub_tracer.go +++ b/lotus-soup/testkit/role_pubsub_tracer.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "context" @@ -14,16 +14,12 @@ import ( ) type PubsubTracer struct { + t *TestEnvironment host host.Host traced *traced.TraceCollector } -func (tr *PubsubTracer) Stop() error { - tr.traced.Stop() - return tr.host.Close() -} - -func preparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) { +func PreparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) { ctx := context.Background() privk, _, err := crypto.GenerateEd25519Key(rand.Reader) @@ -54,29 +50,30 @@ func preparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) { _ = ma.StringCast(tracedMultiaddrStr) tracedMsg := &PubsubTracerMsg{Multiaddr: tracedMultiaddrStr} - t.SyncClient.MustPublish(ctx, pubsubTracerTopic, tracedMsg) + t.SyncClient.MustPublish(ctx, PubsubTracerTopic, tracedMsg) t.RecordMessage("waiting for all nodes to be ready") - t.SyncClient.MustSignalAndWait(ctx, stateReady, t.TestInstanceCount) + t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount) - return &PubsubTracer{host: host, traced: traced}, nil + tracer := &PubsubTracer{t: t, host: host, traced: traced} + return tracer, nil } -func runPubsubTracer(t *TestEnvironment) error { - t.RecordMessage("running pubsub tracer") - tracer, err := preparePubsubTracer(t) - if err != nil { - return err - } +func (tr *PubsubTracer) RunDefault() error { + tr.t.RecordMessage("running pubsub tracer") defer func() { - err := tracer.Stop() + err := tr.Stop() if err != nil { - t.RecordMessage("error stoping tracer: %s", err) + tr.t.RecordMessage("error stoping tracer: %s", err) } }() - ctx := context.Background() - t.SyncClient.MustSignalAndWait(ctx, stateDone, t.TestInstanceCount) + tr.t.WaitUntilAllDone() return nil } + +func (tr *PubsubTracer) Stop() error { + tr.traced.Stop() + return tr.host.Close() +} diff --git a/lotus-soup/sync.go b/lotus-soup/testkit/sync.go similarity index 51% rename from lotus-soup/sync.go rename to lotus-soup/testkit/sync.go index 099d31283..0ca4327bc 100644 --- a/lotus-soup/sync.go +++ b/lotus-soup/testkit/sync.go @@ -1,4 +1,4 @@ -package main +package testkit import ( "github.com/filecoin-project/go-address" @@ -9,20 +9,20 @@ import ( ) var ( - genesisTopic = sync.NewTopic("genesis", &GenesisMsg{}) - balanceTopic = sync.NewTopic("balance", &InitialBalanceMsg{}) - presealTopic = sync.NewTopic("preseal", &PresealMsg{}) - clientsAddrsTopic = sync.NewTopic("clientsAddrsTopic", &peer.AddrInfo{}) - minersAddrsTopic = sync.NewTopic("minersAddrsTopic", &MinerAddressesMsg{}) - pubsubTracerTopic = sync.NewTopic("pubsubTracer", &PubsubTracerMsg{}) - drandConfigTopic = sync.NewTopic("drand-config", &DrandRuntimeInfo{}) + GenesisTopic = sync.NewTopic("genesis", &GenesisMsg{}) + BalanceTopic = sync.NewTopic("balance", &InitialBalanceMsg{}) + PresealTopic = sync.NewTopic("preseal", &PresealMsg{}) + ClientsAddrsTopic = sync.NewTopic("clients_addrs", &peer.AddrInfo{}) + MinersAddrsTopic = sync.NewTopic("miners_addrs", &MinerAddressesMsg{}) + PubsubTracerTopic = sync.NewTopic("pubsub_tracer", &PubsubTracerMsg{}) + DrandConfigTopic = sync.NewTopic("drand_config", &DrandRuntimeInfo{}) ) var ( - stateReady = sync.State("ready") - stateDone = sync.State("done") - stateStopMining = sync.State("stop-mining") - stateMinerPickSeqNum = sync.State("miner-pick-seq-num") + StateReady = sync.State("ready") + StateDone = sync.State("done") + StateStopMining = sync.State("stop-mining") + StateMinerPickSeqNum = sync.State("miner-pick-seq-num") ) type InitialBalanceMsg struct { diff --git a/lotus-soup/testkit/testenv.go b/lotus-soup/testkit/testenv.go new file mode 100644 index 000000000..d770d3dd3 --- /dev/null +++ b/lotus-soup/testkit/testenv.go @@ -0,0 +1,48 @@ +package testkit + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/testground/sdk-go/run" + "github.com/testground/sdk-go/runtime" +) + +type TestEnvironment struct { + *runtime.RunEnv + *run.InitContext + + Role string +} + +// workaround for default params being wrapped in quote chars +func (t *TestEnvironment) StringParam(name string) string { + return strings.Trim(t.RunEnv.StringParam(name), "\"") +} + +func (t *TestEnvironment) DurationParam(name string) time.Duration { + d, err := time.ParseDuration(t.StringParam(name)) + if err != nil { + panic(fmt.Errorf("invalid duration value for param '%s': %w", name, err)) + } + return d +} + +// WaitUntilAllDone waits until all instances in the test case are done. +func (t *TestEnvironment) WaitUntilAllDone() { + ctx := context.Background() + t.SyncClient.MustSignalAndWait(ctx, StateDone, t.TestInstanceCount) +} + +// WrapTestEnvironment takes a test case function that accepts a +// *TestEnvironment, and adapts it to the original unwrapped SDK style +// (run.InitializedTestCaseFn). +func WrapTestEnvironment(f func(t *TestEnvironment) error) run.InitializedTestCaseFn { + return func(runenv *runtime.RunEnv, initCtx *run.InitContext) error { + t := &TestEnvironment{RunEnv: runenv, InitContext: initCtx} + t.Role = t.StringParam("role") + return f(t) + } +}