You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

152 lines
3.6 KiB

package handlers
import (
"fmt"
"sort"
"sync"
"github.com/tendermint/go-event-meter"
"github.com/tendermint/go-wire"
"github.com/tendermint/netmon/types"
)
type NetMonResultInterface interface{}
type NetMonResult struct {
Result NetMonResultInterface
}
// for wire.readReflect
var _ = wire.RegisterInterface(
struct{ NetMonResultInterface }{},
wire.ConcreteType{&types.ChainAndValidatorIDs{}, 0x01},
wire.ConcreteType{&types.ChainStatus{}, 0x02},
wire.ConcreteType{&types.Validator{}, 0x03},
wire.ConcreteType{&eventmeter.EventMetric{}, 0x04},
)
//---------------------------------------------
// global state and backend functions
type TendermintNetwork struct {
mtx sync.Mutex
Chains map[string]*types.ChainStatus `json:"blockchains"`
ValSets map[string]*types.ValidatorSet `json:"validator_sets"`
}
// TODO: populate validator sets
func NewTendermintNetwork(chains ...*types.ChainStatus) *TendermintNetwork {
network := &TendermintNetwork{
Chains: make(map[string]*types.ChainStatus),
ValSets: make(map[string]*types.ValidatorSet),
}
for _, chain := range chains {
network.Chains[chain.Config.ID] = chain
}
return network
}
//------------
// RPC funcs
func (tn *TendermintNetwork) Status() (*types.ChainAndValidatorIDs, error) {
tn.mtx.Lock()
defer tn.mtx.Unlock()
chains := make([]string, len(tn.Chains))
valSets := make([]string, len(tn.ValSets))
i := 0
for chain, _ := range tn.Chains {
chains[i] = chain
i += 1
}
i = 0
for valset, _ := range tn.ValSets {
valSets[i] = valset
i += 1
}
sort.StringSlice(chains).Sort()
sort.StringSlice(valSets).Sort()
return &types.ChainAndValidatorIDs{
ChainIDs: chains,
ValidatorSetIDs: valSets,
}, nil
}
func (tn *TendermintNetwork) GetChain(chainID string) (*types.ChainStatus, error) {
tn.mtx.Lock()
defer tn.mtx.Unlock()
chain, ok := tn.Chains[chainID]
if !ok {
return nil, fmt.Errorf("Unknown chain %s", chainID)
}
return chain, nil
}
func (tn *TendermintNetwork) GetValidatorSet(valSetID string) (*types.ValidatorSet, error) {
tn.mtx.Lock()
defer tn.mtx.Unlock()
valSet, ok := tn.ValSets[valSetID]
if !ok {
return nil, fmt.Errorf("Unknown validator set %s", valSetID)
}
return valSet, nil
}
func (tn *TendermintNetwork) GetValidator(valSetID, valID string) (*types.Validator, error) {
tn.mtx.Lock()
defer tn.mtx.Unlock()
valSet, ok := tn.ValSets[valSetID]
if !ok {
return nil, fmt.Errorf("Unknown validator set %s", valSetID)
}
val, err := valSet.Validator(valID)
if err != nil {
return nil, err
}
return val, nil
}
func (tn *TendermintNetwork) StartMeter(chainID, valID, eventID string) error {
tn.mtx.Lock()
defer tn.mtx.Unlock()
val, err := tn.getChainVal(chainID, valID)
if err != nil {
return err
}
return val.EventMeter().Subscribe(eventID, nil)
}
func (tn *TendermintNetwork) StopMeter(chainID, valID, eventID string) error {
tn.mtx.Lock()
defer tn.mtx.Unlock()
val, err := tn.getChainVal(chainID, valID)
if err != nil {
return err
}
return val.EventMeter().Unsubscribe(eventID)
}
func (tn *TendermintNetwork) GetMeter(chainID, valID, eventID string) (*eventmeter.EventMetric, error) {
tn.mtx.Lock()
defer tn.mtx.Unlock()
val, err := tn.getChainVal(chainID, valID)
if err != nil {
return nil, err
}
return val.EventMeter().GetMetric(eventID)
}
func (tn *TendermintNetwork) getChainVal(chainID, valID string) (*types.ChainValidator, error) {
chain, ok := tn.Chains[chainID]
if !ok {
return nil, fmt.Errorf("Unknown chain %s", chainID)
}
val, err := chain.Config.GetValidatorByID(valID)
if err != nil {
return nil, err
}
return val, nil
}