mirror of https://github.com/hashicorp/packer
commit
dfefe7e8d9
@ -0,0 +1,45 @@
|
||||
package arm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/packer/builder/azure/common"
|
||||
"github.com/hashicorp/packer/builder/azure/common/constants"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
)
|
||||
|
||||
type StepCertificateInKeyVault struct {
|
||||
config *Config
|
||||
client common.AZVaultClientIface
|
||||
say func(message string)
|
||||
error func(e error)
|
||||
}
|
||||
|
||||
func NewStepCertificateInKeyVault(cli common.AZVaultClientIface, ui packer.Ui, config *Config) *StepCertificateInKeyVault {
|
||||
var step = &StepCertificateInKeyVault{
|
||||
client: cli,
|
||||
config: config,
|
||||
say: func(message string) { ui.Say(message) },
|
||||
error: func(e error) { ui.Error(e.Error()) },
|
||||
}
|
||||
|
||||
return step
|
||||
}
|
||||
|
||||
func (s *StepCertificateInKeyVault) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
|
||||
s.say("Setting the certificate in the KeyVault...")
|
||||
var keyVaultName = state.Get(constants.ArmKeyVaultName).(string)
|
||||
|
||||
err := s.client.SetSecret(keyVaultName, DefaultSecretName, s.config.winrmCertificate)
|
||||
if err != nil {
|
||||
s.error(fmt.Errorf("Error setting winrm cert in custom keyvault: %s", err))
|
||||
return multistep.ActionHalt
|
||||
}
|
||||
|
||||
return multistep.ActionContinue
|
||||
}
|
||||
|
||||
func (*StepCertificateInKeyVault) Cleanup(multistep.StateBag) {
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
package arm
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
azcommon "github.com/hashicorp/packer/builder/azure/common"
|
||||
"github.com/hashicorp/packer/builder/azure/common/constants"
|
||||
"github.com/hashicorp/packer/helper/multistep"
|
||||
"github.com/hashicorp/packer/packer"
|
||||
)
|
||||
|
||||
func TestNewStepCertificateInKeyVault(t *testing.T) {
|
||||
cli := azcommon.MockAZVaultClient{}
|
||||
ui := &packer.BasicUi{
|
||||
Reader: new(bytes.Buffer),
|
||||
Writer: new(bytes.Buffer),
|
||||
}
|
||||
state := new(multistep.BasicStateBag)
|
||||
state.Put(constants.ArmKeyVaultName, "testKeyVaultName")
|
||||
|
||||
config := &Config{
|
||||
winrmCertificate: "testCertificateString",
|
||||
}
|
||||
|
||||
certKVStep := NewStepCertificateInKeyVault(&cli, ui, config)
|
||||
stepAction := certKVStep.Run(context.TODO(), state)
|
||||
|
||||
if stepAction == multistep.ActionHalt {
|
||||
t.Fatalf("step should have succeeded.")
|
||||
}
|
||||
if !cli.SetSecretCalled {
|
||||
t.Fatalf("Step should have called SetSecret on Azure client.")
|
||||
}
|
||||
if cli.SetSecretCert != "testCertificateString" {
|
||||
t.Fatalf("Step should have read cert from winRMCertificate field on config.")
|
||||
}
|
||||
if cli.SetSecretVaultName != "testKeyVaultName" {
|
||||
t.Fatalf("step should have read keyvault name from state.")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewStepCertificateInKeyVault_error(t *testing.T) {
|
||||
// Tell mock to return an error
|
||||
cli := azcommon.MockAZVaultClient{}
|
||||
cli.IsError = true
|
||||
|
||||
ui := &packer.BasicUi{
|
||||
Reader: new(bytes.Buffer),
|
||||
Writer: new(bytes.Buffer),
|
||||
}
|
||||
state := new(multistep.BasicStateBag)
|
||||
state.Put(constants.ArmKeyVaultName, "testKeyVaultName")
|
||||
|
||||
config := &Config{
|
||||
winrmCertificate: "testCertificateString",
|
||||
}
|
||||
|
||||
certKVStep := NewStepCertificateInKeyVault(&cli, ui, config)
|
||||
stepAction := certKVStep.Run(context.TODO(), state)
|
||||
|
||||
if stepAction != multistep.ActionHalt {
|
||||
t.Fatalf("step should have failed.")
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/Azure/go-autorest/autorest"
|
||||
)
|
||||
|
||||
type MockAZVaultClient struct {
|
||||
GetSecretCalled bool
|
||||
SetSecretCalled bool
|
||||
SetSecretVaultName string
|
||||
SetSecretSecretName string
|
||||
SetSecretCert string
|
||||
DeleteResponderCalled bool
|
||||
DeletePreparerCalled bool
|
||||
DeleteSenderCalled bool
|
||||
|
||||
IsError bool
|
||||
}
|
||||
|
||||
func (m *MockAZVaultClient) GetSecret(vaultName, secretName string) (*Secret, error) {
|
||||
m.GetSecretCalled = true
|
||||
var secret Secret
|
||||
return &secret, nil
|
||||
}
|
||||
|
||||
func (m *MockAZVaultClient) SetSecret(vaultName, secretName string, secretValue string) error {
|
||||
m.SetSecretCalled = true
|
||||
m.SetSecretVaultName = vaultName
|
||||
m.SetSecretSecretName = secretName
|
||||
m.SetSecretCert = secretValue
|
||||
|
||||
if m.IsError {
|
||||
return fmt.Errorf("generic error!!")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MockAZVaultClient) DeletePreparer(resourceGroupName string, vaultName string) (*http.Request, error) {
|
||||
m.DeletePreparerCalled = true
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (m *MockAZVaultClient) DeleteResponder(resp *http.Response) (autorest.Response, error) {
|
||||
m.DeleteResponderCalled = true
|
||||
var result autorest.Response
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (m *MockAZVaultClient) DeleteSender(req *http.Request) (*http.Response, error) {
|
||||
m.DeleteSenderCalled = true
|
||||
return nil, nil
|
||||
}
|
||||
Loading…
Reference in new issue