github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/builder/azure/common/vault.go (about) 1 // NOTE: vault APIs do not yet exist in the SDK, but once they do this code 2 // should be removed. 3 4 package common 5 6 import ( 7 "fmt" 8 "net/http" 9 "net/url" 10 11 "github.com/Azure/go-autorest/autorest" 12 ) 13 14 const ( 15 AzureVaultApiVersion = "2015-06-01" 16 ) 17 18 type VaultClient struct { 19 autorest.Client 20 keyVaultEndpoint url.URL 21 } 22 23 func NewVaultClient(keyVaultEndpoint url.URL) VaultClient { 24 return VaultClient{ 25 keyVaultEndpoint: keyVaultEndpoint, 26 } 27 } 28 29 type Secret struct { 30 ID *string `json:"id,omitempty"` 31 Value string `json:"value"` 32 } 33 34 func (client *VaultClient) GetSecret(vaultName, secretName string) (*Secret, error) { 35 p := map[string]interface{}{ 36 "secret-name": autorest.Encode("path", secretName), 37 } 38 q := map[string]interface{}{ 39 "api-version": AzureVaultApiVersion, 40 } 41 42 req, err := autorest.Prepare( 43 &http.Request{}, 44 autorest.AsGet(), 45 autorest.WithBaseURL(client.getVaultUrl(vaultName)), 46 autorest.WithPathParameters("/secrets/{secret-name}", p), 47 autorest.WithQueryParameters(q)) 48 49 if err != nil { 50 return nil, err 51 } 52 53 resp, err := autorest.SendWithSender(client, req) 54 if err != nil { 55 return nil, err 56 } 57 58 if resp.StatusCode != 200 { 59 return nil, fmt.Errorf( 60 "Failed to fetch secret from %s/%s, HTTP status code=%d (%s)", 61 vaultName, 62 secretName, 63 resp.StatusCode, 64 http.StatusText(resp.StatusCode)) 65 } 66 67 var secret Secret 68 69 err = autorest.Respond( 70 resp, 71 autorest.ByUnmarshallingJSON(&secret)) 72 if err != nil { 73 return nil, err 74 } 75 76 return &secret, nil 77 } 78 79 func (client *VaultClient) getVaultUrl(vaultName string) string { 80 return fmt.Sprintf("%s://%s.%s/", client.keyVaultEndpoint.Scheme, vaultName, client.keyVaultEndpoint.Host) 81 }