github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/builder/azure/common/vault.go (about)

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