@@ -27,6 +27,7 @@ import (
27
27
"github.com/nuts-foundation/nuts-node/crypto/storage/azure"
28
28
"github.com/nuts-foundation/nuts-node/storage"
29
29
"github.com/nuts-foundation/nuts-node/storage/orm"
30
+ "github.com/prometheus/client_golang/prometheus"
30
31
"gorm.io/gorm"
31
32
"path"
32
33
"time"
@@ -65,6 +66,7 @@ func DefaultCryptoConfig() Config {
65
66
}
66
67
67
68
var _ KeyStore = (* Crypto )(nil )
69
+ var _ core.Runnable = (* Crypto )(nil )
68
70
69
71
// Crypto holds references to storage and needed config
70
72
type Crypto struct {
@@ -74,6 +76,22 @@ type Crypto struct {
74
76
storage storage.Engine
75
77
}
76
78
79
+ func (client * Crypto ) Start () error {
80
+ for _ , collector := range client .backend .(* spi.PrometheusWrapper ).Collectors () {
81
+ if err := prometheus .Register (collector ); err != nil {
82
+ return fmt .Errorf ("register metric: %w" , err )
83
+ }
84
+ }
85
+ return nil
86
+ }
87
+
88
+ func (client * Crypto ) Shutdown () error {
89
+ for _ , collector := range client .backend .(* spi.PrometheusWrapper ).Collectors () {
90
+ _ = prometheus .Unregister (collector )
91
+ }
92
+ return nil
93
+ }
94
+
77
95
func (client * Crypto ) CheckHealth () map [string ]core.Health {
78
96
return client .backend .CheckHealth ()
79
97
}
@@ -94,49 +112,28 @@ func (client *Crypto) Config() interface{} {
94
112
return & client .config
95
113
}
96
114
97
- func (client * Crypto ) setupFSBackend (config core.ServerConfig ) error {
115
+ func (client * Crypto ) setupFSBackend (config core.ServerConfig ) (spi. Storage , error ) {
98
116
log .Logger ().Info ("Setting up FileSystem backend for storage of private key material. " +
99
117
"Discouraged for production use unless backups and encryption is properly set up. Consider using the Hashicorp Vault backend." )
100
118
fsPath := path .Join (config .Datadir , "crypto" )
101
- fsBackend , err := fs .NewFileSystemBackend (fsPath )
102
- if err != nil {
103
- return err
104
- }
105
- client .backend = spi .NewValidatedKIDBackendWrapper (fsBackend , spi .KidPattern )
106
- return nil
119
+ return fs .NewFileSystemBackend (fsPath )
107
120
}
108
121
109
- func (client * Crypto ) setupStorageAPIBackend () error {
122
+ func (client * Crypto ) setupStorageAPIBackend () (spi. Storage , error ) {
110
123
log .Logger ().Debug ("Setting up StorageAPI backend for storage of private key material." )
111
124
log .Logger ().Warn ("External key storage backend is deprecated and will be removed in the future." )
112
- apiBackend , err := external .NewAPIClient (client .config .External )
113
- if err != nil {
114
- return fmt .Errorf ("unable to set up external crypto API client: %w" , err )
115
- }
116
- client .backend = spi .NewValidatedKIDBackendWrapper (apiBackend , spi .KidPattern )
117
- return nil
125
+ return external .NewAPIClient (client .config .External )
118
126
}
119
127
120
- func (client * Crypto ) setupVaultBackend (_ core.ServerConfig ) error {
128
+ func (client * Crypto ) setupVaultBackend (_ core.ServerConfig ) (spi. Storage , error ) {
121
129
log .Logger ().Debug ("Setting up Vault backend for storage of private key material. " +
122
130
"This feature is experimental and may change in the future." )
123
- vaultBackend , err := vault .NewVaultKVStorage (client .config .Vault )
124
- if err != nil {
125
- return err
126
- }
127
-
128
- client .backend = spi .NewValidatedKIDBackendWrapper (vaultBackend , spi .KidPattern )
129
- return nil
131
+ return vault .NewVaultKVStorage (client .config .Vault )
130
132
}
131
133
132
- func (client * Crypto ) setupAzureKeyVaultBackend (_ core.ServerConfig ) error {
134
+ func (client * Crypto ) setupAzureKeyVaultBackend (_ core.ServerConfig ) (spi. Storage , error ) {
133
135
log .Logger ().Debug ("Setting up Azure Key Vault backend for storage of private key material." )
134
- azureBackend , err := azure .New (client .config .AzureKeyVault )
135
- if err != nil {
136
- return err
137
- }
138
- client .backend = spi .NewValidatedKIDBackendWrapper (azureBackend , spi .KidPattern )
139
- return nil
136
+ return azure .New (client .config .AzureKeyVault )
140
137
}
141
138
142
139
// List returns the KIDs of the private keys that are present in the key store.
@@ -163,24 +160,33 @@ func (client *Crypto) List(ctx context.Context) []string {
163
160
func (client * Crypto ) Configure (config core.ServerConfig ) error {
164
161
client .db = client .storage .GetSQLDatabase ()
165
162
163
+ var backend spi.Storage
164
+ var err error
166
165
switch client .config .Storage {
167
166
case fs .StorageType :
168
- return client .setupFSBackend (config )
167
+ backend , err = client .setupFSBackend (config )
169
168
case vault .StorageType :
170
- return client .setupVaultBackend (config )
169
+ backend , err = client .setupVaultBackend (config )
171
170
case azure .StorageType :
172
- return client .setupAzureKeyVaultBackend (config )
171
+ backend , err = client .setupAzureKeyVaultBackend (config )
173
172
case external .StorageType :
174
- return client .setupStorageAPIBackend ()
173
+ backend , err = client .setupStorageAPIBackend ()
175
174
case "" :
176
175
if config .Strictmode {
177
176
return errors .New ("backend must be explicitly set in strict mode" )
178
177
}
179
178
// default to file system and run this setup again
180
- return client .setupFSBackend (config )
179
+ backend , err = client .setupFSBackend (config )
181
180
default :
182
181
return fmt .Errorf ("invalid config for crypto.storage. Available options are: vaultkv, fs, %s(experimental)" , external .StorageType )
183
182
}
183
+ if err != nil {
184
+ return fmt .Errorf ("could not setup crypto backend (type=%s): %w" , client .config .Storage , err )
185
+ }
186
+
187
+ metricsWrapper := spi .NewPrometheusWrapper (spi .NewValidatedKIDBackendWrapper (backend , spi .KidPattern ))
188
+ client .backend = metricsWrapper
189
+ return nil
184
190
}
185
191
186
192
func (client * Crypto ) Migrate () error {
0 commit comments