@@ -8,16 +8,25 @@ import (
8
8
9
9
"github.com/Azure/azure-sdk-for-go/profiles/latest/keyvault/keyvault"
10
10
kvauth "github.com/Azure/azure-sdk-for-go/services/keyvault/auth"
11
+ "github.com/Azure/go-autorest/autorest"
11
12
"github.com/spectralops/teller/pkg/core"
12
13
"github.com/spectralops/teller/pkg/logging"
13
14
)
14
15
15
16
const AzureVaultDomain = "vault.azure.net"
16
17
18
+ type AzureKeyVaultClient interface {
19
+ SetSecret (ctx context.Context , vaultBaseURL string , secretName string , parameters keyvault.SecretSetParameters ) (result keyvault.SecretBundle , err error )
20
+ GetSecret (ctx context.Context , vaultBaseURL string , secretName string , secretVersion string ) (result keyvault.SecretBundle , err error )
21
+ GetSecrets (ctx context.Context , vaultBaseURL string , maxresults * int32 ) (result keyvault.SecretListResultPage , err error )
22
+ DeleteSecret (ctx context.Context , vaultBaseURL string , secretName string ) (result keyvault.DeletedSecretBundle , err error )
23
+ }
24
+
17
25
type AzureKeyVault struct {
18
- client * keyvault.BaseClient
19
- logger logging.Logger
20
- vaultName string
26
+ client AzureKeyVaultClient
27
+ logger logging.Logger
28
+ vaultName string
29
+ vaultBaseURL string
21
30
}
22
31
23
32
func NewAzureKeyVault (logger logging.Logger ) (core.Provider , error ) {
@@ -26,31 +35,56 @@ func NewAzureKeyVault(logger logging.Logger) (core.Provider, error) {
26
35
return nil , fmt .Errorf ("cannot find KVAULT_NAME for azure key vault" )
27
36
}
28
37
29
- authorizer , err := kvauth .NewAuthorizerFromEnvironment ()
38
+ var authorizer autorest.Authorizer
39
+ var err error
40
+
41
+ if _ , ok := os .LookupEnv ("AZURE_CLI" ); ok {
42
+ authorizer , err = kvauth .NewAuthorizerFromCLI ()
43
+ } else {
44
+ authorizer , err = kvauth .NewAuthorizerFromEnvironment ()
45
+ }
46
+
30
47
if err != nil {
31
48
return nil , err
32
49
}
33
50
34
51
basicClient := keyvault .New ()
35
52
basicClient .Authorizer = authorizer
36
- return & AzureKeyVault {client : & basicClient , vaultName : vaultName , logger : logger }, nil
53
+ return & AzureKeyVault {client : & basicClient ,
54
+ vaultName : vaultName ,
55
+ logger : logger ,
56
+ vaultBaseURL : "https://" + vaultName + "." + AzureVaultDomain ,
57
+ }, nil
37
58
}
38
59
39
60
func (a * AzureKeyVault ) Name () string {
40
61
return "azure_keyvault"
41
62
}
63
+
42
64
func (a * AzureKeyVault ) Put (p core.KeyPath , val string ) error {
43
- return fmt .Errorf ("provider %q does not implement write yet" , a .Name ())
65
+ a .logger .WithField ("path" , p .Path ).Debug ("set secret" )
66
+ _ , err := a .client .SetSecret (context .TODO (), a .vaultBaseURL , p .Path , keyvault.SecretSetParameters {
67
+ Value : & val ,
68
+ })
69
+ return err
44
70
}
71
+
45
72
func (a * AzureKeyVault ) PutMapping (p core.KeyPath , m map [string ]string ) error {
46
- return fmt .Errorf ("provider %q does not implement write yet" , a .Name ())
73
+ for k , v := range m {
74
+ ap := p .SwitchPath (k )
75
+ err := a .Put (ap , v )
76
+ if err != nil {
77
+ return err
78
+ }
79
+ }
80
+ return nil
47
81
}
82
+
48
83
func (a * AzureKeyVault ) GetMapping (kp core.KeyPath ) ([]core.EnvEntry , error ) {
49
84
r := []core.EnvEntry {}
50
85
ctx := context .Background ()
51
- vaultBaseURL := "https://" + a .vaultName + "." + AzureVaultDomain
52
- a .logger .WithField ("vault_base_url" , vaultBaseURL ).Debug ("get secrets" )
53
- secretList , err := a .client .GetSecrets (ctx , vaultBaseURL , nil )
86
+ a .logger .WithField ("vault_base_url" , a .vaultBaseURL ).Debug ("get secrets" )
87
+ secretList , err := a .client .GetSecrets (ctx , a .vaultBaseURL , nil )
54
88
if err != nil {
55
89
return nil , err
56
90
}
@@ -91,18 +125,18 @@ func (a *AzureKeyVault) Get(p core.KeyPath) (*core.EnvEntry, error) {
91
125
}
92
126
93
127
func (a * AzureKeyVault ) Delete (kp core.KeyPath ) error {
94
- return fmt .Errorf ("%s does not implement delete yet" , a .Name ())
128
+ _ , err := a .client .DeleteSecret (context .TODO (), a .vaultBaseURL , kp .Path )
129
+ return err
95
130
}
96
131
97
132
func (a * AzureKeyVault ) DeleteMapping (kp core.KeyPath ) error {
98
133
return fmt .Errorf ("%s does not implement delete yet" , a .Name ())
99
134
}
100
135
101
136
func (a * AzureKeyVault ) getSecret (kp core.KeyPath ) (keyvault.SecretBundle , error ) {
102
- vaultBaseURL := "https://" + a .vaultName + "." + AzureVaultDomain
103
137
a .logger .WithFields (map [string ]interface {}{
104
- "vault_base_url" : vaultBaseURL ,
138
+ "vault_base_url" : a . vaultBaseURL ,
105
139
"secret_name" : kp .Path ,
106
140
}).Debug ("get secret" )
107
- return a .client .GetSecret (context .Background (), vaultBaseURL , kp .Path , "" )
141
+ return a .client .GetSecret (context .Background (), a . vaultBaseURL , kp .Path , "" )
108
142
}
0 commit comments