@@ -4,10 +4,10 @@ import (
44 "context"
55 "encoding/json"
66 "errors"
7+ "strings"
78 "time"
89
9- "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault"
10- "github.com/Azure/go-autorest/autorest/to"
10+ "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
1111 "github.com/libopenstorage/secrets"
1212 "github.com/portworx/sched-ops/task"
1313)
@@ -21,6 +21,10 @@ const (
2121 AzureClientID = "AZURE_CLIENT_ID"
2222 // AzureClientSecret of service principal account
2323 AzureClientSecret = "AZURE_CLIENT_SECRET"
24+ // AzureClientCertPath is path of the client certificate
25+ AzureClientCertPath = "AZURE_CLIENT_CERT_PATH"
26+ // AzureClientCertPassword is the password of the private key
27+ AzureClientCertPassword = "AZURE_CIENT_CERT_PASSWORD"
2428 // AzureEnviornment to connect
2529 AzureEnviornment = "AZURE_ENVIRONMENT"
2630 // AzureVaultURI of azure key vault
3741 ErrAzureTenantIDNotSet = errors .New ("AZURE_TENANT_ID not set." )
3842 ErrAzureClientIDNotSet = errors .New ("AZURE_CLIENT_ID not set." )
3943 ErrAzureSecretIDNotSet = errors .New ("AZURE_SECRET_ID not set." )
44+ ErrAzureAuthMedhodNotSet = errors .New ("AZURE_SECRET_ID or AZURE_CLIENT_CERT_PATH not set" )
4045 ErrAzureVaultURLNotSet = errors .New ("AZURE_VAULT_URL not set." )
4146 ErrAzureEnvironmentNotset = errors .New ("AZURE_ENVIRONMENT not set." )
4247 ErrAzureConfigMissing = errors .New ("AzureConfig is not provided" )
4550)
4651
4752type azureSecrets struct {
48- kv keyvault. BaseClient
53+ kv azsecrets. Client
4954 baseURL string
5055}
5156
@@ -62,9 +67,9 @@ func New(
6267 return nil , ErrAzureClientIDNotSet
6368 }
6469 secretID := getAzureKVParams (secretConfig , AzureClientSecret )
65- if secretID == "" {
66- return nil , ErrAzureSecretIDNotSet
67- }
70+ clientCertPath := getAzureKVParams ( secretConfig , AzureClientCertPath )
71+ clientCertPassword := getAzureKVParams ( secretConfig , AzureClientCertPassword )
72+
6873 envName := getAzureKVParams (secretConfig , AzureEnviornment )
6974 if envName == "" {
7075 // we set back to default AzurePublicCloud
@@ -75,13 +80,24 @@ func New(
7580 return nil , ErrAzureVaultURLNotSet
7681 }
7782
78- client , err := getAzureVaultClient (clientID , secretID , tenantID , envName )
79- if err != nil {
80- return nil , err
83+ var client * azsecrets.Client
84+ var err error
85+ if secretID != "" {
86+ client , err = getAzureVaultClient (clientID , secretID , tenantID , vaultURL )
87+ if err != nil {
88+ return nil , err
89+ }
90+ } else if clientCertPath != "" {
91+ client , err = getAzureVaultClientWithCert (clientID , tenantID , vaultURL , clientCertPath , clientCertPassword )
92+ if err != nil {
93+ return nil , err
94+ }
95+ } else {
96+ return nil , ErrAzureAuthMedhodNotSet
8197 }
8298
8399 return & azureSecrets {
84- kv : client ,
100+ kv : * client ,
85101 baseURL : vaultURL ,
86102 }, nil
87103}
@@ -98,8 +114,13 @@ func (az *azureSecrets) GetSecret(
98114 }
99115
100116 t := func () (interface {}, bool , error ) {
101- secretResp , err := az .kv .GetSecret (ctx , az .baseURL , secretID , "" )
117+ // passing empty version to always get the latest version of the secret.
118+ secretResp , err := az .kv .GetSecret (ctx , secretID , "" , nil )
102119 if err != nil {
120+ // don't retry if Secret is not present
121+ if strings .Contains (err .Error (), "SecretNotFound" ) {
122+ return nil , false , secrets .ErrSecretNotFound
123+ }
103124 return nil , true , err
104125 }
105126 return secretResp , false , nil
@@ -109,7 +130,7 @@ func (az *azureSecrets) GetSecret(
109130 return nil , secrets .NoVersion , err
110131 }
111132
112- secretResp , ok := resp .(keyvault. SecretBundle )
133+ secretResp , ok := resp .(azsecrets. GetSecretResponse )
113134 if ! ok || secretResp .Value == nil {
114135 return nil , secrets .NoVersion , ErrInvalidSecretResp
115136 }
@@ -133,7 +154,7 @@ func (az *azureSecrets) PutSecret(
133154 ctx , cancel := context .WithTimeout (context .Background (), defaultTimeout )
134155 defer cancel ()
135156
136- var secretResp keyvault .SecretBundle
157+ var secretResp azsecrets .SecretBundle
137158 if secretName == "" {
138159 return secrets .NoVersion , secrets .ErrEmptySecretId
139160 }
@@ -146,10 +167,10 @@ func (az *azureSecrets) PutSecret(
146167 return secrets .NoVersion , err
147168 }
148169
170+ valueStr := string (value )
149171 t := func () (interface {}, bool , error ) {
150- secretResp , err = az .kv .SetSecret (ctx , az .baseURL , secretName , keyvault.SecretSetParameters {
151- Value : to .StringPtr (string (value )),
152- })
172+ params := azsecrets.SetSecretParameters {Value : & valueStr }
173+ az .kv .SetSecret (ctx , secretName , params , nil )
153174 if err != nil {
154175 return nil , true , err
155176 }
@@ -169,7 +190,7 @@ func (az *azureSecrets) DeleteSecret(
169190 if secretName == "" {
170191 return secrets .ErrEmptySecretId
171192 }
172- _ , err := az .kv .DeleteSecret (ctx , az . baseURL , secretName )
193+ _ , err := az .kv .DeleteSecret (ctx , secretName , nil )
173194
174195 return err
175196}
0 commit comments