Merge PR #1252: Query node version
introduce non store queries add version query update lcd spec changelog moved version query into baseapp
This commit is contained in:
parent
cc11bd22b2
commit
42e72956f4
|
@ -17,6 +17,7 @@ BREAKING CHANGES
|
||||||
|
|
||||||
FEATURES
|
FEATURES
|
||||||
* [x/auth] Added AccountNumbers to BaseAccount and StdTxs to allow for replay protection with account pruning
|
* [x/auth] Added AccountNumbers to BaseAccount and StdTxs to allow for replay protection with account pruning
|
||||||
|
* [lcd] added an endpoint to query for the SDK version of the connected node
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
* export command now writes current validator set for Tendermint
|
* export command now writes current validator set for Tendermint
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/store"
|
"github.com/cosmos/cosmos-sdk/store"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/version"
|
||||||
"github.com/cosmos/cosmos-sdk/wire"
|
"github.com/cosmos/cosmos-sdk/wire"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||||
)
|
)
|
||||||
|
@ -338,6 +339,11 @@ func (app *BaseApp) Query(req abci.RequestQuery) (res abci.ResponseQuery) {
|
||||||
} else {
|
} else {
|
||||||
result = app.Simulate(tx)
|
result = app.Simulate(tx)
|
||||||
}
|
}
|
||||||
|
case "version":
|
||||||
|
return abci.ResponseQuery{
|
||||||
|
Code: uint32(sdk.ABCICodeOK),
|
||||||
|
Value: []byte(version.GetVersion()),
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
result = sdk.ErrUnknownRequest(fmt.Sprintf("Unknown query: %s", path)).Result()
|
result = sdk.ErrUnknownRequest(fmt.Sprintf("Unknown query: %s", path)).Result()
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@ package context
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/tendermint/tmlibs/common"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/wire"
|
"github.com/cosmos/cosmos-sdk/wire"
|
||||||
|
@ -42,14 +44,19 @@ func (ctx CoreContext) BroadcastTx(tx []byte) (*ctypes.ResultBroadcastTxCommit,
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query from Tendermint with the provided key and storename
|
// Query information about the connected node
|
||||||
func (ctx CoreContext) Query(key cmn.HexBytes, storeName string) (res []byte, err error) {
|
func (ctx CoreContext) Query(path string) (res []byte, err error) {
|
||||||
return ctx.query(key, storeName, "key")
|
return ctx.query(path, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryStore from Tendermint with the provided key and storename
|
||||||
|
func (ctx CoreContext) QueryStore(key cmn.HexBytes, storeName string) (res []byte, err error) {
|
||||||
|
return ctx.queryStore(key, storeName, "key")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query from Tendermint with the provided storename and subspace
|
// Query from Tendermint with the provided storename and subspace
|
||||||
func (ctx CoreContext) QuerySubspace(cdc *wire.Codec, subspace []byte, storeName string) (res []sdk.KVPair, err error) {
|
func (ctx CoreContext) QuerySubspace(cdc *wire.Codec, subspace []byte, storeName string) (res []sdk.KVPair, err error) {
|
||||||
resRaw, err := ctx.query(subspace, storeName, "subspace")
|
resRaw, err := ctx.queryStore(subspace, storeName, "subspace")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
@ -58,8 +65,7 @@ func (ctx CoreContext) QuerySubspace(cdc *wire.Codec, subspace []byte, storeName
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query from Tendermint with the provided storename and path
|
// Query from Tendermint with the provided storename and path
|
||||||
func (ctx CoreContext) query(key cmn.HexBytes, storeName, endPath string) (res []byte, err error) {
|
func (ctx CoreContext) query(path string, key common.HexBytes) (res []byte, err error) {
|
||||||
path := fmt.Sprintf("/store/%s/%s", storeName, endPath)
|
|
||||||
node, err := ctx.GetNode()
|
node, err := ctx.GetNode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
|
@ -80,6 +86,12 @@ func (ctx CoreContext) query(key cmn.HexBytes, storeName, endPath string) (res [
|
||||||
return resp.Value, nil
|
return resp.Value, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Query from Tendermint with the provided storename and path
|
||||||
|
func (ctx CoreContext) queryStore(key cmn.HexBytes, storeName, endPath string) (res []byte, err error) {
|
||||||
|
path := fmt.Sprintf("/store/%s/%s", storeName, endPath)
|
||||||
|
return ctx.query(path, key)
|
||||||
|
}
|
||||||
|
|
||||||
// Get the from address from the name flag
|
// Get the from address from the name flag
|
||||||
func (ctx CoreContext) GetFromAddress() (from sdk.Address, err error) {
|
func (ctx CoreContext) GetFromAddress() (from sdk.Address, err error) {
|
||||||
|
|
||||||
|
@ -177,7 +189,7 @@ func (ctx CoreContext) GetAccountNumber(address []byte) (int64, error) {
|
||||||
return 0, errors.New("accountDecoder required but not provided")
|
return 0, errors.New("accountDecoder required but not provided")
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore)
|
res, err := ctx.QueryStore(auth.AddressStoreKey(address), ctx.AccountStore)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -201,7 +213,7 @@ func (ctx CoreContext) NextSequence(address []byte) (int64, error) {
|
||||||
return 0, errors.New("accountDecoder required but not provided")
|
return 0, errors.New("accountDecoder required but not provided")
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore)
|
res, err := ctx.QueryStore(auth.AddressStoreKey(address), ctx.AccountStore)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,15 @@ func TestVersion(t *testing.T) {
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
match := reg.MatchString(body)
|
match := reg.MatchString(body)
|
||||||
assert.True(t, match, body)
|
assert.True(t, match, body)
|
||||||
|
|
||||||
|
// node info
|
||||||
|
res, body = Request(t, port, "GET", "/node_version", nil)
|
||||||
|
require.Equal(t, http.StatusOK, res.StatusCode, body)
|
||||||
|
|
||||||
|
reg, err = regexp.Compile(`\d+\.\d+\.\d+(-dev)?`)
|
||||||
|
require.Nil(t, err)
|
||||||
|
match = reg.MatchString(body)
|
||||||
|
assert.True(t, match, body)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNodeStatus(t *testing.T) {
|
func TestNodeStatus(t *testing.T) {
|
||||||
|
|
|
@ -17,7 +17,6 @@ import (
|
||||||
keys "github.com/cosmos/cosmos-sdk/client/keys"
|
keys "github.com/cosmos/cosmos-sdk/client/keys"
|
||||||
rpc "github.com/cosmos/cosmos-sdk/client/rpc"
|
rpc "github.com/cosmos/cosmos-sdk/client/rpc"
|
||||||
tx "github.com/cosmos/cosmos-sdk/client/tx"
|
tx "github.com/cosmos/cosmos-sdk/client/tx"
|
||||||
version "github.com/cosmos/cosmos-sdk/version"
|
|
||||||
"github.com/cosmos/cosmos-sdk/wire"
|
"github.com/cosmos/cosmos-sdk/wire"
|
||||||
auth "github.com/cosmos/cosmos-sdk/x/auth/client/rest"
|
auth "github.com/cosmos/cosmos-sdk/x/auth/client/rest"
|
||||||
bank "github.com/cosmos/cosmos-sdk/x/bank/client/rest"
|
bank "github.com/cosmos/cosmos-sdk/x/bank/client/rest"
|
||||||
|
@ -63,7 +62,6 @@ func ServeCommand(cdc *wire.Codec) *cobra.Command {
|
||||||
|
|
||||||
func createHandler(cdc *wire.Codec) http.Handler {
|
func createHandler(cdc *wire.Codec) http.Handler {
|
||||||
r := mux.NewRouter()
|
r := mux.NewRouter()
|
||||||
r.HandleFunc("/version", version.RequestHandler).Methods("GET")
|
|
||||||
|
|
||||||
kb, err := keys.GetKeyBase() //XXX
|
kb, err := keys.GetKeyBase() //XXX
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -73,6 +71,8 @@ func createHandler(cdc *wire.Codec) http.Handler {
|
||||||
ctx := context.NewCoreContextFromViper()
|
ctx := context.NewCoreContextFromViper()
|
||||||
|
|
||||||
// TODO make more functional? aka r = keys.RegisterRoutes(r)
|
// TODO make more functional? aka r = keys.RegisterRoutes(r)
|
||||||
|
r.HandleFunc("/version", CLIVersionRequestHandler).Methods("GET")
|
||||||
|
r.HandleFunc("/node_version", NodeVersionRequestHandler(cdc, ctx)).Methods("GET")
|
||||||
keys.RegisterRoutes(r)
|
keys.RegisterRoutes(r)
|
||||||
rpc.RegisterRoutes(ctx, r)
|
rpc.RegisterRoutes(ctx, r)
|
||||||
tx.RegisterRoutes(ctx, r, cdc)
|
tx.RegisterRoutes(ctx, r, cdc)
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package lcd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/context"
|
||||||
|
"github.com/cosmos/cosmos-sdk/version"
|
||||||
|
"github.com/cosmos/cosmos-sdk/wire"
|
||||||
|
)
|
||||||
|
|
||||||
|
// cli version REST handler endpoint
|
||||||
|
func CLIVersionRequestHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
v := version.GetVersion()
|
||||||
|
w.Write([]byte(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
// connected node version REST handler endpoint
|
||||||
|
func NodeVersionRequestHandler(cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
version, err := ctx.Query("/app/version")
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
w.Write([]byte(fmt.Sprintf("Could't query version. Error: %s", err.Error())))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Write([]byte(version))
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,13 @@ paths:
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
description: Plaintext version i.e. "v0.5.0"
|
description: Plaintext version i.e. "v0.5.0"
|
||||||
|
/node_version:
|
||||||
|
get:
|
||||||
|
summary: Version of the connected node
|
||||||
|
description: Get the version of the SDK running on the connected node to compare against expected
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Plaintext version i.e. "v0.5.0"
|
||||||
/node_info:
|
/node_info:
|
||||||
get:
|
get:
|
||||||
description: Only the node info. Block information can be queried via /block/latest
|
description: Only the node info. Block information can be queried via /block/latest
|
||||||
|
|
|
@ -2,7 +2,6 @@ package version
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
@ -16,7 +15,8 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func getVersion() string {
|
// return version of CLI/node and commit hash
|
||||||
|
func GetVersion() string {
|
||||||
v := Version
|
v := Version
|
||||||
if GitCommit != "" {
|
if GitCommit != "" {
|
||||||
v = v + "-" + GitCommit
|
v = v + "-" + GitCommit
|
||||||
|
@ -26,12 +26,6 @@ func getVersion() string {
|
||||||
|
|
||||||
// CMD
|
// CMD
|
||||||
func printVersion(cmd *cobra.Command, args []string) {
|
func printVersion(cmd *cobra.Command, args []string) {
|
||||||
v := getVersion()
|
v := GetVersion()
|
||||||
fmt.Println(v)
|
fmt.Println(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// version REST handler endpoint
|
|
||||||
func RequestHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
v := getVersion()
|
|
||||||
w.Write([]byte(v))
|
|
||||||
}
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecode
|
||||||
|
|
||||||
// perform query
|
// perform query
|
||||||
ctx := context.NewCoreContextFromViper()
|
ctx := context.NewCoreContextFromViper()
|
||||||
res, err := ctx.Query(auth.AddressStoreKey(key), storeName)
|
res, err := ctx.QueryStore(auth.AddressStoreKey(key), storeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder aut
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := ctx.Query(auth.AddressStoreKey(addr), storeName)
|
res, err := ctx.QueryStore(auth.AddressStoreKey(addr), storeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
w.Write([]byte(fmt.Sprintf("couldn't query account. Error: %s", err.Error())))
|
w.Write([]byte(fmt.Sprintf("couldn't query account. Error: %s", err.Error())))
|
||||||
|
|
|
@ -151,7 +151,7 @@ OUTER:
|
||||||
}
|
}
|
||||||
|
|
||||||
func query(node string, key []byte, storeName string) (res []byte, err error) {
|
func query(node string, key []byte, storeName string) (res []byte, err error) {
|
||||||
return context.NewCoreContextFromViper().WithNodeURI(node).Query(key, storeName)
|
return context.NewCoreContextFromViper().WithNodeURI(node).QueryStore(key, storeName)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c relayCommander) broadcastTx(seq int64, node string, tx []byte) error {
|
func (c relayCommander) broadcastTx(seq int64, node string, tx []byte) error {
|
||||||
|
|
|
@ -27,7 +27,7 @@ func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command {
|
||||||
}
|
}
|
||||||
key := slashing.GetValidatorSigningInfoKey(pk.Address())
|
key := slashing.GetValidatorSigningInfoKey(pk.Address())
|
||||||
ctx := context.NewCoreContextFromViper()
|
ctx := context.NewCoreContextFromViper()
|
||||||
res, err := ctx.Query(key, storeName)
|
res, err := ctx.QueryStore(key, storeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ func GetCmdQueryValidator(storeName string, cdc *wire.Codec) *cobra.Command {
|
||||||
}
|
}
|
||||||
key := stake.GetValidatorKey(addr)
|
key := stake.GetValidatorKey(addr)
|
||||||
ctx := context.NewCoreContextFromViper()
|
ctx := context.NewCoreContextFromViper()
|
||||||
res, err := ctx.Query(key, storeName)
|
res, err := ctx.QueryStore(key, storeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ func GetCmdQueryDelegation(storeName string, cdc *wire.Codec) *cobra.Command {
|
||||||
|
|
||||||
key := stake.GetDelegationKey(delAddr, addr, cdc)
|
key := stake.GetDelegationKey(delAddr, addr, cdc)
|
||||||
ctx := context.NewCoreContextFromViper()
|
ctx := context.NewCoreContextFromViper()
|
||||||
res, err := ctx.Query(key, storeName)
|
res, err := ctx.QueryStore(key, storeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire
|
||||||
|
|
||||||
key := stake.GetDelegationKey(delegatorAddr, validatorAddr, cdc)
|
key := stake.GetDelegationKey(delegatorAddr, validatorAddr, cdc)
|
||||||
|
|
||||||
res, err := ctx.Query(key, storeName)
|
res, err := ctx.QueryStore(key, storeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
w.Write([]byte(fmt.Sprintf("couldn't query bond. Error: %s", err.Error())))
|
w.Write([]byte(fmt.Sprintf("couldn't query bond. Error: %s", err.Error())))
|
||||||
|
|
Loading…
Reference in New Issue