Skip to content

Commit 3e04f6a

Browse files
authored
feat: secrets manager interface (#75)
1 parent 74acabd commit 3e04f6a

File tree

11 files changed

+2524
-45
lines changed

11 files changed

+2524
-45
lines changed

agent/agent.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/netboxlabs/orb-agent/agent/config"
1616
"github.com/netboxlabs/orb-agent/agent/configmgr"
1717
"github.com/netboxlabs/orb-agent/agent/policymgr"
18+
"github.com/netboxlabs/orb-agent/agent/secretsmgr"
1819
"github.com/netboxlabs/orb-agent/agent/version"
1920
)
2021

@@ -49,8 +50,9 @@ type orbAgent struct {
4950
// AgentGroup channels sent from core
5051
groupsInfos map[string]groupInfo
5152

52-
policyManager policymgr.PolicyManager
53-
configManager configmgr.Manager
53+
policyManager policymgr.PolicyManager
54+
configManager configmgr.Manager
55+
secretsManager secretsmgr.Manager
5456
}
5557

5658
type groupInfo struct {
@@ -71,9 +73,15 @@ func New(logger *zap.Logger, c config.Config) (Agent, error) {
7173
logger.Error("policy manager failed to get repository", zap.Error(err))
7274
return nil, err
7375
}
74-
cm := configmgr.New(logger, pm, c.OrbAgent.ConfigManager)
7576

76-
return &orbAgent{logger: logger, config: c, policyManager: pm, configManager: cm, groupsInfos: make(map[string]groupInfo)}, nil
77+
sm := secretsmgr.New(logger, c.OrbAgent.SecretsManger)
78+
79+
cm := configmgr.New(logger, pm, sm, c.OrbAgent.ConfigManager)
80+
81+
return &orbAgent{
82+
logger: logger, config: c, policyManager: pm, configManager: cm,
83+
secretsManager: sm, groupsInfos: make(map[string]groupInfo),
84+
}, nil
7785
}
7886

7987
func (a *orbAgent) startBackends(agentCtx context.Context) error {
@@ -143,6 +151,11 @@ func (a *orbAgent) Start(ctx context.Context, cancelFunc context.CancelFunc) err
143151
a.cancelFunction = cancelFunc
144152
a.logger.Info("agent started", zap.String("version", version.GetBuildVersion()), zap.Any("routine", agentCtx.Value(routineKey)))
145153

154+
if err := a.secretsManager.Start(ctx); err != nil {
155+
a.logger.Error("error during start secrets manager", zap.Error(err))
156+
return err
157+
}
158+
146159
if err := a.startBackends(ctx); err != nil {
147160
return err
148161
}

agent/config/types.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,37 @@ type GitManager struct {
3232
PrivateKey string `mapstructure:"private_key"`
3333
}
3434

35-
// ManagerSources represents the configuration for manager sources, including cloud, local and git.
36-
type ManagerSources struct {
35+
// Sources represents the configuration for manager sources, including cloud, local and git.
36+
type Sources struct {
3737
Local LocalManager `mapstructure:"local"`
3838
Git GitManager `mapstructure:"git"`
3939
}
4040

4141
// ManagerConfig represents the configuration for the Config Manager
4242
type ManagerConfig struct {
43+
Active string `mapstructure:"active"`
44+
Sources Sources `mapstructure:"sources"`
45+
}
46+
47+
// VaultManager represents the configuration for the Vault manager
48+
type VaultManager struct {
49+
Auth string `yaml:"auth"`
50+
AuthArgs map[string]any `mapstructure:"auth_args"`
51+
Address string `yaml:"address"`
52+
Namespace string `yaml:"namespace"`
53+
Timeout *int `yaml:"timeout,omitempty"`
54+
Schedule *string `yaml:"schedule,omitempty"`
55+
}
56+
57+
// SecretsSources represents the configuration for manager sources, including vault.
58+
type SecretsSources struct {
59+
Vault VaultManager `mapstructure:"vault"`
60+
}
61+
62+
// ManagerSecrets represents the configuration for the Secrets Manager
63+
type ManagerSecrets struct {
4364
Active string `mapstructure:"active"`
44-
Sources ManagerSources `mapstructure:"sources"`
65+
Sources SecretsSources `mapstructure:"sources"`
4566
}
4667

4768
// BackendCommons represents common configuration for backends
@@ -64,6 +85,7 @@ type OrbAgent struct {
6485
Policies map[string]map[string]any `mapstructure:"policies"`
6586
Labels map[string]string `mapstructure:"labels"`
6687
ConfigManager ManagerConfig `mapstructure:"config_manager"`
88+
SecretsManger ManagerSecrets `mapstructure:"secrets_manager"`
6789
Debug struct {
6890
Enable bool `mapstructure:"enable"`
6991
} `mapstructure:"debug"`

agent/configmgr/git.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ import (
2424
"github.com/netboxlabs/orb-agent/agent/backend"
2525
"github.com/netboxlabs/orb-agent/agent/config"
2626
"github.com/netboxlabs/orb-agent/agent/policymgr"
27+
"github.com/netboxlabs/orb-agent/agent/secretsmgr"
2728
)
2829

2930
var _ Manager = (*gitConfigManager)(nil)
3031

3132
type gitConfigManager struct {
3233
logger *zap.Logger
3334
pMgr policymgr.PolicyManager
35+
sMgr secretsmgr.Manager
3436
config config.GitManager
3537
scheduler gocron.Scheduler
3638
repo *gitv5.Repository
@@ -157,6 +159,11 @@ func (gc *gitConfigManager) applyPolicies(policies policyData, backends map[stri
157159
Version: gc.version,
158160
Data: data,
159161
}
162+
var err error
163+
payload, err = gc.sMgr.SolveSecrets(payload)
164+
if err != nil {
165+
return err
166+
}
160167
gc.pMgr.ManagePolicy(payload)
161168
}
162169
}

agent/configmgr/local.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import (
1010
"github.com/netboxlabs/orb-agent/agent/backend"
1111
"github.com/netboxlabs/orb-agent/agent/config"
1212
"github.com/netboxlabs/orb-agent/agent/policymgr"
13+
"github.com/netboxlabs/orb-agent/agent/secretsmgr"
1314
)
1415

1516
var _ Manager = (*localConfigManager)(nil)
1617

1718
type localConfigManager struct {
1819
logger *zap.Logger
1920
pMgr policymgr.PolicyManager
21+
sMgr secretsmgr.Manager
2022
config config.LocalManager
2123
}
2224

@@ -37,6 +39,11 @@ func (lc *localConfigManager) Start(cfg config.Config, backends map[string]backe
3739
ID: policyID, Action: "manage",
3840
Name: pName, DatasetID: id, Backend: beName, Version: 1, Data: data,
3941
}
42+
var err error
43+
payload, err = lc.sMgr.SolveSecrets(payload)
44+
if err != nil {
45+
return err
46+
}
4047
lc.pMgr.ManagePolicy(payload)
4148
}
4249

agent/configmgr/manager.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/netboxlabs/orb-agent/agent/backend"
99
"github.com/netboxlabs/orb-agent/agent/config"
1010
"github.com/netboxlabs/orb-agent/agent/policymgr"
11+
"github.com/netboxlabs/orb-agent/agent/secretsmgr"
1112
)
1213

1314
// Manager is the interface for configuration manager
@@ -17,13 +18,13 @@ type Manager interface {
1718
}
1819

1920
// New creates a new instance of ConfigManager based on the configuration
20-
func New(logger *zap.Logger, mgr policymgr.PolicyManager, c config.ManagerConfig) Manager {
21+
func New(logger *zap.Logger, pMgr policymgr.PolicyManager, sMgr secretsmgr.Manager, c config.ManagerConfig) Manager {
2122
switch c.Active {
2223
case "local":
23-
return &localConfigManager{logger: logger, pMgr: mgr, config: c.Sources.Local}
24+
return &localConfigManager{logger: logger, pMgr: pMgr, sMgr: sMgr, config: c.Sources.Local}
2425
case "git":
25-
return &gitConfigManager{logger: logger, pMgr: mgr, config: c.Sources.Git}
26+
return &gitConfigManager{logger: logger, pMgr: pMgr, sMgr: sMgr, config: c.Sources.Git}
2627
default:
27-
return &localConfigManager{logger: logger, pMgr: mgr, config: c.Sources.Local}
28+
return &localConfigManager{logger: logger, pMgr: pMgr, sMgr: sMgr, config: c.Sources.Local}
2829
}
2930
}

agent/secretsmgr/manager.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package secretsmgr
2+
3+
import (
4+
"context"
5+
6+
"go.uber.org/zap"
7+
8+
"github.com/netboxlabs/orb-agent/agent/config"
9+
)
10+
11+
// Manager is an interface for managing secrets
12+
type Manager interface {
13+
Start(ctx context.Context) error
14+
RegisterUpdateCallback(callback func([]string))
15+
SolveSecrets(payload config.PolicyPayload) (config.PolicyPayload, error)
16+
}
17+
18+
// New creates a new instance of ConfigManager based on the configuration
19+
func New(logger *zap.Logger, c config.ManagerSecrets) Manager {
20+
switch c.Active {
21+
case "vault":
22+
return &vaultManager{logger: logger, config: c.Sources.Vault}
23+
default:
24+
return &dummyManager{}
25+
}
26+
}
27+
28+
var _ Manager = (*dummyManager)(nil)
29+
30+
type dummyManager struct{}
31+
32+
func (v *dummyManager) Start(_ context.Context) error {
33+
return nil
34+
}
35+
36+
func (v *dummyManager) RegisterUpdateCallback(_ func([]string)) {
37+
}
38+
39+
func (v *dummyManager) SolveSecrets(payload config.PolicyPayload) (config.PolicyPayload, error) {
40+
return payload, nil
41+
}

0 commit comments

Comments
 (0)