66 "errors"
77 "time"
88
9- "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault"
10- "github.com/Azure/go-autorest/autorest/to"
9+ "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
1110 "github.com/libopenstorage/secrets"
1211 "github.com/portworx/sched-ops/task"
1312)
@@ -21,6 +20,10 @@ const (
2120 AzureClientID = "AZURE_CLIENT_ID"
2221 // AzureClientSecret of service principal account
2322 AzureClientSecret = "AZURE_CLIENT_SECRET"
23+ // AzureClientCertPath is path of the client certificate
24+ AzureClientCertPath = "AZURE_CLIENT_CERT_PATH"
25+ // AzureClientCertPassword is the password of the private key
26+ AzureClientCertPassword = "AZURE_CIENT_CERT_PASSWORD"
2427 // AzureEnviornment to connect
2528 AzureEnviornment = "AZURE_ENVIRONMENT"
2629 // AzureVaultURI of azure key vault
3740 ErrAzureTenantIDNotSet = errors .New ("AZURE_TENANT_ID not set." )
3841 ErrAzureClientIDNotSet = errors .New ("AZURE_CLIENT_ID not set." )
3942 ErrAzureSecretIDNotSet = errors .New ("AZURE_SECRET_ID not set." )
43+ ErrAzureAuthMedhodNotSet = errors .New ("AZURE_SECRET_ID or AZURE_CLIENT_CERT_PATH not set" )
4044 ErrAzureVaultURLNotSet = errors .New ("AZURE_VAULT_URL not set." )
4145 ErrAzureEnvironmentNotset = errors .New ("AZURE_ENVIRONMENT not set." )
4246 ErrAzureConfigMissing = errors .New ("AzureConfig is not provided" )
4549)
4650
4751type azureSecrets struct {
48- kv keyvault. BaseClient
52+ kv azsecrets. Client
4953 baseURL string
5054}
5155
@@ -62,9 +66,9 @@ func New(
6266 return nil , ErrAzureClientIDNotSet
6367 }
6468 secretID := getAzureKVParams (secretConfig , AzureClientSecret )
65- if secretID == "" {
66- return nil , ErrAzureSecretIDNotSet
67- }
69+ clientCertPath := getAzureKVParams ( secretConfig , AzureClientCertPath )
70+ clientCertPassword := getAzureKVParams ( secretConfig , AzureClientCertPassword )
71+
6872 envName := getAzureKVParams (secretConfig , AzureEnviornment )
6973 if envName == "" {
7074 // we set back to default AzurePublicCloud
@@ -75,13 +79,24 @@ func New(
7579 return nil , ErrAzureVaultURLNotSet
7680 }
7781
78- client , err := getAzureVaultClient (clientID , secretID , tenantID , envName )
79- if err != nil {
80- return nil , err
82+ var client * azsecrets.Client
83+ var err error
84+ if secretID != "" {
85+ client , err = getAzureVaultClient (clientID , secretID , tenantID , vaultURL )
86+ if err != nil {
87+ return nil , err
88+ }
89+ } else if clientCertPath != "" {
90+ client , err = getAzureVaultClientWithCert (clientID , tenantID , vaultURL , clientCertPath , clientCertPassword )
91+ if err != nil {
92+ return nil , err
93+ }
94+ } else {
95+ return nil , ErrAzureAuthMedhodNotSet
8196 }
8297
8398 return & azureSecrets {
84- kv : client ,
99+ kv : * client ,
85100 baseURL : vaultURL ,
86101 }, nil
87102}
@@ -98,7 +113,8 @@ func (az *azureSecrets) GetSecret(
98113 }
99114
100115 t := func () (interface {}, bool , error ) {
101- secretResp , err := az .kv .GetSecret (ctx , az .baseURL , secretID , "" )
116+ // passing empty version to always get the latest version of the secret.
117+ secretResp , err := az .kv .GetSecret (ctx , secretID , "" , nil )
102118 if err != nil {
103119 return nil , true , err
104120 }
@@ -109,7 +125,7 @@ func (az *azureSecrets) GetSecret(
109125 return nil , secrets .NoVersion , err
110126 }
111127
112- secretResp , ok := resp .(keyvault .SecretBundle )
128+ secretResp , ok := resp .(azsecrets .SecretBundle )
113129 if ! ok || secretResp .Value == nil {
114130 return nil , secrets .NoVersion , ErrInvalidSecretResp
115131 }
@@ -133,7 +149,7 @@ func (az *azureSecrets) PutSecret(
133149 ctx , cancel := context .WithTimeout (context .Background (), defaultTimeout )
134150 defer cancel ()
135151
136- var secretResp keyvault .SecretBundle
152+ var secretResp azsecrets .SecretBundle
137153 if secretName == "" {
138154 return secrets .NoVersion , secrets .ErrEmptySecretId
139155 }
@@ -146,10 +162,10 @@ func (az *azureSecrets) PutSecret(
146162 return secrets .NoVersion , err
147163 }
148164
165+ valueStr := string (value )
149166 t := func () (interface {}, bool , error ) {
150- secretResp , err = az .kv .SetSecret (ctx , az .baseURL , secretName , keyvault.SecretSetParameters {
151- Value : to .StringPtr (string (value )),
152- })
167+ params := azsecrets.SetSecretParameters {Value : & valueStr }
168+ az .kv .SetSecret (ctx , secretName , params , nil )
153169 if err != nil {
154170 return nil , true , err
155171 }
@@ -169,7 +185,7 @@ func (az *azureSecrets) DeleteSecret(
169185 if secretName == "" {
170186 return secrets .ErrEmptySecretId
171187 }
172- _ , err := az .kv .DeleteSecret (ctx , az . baseURL , secretName )
188+ _ , err := az .kv .DeleteSecret (ctx , secretName , nil )
173189
174190 return err
175191}
0 commit comments