From bf04cc720b5bdbe8f406cb455cba16b9b61706c3 Mon Sep 17 00:00:00 2001 From: Geoffrey Ragot Date: Fri, 31 Jan 2025 09:53:41 +0100 Subject: [PATCH] chore: add openapi tag to satisfy global sdk --- openapi/v2.yaml | 4 +- pkg/client/.speakeasy/gen.lock | 36 +-- pkg/client/.speakeasy/gen.yaml | 2 +- pkg/client/README.md | 43 ++- pkg/client/USAGE.md | 4 +- pkg/client/docs/sdks/ledger/README.md | 104 ------- pkg/client/docs/sdks/v2/README.md | 104 +++++++ pkg/client/formance.go | 4 +- pkg/client/ledger.go | 385 ------------------------- pkg/client/v2.go | 370 ++++++++++++++++++++++++ pkg/testserver/api.go | 2 +- test/e2e/app_lifecycle_test.go | 2 +- test/e2e/app_multiple_instance_test.go | 2 +- test/performance/benchmark_test.go | 2 +- 14 files changed, 523 insertions(+), 541 deletions(-) diff --git a/openapi/v2.yaml b/openapi/v2.yaml index ee11f4902..dd39bbba7 100644 --- a/openapi/v2.yaml +++ b/openapi/v2.yaml @@ -9,7 +9,7 @@ paths: /_/info: get: tags: - - ledger + - ledger.v2 summary: Show server information operationId: v2GetInfo x-speakeasy-name-override: GetInfo @@ -38,7 +38,7 @@ paths: /_/metrics: get: tags: - - ledger + - ledger.v2 summary: Read in memory metrics operationId: getMetrics x-speakeasy-name-override: GetMetrics diff --git a/pkg/client/.speakeasy/gen.lock b/pkg/client/.speakeasy/gen.lock index 2ceb89946..70d36209a 100644 --- a/pkg/client/.speakeasy/gen.lock +++ b/pkg/client/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: a9ac79e1-e429-4ee3-96c4-ec973f19bec3 management: - docChecksum: a75fbcee4705d8d6603062086b542987 + docChecksum: 66467c4916574601e600551d938bede8 docVersion: v1 speakeasyVersion: 1.351.0 generationVersion: 2.384.1 - releaseVersion: 0.5.1 - configChecksum: c054a60832022bfc610a27df523d0e92 + releaseVersion: 0.5.2 + configChecksum: cbb85382da20101bd1a7a4eb33420e1d features: go: additionalDependencies: 0.1.0 @@ -53,8 +53,6 @@ generatedFiles: - internal/utils/retries.go - internal/utils/security.go - internal/utils/utils.go - - /models/operations/v2getinfo.go - - /models/operations/getmetrics.go - /models/operations/getinfo.go - /models/operations/getledgerinfo.go - /models/operations/countaccounts.go @@ -75,6 +73,8 @@ generatedFiles: - /models/operations/getbalances.go - /models/operations/getbalancesaggregated.go - /models/operations/listlogs.go + - /models/operations/v2getinfo.go + - /models/operations/getmetrics.go - /models/operations/v2listledgers.go - /models/operations/v2getledger.go - /models/operations/v2createledger.go @@ -100,15 +100,11 @@ generatedFiles: - /models/operations/v2listlogs.go - /models/operations/v2importlogs.go - /models/operations/v2exportlogs.go - - /models/sdkerrors/v2errorresponse.go - - /models/sdkerrors/errorresponse.go - - /models/components/v2errorsenum.go - - /models/components/v2configinforesponse.go - - /models/components/httpmetadata.go - /models/components/configinforesponse.go - /models/components/configinfo.go - /models/components/config.go - /models/components/ledgerstorage.go + - /models/components/httpmetadata.go - /models/components/errorsenum.go - /models/components/ledgerinforesponse.go - /models/components/ledgerinfo.go @@ -137,6 +133,8 @@ generatedFiles: - /models/components/aggregatebalancesresponse.go - /models/components/logscursorresponse.go - /models/components/log.go + - /models/components/v2errorsenum.go + - /models/components/v2configinforesponse.go - /models/components/v2ledgerlistresponse.go - /models/components/v2ledger.go - /models/components/v2getledgerresponse.go @@ -172,8 +170,8 @@ generatedFiles: - /models/components/v2logscursorresponse.go - /models/components/v2log.go - /models/components/security.go - - docs/models/operations/v2getinforesponse.md - - docs/models/operations/getmetricsresponse.md + - /models/sdkerrors/errorresponse.go + - /models/sdkerrors/v2errorresponse.go - docs/models/operations/getinforesponse.md - docs/models/operations/getledgerinforequest.md - docs/models/operations/getledgerinforesponse.md @@ -214,6 +212,8 @@ generatedFiles: - docs/models/operations/getbalancesaggregatedresponse.md - docs/models/operations/listlogsrequest.md - docs/models/operations/listlogsresponse.md + - docs/models/operations/v2getinforesponse.md + - docs/models/operations/getmetricsresponse.md - docs/models/operations/v2listledgersrequest.md - docs/models/operations/v2listledgersresponse.md - docs/models/operations/v2getledgerrequest.md @@ -265,15 +265,11 @@ generatedFiles: - docs/models/operations/v2importlogsresponse.md - docs/models/operations/v2exportlogsrequest.md - docs/models/operations/v2exportlogsresponse.md - - docs/models/sdkerrors/v2errorresponse.md - - docs/models/sdkerrors/errorresponse.md - - docs/models/components/v2errorsenum.md - - docs/models/components/v2configinforesponse.md - - docs/models/components/httpmetadata.md - docs/models/components/configinforesponse.md - docs/models/components/configinfo.md - docs/models/components/config.md - docs/models/components/ledgerstorage.md + - docs/models/components/httpmetadata.md - docs/models/components/errorsenum.md - docs/models/components/ledgerinforesponse.md - docs/models/components/storage.md @@ -311,6 +307,8 @@ generatedFiles: - docs/models/components/logscursorresponse.md - docs/models/components/type.md - docs/models/components/log.md + - docs/models/components/v2errorsenum.md + - docs/models/components/v2configinforesponse.md - docs/models/components/v2ledgerlistresponsecursor.md - docs/models/components/v2ledgerlistresponse.md - docs/models/components/v2ledger.md @@ -363,9 +361,11 @@ generatedFiles: - docs/models/components/v2logtype.md - docs/models/components/v2log.md - docs/models/components/security.md + - docs/models/sdkerrors/errorresponse.md + - docs/models/sdkerrors/v2errorresponse.md - docs/sdks/formance/README.md - - docs/models/operations/option.md - docs/sdks/ledger/README.md + - docs/models/operations/option.md - docs/sdks/v1/README.md - docs/sdks/v2/README.md - USAGE.md diff --git a/pkg/client/.speakeasy/gen.yaml b/pkg/client/.speakeasy/gen.yaml index 584f2ddbd..a7e9cdf7e 100644 --- a/pkg/client/.speakeasy/gen.yaml +++ b/pkg/client/.speakeasy/gen.yaml @@ -15,7 +15,7 @@ generation: auth: oAuth2ClientCredentialsEnabled: true go: - version: 0.5.1 + version: 0.5.2 additionalDependencies: {} allowUnknownFieldsInWeakUnions: false clientServerStatusCodesAsErrors: true diff --git a/pkg/client/README.md b/pkg/client/README.md index 613553c69..3cf143167 100644 --- a/pkg/client/README.md +++ b/pkg/client/README.md @@ -69,11 +69,11 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) + res, err := s.Ledger.V1.GetInfo(ctx) if err != nil { log.Fatal(err) } - if res.V2ConfigInfoResponse != nil { + if res.ConfigInfoResponse != nil { // handle response } } @@ -84,11 +84,6 @@ func main() { ## Available Resources and Operations -### [Ledger](docs/sdks/ledger/README.md) - -* [GetInfo](docs/sdks/ledger/README.md#getinfo) - Show server information -* [GetMetrics](docs/sdks/ledger/README.md#getmetrics) - Read in memory metrics - ### [Ledger.V1](docs/sdks/v1/README.md) * [GetInfo](docs/sdks/v1/README.md#getinfo) - Show server information @@ -114,6 +109,8 @@ func main() { ### [Ledger.V2](docs/sdks/v2/README.md) +* [GetInfo](docs/sdks/v2/README.md#getinfo) - Show server information +* [GetMetrics](docs/sdks/v2/README.md#getmetrics) - Read in memory metrics * [ListLedgers](docs/sdks/v2/README.md#listledgers) - List ledgers * [GetLedger](docs/sdks/v2/README.md#getledger) - Get a ledger * [CreateLedger](docs/sdks/v2/README.md#createledger) - Create a ledger @@ -168,7 +165,7 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx, operations.WithRetries( + res, err := s.Ledger.V1.GetInfo(ctx, operations.WithRetries( retry.Config{ Strategy: "backoff", Backoff: &retry.BackoffStrategy{ @@ -182,7 +179,7 @@ func main() { if err != nil { log.Fatal(err) } - if res.V2ConfigInfoResponse != nil { + if res.ConfigInfoResponse != nil { // handle response } } @@ -221,11 +218,11 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) + res, err := s.Ledger.V1.GetInfo(ctx) if err != nil { log.Fatal(err) } - if res.V2ConfigInfoResponse != nil { + if res.ConfigInfoResponse != nil { // handle response } } @@ -238,10 +235,10 @@ func main() { Handling errors in this SDK should largely match your expectations. All operations return a response object or an error, they will never return both. When specified by the OpenAPI spec document, the SDK will return the appropriate subclass. -| Error Object | Status Code | Content Type | -| ------------------------- | ------------------------- | ------------------------- | -| sdkerrors.V2ErrorResponse | default | application/json | -| sdkerrors.SDKError | 4xx-5xx | */* | +| Error Object | Status Code | Content Type | +| ----------------------- | ----------------------- | ----------------------- | +| sdkerrors.ErrorResponse | default | application/json | +| sdkerrors.SDKError | 4xx-5xx | */* | ### Example @@ -266,10 +263,10 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) + res, err := s.Ledger.V1.GetInfo(ctx) if err != nil { - var e *sdkerrors.V2ErrorResponse + var e *sdkerrors.ErrorResponse if errors.As(err, &e) { // handle error log.Fatal(e.Error()) @@ -319,11 +316,11 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) + res, err := s.Ledger.V1.GetInfo(ctx) if err != nil { log.Fatal(err) } - if res.V2ConfigInfoResponse != nil { + if res.ConfigInfoResponse != nil { // handle response } } @@ -354,11 +351,11 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) + res, err := s.Ledger.V1.GetInfo(ctx) if err != nil { log.Fatal(err) } - if res.V2ConfigInfoResponse != nil { + if res.ConfigInfoResponse != nil { // handle response } } @@ -433,11 +430,11 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) + res, err := s.Ledger.V1.GetInfo(ctx) if err != nil { log.Fatal(err) } - if res.V2ConfigInfoResponse != nil { + if res.ConfigInfoResponse != nil { // handle response } } diff --git a/pkg/client/USAGE.md b/pkg/client/USAGE.md index 94310b284..63fd0f60f 100644 --- a/pkg/client/USAGE.md +++ b/pkg/client/USAGE.md @@ -18,11 +18,11 @@ func main() { ) ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) + res, err := s.Ledger.V1.GetInfo(ctx) if err != nil { log.Fatal(err) } - if res.V2ConfigInfoResponse != nil { + if res.ConfigInfoResponse != nil { // handle response } } diff --git a/pkg/client/docs/sdks/ledger/README.md b/pkg/client/docs/sdks/ledger/README.md index 4c46b7a04..9609c10c1 100644 --- a/pkg/client/docs/sdks/ledger/README.md +++ b/pkg/client/docs/sdks/ledger/README.md @@ -3,107 +3,3 @@ ### Available Operations -* [GetInfo](#getinfo) - Show server information -* [GetMetrics](#getmetrics) - Read in memory metrics - -## GetInfo - -Show server information - -### Example Usage - -```go -package main - -import( - "github.com/formancehq/ledger/pkg/client/models/components" - "github.com/formancehq/ledger/pkg/client" - "context" - "log" -) - -func main() { - s := client.New( - client.WithSecurity(components.Security{ - ClientID: "", - ClientSecret: "", - }), - ) - - ctx := context.Background() - res, err := s.Ledger.GetInfo(ctx) - if err != nil { - log.Fatal(err) - } - if res.V2ConfigInfoResponse != nil { - // handle response - } -} -``` - -### Parameters - -| Parameter | Type | Required | Description | -| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | -| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | - - -### Response - -**[*operations.V2GetInfoResponse](../../models/operations/v2getinforesponse.md), error** -| Error Object | Status Code | Content Type | -| ------------------------- | ------------------------- | ------------------------- | -| sdkerrors.V2ErrorResponse | default | application/json | -| sdkerrors.SDKError | 4xx-5xx | */* | - -## GetMetrics - -Read in memory metrics - -### Example Usage - -```go -package main - -import( - "github.com/formancehq/ledger/pkg/client/models/components" - "github.com/formancehq/ledger/pkg/client" - "context" - "log" -) - -func main() { - s := client.New( - client.WithSecurity(components.Security{ - ClientID: "", - ClientSecret: "", - }), - ) - - ctx := context.Background() - res, err := s.Ledger.GetMetrics(ctx) - if err != nil { - log.Fatal(err) - } - if res.Object != nil { - // handle response - } -} -``` - -### Parameters - -| Parameter | Type | Required | Description | -| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | -| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | - - -### Response - -**[*operations.GetMetricsResponse](../../models/operations/getmetricsresponse.md), error** -| Error Object | Status Code | Content Type | -| ------------------------- | ------------------------- | ------------------------- | -| sdkerrors.V2ErrorResponse | default | application/json | -| sdkerrors.SDKError | 4xx-5xx | */* | diff --git a/pkg/client/docs/sdks/v2/README.md b/pkg/client/docs/sdks/v2/README.md index 5791b00c1..2d5c78f73 100644 --- a/pkg/client/docs/sdks/v2/README.md +++ b/pkg/client/docs/sdks/v2/README.md @@ -3,6 +3,8 @@ ### Available Operations +* [GetInfo](#getinfo) - Show server information +* [GetMetrics](#getmetrics) - Read in memory metrics * [ListLedgers](#listledgers) - List ledgers * [GetLedger](#getledger) - Get a ledger * [CreateLedger](#createledger) - Create a ledger @@ -29,6 +31,108 @@ * [ImportLogs](#importlogs) * [ExportLogs](#exportlogs) - Export logs +## GetInfo + +Show server information + +### Example Usage + +```go +package main + +import( + "github.com/formancehq/ledger/pkg/client/models/components" + "github.com/formancehq/ledger/pkg/client" + "context" + "log" +) + +func main() { + s := client.New( + client.WithSecurity(components.Security{ + ClientID: "", + ClientSecret: "", + }), + ) + + ctx := context.Background() + res, err := s.Ledger.V2.GetInfo(ctx) + if err != nil { + log.Fatal(err) + } + if res.V2ConfigInfoResponse != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + + +### Response + +**[*operations.V2GetInfoResponse](../../models/operations/v2getinforesponse.md), error** +| Error Object | Status Code | Content Type | +| ------------------------- | ------------------------- | ------------------------- | +| sdkerrors.V2ErrorResponse | default | application/json | +| sdkerrors.SDKError | 4xx-5xx | */* | + +## GetMetrics + +Read in memory metrics + +### Example Usage + +```go +package main + +import( + "github.com/formancehq/ledger/pkg/client/models/components" + "github.com/formancehq/ledger/pkg/client" + "context" + "log" +) + +func main() { + s := client.New( + client.WithSecurity(components.Security{ + ClientID: "", + ClientSecret: "", + }), + ) + + ctx := context.Background() + res, err := s.Ledger.V2.GetMetrics(ctx) + if err != nil { + log.Fatal(err) + } + if res.Object != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + + +### Response + +**[*operations.GetMetricsResponse](../../models/operations/getmetricsresponse.md), error** +| Error Object | Status Code | Content Type | +| ------------------------- | ------------------------- | ------------------------- | +| sdkerrors.V2ErrorResponse | default | application/json | +| sdkerrors.SDKError | 4xx-5xx | */* | + ## ListLedgers List ledgers diff --git a/pkg/client/formance.go b/pkg/client/formance.go index 869df9420..f44e656df 100644 --- a/pkg/client/formance.go +++ b/pkg/client/formance.go @@ -143,9 +143,9 @@ func New(opts ...SDKOption) *Formance { sdkConfiguration: sdkConfiguration{ Language: "go", OpenAPIDocVersion: "v1", - SDKVersion: "0.5.1", + SDKVersion: "0.5.2", GenVersion: "2.384.1", - UserAgent: "speakeasy-sdk/go 0.5.1 2.384.1 v1 github.com/formancehq/ledger/pkg/client", + UserAgent: "speakeasy-sdk/go 0.5.2 2.384.1 v1 github.com/formancehq/ledger/pkg/client", Hooks: hooks.New(), }, } diff --git a/pkg/client/ledger.go b/pkg/client/ledger.go index a3af51ae0..25fcac408 100644 --- a/pkg/client/ledger.go +++ b/pkg/client/ledger.go @@ -2,21 +2,6 @@ package client -import ( - "bytes" - "context" - "fmt" - "github.com/cenkalti/backoff/v4" - "github.com/formancehq/ledger/pkg/client/internal/hooks" - "github.com/formancehq/ledger/pkg/client/internal/utils" - "github.com/formancehq/ledger/pkg/client/models/components" - "github.com/formancehq/ledger/pkg/client/models/operations" - "github.com/formancehq/ledger/pkg/client/models/sdkerrors" - "io" - "net/http" - "net/url" -) - type Ledger struct { V1 *V1 V2 *V2 @@ -31,373 +16,3 @@ func newLedger(sdkConfig sdkConfiguration) *Ledger { V2: newV2(sdkConfig), } } - -// GetInfo - Show server information -func (s *Ledger) GetInfo(ctx context.Context, opts ...operations.Option) (*operations.V2GetInfoResponse, error) { - hookCtx := hooks.HookContext{ - Context: ctx, - OperationID: "v2GetInfo", - OAuth2Scopes: []string{"ledger:read", "ledger:read"}, - SecuritySource: s.sdkConfiguration.Security, - } - - o := operations.Options{} - supportedOptions := []string{ - operations.SupportedOptionRetries, - operations.SupportedOptionTimeout, - } - - for _, opt := range opts { - if err := opt(&o, supportedOptions...); err != nil { - return nil, fmt.Errorf("error applying option: %w", err) - } - } - - baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - opURL, err := url.JoinPath(baseURL, "/_/info") - if err != nil { - return nil, fmt.Errorf("error generating URL: %w", err) - } - - timeout := o.Timeout - if timeout == nil { - timeout = s.sdkConfiguration.Timeout - } - - if timeout != nil { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, *timeout) - defer cancel() - } - - req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) - if err != nil { - return nil, fmt.Errorf("error creating request: %w", err) - } - req.Header.Set("Accept", "application/json") - req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) - - if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { - return nil, err - } - - globalRetryConfig := s.sdkConfiguration.RetryConfig - retryConfig := o.Retries - if retryConfig == nil { - if globalRetryConfig != nil { - retryConfig = globalRetryConfig - } - } - - var httpRes *http.Response - if retryConfig != nil { - httpRes, err = utils.Retry(ctx, utils.Retries{ - Config: retryConfig, - StatusCodes: []string{ - "429", - "500", - "502", - "503", - "504", - }, - }, func() (*http.Response, error) { - if req.Body != nil { - copyBody, err := req.GetBody() - if err != nil { - return nil, err - } - req.Body = copyBody - } - - req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) - if err != nil { - return nil, backoff.Permanent(err) - } - - httpRes, err := s.sdkConfiguration.Client.Do(req) - if err != nil || httpRes == nil { - if err != nil { - err = fmt.Errorf("error sending request: %w", err) - } else { - err = fmt.Errorf("error sending request: no response") - } - - _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) - } - return httpRes, err - }) - - if err != nil { - return nil, err - } else { - httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) - if err != nil { - return nil, err - } - } - } else { - req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) - if err != nil { - return nil, err - } - - httpRes, err = s.sdkConfiguration.Client.Do(req) - if err != nil || httpRes == nil { - if err != nil { - err = fmt.Errorf("error sending request: %w", err) - } else { - err = fmt.Errorf("error sending request: no response") - } - - _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) - return nil, err - } else if utils.MatchStatusCodes([]string{"default"}, httpRes.StatusCode) { - _httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) - if err != nil { - return nil, err - } else if _httpRes != nil { - httpRes = _httpRes - } - } else { - httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) - if err != nil { - return nil, err - } - } - } - - res := &operations.V2GetInfoResponse{ - HTTPMeta: components.HTTPMetadata{ - Request: req, - Response: httpRes, - }, - } - - rawBody, err := io.ReadAll(httpRes.Body) - if err != nil { - return nil, fmt.Errorf("error reading response body: %w", err) - } - httpRes.Body.Close() - httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - - switch { - case httpRes.StatusCode == 200: - switch { - case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): - var out components.V2ConfigInfoResponse - if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { - return nil, err - } - - res.V2ConfigInfoResponse = &out - default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) - } - case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: - switch { - case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): - var out sdkerrors.V2ErrorResponse - if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { - return nil, err - } - - res.V2ErrorResponse = &out - default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) - } - default: - switch { - case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): - var out sdkerrors.V2ErrorResponse - if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { - return nil, err - } - - return nil, &out - default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) - } - } - - return res, nil - -} - -// GetMetrics - Read in memory metrics -func (s *Ledger) GetMetrics(ctx context.Context, opts ...operations.Option) (*operations.GetMetricsResponse, error) { - hookCtx := hooks.HookContext{ - Context: ctx, - OperationID: "getMetrics", - OAuth2Scopes: []string{"ledger:read", "ledger:read"}, - SecuritySource: s.sdkConfiguration.Security, - } - - o := operations.Options{} - supportedOptions := []string{ - operations.SupportedOptionRetries, - operations.SupportedOptionTimeout, - } - - for _, opt := range opts { - if err := opt(&o, supportedOptions...); err != nil { - return nil, fmt.Errorf("error applying option: %w", err) - } - } - - baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - opURL, err := url.JoinPath(baseURL, "/_/metrics") - if err != nil { - return nil, fmt.Errorf("error generating URL: %w", err) - } - - timeout := o.Timeout - if timeout == nil { - timeout = s.sdkConfiguration.Timeout - } - - if timeout != nil { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, *timeout) - defer cancel() - } - - req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) - if err != nil { - return nil, fmt.Errorf("error creating request: %w", err) - } - req.Header.Set("Accept", "application/json") - req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) - - if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { - return nil, err - } - - globalRetryConfig := s.sdkConfiguration.RetryConfig - retryConfig := o.Retries - if retryConfig == nil { - if globalRetryConfig != nil { - retryConfig = globalRetryConfig - } - } - - var httpRes *http.Response - if retryConfig != nil { - httpRes, err = utils.Retry(ctx, utils.Retries{ - Config: retryConfig, - StatusCodes: []string{ - "429", - "500", - "502", - "503", - "504", - }, - }, func() (*http.Response, error) { - if req.Body != nil { - copyBody, err := req.GetBody() - if err != nil { - return nil, err - } - req.Body = copyBody - } - - req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) - if err != nil { - return nil, backoff.Permanent(err) - } - - httpRes, err := s.sdkConfiguration.Client.Do(req) - if err != nil || httpRes == nil { - if err != nil { - err = fmt.Errorf("error sending request: %w", err) - } else { - err = fmt.Errorf("error sending request: no response") - } - - _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) - } - return httpRes, err - }) - - if err != nil { - return nil, err - } else { - httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) - if err != nil { - return nil, err - } - } - } else { - req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) - if err != nil { - return nil, err - } - - httpRes, err = s.sdkConfiguration.Client.Do(req) - if err != nil || httpRes == nil { - if err != nil { - err = fmt.Errorf("error sending request: %w", err) - } else { - err = fmt.Errorf("error sending request: no response") - } - - _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) - return nil, err - } else if utils.MatchStatusCodes([]string{"default"}, httpRes.StatusCode) { - _httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) - if err != nil { - return nil, err - } else if _httpRes != nil { - httpRes = _httpRes - } - } else { - httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) - if err != nil { - return nil, err - } - } - } - - res := &operations.GetMetricsResponse{ - HTTPMeta: components.HTTPMetadata{ - Request: req, - Response: httpRes, - }, - } - - rawBody, err := io.ReadAll(httpRes.Body) - if err != nil { - return nil, fmt.Errorf("error reading response body: %w", err) - } - httpRes.Body.Close() - httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - - switch { - case httpRes.StatusCode == 200: - switch { - case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): - var out map[string]any - if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { - return nil, err - } - - res.Object = out - default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) - } - default: - switch { - case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): - var out sdkerrors.V2ErrorResponse - if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { - return nil, err - } - - return nil, &out - default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) - } - } - - return res, nil - -} diff --git a/pkg/client/v2.go b/pkg/client/v2.go index 4d978414e..19c5fcabb 100644 --- a/pkg/client/v2.go +++ b/pkg/client/v2.go @@ -27,6 +27,376 @@ func newV2(sdkConfig sdkConfiguration) *V2 { } } +// GetInfo - Show server information +func (s *V2) GetInfo(ctx context.Context, opts ...operations.Option) (*operations.V2GetInfoResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "v2GetInfo", + OAuth2Scopes: []string{"ledger:read", "ledger:read"}, + SecuritySource: s.sdkConfiguration.Security, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) + opURL, err := url.JoinPath(baseURL, "/_/info") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"default"}, httpRes.StatusCode) { + _httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.V2GetInfoResponse{ + HTTPMeta: components.HTTPMetadata{ + Request: req, + Response: httpRes, + }, + } + + rawBody, err := io.ReadAll(httpRes.Body) + if err != nil { + return nil, fmt.Errorf("error reading response body: %w", err) + } + httpRes.Body.Close() + httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) + + switch { + case httpRes.StatusCode == 200: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + var out components.V2ConfigInfoResponse + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.V2ConfigInfoResponse = &out + default: + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + var out sdkerrors.V2ErrorResponse + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.V2ErrorResponse = &out + default: + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + default: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + var out sdkerrors.V2ErrorResponse + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + return nil, &out + default: + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + } + + return res, nil + +} + +// GetMetrics - Read in memory metrics +func (s *V2) GetMetrics(ctx context.Context, opts ...operations.Option) (*operations.GetMetricsResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "getMetrics", + OAuth2Scopes: []string{"ledger:read", "ledger:read"}, + SecuritySource: s.sdkConfiguration.Security, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) + opURL, err := url.JoinPath(baseURL, "/_/metrics") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"default"}, httpRes.StatusCode) { + _httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.GetMetricsResponse{ + HTTPMeta: components.HTTPMetadata{ + Request: req, + Response: httpRes, + }, + } + + rawBody, err := io.ReadAll(httpRes.Body) + if err != nil { + return nil, fmt.Errorf("error reading response body: %w", err) + } + httpRes.Body.Close() + httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) + + switch { + case httpRes.StatusCode == 200: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + var out map[string]any + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.Object = out + default: + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + default: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + var out sdkerrors.V2ErrorResponse + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + return nil, &out + default: + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + } + + return res, nil + +} + // ListLedgers - List ledgers func (s *V2) ListLedgers(ctx context.Context, request operations.V2ListLedgersRequest, opts ...operations.Option) (*operations.V2ListLedgersResponse, error) { hookCtx := hooks.HookContext{ diff --git a/pkg/testserver/api.go b/pkg/testserver/api.go index 935f33df3..38d989e50 100644 --- a/pkg/testserver/api.go +++ b/pkg/testserver/api.go @@ -27,7 +27,7 @@ func GetLedger(ctx context.Context, srv *Server, request operations.V2GetLedgerR } func GetInfo(ctx context.Context, srv *Server) (*operations.V2GetInfoResponse, error) { - return srv.Client().Ledger.GetInfo(ctx) + return srv.Client().Ledger.V2.GetInfo(ctx) } func GetLedgerInfo(ctx context.Context, srv *Server, request operations.V2GetLedgerInfoRequest) (*operations.V2GetLedgerInfoResponse, error) { diff --git a/test/e2e/app_lifecycle_test.go b/test/e2e/app_lifecycle_test.go index fda433f31..7940525c3 100644 --- a/test/e2e/app_lifecycle_test.go +++ b/test/e2e/app_lifecycle_test.go @@ -49,7 +49,7 @@ var _ = Context("Ledger application lifecycle tests", func() { When("starting the service", func() { It("should be ok", func() { - info, err := testServer.GetValue().Client().Ledger.GetInfo(ctx) + info, err := testServer.GetValue().Client().Ledger.V2.GetInfo(ctx) Expect(err).NotTo(HaveOccurred()) Expect(info.V2ConfigInfoResponse.Version).To(Equal("develop")) }) diff --git a/test/e2e/app_multiple_instance_test.go b/test/e2e/app_multiple_instance_test.go index 25f19bf3d..99e198a64 100644 --- a/test/e2e/app_multiple_instance_test.go +++ b/test/e2e/app_multiple_instance_test.go @@ -50,7 +50,7 @@ var _ = Context("Ledger application multiple instance tests", func() { It("each service should be up and running", func() { for server := range servers { - info, err := server.Client().Ledger.GetInfo(ctx) + info, err := server.Client().Ledger.V2.GetInfo(ctx) Expect(err).NotTo(HaveOccurred()) Expect(info.V2ConfigInfoResponse.Version).To(Equal("develop")) } diff --git a/test/performance/benchmark_test.go b/test/performance/benchmark_test.go index 55df38f2c..f447338f9 100644 --- a/test/performance/benchmark_test.go +++ b/test/performance/benchmark_test.go @@ -117,7 +117,7 @@ func (benchmark *Benchmark) Run(ctx context.Context) map[string][]Result { report.End = time.Now() // Fetch otel metrics - metrics, err := env.Client().Ledger.GetMetrics(ctx) + metrics, err := env.Client().Ledger.V2.GetMetrics(ctx) if err != nil { b.Logf("Unable to fetch ledger metrics: %s", err) } else {