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  }