packer-cn/builder/yandex/step_create_instance_test.go

126 lines
3.6 KiB
Go

package yandex
import (
"bytes"
"io/ioutil"
"os"
"strings"
"testing"
"github.com/hashicorp/packer-plugin-sdk/multistep"
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
const testMetadataFileContent = `meta data value`
func testMetadataFile(t *testing.T) string {
tf, err := ioutil.TempFile("", "packer")
require.NoErrorf(t, err, "create temporary file failed")
defer tf.Close()
_, err = tf.Write([]byte(testMetadataFileContent))
require.NoErrorf(t, err, "write to file failed")
return tf.Name()
}
func TestCreateInstanceMetadata(t *testing.T) {
state := testState(t)
c := state.Get("config").(*Config)
pubKey := "abcdefgh123456789"
// create our metadata
metadata, err := c.createInstanceMetadata(pubKey)
require.NoError(t, err, "Metadata creation should have succeeded.")
// ensure our pubKey is listed
assert.True(t, strings.Contains(metadata["ssh-keys"], pubKey), "Instance metadata should contain provided public key")
}
func TestCreateInstanceMetadata_noPublicKey(t *testing.T) {
state := testState(t)
c := state.Get("config").(*Config)
sshKeys := c.Metadata["sshKeys"]
// create our metadata
metadata, err := c.createInstanceMetadata("")
// ensure the metadata created without err
require.NoError(t, err, "Metadata creation should have succeeded.")
// ensure the ssh metadata hasn't changed
assert.Equal(t, metadata["sshKeys"], sshKeys, "Instance metadata should not have been modified")
}
func TestCreateInstanceMetadata_fromFile(t *testing.T) {
state := testState(t)
metadataFile := testMetadataFile(t)
defer os.Remove(metadataFile)
state.Put("config", testConfigStruct(t))
c := state.Get("config").(*Config)
c.MetadataFromFile = map[string]string{
"test-key": metadataFile,
}
// create our metadata
metadata, err := c.createInstanceMetadata("")
require.NoError(t, err, "Metadata creation should have succeeded.")
// ensure the metadata from file hasn't changed
assert.Equal(t, testMetadataFileContent, metadata["test-key"], "Instance metadata should not have been modified")
}
func TestCreateInstanceMetadata_fromFileAndTemplate(t *testing.T) {
state := testState(t)
metadataFile := testMetadataFile(t)
defer os.Remove(metadataFile)
state.Put("config", testConfigStruct(t))
c := state.Get("config").(*Config)
c.MetadataFromFile = map[string]string{
"test-key": metadataFile,
}
c.Metadata = map[string]string{
"test-key": "override value",
"test-key-2": "new-value",
}
// create our metadata
metadata, err := c.createInstanceMetadata("")
require.NoError(t, err, "Metadata creation should have succeeded.")
// ensure the metadata merged
assert.Equal(t, "override value", metadata["test-key"], "Instance metadata should not have been modified")
assert.Equal(t, "new-value", metadata["test-key-2"], "Instance metadata should not have been modified")
}
func TestCreateInstanceMetadata_fromNotExistFile(t *testing.T) {
state := testState(t)
metadataFile := "not-exist-file"
state.Put("config", testConfigStruct(t))
c := state.Get("config").(*Config)
c.MetadataFromFile = map[string]string{
"test-key": metadataFile,
}
// create our metadata
_, err := c.createInstanceMetadata("")
assert.True(t, err != nil, "Metadata creation should have an error.")
}
func testState(t *testing.T) multistep.StateBag {
state := new(multistep.BasicStateBag)
state.Put("config", testConfigStruct(t))
state.Put("hook", &packersdk.MockHook{})
state.Put("ui", &packersdk.BasicUi{
Reader: new(bytes.Buffer),
Writer: new(bytes.Buffer),
})
return state
}