Issue 556 - add: Add retry configuration support to dediregistry plugin

This commit is contained in:
ameersohel45
2025-11-26 11:56:17 +05:30
parent 1056ca4e9a
commit 1efb6f5bb9
4 changed files with 79 additions and 4 deletions

View File

@@ -392,7 +392,34 @@ registry:
--- ---
#### 2. Key Manager Plugin #### 2. Dediregistry Plugin
**Purpose**: Lookup participant information from a Decentralized Discovery (DeDi) registry.
**Configuration**:
```yaml
registry:
id: dediregistry
config:
url: "https://dedi-wrapper.example.com/dedi"
registryName: "subscribers.beckn.one"
timeout: 30
retry_max: 3
retry_wait_min: 1s
retry_wait_max: 5s
```
**Parameters**:
- `url`: DeDi wrapper API base URL (Required)
- `registryName`: Name of the registry (Required)
- `timeout`: Request timeout in seconds (Optional, default: client default)
- `retry_max`: Maximum number of retry attempts (Optional, default: 4)
- `retry_wait_min`: Minimum wait time between retries in duration format (Optional, default: 1s)
- `retry_wait_max`: Maximum wait time between retries in duration format (Optional, default: 30s)
---
#### 3. Key Manager Plugin
**Purpose**: Manage cryptographic keys for signing and verification. **Purpose**: Manage cryptographic keys for signing and verification.

View File

@@ -19,6 +19,9 @@ registry:
url: "https://dedi-wrapper.example.com/dedi" url: "https://dedi-wrapper.example.com/dedi"
registryName: "subscribers.beckn.one" registryName: "subscribers.beckn.one"
timeout: 30 timeout: 30
retry_max: 3
retry_wait_min: 1s
retry_wait_max: 5s
``` ```
### Configuration Parameters ### Configuration Parameters
@@ -28,6 +31,9 @@ registry:
| `url` | Yes | DeDi wrapper API base URL (include /dedi path) | - | | `url` | Yes | DeDi wrapper API base URL (include /dedi path) | - |
| `registryName` | Yes | Registry name for lookup path | - | | `registryName` | Yes | Registry name for lookup path | - |
| `timeout` | No | Request timeout in seconds | Client default | | `timeout` | No | Request timeout in seconds | Client default |
| `retry_max` | No | Maximum number of retry attempts | 4 (library default) |
| `retry_wait_min` | No | Minimum wait time between retries (e.g., "1s", "500ms") | 1s (library default) |
| `retry_wait_max` | No | Maximum wait time between retries (e.g., "5s") | 30s (library default) |
## API Integration ## API Integration
@@ -88,6 +94,9 @@ modules:
url: "https://dedi-wrapper.example.com/dedi" url: "https://dedi-wrapper.example.com/dedi"
registryName: "subscribers.beckn.one" registryName: "subscribers.beckn.one"
timeout: 30 timeout: 30
retry_max: 3
retry_wait_min: 1s
retry_wait_max: 5s
steps: steps:
- validateSign # Required for registry lookup - validateSign # Required for registry lookup
- addRoute - addRoute

View File

@@ -15,9 +15,12 @@ import (
// Config holds configuration parameters for the DeDi registry client. // Config holds configuration parameters for the DeDi registry client.
type Config struct { type Config struct {
URL string `yaml:"url" json:"url"` URL string `yaml:"url" json:"url"`
RegistryName string `yaml:"registryName" json:"registryName"` RegistryName string `yaml:"registryName" json:"registryName"`
Timeout int `yaml:"timeout" json:"timeout"` Timeout int `yaml:"timeout" json:"timeout"`
RetryMax int `yaml:"retry_max" json:"retry_max"`
RetryWaitMin time.Duration `yaml:"retry_wait_min" json:"retry_wait_min"`
RetryWaitMax time.Duration `yaml:"retry_wait_max" json:"retry_wait_max"`
} }
// DeDiRegistryClient encapsulates the logic for calling the DeDi registry endpoints. // DeDiRegistryClient encapsulates the logic for calling the DeDi registry endpoints.
@@ -55,6 +58,17 @@ func New(ctx context.Context, cfg *Config) (*DeDiRegistryClient, func() error, e
retryClient.HTTPClient.Timeout = time.Duration(cfg.Timeout) * time.Second retryClient.HTTPClient.Timeout = time.Duration(cfg.Timeout) * time.Second
} }
// Configure retry settings if provided
if cfg.RetryMax > 0 {
retryClient.RetryMax = cfg.RetryMax
}
if cfg.RetryWaitMin > 0 {
retryClient.RetryWaitMin = cfg.RetryWaitMin
}
if cfg.RetryWaitMax > 0 {
retryClient.RetryWaitMax = cfg.RetryWaitMax
}
client := &DeDiRegistryClient{ client := &DeDiRegistryClient{
config: cfg, config: cfg,
client: retryClient, client: retryClient,

View File

@@ -6,6 +6,7 @@ import (
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
"time"
"github.com/beckn-one/beckn-onix/pkg/model" "github.com/beckn-one/beckn-onix/pkg/model"
) )
@@ -84,6 +85,30 @@ func TestNew(t *testing.T) {
if err := closer(); err != nil { if err := closer(); err != nil {
t.Errorf("closer() error = %v", err) t.Errorf("closer() error = %v", err)
} }
t.Run("should apply custom retry settings", func(t *testing.T) {
cfg := &Config{
URL: "http://test.com",
RegistryName: "subscribers.beckn.one",
RetryMax: 10,
RetryWaitMin: 100 * time.Millisecond,
RetryWaitMax: 1 * time.Second,
}
client, _, err := New(ctx, cfg)
if err != nil {
t.Fatalf("expected no error, but got: %v", err)
}
if client.client.RetryMax != cfg.RetryMax {
t.Errorf("expected RetryMax to be %d, but got %d", cfg.RetryMax, client.client.RetryMax)
}
if client.client.RetryWaitMin != cfg.RetryWaitMin {
t.Errorf("expected RetryWaitMin to be %v, but got %v", cfg.RetryWaitMin, client.client.RetryWaitMin)
}
if client.client.RetryWaitMax != cfg.RetryWaitMax {
t.Errorf("expected RetryWaitMax to be %v, but got %v", cfg.RetryWaitMax, client.client.RetryWaitMax)
}
})
} }
func TestLookup(t *testing.T) { func TestLookup(t *testing.T) {