|
@ -9,6 +9,7 @@ import ( |
|
|
"github.com/tendermint/go-wire" |
|
|
"github.com/tendermint/go-wire" |
|
|
|
|
|
|
|
|
"github.com/tendermint/netmon/types" |
|
|
"github.com/tendermint/netmon/types" |
|
|
|
|
|
tmtypes "github.com/tendermint/tendermint/types" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
type NetMonResult interface { |
|
|
type NetMonResult interface { |
|
@ -17,7 +18,7 @@ type NetMonResult interface { |
|
|
// for wire.readReflect
|
|
|
// for wire.readReflect
|
|
|
var _ = wire.RegisterInterface( |
|
|
var _ = wire.RegisterInterface( |
|
|
struct{ NetMonResult }{}, |
|
|
struct{ NetMonResult }{}, |
|
|
wire.ConcreteType{&types.ChainAndValidatorIDs{}, 0x01}, |
|
|
|
|
|
|
|
|
wire.ConcreteType{&types.ChainAndValidatorSetIDs{}, 0x01}, |
|
|
wire.ConcreteType{&types.ChainState{}, 0x02}, |
|
|
wire.ConcreteType{&types.ChainState{}, 0x02}, |
|
|
wire.ConcreteType{&types.Validator{}, 0x03}, |
|
|
wire.ConcreteType{&types.Validator{}, 0x03}, |
|
|
wire.ConcreteType{&eventmeter.EventMetric{}, 0x04}, |
|
|
wire.ConcreteType{&eventmeter.EventMetric{}, 0x04}, |
|
@ -47,20 +48,21 @@ func NewTendermintNetwork(chains ...*types.ChainState) *TendermintNetwork { |
|
|
//------------
|
|
|
//------------
|
|
|
// Public Methods
|
|
|
// Public Methods
|
|
|
|
|
|
|
|
|
func (tn *TendermintNetwork) RegisterChain(chain *types.ChainState) { |
|
|
|
|
|
|
|
|
func (tn *TendermintNetwork) Stop() { |
|
|
tn.mtx.Lock() |
|
|
tn.mtx.Lock() |
|
|
defer tn.mtx.Unlock() |
|
|
defer tn.mtx.Unlock() |
|
|
tn.Chains[chain.Config.ID] = chain |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (tn *TendermintNetwork) Stop() { |
|
|
|
|
|
// TODO: for each chain, stop each validator
|
|
|
|
|
|
|
|
|
for _, c := range tn.Chains { |
|
|
|
|
|
for _, v := range c.Config.Validators { |
|
|
|
|
|
v.Stop() |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//------------
|
|
|
//------------
|
|
|
// RPC funcs
|
|
|
// RPC funcs
|
|
|
|
|
|
|
|
|
func (tn *TendermintNetwork) Status() (*types.ChainAndValidatorIDs, error) { |
|
|
|
|
|
|
|
|
// Returns sorted lists of all chains and validator sets
|
|
|
|
|
|
func (tn *TendermintNetwork) Status() (*types.ChainAndValidatorSetIDs, error) { |
|
|
tn.mtx.Lock() |
|
|
tn.mtx.Lock() |
|
|
defer tn.mtx.Unlock() |
|
|
defer tn.mtx.Unlock() |
|
|
chains := make([]string, len(tn.Chains)) |
|
|
chains := make([]string, len(tn.Chains)) |
|
@ -77,7 +79,7 @@ func (tn *TendermintNetwork) Status() (*types.ChainAndValidatorIDs, error) { |
|
|
} |
|
|
} |
|
|
sort.StringSlice(chains).Sort() |
|
|
sort.StringSlice(chains).Sort() |
|
|
sort.StringSlice(valSets).Sort() |
|
|
sort.StringSlice(valSets).Sort() |
|
|
return &types.ChainAndValidatorIDs{ |
|
|
|
|
|
|
|
|
return &types.ChainAndValidatorSetIDs{ |
|
|
ChainIDs: chains, |
|
|
ChainIDs: chains, |
|
|
ValidatorSetIDs: valSets, |
|
|
ValidatorSetIDs: valSets, |
|
|
}, nil |
|
|
}, nil |
|
@ -91,10 +93,40 @@ func (tn *TendermintNetwork) GetChain(chainID string) (*types.ChainState, error) |
|
|
if !ok { |
|
|
if !ok { |
|
|
return nil, fmt.Errorf("Unknown chain %s", chainID) |
|
|
return nil, fmt.Errorf("Unknown chain %s", chainID) |
|
|
} |
|
|
} |
|
|
fmt.Println("CHAIN:", chain) |
|
|
|
|
|
return chain, nil |
|
|
return chain, nil |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (tn *TendermintNetwork) RegisterChain(chainConfig *types.BlockchainConfig) (*types.ChainState, error) { |
|
|
|
|
|
tn.mtx.Lock() |
|
|
|
|
|
defer tn.mtx.Unlock() |
|
|
|
|
|
|
|
|
|
|
|
chainState := &types.ChainState{ |
|
|
|
|
|
Config: chainConfig, |
|
|
|
|
|
Status: types.NewBlockchainStatus(), |
|
|
|
|
|
} |
|
|
|
|
|
chainState.Status.NumValidators = len(chainConfig.Validators) |
|
|
|
|
|
|
|
|
|
|
|
chainState.Config.PopulateValIDMap() |
|
|
|
|
|
|
|
|
|
|
|
// start the event meter and listen for new blocks on each validator
|
|
|
|
|
|
for _, v := range chainConfig.Validators { |
|
|
|
|
|
|
|
|
|
|
|
if err := v.Start(); err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
v.EventMeter().RegisterLatencyCallback(tn.latencyCallback(chainConfig.ID, v.Validator.ID)) |
|
|
|
|
|
err := v.EventMeter().Subscribe(tmtypes.EventStringNewBlock(), tn.newBlockCallback(chainConfig.ID, v.Validator.ID)) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// get/set the validator's pub key
|
|
|
|
|
|
v.PubKey() |
|
|
|
|
|
} |
|
|
|
|
|
tn.Chains[chainState.Config.ID] = chainState |
|
|
|
|
|
return chainState, nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
func (tn *TendermintNetwork) GetValidatorSet(valSetID string) (*types.ValidatorSet, error) { |
|
|
func (tn *TendermintNetwork) GetValidatorSet(valSetID string) (*types.ValidatorSet, error) { |
|
|
tn.mtx.Lock() |
|
|
tn.mtx.Lock() |
|
|
defer tn.mtx.Unlock() |
|
|
defer tn.mtx.Unlock() |
|
|