diff --git a/README.md b/README.md index 9262d6c1..b50a0979 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ For more details, go [here](https://docs.multiversx.com/sdk-and-tools/proxy/). - `/v1.0/network/direct-staked-info` (GET) --> returns the list of direct staked values - `/v1.0/network/delegated-info` (GET) --> returns the list of delegated values - `/v1.0/network/enable-epochs` (GET) --> returns the activation epochs metric +- `/v1.0/network/enable-epochs-v2` (GET) --> returns the newer version of activation epochs ### node - `/v1.0/node/heartbeatstatus` (GET) --> returns the heartbeat data from an observer from any shard. Has a cache to avoid many requests diff --git a/api/groups/baseNetworkGroup.go b/api/groups/baseNetworkGroup.go index 8c4956f5..d165c581 100644 --- a/api/groups/baseNetworkGroup.go +++ b/api/groups/baseNetworkGroup.go @@ -37,6 +37,7 @@ func NewNetworkGroup(facadeHandler data.FacadeHandler) (*networkGroup, error) { {Path: "/esdt/non-fungible-tokens", Handler: ng.getEsdtHandlerFunc(data.NonFungibleTokens), Method: http.MethodGet}, {Path: "/esdt/supply/:token", Handler: ng.getESDTSupply, Method: http.MethodGet}, {Path: "/enable-epochs", Handler: ng.getEnableEpochs, Method: http.MethodGet}, + {Path: "/enable-epochs-v2", Handler: ng.getEnableEpochsV2, Method: http.MethodGet}, {Path: "/direct-staked-info", Handler: ng.getDirectStakedInfo, Method: http.MethodGet}, {Path: "/delegated-info", Handler: ng.getDelegatedInfo, Method: http.MethodGet}, {Path: "/ratings", Handler: ng.getRatingsConfig, Method: http.MethodGet}, @@ -144,6 +145,16 @@ func (group *networkGroup) getEnableEpochs(c *gin.Context) { c.JSON(http.StatusOK, enableEpochsMetrics) } +func (group *networkGroup) getEnableEpochsV2(c *gin.Context) { + enableEpochsMetrics, err := group.facade.GetEnableEpochsMetricsV2() + if err != nil { + shared.RespondWith(c, http.StatusInternalServerError, nil, err.Error(), data.ReturnCodeInternalError) + return + } + + c.JSON(http.StatusOK, enableEpochsMetrics) +} + func (group *networkGroup) getESDTSupply(c *gin.Context) { tokenIdentifier := c.Param("token") if tokenIdentifier == "" { diff --git a/api/groups/baseNetworkGroup_test.go b/api/groups/baseNetworkGroup_test.go index 9086274d..04b20580 100644 --- a/api/groups/baseNetworkGroup_test.go +++ b/api/groups/baseNetworkGroup_test.go @@ -216,7 +216,7 @@ func TestGetEconomicsData_ShouldWork(t *testing.T) { assert.Equal(t, http.StatusOK, resp.Code) assert.Equal(t, expectedResp, ecDataResp) - assert.Equal(t, expectedResp.Data, ecDataResp.Data) //extra safe + assert.Equal(t, expectedResp.Data, ecDataResp.Data) // extra safe } func TestGetAllIssuedESDTs_ShouldErr(t *testing.T) { @@ -325,7 +325,7 @@ func TestGetDelegatedInfo_ShouldWork(t *testing.T) { assert.Equal(t, http.StatusOK, resp.Code) assert.Equal(t, expectedResp, delegatedInfoResp) - assert.Equal(t, expectedResp.Data, delegatedInfoResp.Data) //extra safe + assert.Equal(t, expectedResp.Data, delegatedInfoResp.Data) // extra safe } func TestGetDirectStaked_ShouldErr(t *testing.T) { @@ -374,7 +374,7 @@ func TestGetDirectStaked_ShouldWork(t *testing.T) { assert.Equal(t, http.StatusOK, resp.Code) assert.Equal(t, expectedResp, directStakedResp) - assert.Equal(t, expectedResp.Data, directStakedResp.Data) //extra safe + assert.Equal(t, expectedResp.Data, directStakedResp.Data) // extra safe } func TestGetEnableEpochsMetrics_FacadeErrShouldErr(t *testing.T) { @@ -452,6 +452,81 @@ func TestGetEnableEpochsMetrics_OkRequestShouldWork(t *testing.T) { assert.Equal(t, value, res) } +func TestGetEnableEpochsMetricsV2_FacadeErrShouldErr(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected err") + facade := &mock.FacadeStub{ + GetEnableEpochsMetricsV2Handler: func() (*data.GenericAPIResponse, error) { + return nil, expectedErr + }, + } + networkGroup, err := groups.NewNetworkGroup(facade) + require.NoError(t, err) + ws := startProxyServer(networkGroup, networkPath) + + req, _ := http.NewRequest("GET", "/network/enable-epochs-v2", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + + var result metricsResponse + loadResponse(resp.Body, &result) + + assert.Equal(t, expectedErr.Error(), result.Error) +} + +func TestGetEnableEpochsMetricsV2_BadRequestShouldErr(t *testing.T) { + t.Parallel() + + facade := &mock.FacadeStub{ + GetEnableEpochsMetricsV2Handler: func() (*data.GenericAPIResponse, error) { + return nil, errors.New("bad request") + }, + } + networkGroup, err := groups.NewNetworkGroup(facade) + require.NoError(t, err) + ws := startProxyServer(networkGroup, networkPath) + + req, _ := http.NewRequest("GET", "/network/enable-epochs-v2", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, http.StatusInternalServerError, resp.Code) +} + +func TestGetEnableEpochsMetricsV2_OkRequestShouldWork(t *testing.T) { + t.Parallel() + + key := "SupernovaEnableEpoch" + value := float64(4) + facade := &mock.FacadeStub{ + GetEnableEpochsMetricsV2Handler: func() (*data.GenericAPIResponse, error) { + return &data.GenericAPIResponse{ + Data: map[string]interface{}{ + key: value, + }, + Error: "", + }, nil + }, + } + networkGroup, err := groups.NewNetworkGroup(facade) + require.NoError(t, err) + ws := startProxyServer(networkGroup, networkPath) + + req, _ := http.NewRequest("GET", "/network/enable-epochs-v2", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + assert.Equal(t, http.StatusOK, resp.Code) + + var result metricsResponse + loadResponse(resp.Body, &result) + + res, ok := result.Data[key] + assert.True(t, ok) + assert.Equal(t, value, res) +} + func TestGetRatingsConfig_ShouldFail(t *testing.T) { t.Parallel() diff --git a/api/groups/interface.go b/api/groups/interface.go index 26569ff1..f7a2ae11 100644 --- a/api/groups/interface.go +++ b/api/groups/interface.go @@ -65,6 +65,7 @@ type NetworkFacadeHandler interface { GetDirectStakedInfo() (*data.GenericAPIResponse, error) GetDelegatedInfo() (*data.GenericAPIResponse, error) GetEnableEpochsMetrics() (*data.GenericAPIResponse, error) + GetEnableEpochsMetricsV2() (*data.GenericAPIResponse, error) GetESDTSupply(token string) (*data.ESDTSupplyResponse, error) GetRatingsConfig() (*data.GenericAPIResponse, error) GetGenesisNodesPubKeys() (*data.GenericAPIResponse, error) diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index 3bb3c181..b8219c04 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -45,6 +45,7 @@ type FacadeStub struct { GetNetworkMetricsHandler func(shardID uint32) (*data.GenericAPIResponse, error) GetAllIssuedESDTsHandler func(tokenType string) (*data.GenericAPIResponse, error) GetEnableEpochsMetricsHandler func() (*data.GenericAPIResponse, error) + GetEnableEpochsMetricsV2Handler func() (*data.GenericAPIResponse, error) GetEconomicsDataMetricsHandler func() (*data.GenericAPIResponse, error) GetDirectStakedInfoCalled func() (*data.GenericAPIResponse, error) GetDelegatedInfoCalled func() (*data.GenericAPIResponse, error) @@ -235,6 +236,11 @@ func (f *FacadeStub) GetEnableEpochsMetrics() (*data.GenericAPIResponse, error) return f.GetEnableEpochsMetricsHandler() } +// GetEnableEpochsMetricsV2 - +func (f *FacadeStub) GetEnableEpochsMetricsV2() (*data.GenericAPIResponse, error) { + return f.GetEnableEpochsMetricsV2Handler() +} + // GetRatingsConfig - func (f *FacadeStub) GetRatingsConfig() (*data.GenericAPIResponse, error) { return f.GetRatingsConfigCalled() diff --git a/cmd/proxy/config/apiConfig/v1_0.toml b/cmd/proxy/config/apiConfig/v1_0.toml index 0accd45e..1e7e83b4 100644 --- a/cmd/proxy/config/apiConfig/v1_0.toml +++ b/cmd/proxy/config/apiConfig/v1_0.toml @@ -69,6 +69,7 @@ Routes = [ { Name = "/direct-staked-info", Open = true, Secured = true, RateLimit = 0 }, { Name = "/delegated-info", Open = true, Secured = true, RateLimit = 0 }, { Name = "/enable-epochs", Open = true, Secured = false, RateLimit = 0 }, + { Name = "/enable-epochs-v2", Open = true, Secured = false, RateLimit = 0 }, { Name = "/ratings", Open = true, Secured = false, RateLimit = 0 }, { Name = "/genesis-nodes", Open = true, Secured = false, RateLimit = 0 }, { Name = "/gas-configs", Open = true, Secured = false, RateLimit = 0 }, diff --git a/cmd/proxy/config/apiConfig/v_next.toml b/cmd/proxy/config/apiConfig/v_next.toml index 0ada0023..d38355ab 100644 --- a/cmd/proxy/config/apiConfig/v_next.toml +++ b/cmd/proxy/config/apiConfig/v_next.toml @@ -69,6 +69,7 @@ Routes = [ { Name = "/direct-staked-info", Open = true, Secured = true, RateLimit = 0 }, { Name = "/delegated-info", Open = true, Secured = true, RateLimit = 0 }, { Name = "/enable-epochs", Open = true, Secured = false, RateLimit = 0 }, + { Name = "/enable-epochs-v2", Open = true, Secured = false, RateLimit = 0 }, { Name = "/ratings", Open = true, Secured = false, RateLimit = 0 }, { Name = "/genesis-nodes", Open = true, Secured = false, RateLimit = 0 }, { Name = "/gas-configs", Open = true, Secured = false, RateLimit = 0 }, diff --git a/cmd/proxy/config/swagger/openapi.json b/cmd/proxy/config/swagger/openapi.json index 8c77f753..5b1e55d2 100644 --- a/cmd/proxy/config/swagger/openapi.json +++ b/cmd/proxy/config/swagger/openapi.json @@ -1071,6 +1071,26 @@ } } }, + "/network/enable-epochs-v2": { + "get": { + "tags": [ + "network" + ], + "summary": "returns the activation epochs metric", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericResponse" + } + } + } + } + } + } + }, "/network/ratings": { "get": { "tags": [ diff --git a/facade/baseFacade.go b/facade/baseFacade.go index 541e8eeb..b3fb63c8 100644 --- a/facade/baseFacade.go +++ b/facade/baseFacade.go @@ -345,6 +345,11 @@ func (pf *ProxyFacade) GetEnableEpochsMetrics() (*data.GenericAPIResponse, error return pf.nodeStatusProc.GetEnableEpochsMetrics() } +// GetEnableEpochsMetricsV2 retrieves the activation epochs +func (pf *ProxyFacade) GetEnableEpochsMetricsV2() (*data.GenericAPIResponse, error) { + return pf.nodeStatusProc.GetEnableEpochsMetricsV2() +} + // GetRatingsConfig retrieves the node's configuration's metrics func (pf *ProxyFacade) GetRatingsConfig() (*data.GenericAPIResponse, error) { return pf.nodeStatusProc.GetRatingsConfig() @@ -406,8 +411,8 @@ func (pf *ProxyFacade) ValidatorStatistics() (map[string]*data.ValidatorApiRespo } // AuctionList will return the auction list -func (epf *ProxyFacade) AuctionList() ([]*data.AuctionListValidatorAPIResponse, error) { - auctionList, err := epf.valStatsProc.GetAuctionList() +func (pf *ProxyFacade) AuctionList() ([]*data.AuctionListValidatorAPIResponse, error) { + auctionList, err := pf.valStatsProc.GetAuctionList() if err != nil { return nil, err } @@ -536,8 +541,8 @@ func (pf *ProxyFacade) GetInternalStartOfEpochValidatorsInfo(epoch uint32) (*dat } // GetWaitingEpochsLeftForPublicKey returns the number of epochs left for the public key until it becomes eligible -func (epf *ProxyFacade) GetWaitingEpochsLeftForPublicKey(publicKey string) (*data.WaitingEpochsLeftApiResponse, error) { - return epf.nodeGroupProc.GetWaitingEpochsLeftForPublicKey(publicKey) +func (pf *ProxyFacade) GetWaitingEpochsLeftForPublicKey(publicKey string) (*data.WaitingEpochsLeftApiResponse, error) { + return pf.nodeGroupProc.GetWaitingEpochsLeftForPublicKey(publicKey) } // IsDataTrieMigrated returns true if the data trie for the given address is migrated diff --git a/facade/interface.go b/facade/interface.go index 1048fa17..aaa712fc 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -92,6 +92,7 @@ type NodeStatusProcessor interface { GetLatestFullySynchronizedHyperblockNonce() (uint64, error) GetAllIssuedESDTs(tokenType string) (*data.GenericAPIResponse, error) GetEnableEpochsMetrics() (*data.GenericAPIResponse, error) + GetEnableEpochsMetricsV2() (*data.GenericAPIResponse, error) GetDirectStakedInfo() (*data.GenericAPIResponse, error) GetDelegatedInfo() (*data.GenericAPIResponse, error) GetRatingsConfig() (*data.GenericAPIResponse, error) diff --git a/facade/mock/nodeStatusProcessorStub.go b/facade/mock/nodeStatusProcessorStub.go index efe42914..991524e4 100644 --- a/facade/mock/nodeStatusProcessorStub.go +++ b/facade/mock/nodeStatusProcessorStub.go @@ -12,6 +12,7 @@ type NodeStatusProcessorStub struct { GetDirectStakedInfoCalled func() (*data.GenericAPIResponse, error) GetDelegatedInfoCalled func() (*data.GenericAPIResponse, error) GetEnableEpochsMetricsCalled func() (*data.GenericAPIResponse, error) + GetEnableEpochsMetricsV2Called func() (*data.GenericAPIResponse, error) GetRatingsConfigCalled func() (*data.GenericAPIResponse, error) GetGenesisNodesPubKeysCalled func() (*data.GenericAPIResponse, error) GetGasConfigsCalled func() (*data.GenericAPIResponse, error) @@ -91,6 +92,15 @@ func (stub *NodeStatusProcessorStub) GetEnableEpochsMetrics() (*data.GenericAPIR return &data.GenericAPIResponse{}, nil } +// GetEnableEpochsMetricsV2 - +func (stub *NodeStatusProcessorStub) GetEnableEpochsMetricsV2() (*data.GenericAPIResponse, error) { + if stub.GetEnableEpochsMetricsV2Called != nil { + return stub.GetEnableEpochsMetricsV2Called() + } + + return &data.GenericAPIResponse{}, nil +} + // GetRatingsConfig - func (stub *NodeStatusProcessorStub) GetRatingsConfig() (*data.GenericAPIResponse, error) { if stub.GetRatingsConfigCalled != nil { diff --git a/go.mod b/go.mod index d0c3a9e2..f82fa260 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,9 @@ require ( github.com/gin-contrib/pprof v1.4.0 github.com/gin-contrib/static v0.0.1 github.com/gin-gonic/gin v1.10.0 - github.com/multiversx/mx-chain-core-go v1.4.2-0.20251211081223-2b266c66a68a + github.com/multiversx/mx-chain-core-go v1.4.2-0.20260112082618-e36a88370557 github.com/multiversx/mx-chain-crypto-go v1.3.0 - github.com/multiversx/mx-chain-es-indexer-go v1.8.0 + github.com/multiversx/mx-chain-es-indexer-go v1.9.3-0.20260112102658-97d6a0ceb5f6 github.com/multiversx/mx-chain-logger-go v1.1.0 github.com/multiversx/mx-chain-storage-go v1.1.0 github.com/pkg/errors v0.9.1 @@ -49,11 +49,11 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect golang.org/x/arch v0.8.0 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.21.0 // indirect - google.golang.org/protobuf v1.36.3 // indirect + google.golang.org/protobuf v1.36.4 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 55252fc7..456bd0bd 100644 --- a/go.sum +++ b/go.sum @@ -132,12 +132,12 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiversx/mx-chain-core-go v1.4.2-0.20251211081223-2b266c66a68a h1:+MWgbbcL8RoBOweAP+EBMgFYKk6wCYi0Ob+3Flgwypw= -github.com/multiversx/mx-chain-core-go v1.4.2-0.20251211081223-2b266c66a68a/go.mod h1:IO+vspNan+gT0WOHnJ95uvWygiziHZvfXpff6KnxV7g= +github.com/multiversx/mx-chain-core-go v1.4.2-0.20260112082618-e36a88370557 h1:OKl4jmdUPjR9qlK8e5g8BMA9vM0rtr8i87WnfSn7gVA= +github.com/multiversx/mx-chain-core-go v1.4.2-0.20260112082618-e36a88370557/go.mod h1:IO+vspNan+gT0WOHnJ95uvWygiziHZvfXpff6KnxV7g= github.com/multiversx/mx-chain-crypto-go v1.3.0 h1:0eK2bkDOMi8VbSPrB1/vGJSYT81IBtfL4zw+C4sWe/k= github.com/multiversx/mx-chain-crypto-go v1.3.0/go.mod h1:nPIkxxzyTP8IquWKds+22Q2OJ9W7LtusC7cAosz7ojM= -github.com/multiversx/mx-chain-es-indexer-go v1.8.0 h1:VLN9V3yNxchyGub25yOIUoa3KOuxqxGfRuXIH5f24s8= -github.com/multiversx/mx-chain-es-indexer-go v1.8.0/go.mod h1:OLsBLRme3wL59qPRSJ2UG3xRU8QIR/JnbXHPEncR4dg= +github.com/multiversx/mx-chain-es-indexer-go v1.9.3-0.20260112102658-97d6a0ceb5f6 h1:ywYAthnCkytgSGfMBTBvojlBJh9o5zUmottZwaVYTd8= +github.com/multiversx/mx-chain-es-indexer-go v1.9.3-0.20260112102658-97d6a0ceb5f6/go.mod h1:F/BpaYVPuHN7POJN6gwvJfZ22diYtvz2576a+PWiPvw= github.com/multiversx/mx-chain-logger-go v1.1.0 h1:97x84A6L4RfCa6YOx1HpAFxZp1cf/WI0Qh112whgZNM= github.com/multiversx/mx-chain-logger-go v1.1.0/go.mod h1:K9XgiohLwOsNACETMNL0LItJMREuEvTH6NsoXWXWg7g= github.com/multiversx/mx-chain-storage-go v1.1.0 h1:M1Y9DqMrJ62s7Zw31+cyuqsnPIvlG4jLBJl5WzeZLe8= @@ -202,8 +202,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -215,8 +215,8 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -237,8 +237,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -264,8 +264,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/process/nodeStatusProcessor.go b/process/nodeStatusProcessor.go index 3ec70b33..b96d7128 100644 --- a/process/nodeStatusProcessor.go +++ b/process/nodeStatusProcessor.go @@ -47,6 +47,9 @@ const ( // EnableEpochsPath represents the path where an observer exposes all the activation epochs EnableEpochsPath = "/network/enable-epochs" + // EnableEpochsV2Path represents the path where an observer exposes all the activation epochs + EnableEpochsV2Path = "/network/enable-epochs-v2" + // MetricCrossCheckBlockHeight is the metric that stores cross block height MetricCrossCheckBlockHeight = "erd_cross_check_block_height" @@ -138,6 +141,15 @@ func (nsp *NodeStatusProcessor) GetNetworkConfigMetrics() (*data.GenericAPIRespo // GetEnableEpochsMetrics will simply forward the activation epochs config metrics from an observer func (nsp *NodeStatusProcessor) GetEnableEpochsMetrics() (*data.GenericAPIResponse, error) { + return nsp.getEnableEpochsMetrics(EnableEpochsPath) +} + +// GetEnableEpochsMetricsV2 will simply forward the activation epochs config metrics from an observer +func (nsp *NodeStatusProcessor) GetEnableEpochsMetricsV2() (*data.GenericAPIResponse, error) { + return nsp.getEnableEpochsMetrics(EnableEpochsV2Path) +} + +func (nsp *NodeStatusProcessor) getEnableEpochsMetrics(path string) (*data.GenericAPIResponse, error) { observers, err := nsp.proc.GetAllObservers(data.AvailabilityRecent) if err != nil { return nil, err @@ -146,7 +158,7 @@ func (nsp *NodeStatusProcessor) GetEnableEpochsMetrics() (*data.GenericAPIRespon responseEnableEpochsMetrics := data.GenericAPIResponse{} for _, observer := range observers { - _, err := nsp.proc.CallGetRestEndPoint(observer.Address, EnableEpochsPath, &responseEnableEpochsMetrics) + _, err := nsp.proc.CallGetRestEndPoint(observer.Address, path, &responseEnableEpochsMetrics) if err != nil { log.Error("enable epochs metrics request", "observer", observer.Address, "error", err.Error()) continue diff --git a/process/nodeStatusProcessor_test.go b/process/nodeStatusProcessor_test.go index c074c154..d4b67c8b 100644 --- a/process/nodeStatusProcessor_test.go +++ b/process/nodeStatusProcessor_test.go @@ -523,6 +523,43 @@ func TestNodeStatusProcessor_GetEnableEpochsMetricsShouldWork(t *testing.T) { require.Equal(t, expectedValue, actualValue) } +func TestNodeStatusProcessor_GetEnableEpochsMetricsV2ShouldWork(t *testing.T) { + t.Parallel() + + key := "SupernovaEnableEpoch" + expectedValue := float64(4) + nodesStatusProc, _ := NewNodeStatusProcessor(&mock.ProcessorStub{ + GetAllObserversCalled: func(dataAvailability data.ObserverDataAvailabilityType) ([]*data.NodeData, error) { + return []*data.NodeData{ + {Address: "addr1", ShardId: 0}, + }, nil + }, + CallGetRestEndPointCalled: func(address string, path string, value interface{}) (int, error) { + metricMap := map[string]interface{}{ + key: expectedValue, + } + genericResp := &data.GenericAPIResponse{Data: metricMap} + genericRespBytes, _ := json.Marshal(genericResp) + + return 0, json.Unmarshal(genericRespBytes, value) + }, + }, + &mock.GenericApiResponseCacherMock{}, + time.Nanosecond, + ) + + genericResponse, err := nodesStatusProc.GetEnableEpochsMetricsV2() + require.Nil(t, err) + require.NotNil(t, genericResponse) + + metricsMap, ok := genericResponse.Data.(map[string]interface{}) + require.True(t, ok) + + actualValue, ok := metricsMap[key] + require.True(t, ok) + require.Equal(t, expectedValue, actualValue) +} + func TestNodeStatusProcessor_GetEnableEpochsMetricsGetObserversShouldErr(t *testing.T) { t.Parallel()