Skip to content

Commit

Permalink
Merge PR #221: GameOfZones - Phase 1
Browse files Browse the repository at this point in the history
* Update to latest SDK code

* Update tests

* Add additional logging to faucet to facilitate debugging

* Merge PR #223: Add utility for fetching data about clients

* Add utility for fetching data about clients

* Fix pagniation flags

* Fix version issue

* fix: don't exit if the packets have not yet begun flowing

* fix: the race was in nchainz, not the relayer

* fix: add retry to packet sends

* fix: when retrying in sendTxFromEventPackets, use a fresh header

* chore: get cosmos-sdk 7557f0e for quick-fix

* fix: make basedir if not already existing

* Add goz data dump cmd

* Add statsd output for data

* Fix channel bug

* - Switch to datadogs statsd client
- use tags to dimensionalize data
- report microseconds since last update

Co-authored-by: Michael FIG <[email protected]>
Co-authored-by: Zaki Manian <[email protected]>
  • Loading branch information
3 people authored May 7, 2020
1 parent e3ffaf2 commit a479eea
Show file tree
Hide file tree
Showing 23 changed files with 573 additions and 223 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ coverage.out
release.tar.gz
.env
nchainz/
.idea/
.idea/
.csv
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//')
COMMIT := $(shell git log -1 --format='%H')
SDKCOMMIT := $(shell echo $(shell go list -m -u github.com/cosmos/cosmos-sdk) | sed 's~github.com/cosmos/cosmos-sdk ~~')
all: ci-lint install

###############################################################################
# Build / Install
###############################################################################

LD_FLAGS = -X github.com/iqlusioninc/relayer/cmd.Version=$(VERSION) \
-X github.com/iqlusioninc/relayer/cmd.Commit=$(COMMIT)
-X github.com/iqlusioninc/relayer/cmd.Commit=$(COMMIT) \
-X github.com/iqlusioninc/relayer/cmd.SDKCommit=$(SDKCOMMIT)

BUILD_FLAGS := -ldflags '$(LD_FLAGS)'

Expand Down
203 changes: 203 additions & 0 deletions cmd/dev.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package cmd

import (
"encoding/csv"
"encoding/json"
"fmt"
"os"
"time"

"github.com/DataDog/datadog-go/statsd"

sdk "github.com/cosmos/cosmos-sdk/types"
tmclient "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types"
"github.com/spf13/cobra"
)

Expand All @@ -20,10 +26,91 @@ func devCommand() *cobra.Command {
rlyService(),
listenCmd(),
genesisCmd(),
gozDataCmd(),
gozCSVCmd(),
gozStatsDCmd(),
)
return cmd
}

func gozCSVCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "goz-csv [chain-id] [file]",
Aliases: []string{"csv"},
Short: "read in source of truth csv, and enrich on chain w/ team data",
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
to, err := readGoZCsv(args[1])
if err != nil {
return err
}
cd, err := fetchClientData(args[0])
if err != nil {
return err
}
for _, c := range cd {
info := to[c.ChainID]
c.TeamInfo = info
}
out, _ := json.Marshal(cd)
fmt.Println(string(out))
return nil
},
}
return cmd
}

func gozStatsDCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "goz-statsd [chain-id] [file] [statsd-host] [statd-port]",
Aliases: []string{"statsd"},
Short: "read in source of truth csv",
Args: cobra.ExactArgs(4),
RunE: func(cmd *cobra.Command, args []string) error {

to, err := readGoZCsv(args[1])
if err != nil {
return err
}
client, err := statsd.New(args[2])
if err != nil {
return err
}

cd, err := fetchClientData(args[0])
if err != nil {
return err
}
for _, c := range cd {
info := to[c.ChainID]
c.TeamInfo = info
c.StatsD(client, args[3])
}
return nil
},
}
return cmd
}

func gozDataCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "goz-dump [chain-id]",
Aliases: []string{"dump", "goz"},
Short: "fetch the list of chains connected as a CSV dump",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
cd, err := fetchClientData(args[0])
if err != nil {
return err
}
out, _ := json.Marshal(cd)
fmt.Println(string(out))
return nil
},
}
return cmd
}

func genesisCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "genesis [chain-id]",
Expand Down Expand Up @@ -231,3 +318,119 @@ WantedBy=multi-user.target
}
return cmd
}

func readGoZCsv(path string) (map[string]*teamInfo, error) {
// open the CSV file
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()

// create the csv reader
cs := csv.NewReader(f)

// ignore the header line
if _, err := cs.Read(); err != nil {
return nil, err
}

// read all the records into memory
records, err := cs.ReadAll()
if err != nil {
return nil, err
}

// format the map[chain-id]Info
var out = map[string]*teamInfo{}
for _, r := range records {
out[r[2]] = &teamInfo{r[0], r[1], r[3]}
}

return out, nil
}

type teamInfo struct {
Name string `json:"name"`
Address string `json:"address"`
RPCAddr string `json:"rpc-addr"`
}

func fetchClientData(chainID string) ([]*clientData, error) {
c, err := config.Chains.Get(chainID)
if err != nil {
return nil, err
}

clients, err := c.QueryClients(1, 1000)
if err != nil {
return nil, err
}

header, err := c.UpdateLiteWithHeader()
if err != nil {
return nil, err
}

chans, err := c.QueryChannels(1, 10000)
if err != nil {
return nil, err
}

var clientDatas = []*clientData{}
for _, cl := range clients {
cd := &clientData{
ClientID: cl.GetID(),
ChainID: cl.GetChainID(),
TimeOfLastUpdate: cl.(tmclient.ClientState).LastHeader.Time,
ChannelIDs: []string{},
}

if err := c.AddPath(cd.ClientID, dcon, dcha, dpor, dord); err != nil {
return nil, err
}

conns, err := c.QueryConnectionsUsingClient(header.Height)
if err != nil {
return nil, err
}

cd.ConnectionIDs = conns.ConnectionPaths
for _, conn := range cd.ConnectionIDs {
for _, ch := range chans {
for _, co := range ch.ConnectionHops {
if co == conn {
cd.ChannelIDs = append(cd.ChannelIDs, ch.ID)
}
}
}
}

// todo deal with channels
clientDatas = append(clientDatas, cd)

}
return clientDatas, nil
}

type clientData struct {
ClientID string `json:"client-id"`
ConnectionIDs []string `json:"connection-ids"`
ChannelIDs []string `json:"channel-ids"`
ChainID string `json:"chain-id"`
TimeOfLastUpdate time.Time `json:"since-last-update"`
TeamInfo *teamInfo `json:"team-info"`
}

func (cd *clientData) StatsD(cl *statsd.Client, prefix string) {
switch {
case len(cd.ConnectionIDs) != 1:
byt, _ := json.Marshal(cd)
fmt.Fprintf(os.Stderr, "%s", string(byt))
case len(cd.ChannelIDs) != 1:
byt, _ := json.Marshal(cd)
fmt.Fprintf(os.Stderr, "%s", string(byt))
// TODO: add more cases here
}
cl.TimeInMilliseconds(fmt.Sprintf("relayer.%s.client", prefix), float64(time.Since(cd.TimeOfLastUpdate).Milliseconds()), []string{"teamname", cd.TeamInfo.Name, "chain-id", cd.ChainID, "client-id", cd.ClientID, "connection-id", cd.ConnectionIDs[0], "channelid", cd.ChannelIDs[0]}, 1)
}
52 changes: 26 additions & 26 deletions cmd/paths.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,11 +178,11 @@ func pathsGenCmd() *cobra.Command {
return err
}

var srcCon connTypes.IdentifiedConnectionEnd
var srcCon connTypes.ConnectionEnd
for _, c := range srcConns {
if c.Connection.ClientID == path.Src.ClientID {
if c.ClientID == path.Src.ClientID {
srcCon = c
path.Src.ConnectionID = c.Identifier
path.Src.ConnectionID = c.ID
}
}

Expand All @@ -191,11 +191,11 @@ func pathsGenCmd() *cobra.Command {
return err
}

var dstCon connTypes.IdentifiedConnectionEnd
var dstCon connTypes.ConnectionEnd
for _, c := range dstConns {
if c.Connection.ClientID == path.Dst.ClientID {
if c.ClientID == path.Dst.ClientID {
dstCon = c
path.Dst.ConnectionID = c.Identifier
path.Dst.ConnectionID = c.ID
}
}

Expand All @@ -204,10 +204,10 @@ func pathsGenCmd() *cobra.Command {
// If we have identified a connection, make sure that each end is the
// other's counterparty and that the connection is open. In the failure case
// we should generate a new connection identifier
dstCpForSrc := srcCon.Connection.Counterparty.ConnectionID == dstCon.Identifier
srcCpForDst := dstCon.Connection.Counterparty.ConnectionID == srcCon.Identifier
srcOpen := srcCon.Connection.GetState().String() == "OPEN"
dstOpen := dstCon.Connection.GetState().String() == "OPEN"
dstCpForSrc := srcCon.Counterparty.ConnectionID == dstCon.ID
srcCpForDst := dstCon.Counterparty.ConnectionID == srcCon.ID
srcOpen := srcCon.State.String() == "OPEN"
dstOpen := dstCon.State.String() == "OPEN"
if !(dstCpForSrc && srcCpForDst && srcOpen && dstOpen) {
path.Src.ConnectionID = relayer.RandLowerCaseLetterString(10)
path.Dst.ConnectionID = relayer.RandLowerCaseLetterString(10)
Expand Down Expand Up @@ -236,9 +236,9 @@ func pathsGenCmd() *cobra.Command {

var srcChan chanTypes.IdentifiedChannel
for _, c := range srcChans {
if c.Channel.ConnectionHops[0] == path.Src.ConnectionID {
if c.ConnectionHops[0] == path.Src.ConnectionID {
srcChan = c
path.Src.ChannelID = c.ChannelIdentifier
path.Src.ChannelID = c.ID
}
}

Expand All @@ -249,22 +249,22 @@ func pathsGenCmd() *cobra.Command {

var dstChan chanTypes.IdentifiedChannel
for _, c := range dstChans {
if c.Channel.ConnectionHops[0] == path.Dst.ConnectionID {
if c.ConnectionHops[0] == path.Dst.ConnectionID {
dstChan = c
path.Dst.ChannelID = c.ChannelIdentifier
path.Dst.ChannelID = c.ID
}
}

switch {
case path.Src.ChannelID != "" && path.Dst.ChannelID != "":
dstCpForSrc := srcChan.Channel.Counterparty.ChannelID == dstChan.ChannelIdentifier
srcCpForDst := dstChan.Channel.Counterparty.ChannelID == srcChan.ChannelIdentifier
srcOpen := srcChan.Channel.GetState().String() == "OPEN"
dstOpen := dstChan.Channel.GetState().String() == "OPEN"
srcPort := srcChan.PortIdentifier == path.Src.PortID
dstPort := dstChan.PortIdentifier == path.Dst.PortID
srcOrder := srcChan.Channel.Ordering.String() == path.Src.Order
dstOrder := dstChan.Channel.Ordering.String() == path.Dst.Order
dstCpForSrc := srcChan.Counterparty.ChannelID == dstChan.ID
srcCpForDst := dstChan.Counterparty.ChannelID == srcChan.ID
srcOpen := srcChan.State.String() == "OPEN"
dstOpen := dstChan.State.String() == "OPEN"
srcPort := srcChan.PortID == path.Src.PortID
dstPort := dstChan.PortID == path.Dst.PortID
srcOrder := srcChan.Ordering.String() == path.Src.Order
dstOrder := dstChan.Ordering.String() == path.Dst.Order
if !(dstCpForSrc && srcCpForDst && srcOpen && dstOpen && srcPort && dstPort && srcOrder && dstOrder) {
path.Src.ChannelID = relayer.RandLowerCaseLetterString(10)
path.Dst.ChannelID = relayer.RandLowerCaseLetterString(10)
Expand Down Expand Up @@ -387,7 +387,7 @@ func pathsListCmd() *cobra.Command {

srcConn, err := ch[src].QueryConnection(srch)
dstConn, _ := ch[dst].QueryConnection(dsth)
if err == nil && srcConn.Connection.Connection.State.String() == "OPEN" && dstConn.Connection.Connection.State.String() == "OPEN" {
if err == nil && srcConn.Connection.State.String() == "OPEN" && dstConn.Connection.State.String() == "OPEN" {
connection = "✔"
} else {
printPath(i, k, pth, chains, clients, connection, channel)
Expand All @@ -397,7 +397,7 @@ func pathsListCmd() *cobra.Command {

srcChan, err := ch[src].QueryChannel(srch)
dstChan, _ := ch[dst].QueryChannel(dsth)
if err == nil && srcChan.Channel.Channel.State.String() == "OPEN" && dstChan.Channel.Channel.State.String() == "OPEN" {
if err == nil && srcChan.Channel.State.String() == "OPEN" && dstChan.Channel.State.String() == "OPEN" {
channel = "✔"
} else {
printPath(i, k, pth, chains, clients, connection, channel)
Expand Down Expand Up @@ -490,13 +490,13 @@ func pathsShowCmd() *cobra.Command {

srcConn, err := ch[src].QueryConnection(srch)
dstConn, _ := ch[dst].QueryConnection(dsth)
if err == nil && srcConn.Connection.Connection.State.String() == "OPEN" && dstConn.Connection.Connection.State.String() == "OPEN" {
if err == nil && srcConn.Connection.State.String() == "OPEN" && dstConn.Connection.State.String() == "OPEN" {
connection = true
}

srcChan, err := ch[src].QueryChannel(srch)
dstChan, _ := ch[dst].QueryChannel(dsth)
if err == nil && srcChan.Channel.Channel.State.String() == "OPEN" && dstChan.Channel.Channel.State.String() == "OPEN" {
if err == nil && srcChan.Channel.State.String() == "OPEN" && dstChan.Channel.State.String() == "OPEN" {
channel = true
}

Expand Down
Loading

0 comments on commit a479eea

Please sign in to comment.