Skip to content

Commit

Permalink
Merge branch 'main' into add-default-entrypoint
Browse files Browse the repository at this point in the history
  • Loading branch information
Reecepbcups authored Jul 23, 2024
2 parents 8144951 + 8647a34 commit 7c5d872
Show file tree
Hide file tree
Showing 9 changed files with 586 additions and 21 deletions.
36 changes: 36 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ ldflags := $(strip $(ldflags))

BUILD_FLAGS := -ldflags '$(ldflags)'

#? build: Build the rly binary
build: go.sum
ifeq ($(OS),Windows_NT)
@echo "building rly binary..."
Expand All @@ -34,70 +35,89 @@ else
@go build $(BUILD_FLAGS) -o build/rly main.go
endif

#? build-zip: Build rly binaries for all supported operating systems
build-zip: go.sum
@echo "building rly binaries for windows, mac and linux"
@GOOS=linux GOARCH=amd64 go build -mod=readonly $(BUILD_FLAGS) -o build/linux-amd64-rly main.go
@GOOS=darwin GOARCH=amd64 go build -mod=readonly $(BUILD_FLAGS) -o build/darwin-amd64-rly main.go
@GOOS=windows GOARCH=amd64 go build -mod=readonly $(BUILD_FLAGS) -o build/windows-amd64-rly.exe main.go
@tar -czvf release.tar.gz ./build

#? install: Install rly binary to GOBIN
install: go.sum
@echo "installing rly binary..."
@go build -mod=readonly $(BUILD_FLAGS) -o $(GOBIN)/rly main.go

#? build-gaia-docker: Build Docker image for Gaia
build-gaia-docker:
docker build -t cosmos/gaia:$(GAIA_VERSION) --build-arg VERSION=$(GAIA_VERSION) -f ./docker/gaiad/Dockerfile .

#? build-akash-docker: Build Docker image for Akash
build-akash-docker:
docker build -t ovrclk/akash:$(AKASH_VERSION) --build-arg VERSION=$(AKASH_VERSION) -f ./docker/akash/Dockerfile .

#? build-osmosis-docker: Build Docker image for Osmosis
build-osmosis-docker:
docker build -t osmosis-labs/osmosis:$(OSMOSIS_VERSION) --build-arg VERSION=$(OSMOSIS_VERSION) -f ./docker/osmosis/Dockerfile .

###############################################################################
# Tests / CI
###############################################################################

#? test: Run all unit tests
test:
@go test -mod=readonly -race ./...

#? interchaintest: Run interchain TestRelayerInProcess tests
interchaintest:
cd interchaintest && go test -race -v -run TestRelayerInProcess .

#? interchaintest-docker: Run interchain TestRelayerDocker tests
interchaintest-docker:
cd interchaintest && go test -race -v -run TestRelayerDocker .

#? interchaintest-docker-events: Run interchain TestRelayerDockerEventProcessor tests
interchaintest-docker-events:
cd interchaintest && go test -race -v -run TestRelayerDockerEventProcessor .

#? interchaintest-docker-legacy: Run interchain TestRelayerDockerLegacyProcessor tests
interchaintest-docker-legacy:
cd interchaintest && go test -race -v -run TestRelayerDockerLegacyProcessor .

#? interchaintest-events: Run interchain TestRelayerEventProcessor tests
interchaintest-events:
cd interchaintest && go test -race -v -run TestRelayerEventProcessor .

#? interchaintest-legacy: Run interchain TestRelayerLegacyProcessor tests
interchaintest-legacy:
cd interchaintest && go test -race -v -run TestRelayerLegacyProcessor .

#? interchaintest-multiple: Run interchain TestRelayerMultiplePathsSingleProcess tests
interchaintest-multiple:
cd interchaintest && go test -race -v -run TestRelayerMultiplePathsSingleProcess .

#? interchaintest-misbehaviour: Run interchain TestRelayerMisbehaviourDetection tests
interchaintest-misbehaviour:
cd interchaintest && go test -race -v -run TestRelayerMisbehaviourDetection .

#? interchaintest-fee-middleware: Run interchain TestRelayerFeeMiddleware tests
interchaintest-fee-middleware:
cd interchaintest && go test -race -v -run TestRelayerFeeMiddleware .

#? interchaintest-fee-grant: Run interchain TestRelayerFeeGrant tests
interchaintest-fee-grant:
cd interchaintest && go test -race -v -run TestRelayerFeeGrant .

#? interchaintest-scenario: Run interchain TestScenario tests
interchaintest-scenario: ## Scenario tests are suitable for simple networks of 1 validator and no full nodes. They test specific functionality.
cd interchaintest && go test -timeout 30m -race -v -run TestScenario ./...

#? coverage: Generate and view test coverage report
coverage:
@echo "viewing test coverage..."
@go tool cover --html=coverage.out

#? lint: Run linters and gofmt
lint:
@golangci-lint run
@find . -name '*.go' -type f -not -path "*.git*" | xargs gofmt -d -s
Expand All @@ -110,10 +130,12 @@ lint:
CHAIN_CODE := ./chain-code
GAIA_REPO := $(CHAIN_CODE)/gaia

#? get-gaia: Download the Gaia repository
get-gaia:
@mkdir -p $(CHAIN_CODE)/
@git clone --branch $(GAIA_VERSION) --depth=1 https://github.com/cosmos/gaia.git $(GAIA_REPO)

#? build-gaia: Build and install Gaia to GOBIN
build-gaia:
@[ -d $(GAIA_REPO) ] || { echo "Repository for gaia does not exist at $(GAIA_REPO). Try running 'make get-gaia'..." ; exit 1; }
@cd $(GAIA_REPO) && \
Expand All @@ -129,14 +151,17 @@ SYSROOT_DIR ?= sysroots
SYSROOT_ARCHIVE ?= sysroots.tar.bz2

.PHONY: sysroot-pack
#? sysroot-pack: Pack the sysroot directory into an archive
sysroot-pack:
@tar cf - $(SYSROOT_DIR) -P | pv -s $[$(du -sk $(SYSROOT_DIR) | awk '{print $1}') * 1024] | pbzip2 > $(SYSROOT_ARCHIVE)

.PHONY: sysroot-unpack
#? sysroot-unpack: Unpack the sysroot archive
sysroot-unpack:
@pv $(SYSROOT_ARCHIVE) | pbzip2 -cd | tar -xf -

.PHONY: release-dry-run
#? release-dry-run: Perform a dry run of the release process using Docker
release-dry-run:
@docker run \
--rm \
Expand All @@ -149,6 +174,7 @@ release-dry-run:
--rm-dist --skip-validate --skip-publish

.PHONY: release
#? release: Run goreleaser to build and release cross-platform rly binary version
release:
@if [ ! -f ".release-env" ]; then \
echo "\033[91m.release-env is required for release\033[0m";\
Expand All @@ -169,14 +195,24 @@ protoVer=0.11.2
protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer)
protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(protoImageName)

#? proto-all: Run proto-format proto-lint proto-gen
proto-all: proto-format proto-lint proto-gen

#? proto-gen: Generate Protobuf files
proto-gen:
@echo "Generating Protobuf files"
@$(protoImage) sh ./scripts/protocgen.sh

#? proto-format: Format Protobuf files using clang-format
proto-format:
@$(protoImage) find ./ -name "*.proto" -exec clang-format -i {} \;

#? proto-lint: Lint Protobuf files
proto-lint:
@$(protoImage) buf lint --error-format=json

#? help: Get more info on make commands
help: Makefile
@echo " Available commands:"
@sed -n 's/^#?//p' $< | column -t -s ':' | sort | sed -e 's/^/ /'
.PHONY: help
12 changes: 12 additions & 0 deletions cmd/appstate.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,3 +319,15 @@ func (a *appState) useRpcAddr(chainName string, rpcAddr string) error {
return nil
})
}

func (a *appState) useBackupRpcAddrs(chainName string, rpcAddrs []string) error {
_, exists := a.config.Chains[chainName]
if !exists {
return fmt.Errorf("chain %s not found in config", chainName)
}

return a.performConfigLockingOperation(context.Background(), func() error {
a.config.Chains[chainName].ChainProvider.SetBackupRpcAddrs(rpcAddrs)
return nil
})
}
36 changes: 34 additions & 2 deletions cmd/chains.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,17 @@ func chainsCmd(a *appState) *cobra.Command {
chainsAddDirCmd(a),
cmdChainsConfigure(a),
cmdChainsUseRpcAddr(a),
cmdChainsUseBackupRpcAddr(a),
)

return cmd
}

func cmdChainsUseRpcAddr(a *appState) *cobra.Command {
cmd := &cobra.Command{
Use: "set-rpc-addr chain_name valid_rpc_url",
Use: "set-rpc-addr chain_name valid_rpc_url",
Aliases: []string{"rpc"},
Short: "Sets chain's rpc address",
Short: "Sets chain's rpc address",
Args: withUsage(cobra.ExactArgs(2)),
Example: strings.TrimSpace(fmt.Sprintf(`
$ %s chains set-rpc-addr ibc-0 https://abc.xyz.com:443
Expand All @@ -69,6 +70,37 @@ $ %s ch set-rpc-addr ibc-0 https://abc.xyz.com:443`, appName, appName)),
return cmd
}

func cmdChainsUseBackupRpcAddr(a *appState) *cobra.Command {
cmd := &cobra.Command{
Use: "set-backup-rpc-addrs chain_name comma_separated_valid_rpc_urls",
Aliases: []string{"set-backup-rpcs"},
Short: "Sets chain's backup rpc addresses",
Args: withUsage(cobra.ExactArgs(2)),
Example: strings.TrimSpace(fmt.Sprintf(`
$ %s chains set-backup-rpc-addr ibc-0 https://abc.xyz.com:443,https://123.456.com:443
$ %s ch set-backup-rpc-addr ibc-0 https://abc.xyz.com:443,https://123.456.com:443`, appName, appName)),
RunE: func(cmd *cobra.Command, args []string) error {
chainName := args[0]
rpc_addresses := args[1]

// split rpc_addresses by ','
rpc_addresses_list := strings.Split(rpc_addresses, ",")

// loop through and ensure valid
for _, rpc_address := range rpc_addresses_list {
rpc_address := rpc_address
if !isValidURL(rpc_address) {
return invalidRpcAddr(rpc_address)
}
}

return a.useBackupRpcAddrs(chainName, rpc_addresses_list)
},
}

return cmd
}

func chainsAddrCmd(a *appState) *cobra.Command {
cmd := &cobra.Command{
Use: "address chain_name",
Expand Down
49 changes: 49 additions & 0 deletions cregistry/chain_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,48 @@ func (c ChainInfo) GetRandomRPCEndpoint(ctx context.Context, forceAdd bool) (str
return endpoint, nil
}

// GetBackupRPCEndpoints returns a slice of strings to be used as fallback, backup RPC endpoints. forceAdd will
// force the use of all available RPC endpoints, regardless of health.
func (c ChainInfo) GetBackupRPCEndpoints(ctx context.Context, forceAdd bool, primaryRPC string, count uint64) ([]string, error) {
// if force add, get all rpcs, otherwise get only healthy ones
var rpcs []string
var err error
if forceAdd {
rpcs, err = c.GetAllRPCEndpoints()
} else {
rpcs, err = c.GetRPCEndpoints(ctx)
}
if err != nil {
return nil, err
}

// if no rpcs, return error
if len(rpcs) == 0 {
if !forceAdd {
return nil, fmt.Errorf("no working RPCs found, consider using --force-add")
} else {
return nil, nil
}
}

// Select first two endpoints
backupRpcs := []string{}
for _, endpoint := range rpcs {
if len(backupRpcs) < 2 && primaryRPC != endpoint {
backupRpcs = append(backupRpcs, endpoint)
} else {
break
}
}

// Log endpoints
c.log.Info("Backup Endpoints selected",
zap.String("chain_name", c.ChainName),
zap.Strings("endpoints", backupRpcs),
)
return backupRpcs, nil
}

// GetAssetList returns the asset metadata from the cosmos chain registry for this particular chain.
func (c ChainInfo) GetAssetList(ctx context.Context, testnet bool, name string) (AssetList, error) {
var chainRegURL string
Expand Down Expand Up @@ -265,10 +307,17 @@ func (c ChainInfo) GetChainConfig(ctx context.Context, forceAdd, testnet bool, n
return nil, err
}

// select 2 healthy endpoints as backup
backupRpcs, err := c.GetBackupRPCEndpoints(ctx, forceAdd, rpc, 2)
if err != nil {
return nil, err
}

return &cosmos.CosmosProviderConfig{
Key: "default",
ChainID: c.ChainID,
RPCAddr: rpc,
BackupRPCAddrs: backupRpcs,
AccountPrefix: c.Bech32Prefix,
KeyringBackend: "test",
GasAdjustment: 1.2,
Expand Down
Loading

0 comments on commit 7c5d872

Please sign in to comment.