Remove Parallels plugin (#10936)
This commit is contained in:
parent
d6904502ac
commit
25a999978b
|
@ -1,47 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
)
|
||||
|
||||
func TestArtifact_impl(t *testing.T) {
|
||||
var _ packersdk.Artifact = new(artifact)
|
||||
}
|
||||
|
||||
func TestNewArtifact(t *testing.T) {
|
||||
td, err := ioutil.TempDir("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
defer os.RemoveAll(td)
|
||||
|
||||
err = ioutil.WriteFile(filepath.Join(td, "a"), []byte("foo"), 0644)
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
if err = os.Mkdir(filepath.Join(td, "b"), 0755); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
generatedData := map[string]interface{}{"generated_data": "data"}
|
||||
a, err := NewArtifact(td, generatedData)
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
if a.BuilderId() != BuilderId {
|
||||
t.Fatalf("bad: %#v", a.BuilderId())
|
||||
}
|
||||
if len(a.Files()) != 1 {
|
||||
t.Fatalf("should length 1: %d", len(a.Files()))
|
||||
}
|
||||
if a.State("generated_data") != "data" {
|
||||
t.Fatalf("bad: should length have generated_data: %s", a.State("generated_data"))
|
||||
}
|
||||
}
|
|
@ -1,87 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestParallels9Driver_impl(t *testing.T) {
|
||||
var _ Driver = new(Parallels9Driver)
|
||||
}
|
||||
|
||||
func TestIPAddress(t *testing.T) {
|
||||
tf, err := ioutil.TempFile("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
defer os.Remove(tf.Name())
|
||||
defer tf.Close()
|
||||
|
||||
d := Parallels9Driver{
|
||||
dhcpLeaseFile: tf.Name(),
|
||||
}
|
||||
|
||||
// No lease should be found in an empty file
|
||||
ip, err := d.IPAddress("123456789012")
|
||||
if err == nil {
|
||||
t.Fatalf("Found IP: \"%v\". No IP should be found!\n", ip)
|
||||
}
|
||||
|
||||
// The most recent lease, 10.211.55.126 should be found
|
||||
c := []byte(`
|
||||
[vnic0]
|
||||
10.211.55.125="1418288000,1800,001c4235240c,ff4235240c000100011c1c10e7001c4235240c"
|
||||
10.211.55.126="1418288969,1800,001c4235240c,ff4235240c000100011c1c11ad001c4235240c"
|
||||
10.211.55.254="1411712008,1800,001c42a51419,01001c42a51419"
|
||||
`)
|
||||
ioutil.WriteFile(tf.Name(), c, 0666)
|
||||
ip, err = d.IPAddress("001C4235240c")
|
||||
if err != nil {
|
||||
t.Fatalf("Error: %v\n", err)
|
||||
}
|
||||
if ip != "10.211.55.126" {
|
||||
t.Fatalf("Should have found 10.211.55.126, not %s!\n", ip)
|
||||
}
|
||||
|
||||
// The most recent lease, 10.211.55.124 should be found
|
||||
c = []byte(`[vnic0]
|
||||
10.211.55.124="1418288969,1800,001c4235240c,ff4235240c000100011c1c11ad001c4235240c"
|
||||
10.211.55.125="1418288000,1800,001c4235240c,ff4235240c000100011c1c10e7001c4235240c"
|
||||
10.211.55.254="1411712008,1800,001c42a51419,01001c42a51419"
|
||||
`)
|
||||
ioutil.WriteFile(tf.Name(), c, 0666)
|
||||
ip, err = d.IPAddress("001c4235240c")
|
||||
if err != nil {
|
||||
t.Fatalf("Error: %v\n", err)
|
||||
}
|
||||
if ip != "10.211.55.124" {
|
||||
t.Fatalf("Should have found 10.211.55.124, not %s!\n", ip)
|
||||
}
|
||||
}
|
||||
|
||||
func TestXMLParseConfig(t *testing.T) {
|
||||
td, err := ioutil.TempDir("", "configpvs")
|
||||
if err != nil {
|
||||
t.Fatalf("Error creating temp dir: %s", err)
|
||||
}
|
||||
defer os.RemoveAll(td)
|
||||
|
||||
config := []byte(`
|
||||
<ExampleParallelsConfig>
|
||||
<SystemConfig>
|
||||
<DiskSize>20</DiskSize>
|
||||
</SystemConfig>
|
||||
</ExampleParallelsConfig>
|
||||
`)
|
||||
ioutil.WriteFile(td+"/config.pvs", config, 0666)
|
||||
|
||||
result, err := getConfigValueFromXpath(td, "//DiskSize")
|
||||
if err != nil {
|
||||
t.Fatalf("Error parsing XML: %s", err)
|
||||
}
|
||||
|
||||
if result != "20" {
|
||||
t.Fatalf("Expected %q, got %q", "20", result)
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package common
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestIfconfigIPFinder_Impl(t *testing.T) {
|
||||
var raw interface{}
|
||||
raw = &IfconfigIPFinder{}
|
||||
if _, ok := raw.(HostIPFinder); !ok {
|
||||
t.Fatalf("IfconfigIPFinder is not a host IP finder")
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
)
|
||||
|
||||
func TestHWConfigPrepare(t *testing.T) {
|
||||
c := new(HWConfig)
|
||||
if errs := c.Prepare(interpolate.NewContext()); len(errs) > 0 {
|
||||
t.Fatalf("err: %#v", errs)
|
||||
}
|
||||
|
||||
if c.CpuCount < 1 {
|
||||
t.Errorf("bad cpu count: %d", c.CpuCount)
|
||||
}
|
||||
|
||||
if c.MemorySize < 64 {
|
||||
t.Errorf("bad memory size: %d", c.MemorySize)
|
||||
}
|
||||
}
|
|
@ -1,69 +0,0 @@
|
|||
// +build !windows
|
||||
|
||||
package common
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
)
|
||||
|
||||
func TestOutputConfigPrepare(t *testing.T) {
|
||||
c := new(OutputConfig)
|
||||
if c.OutputDir != "" {
|
||||
t.Fatalf("what: %s", c.OutputDir)
|
||||
}
|
||||
|
||||
pc := &common.PackerConfig{PackerBuildName: "foo"}
|
||||
errs := c.Prepare(interpolate.NewContext(), pc)
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("err: %#v", errs)
|
||||
}
|
||||
|
||||
if c.OutputDir == "" {
|
||||
t.Fatal("should have output dir")
|
||||
}
|
||||
}
|
||||
|
||||
func TestOutputConfigPrepare_exists(t *testing.T) {
|
||||
td, err := ioutil.TempDir("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
defer os.RemoveAll(td)
|
||||
|
||||
c := new(OutputConfig)
|
||||
c.OutputDir = td
|
||||
|
||||
pc := &common.PackerConfig{
|
||||
PackerBuildName: "foo",
|
||||
PackerForce: false,
|
||||
}
|
||||
errs := c.Prepare(interpolate.NewContext(), pc)
|
||||
if len(errs) == 0 {
|
||||
t.Fatal("should have errors")
|
||||
}
|
||||
}
|
||||
|
||||
func TestOutputConfigPrepare_forceExists(t *testing.T) {
|
||||
td, err := ioutil.TempDir("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
defer os.RemoveAll(td)
|
||||
|
||||
c := new(OutputConfig)
|
||||
c.OutputDir = td
|
||||
|
||||
pc := &common.PackerConfig{
|
||||
PackerBuildName: "foo",
|
||||
PackerForce: true,
|
||||
}
|
||||
errs := c.Prepare(interpolate.NewContext(), pc)
|
||||
if len(errs) > 0 {
|
||||
t.Fatal("should not have errors")
|
||||
}
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
)
|
||||
|
||||
func TestPrlctlConfigPrepare_Prlctl(t *testing.T) {
|
||||
// Test with empty
|
||||
c := new(PrlctlConfig)
|
||||
errs := c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("err: %#v", errs)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(c.Prlctl, [][]string{}) {
|
||||
t.Fatalf("bad: %#v", c.Prlctl)
|
||||
}
|
||||
|
||||
// Test with a good one
|
||||
c = new(PrlctlConfig)
|
||||
c.Prlctl = [][]string{
|
||||
{"foo", "bar", "baz"},
|
||||
}
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("err: %#v", errs)
|
||||
}
|
||||
|
||||
expected := [][]string{
|
||||
{"foo", "bar", "baz"},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(c.Prlctl, expected) {
|
||||
t.Fatalf("bad: %#v", c.Prlctl)
|
||||
}
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
)
|
||||
|
||||
func TestPrlctlPostConfigPrepare_PrlctlPost(t *testing.T) {
|
||||
// Test with empty
|
||||
c := new(PrlctlPostConfig)
|
||||
errs := c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("err: %#v", errs)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(c.PrlctlPost, [][]string{}) {
|
||||
t.Fatalf("bad: %#v", c.PrlctlPost)
|
||||
}
|
||||
|
||||
// Test with a good one
|
||||
c = new(PrlctlPostConfig)
|
||||
c.PrlctlPost = [][]string{
|
||||
{"foo", "bar", "baz"},
|
||||
}
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("err: %#v", errs)
|
||||
}
|
||||
|
||||
expected := [][]string{
|
||||
{"foo", "bar", "baz"},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(c.PrlctlPost, expected) {
|
||||
t.Fatalf("bad: %#v", c.PrlctlPost)
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
)
|
||||
|
||||
func TestPrlctlVersionConfigPrepare_BootWait(t *testing.T) {
|
||||
var c *PrlctlVersionConfig
|
||||
var errs []error
|
||||
|
||||
// Test empty
|
||||
c = new(PrlctlVersionConfig)
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %s", errs)
|
||||
}
|
||||
|
||||
if c.PrlctlVersionFile != ".prlctl_version" {
|
||||
t.Fatalf("bad value: %s", c.PrlctlVersionFile)
|
||||
}
|
||||
|
||||
// Test with a good one
|
||||
c = new(PrlctlVersionConfig)
|
||||
c.PrlctlVersionFile = "foo"
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %s", errs)
|
||||
}
|
||||
|
||||
if c.PrlctlVersionFile != "foo" {
|
||||
t.Fatalf("bad value: %s", c.PrlctlVersionFile)
|
||||
}
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/communicator"
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
)
|
||||
|
||||
func testSSHConfig() *SSHConfig {
|
||||
return &SSHConfig{
|
||||
Comm: communicator.Config{
|
||||
SSH: communicator.SSH{
|
||||
SSHUsername: "foo",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func TestSSHConfigPrepare(t *testing.T) {
|
||||
c := testSSHConfig()
|
||||
errs := c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("err: %#v", errs)
|
||||
}
|
||||
|
||||
if c.Comm.SSHPort != 22 {
|
||||
t.Errorf("bad ssh port: %d", c.Comm.SSHPort)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSSHConfigPrepare_SSHPrivateKey(t *testing.T) {
|
||||
var c *SSHConfig
|
||||
var errs []error
|
||||
|
||||
c = testSSHConfig()
|
||||
c.Comm.SSHPrivateKeyFile = ""
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %#v", errs)
|
||||
}
|
||||
|
||||
c = testSSHConfig()
|
||||
c.Comm.SSHPrivateKeyFile = "/i/dont/exist"
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) == 0 {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
|
||||
// Test bad contents
|
||||
tf, err := ioutil.TempFile("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
defer os.Remove(tf.Name())
|
||||
defer tf.Close()
|
||||
|
||||
if _, err := tf.Write([]byte("HELLO!")); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
c = testSSHConfig()
|
||||
c.Comm.SSHPrivateKeyFile = tf.Name()
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) == 0 {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
|
||||
// Test good contents
|
||||
tf.Seek(0, 0)
|
||||
tf.Truncate(0)
|
||||
tf.Write([]byte(testPem))
|
||||
c = testSSHConfig()
|
||||
c.Comm.SSHPrivateKeyFile = tf.Name()
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %#v", errs)
|
||||
}
|
||||
}
|
||||
|
||||
const testPem = `
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEAxd4iamvrwRJvtNDGQSIbNvvIQN8imXTRWlRY62EvKov60vqu
|
||||
hh+rDzFYAIIzlmrJopvOe0clqmi3mIP9dtkjPFrYflq52a2CF5q+BdwsJXuRHbJW
|
||||
LmStZUwW1khSz93DhvhmK50nIaczW63u4EO/jJb3xj+wxR1Nkk9bxi3DDsYFt8SN
|
||||
AzYx9kjlEYQ/+sI4/ATfmdV9h78SVotjScupd9KFzzi76gWq9gwyCBLRynTUWlyD
|
||||
2UOfJRkOvhN6/jKzvYfVVwjPSfA9IMuooHdScmC4F6KBKJl/zf/zETM0XyzIDNmH
|
||||
uOPbCiljq2WoRM+rY6ET84EO0kVXbfx8uxUsqQIDAQABAoIBAQCkPj9TF0IagbM3
|
||||
5BSs/CKbAWS4dH/D4bPlxx4IRCNirc8GUg+MRb04Xz0tLuajdQDqeWpr6iLZ0RKV
|
||||
BvreLF+TOdV7DNQ4XE4gSdJyCtCaTHeort/aordL3l0WgfI7mVk0L/yfN1PEG4YG
|
||||
E9q1TYcyrB3/8d5JwIkjabxERLglCcP+geOEJp+QijbvFIaZR/n2irlKW4gSy6ko
|
||||
9B0fgUnhkHysSg49ChHQBPQ+o5BbpuLrPDFMiTPTPhdfsvGGcyCGeqfBA56oHcSF
|
||||
K02Fg8OM+Bd1lb48LAN9nWWY4WbwV+9bkN3Ym8hO4c3a/Dxf2N7LtAQqWZzFjvM3
|
||||
/AaDvAgBAoGBAPLD+Xn1IYQPMB2XXCXfOuJewRY7RzoVWvMffJPDfm16O7wOiW5+
|
||||
2FmvxUDayk4PZy6wQMzGeGKnhcMMZTyaq2g/QtGfrvy7q1Lw2fB1VFlVblvqhoJa
|
||||
nMJojjC4zgjBkXMHsRLeTmgUKyGs+fdFbfI6uejBnnf+eMVUMIdJ+6I9AoGBANCn
|
||||
kWO9640dttyXURxNJ3lBr2H3dJOkmD6XS+u+LWqCSKQe691Y/fZ/ZL0Oc4Mhy7I6
|
||||
hsy3kDQ5k2V0fkaNODQIFJvUqXw2pMewUk8hHc9403f4fe9cPrL12rQ8WlQw4yoC
|
||||
v2B61vNczCCUDtGxlAaw8jzSRaSI5s6ax3K7enbdAoGBAJB1WYDfA2CoAQO6y9Sl
|
||||
b07A/7kQ8SN5DbPaqrDrBdJziBQxukoMJQXJeGFNUFD/DXFU5Fp2R7C86vXT7HIR
|
||||
v6m66zH+CYzOx/YE6EsUJms6UP9VIVF0Rg/RU7teXQwM01ZV32LQ8mswhTH20o/3
|
||||
uqMHmxUMEhZpUMhrfq0isyApAoGAe1UxGTXfj9AqkIVYylPIq2HqGww7+jFmVEj1
|
||||
9Wi6S6Sq72ffnzzFEPkIQL/UA4TsdHMnzsYKFPSbbXLIWUeMGyVTmTDA5c0e5XIR
|
||||
lPhMOKCAzv8w4VUzMnEkTzkFY5JqFCD/ojW57KvDdNZPVB+VEcdxyAW6aKELXMAc
|
||||
eHLc1nkCgYEApm/motCTPN32nINZ+Vvywbv64ZD+gtpeMNP3CLrbe1X9O+H52AXa
|
||||
1jCoOldWR8i2bs2NVPcKZgdo6fFULqE4dBX7Te/uYEIuuZhYLNzRO1IKU/YaqsXG
|
||||
3bfQ8hKYcSnTfE0gPtLDnqCIxTocaGLSHeG3TH9fTw+dA8FvWpUztI4=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
`
|
|
@ -1,86 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
)
|
||||
|
||||
func TestStepAttachFloppy_impl(t *testing.T) {
|
||||
var _ multistep.Step = new(StepAttachFloppy)
|
||||
}
|
||||
|
||||
func TestStepAttachFloppy(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepAttachFloppy)
|
||||
|
||||
// Create a temporary file for our floppy file
|
||||
tf, err := ioutil.TempFile("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
tf.Close()
|
||||
defer os.Remove(tf.Name())
|
||||
|
||||
state.Put("floppy_path", tf.Name())
|
||||
state.Put("vmName", "foo")
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
if len(driver.PrlctlCalls) != 2 {
|
||||
t.Fatal("not enough calls to prlctl")
|
||||
}
|
||||
|
||||
if driver.PrlctlCalls[0][0] != "set" {
|
||||
t.Fatal("bad call")
|
||||
}
|
||||
if driver.PrlctlCalls[0][2] != "--device-del" {
|
||||
t.Fatal("bad call")
|
||||
}
|
||||
if driver.PrlctlCalls[0][3] != "fdd0" {
|
||||
t.Fatal("bad call")
|
||||
}
|
||||
|
||||
if driver.PrlctlCalls[1][0] != "set" {
|
||||
t.Fatal("bad call")
|
||||
}
|
||||
if driver.PrlctlCalls[1][2] != "--device-add" {
|
||||
t.Fatal("bad call")
|
||||
}
|
||||
if driver.PrlctlCalls[1][3] != "fdd" {
|
||||
t.Fatal("bad call")
|
||||
}
|
||||
if driver.PrlctlCalls[1][6] != "--connect" {
|
||||
t.Fatal("bad call")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepAttachFloppy_noFloppy(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepAttachFloppy)
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
if len(driver.PrlctlCalls) > 0 {
|
||||
t.Fatal("should not call prlctl")
|
||||
}
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
)
|
||||
|
||||
func TestStepCompactDisk_impl(t *testing.T) {
|
||||
var _ multistep.Step = new(StepCompactDisk)
|
||||
}
|
||||
|
||||
func TestStepCompactDisk(t *testing.T) {
|
||||
tf, err := ioutil.TempFile("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
tf.Close()
|
||||
defer os.Remove(tf.Name())
|
||||
|
||||
state := testState(t)
|
||||
step := new(StepCompactDisk)
|
||||
|
||||
state.Put("vmName", "foo")
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Mock results
|
||||
driver.DiskPathResult = tf.Name()
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Test the driver
|
||||
if !driver.CompactDiskCalled {
|
||||
t.Fatal("should've called")
|
||||
}
|
||||
|
||||
path, _ := driver.DiskPath("foo")
|
||||
if path != tf.Name() {
|
||||
t.Fatal("should call with right path")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepCompactDisk_skip(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepCompactDisk)
|
||||
step.Skip = true
|
||||
|
||||
state.Put("vmName", "foo")
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Test the driver
|
||||
if driver.CompactDiskCalled {
|
||||
t.Fatal("should not have called")
|
||||
}
|
||||
}
|
|
@ -1,100 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
)
|
||||
|
||||
func testStepOutputDir(t *testing.T) *StepOutputDir {
|
||||
td, err := ioutil.TempDir("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
if err := os.RemoveAll(td); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
return &StepOutputDir{Force: false, Path: td}
|
||||
}
|
||||
|
||||
func TestStepOutputDir_impl(t *testing.T) {
|
||||
var _ multistep.Step = new(StepOutputDir)
|
||||
}
|
||||
|
||||
func TestStepOutputDir(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := testStepOutputDir(t)
|
||||
// Delete the test output directory when done
|
||||
defer os.RemoveAll(step.Path)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
if _, err := os.Stat(step.Path); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
// Test the cleanup
|
||||
step.Cleanup(state)
|
||||
if _, err := os.Stat(step.Path); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepOutputDir_cancelled(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := testStepOutputDir(t)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
if _, err := os.Stat(step.Path); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
// Mark
|
||||
state.Put(multistep.StateCancelled, true)
|
||||
|
||||
// Test the cleanup
|
||||
step.Cleanup(state)
|
||||
if _, err := os.Stat(step.Path); err == nil {
|
||||
t.Fatal("should not exist")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepOutputDir_halted(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := testStepOutputDir(t)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
if _, err := os.Stat(step.Path); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
// Mark
|
||||
state.Put(multistep.StateHalted, true)
|
||||
|
||||
// Test the cleanup
|
||||
step.Cleanup(state)
|
||||
if _, err := os.Stat(step.Path); err == nil {
|
||||
t.Fatal("should not exist")
|
||||
}
|
||||
}
|
|
@ -1,116 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
)
|
||||
|
||||
func TestStepPrepareParallelsTools_impl(t *testing.T) {
|
||||
var _ multistep.Step = new(StepPrepareParallelsTools)
|
||||
}
|
||||
|
||||
func TestStepPrepareParallelsTools(t *testing.T) {
|
||||
tf, err := ioutil.TempFile("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
tf.Close()
|
||||
defer os.Remove(tf.Name())
|
||||
|
||||
state := testState(t)
|
||||
step := &StepPrepareParallelsTools{
|
||||
ParallelsToolsMode: "",
|
||||
ParallelsToolsFlavor: "foo",
|
||||
}
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Mock results
|
||||
driver.ToolsISOPathResult = tf.Name()
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Test the driver
|
||||
if !driver.ToolsISOPathCalled {
|
||||
t.Fatal("tools iso path should be called")
|
||||
}
|
||||
if driver.ToolsISOPathFlavor != "foo" {
|
||||
t.Fatalf("bad: %#v", driver.ToolsISOPathFlavor)
|
||||
}
|
||||
|
||||
// Test the resulting state
|
||||
path, ok := state.GetOk("parallels_tools_path")
|
||||
if !ok {
|
||||
t.Fatal("should have parallels_tools_path")
|
||||
}
|
||||
if path != tf.Name() {
|
||||
t.Fatalf("bad: %#v", path)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepPrepareParallelsTools_disabled(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := &StepPrepareParallelsTools{
|
||||
ParallelsToolsFlavor: "foo",
|
||||
ParallelsToolsMode: ParallelsToolsModeDisable,
|
||||
}
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Test the driver
|
||||
if driver.ToolsISOPathCalled {
|
||||
t.Fatal("tools ISO path should NOT be called")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepPrepareParallelsTools_nonExist(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := &StepPrepareParallelsTools{
|
||||
ParallelsToolsFlavor: "foo",
|
||||
ParallelsToolsMode: "",
|
||||
}
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Mock results
|
||||
driver.ToolsISOPathResult = "foo"
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionHalt {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); !ok {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
|
||||
// Test the driver
|
||||
if !driver.ToolsISOPathCalled {
|
||||
t.Fatal("tools iso path should be called")
|
||||
}
|
||||
if driver.ToolsISOPathFlavor != "foo" {
|
||||
t.Fatalf("bad: %#v", driver.ToolsISOPathFlavor)
|
||||
}
|
||||
|
||||
// Test the resulting state
|
||||
if _, ok := state.GetOk("parallels_tools_path"); ok {
|
||||
t.Fatal("should NOT have parallels_tools_path")
|
||||
}
|
||||
}
|
|
@ -1,107 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
)
|
||||
|
||||
func TestStepShutdown_impl(t *testing.T) {
|
||||
var _ multistep.Step = new(StepShutdown)
|
||||
}
|
||||
|
||||
func TestStepShutdown_noShutdownCommand(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepShutdown)
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
state.Put("vmName", "foo")
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Test that Stop was just called
|
||||
if driver.StopName != "foo" {
|
||||
t.Fatal("should call stop")
|
||||
}
|
||||
if comm.StartCalled {
|
||||
t.Fatal("comm start should not be called")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepShutdown_shutdownCommand(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepShutdown)
|
||||
step.Command = "poweroff"
|
||||
step.Timeout = 1 * time.Second
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
state.Put("vmName", "foo")
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
driver.IsRunningReturn = true
|
||||
|
||||
go func() {
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
driver.Lock()
|
||||
defer driver.Unlock()
|
||||
driver.IsRunningReturn = false
|
||||
}()
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Test that Stop was just called
|
||||
if driver.StopName != "" {
|
||||
t.Fatal("should not call stop")
|
||||
}
|
||||
if comm.StartCmd.Command != step.Command {
|
||||
t.Fatal("comm start should be called")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepShutdown_shutdownTimeout(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepShutdown)
|
||||
step.Command = "poweroff"
|
||||
step.Timeout = 1 * time.Second
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
state.Put("vmName", "foo")
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
driver.IsRunningReturn = true
|
||||
|
||||
go func() {
|
||||
time.Sleep(2 * time.Second)
|
||||
driver.Lock()
|
||||
defer driver.Unlock()
|
||||
driver.IsRunningReturn = false
|
||||
}()
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionHalt {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); !ok {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
)
|
||||
|
||||
func testState(t *testing.T) multistep.StateBag {
|
||||
state := new(multistep.BasicStateBag)
|
||||
state.Put("debug", false)
|
||||
state.Put("driver", new(DriverMock))
|
||||
state.Put("ui", &packersdk.BasicUi{
|
||||
Reader: new(bytes.Buffer),
|
||||
Writer: new(bytes.Buffer),
|
||||
})
|
||||
return state
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
)
|
||||
|
||||
func TestStepUploadParallelsTools_impl(t *testing.T) {
|
||||
var _ multistep.Step = new(StepUploadParallelsTools)
|
||||
}
|
||||
|
||||
func TestStepUploadParallelsTools(t *testing.T) {
|
||||
state := testState(t)
|
||||
state.Put("parallels_tools_path", "./step_upload_parallels_tools_test.go")
|
||||
step := new(StepUploadParallelsTools)
|
||||
step.ParallelsToolsMode = "upload"
|
||||
step.ParallelsToolsGuestPath = "/tmp/prl-lin.iso"
|
||||
step.ParallelsToolsFlavor = "lin"
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Verify
|
||||
if comm.UploadPath != "/tmp/prl-lin.iso" {
|
||||
t.Fatalf("bad: %#v", comm.UploadPath)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepUploadParallelsTools_interpolate(t *testing.T) {
|
||||
state := testState(t)
|
||||
state.Put("parallels_tools_path", "./step_upload_parallels_tools_test.go")
|
||||
step := new(StepUploadParallelsTools)
|
||||
step.ParallelsToolsMode = "upload"
|
||||
step.ParallelsToolsGuestPath = "/tmp/prl-{{ .Flavor }}.iso"
|
||||
step.ParallelsToolsFlavor = "win"
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Verify
|
||||
if comm.UploadPath != "/tmp/prl-win.iso" {
|
||||
t.Fatalf("bad: %#v", comm.UploadPath)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepUploadParallelsTools_attach(t *testing.T) {
|
||||
state := testState(t)
|
||||
state.Put("parallels_tools_path", "./step_upload_parallels_tools_test.go")
|
||||
step := new(StepUploadParallelsTools)
|
||||
step.ParallelsToolsMode = "attach"
|
||||
step.ParallelsToolsGuestPath = "/tmp/prl-lin.iso"
|
||||
step.ParallelsToolsFlavor = "lin"
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Verify
|
||||
if comm.UploadCalled {
|
||||
t.Fatal("bad")
|
||||
}
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
)
|
||||
|
||||
func TestStepUploadVersion_impl(t *testing.T) {
|
||||
var _ multistep.Step = new(StepUploadVersion)
|
||||
}
|
||||
|
||||
func TestStepUploadVersion(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepUploadVersion)
|
||||
step.Path = "foopath"
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
|
||||
driver := state.Get("driver").(*DriverMock)
|
||||
driver.VersionResult = "foo"
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Verify
|
||||
if comm.UploadPath != "foopath" {
|
||||
t.Fatalf("bad: %#v", comm.UploadPath)
|
||||
}
|
||||
if comm.UploadData != "foo" {
|
||||
t.Fatalf("upload data bad: %#v", comm.UploadData)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStepUploadVersion_noPath(t *testing.T) {
|
||||
state := testState(t)
|
||||
step := new(StepUploadVersion)
|
||||
step.Path = ""
|
||||
|
||||
comm := new(packersdk.MockCommunicator)
|
||||
state.Put("communicator", comm)
|
||||
|
||||
// Test the run
|
||||
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
||||
t.Fatalf("bad action: %#v", action)
|
||||
}
|
||||
if _, ok := state.GetOk("error"); ok {
|
||||
t.Fatal("should NOT have error")
|
||||
}
|
||||
|
||||
// Verify
|
||||
if comm.UploadCalled {
|
||||
t.Fatal("bad")
|
||||
}
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
)
|
||||
|
||||
func testToolsConfig() *ToolsConfig {
|
||||
return &ToolsConfig{
|
||||
ParallelsToolsFlavor: "foo",
|
||||
ParallelsToolsGuestPath: "foo",
|
||||
ParallelsToolsMode: "attach",
|
||||
}
|
||||
}
|
||||
|
||||
func TestToolsConfigPrepare(t *testing.T) {
|
||||
c := testToolsConfig()
|
||||
errs := c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("bad err: %#v", errs)
|
||||
}
|
||||
}
|
||||
|
||||
func TestToolsConfigPrepare_ParallelsToolsMode(t *testing.T) {
|
||||
var c *ToolsConfig
|
||||
var errs []error
|
||||
|
||||
// Test default mode
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsMode = ""
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %#v", errs)
|
||||
}
|
||||
if c.ParallelsToolsMode != ParallelsToolsModeUpload {
|
||||
t.Errorf("bad parallels tools mode: %s", c.ParallelsToolsMode)
|
||||
}
|
||||
|
||||
// Test another mode
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsMode = "attach"
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %#v", errs)
|
||||
}
|
||||
if c.ParallelsToolsMode != ParallelsToolsModeAttach {
|
||||
t.Fatalf("bad mode: %s", c.ParallelsToolsMode)
|
||||
}
|
||||
|
||||
// Test invalid mode
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsMode = "invalid_mode"
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) == 0 {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestToolsConfigPrepare_ParallelsToolsGuestPath(t *testing.T) {
|
||||
var c *ToolsConfig
|
||||
var errs []error
|
||||
|
||||
// Test default path
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsGuestPath = ""
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %#v", errs)
|
||||
}
|
||||
if c.ParallelsToolsGuestPath == "" {
|
||||
t.Fatal("should not be empty")
|
||||
}
|
||||
|
||||
// Test with a good one
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsGuestPath = "foo"
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %s", errs)
|
||||
}
|
||||
|
||||
if c.ParallelsToolsGuestPath != "foo" {
|
||||
t.Fatalf("bad guest path: %s", c.ParallelsToolsGuestPath)
|
||||
}
|
||||
}
|
||||
|
||||
func TestToolsConfigPrepare_ParallelsToolsFlavor(t *testing.T) {
|
||||
var c *ToolsConfig
|
||||
var errs []error
|
||||
|
||||
// Test with a default value
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsFlavor = ""
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) == 0 {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
|
||||
// Test with an bad value
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsMode = "attach"
|
||||
c.ParallelsToolsFlavor = ""
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) == 0 {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
|
||||
// Test with a good one
|
||||
c = testToolsConfig()
|
||||
c.ParallelsToolsMode = "disable"
|
||||
c.ParallelsToolsFlavor = ""
|
||||
errs = c.Prepare(interpolate.NewContext())
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("should not have error: %s", errs)
|
||||
}
|
||||
}
|
|
@ -1,242 +0,0 @@
|
|||
package iso
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/common"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
)
|
||||
|
||||
func testConfig() map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"iso_checksum": "md5:0B0F137F17AC10944716020B018F8126",
|
||||
"iso_url": "http://www.google.com/",
|
||||
"shutdown_command": "yes",
|
||||
"ssh_username": "foo",
|
||||
"parallels_tools_flavor": "lin",
|
||||
|
||||
common.BuildNameConfigKey: "foo",
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuilder_ImplementsBuilder(t *testing.T) {
|
||||
var raw interface{}
|
||||
raw = &Builder{}
|
||||
if _, ok := raw.(packersdk.Builder); !ok {
|
||||
t.Error("Builder must implement builder.")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuilderPrepare_Defaults(t *testing.T) {
|
||||
var b Builder
|
||||
config := testConfig()
|
||||
_, warns, err := b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("should not have error: %s", err)
|
||||
}
|
||||
|
||||
if b.config.GuestOSType != "other" {
|
||||
t.Errorf("bad guest OS type: %s", b.config.GuestOSType)
|
||||
}
|
||||
|
||||
if b.config.VMName != "packer-foo" {
|
||||
t.Errorf("bad vm name: %s", b.config.VMName)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuilderPrepare_FloppyFiles(t *testing.T) {
|
||||
var b Builder
|
||||
config := testConfig()
|
||||
|
||||
delete(config, "floppy_files")
|
||||
_, warns, err := b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("bad err: %s", err)
|
||||
}
|
||||
|
||||
if len(b.config.FloppyFiles) != 0 {
|
||||
t.Fatalf("bad: %#v", b.config.FloppyFiles)
|
||||
}
|
||||
|
||||
floppies_path := "../../test-fixtures/floppies"
|
||||
config["floppy_files"] = []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)}
|
||||
b = Builder{}
|
||||
_, warns, err = b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("should not have error: %s", err)
|
||||
}
|
||||
|
||||
expected := []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)}
|
||||
if !reflect.DeepEqual(b.config.FloppyFiles, expected) {
|
||||
t.Fatalf("bad: %#v", b.config.FloppyFiles)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuilderPrepare_InvalidFloppies(t *testing.T) {
|
||||
var b Builder
|
||||
config := testConfig()
|
||||
config["floppy_files"] = []string{"nonexistent.bat", "nonexistent.ps1"}
|
||||
b = Builder{}
|
||||
_, _, errs := b.Prepare(config)
|
||||
if errs == nil {
|
||||
t.Fatalf("Nonexistent floppies should trigger multierror")
|
||||
}
|
||||
|
||||
if len(errs.(*packersdk.MultiError).Errors) != 2 {
|
||||
t.Fatalf("Multierror should work and report 2 errors")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuilderPrepare_DiskSize(t *testing.T) {
|
||||
var b Builder
|
||||
config := testConfig()
|
||||
|
||||
delete(config, "disk_size")
|
||||
_, warns, err := b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("bad err: %s", err)
|
||||
}
|
||||
|
||||
if b.config.DiskSize != 40000 {
|
||||
t.Fatalf("bad size: %d", b.config.DiskSize)
|
||||
}
|
||||
|
||||
config["disk_size"] = 60000
|
||||
b = Builder{}
|
||||
_, warns, err = b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("should not have error: %s", err)
|
||||
}
|
||||
|
||||
if b.config.DiskSize != 60000 {
|
||||
t.Fatalf("bad size: %d", b.config.DiskSize)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuilderPrepare_DiskType(t *testing.T) {
|
||||
var b Builder
|
||||
config := testConfig()
|
||||
|
||||
// Test a default disk_type
|
||||
delete(config, "disk_type")
|
||||
_, warns, err := b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
if b.config.DiskType != "expand" {
|
||||
t.Fatalf("bad: %s", b.config.DiskType)
|
||||
}
|
||||
|
||||
// Test with a bad
|
||||
config["disk_type"] = "fake"
|
||||
b = Builder{}
|
||||
_, warns, err = b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err == nil {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
|
||||
// Test with plain disk with wrong setting for compaction
|
||||
config["disk_type"] = "plain"
|
||||
config["skip_compaction"] = false
|
||||
b = Builder{}
|
||||
_, warns, err = b.Prepare(config)
|
||||
if len(warns) == 0 {
|
||||
t.Fatalf("should have warning")
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("should not have error: %s", err)
|
||||
}
|
||||
|
||||
// Test with plain disk with correct setting for compaction
|
||||
config["disk_type"] = "plain"
|
||||
config["skip_compaction"] = true
|
||||
b = Builder{}
|
||||
_, warns, err = b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("should not have error: %s", err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestBuilderPrepare_HardDriveInterface(t *testing.T) {
|
||||
var b Builder
|
||||
config := testConfig()
|
||||
|
||||
// Test a default boot_wait
|
||||
delete(config, "hard_drive_interface")
|
||||
_, warns, err := b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
if b.config.HardDriveInterface != "sata" {
|
||||
t.Fatalf("bad: %s", b.config.HardDriveInterface)
|
||||
}
|
||||
|
||||
// Test with a bad
|
||||
config["hard_drive_interface"] = "fake"
|
||||
b = Builder{}
|
||||
_, warns, err = b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err == nil {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
|
||||
// Test with a good
|
||||
config["hard_drive_interface"] = "scsi"
|
||||
b = Builder{}
|
||||
_, warns, err = b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("should not have error: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuilderPrepare_InvalidKey(t *testing.T) {
|
||||
var b Builder
|
||||
config := testConfig()
|
||||
|
||||
// Add a random key
|
||||
config["i_should_not_be_valid"] = true
|
||||
_, warns, err := b.Prepare(config)
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err == nil {
|
||||
t.Fatal("should have error")
|
||||
}
|
||||
}
|
|
@ -1,113 +0,0 @@
|
|||
package pvm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
)
|
||||
|
||||
func testConfig(t *testing.T) map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"ssh_username": "foo",
|
||||
"shutdown_command": "foo",
|
||||
"parallels_tools_flavor": "lin",
|
||||
"source_path": "config_test.go",
|
||||
}
|
||||
}
|
||||
|
||||
func getTempFile(t *testing.T) *os.File {
|
||||
tf, err := ioutil.TempFile("", "packer")
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
tf.Close()
|
||||
|
||||
// don't forget to cleanup the file downstream:
|
||||
// defer os.Remove(tf.Name())
|
||||
|
||||
return tf
|
||||
}
|
||||
|
||||
func testConfigErr(t *testing.T, warns []string, err error) {
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err == nil {
|
||||
t.Fatal("should error")
|
||||
}
|
||||
}
|
||||
|
||||
func testConfigOk(t *testing.T, warns []string, err error) {
|
||||
if len(warns) > 0 {
|
||||
t.Fatalf("bad: %#v", warns)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("bad: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewConfig_sourcePath(t *testing.T) {
|
||||
// Bad
|
||||
c := testConfig(t)
|
||||
delete(c, "source_path")
|
||||
warns, errs := (&Config{}).Prepare(c)
|
||||
testConfigErr(t, warns, errs)
|
||||
|
||||
// Bad
|
||||
c = testConfig(t)
|
||||
c["source_path"] = "/i/dont/exist"
|
||||
warns, errs = (&Config{}).Prepare(c)
|
||||
testConfigErr(t, warns, errs)
|
||||
|
||||
// Good
|
||||
tf := getTempFile(t)
|
||||
defer os.Remove(tf.Name())
|
||||
|
||||
c = testConfig(t)
|
||||
c["source_path"] = tf.Name()
|
||||
warns, errs = (&Config{}).Prepare(c)
|
||||
testConfigOk(t, warns, errs)
|
||||
}
|
||||
|
||||
func TestNewConfig_FloppyFiles(t *testing.T) {
|
||||
c := testConfig(t)
|
||||
floppies_path := "../../test-fixtures/floppies"
|
||||
c["floppy_files"] = []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)}
|
||||
_, err := (&Config{}).Prepare(c)
|
||||
if err != nil {
|
||||
t.Fatalf("should not have error: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewConfig_InvalidFloppies(t *testing.T) {
|
||||
c := testConfig(t)
|
||||
c["floppy_files"] = []string{"nonexistent.bat", "nonexistent.ps1"}
|
||||
_, errs := (&Config{}).Prepare(c)
|
||||
if errs == nil {
|
||||
t.Fatalf("Nonexistent floppies should trigger multierror")
|
||||
}
|
||||
|
||||
if len(errs.(*packersdk.MultiError).Errors) != 2 {
|
||||
t.Fatalf("Multierror should work and report 2 errors")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewConfig_shutdown_timeout(t *testing.T) {
|
||||
cfg := testConfig(t)
|
||||
tf := getTempFile(t)
|
||||
defer os.Remove(tf.Name())
|
||||
|
||||
// Expect this to fail
|
||||
cfg["source_path"] = tf.Name()
|
||||
cfg["shutdown_timeout"] = "NaN"
|
||||
warns, errs := (&Config{}).Prepare(cfg)
|
||||
testConfigErr(t, warns, errs)
|
||||
|
||||
// Passes when given a valid time duration
|
||||
cfg["shutdown_timeout"] = "10s"
|
||||
warns, errs = (&Config{}).Prepare(cfg)
|
||||
testConfigOk(t, warns, errs)
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package pvm
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
func testState(t *testing.T) multistep.StateBag {
|
||||
state := new(multistep.BasicStateBag)
|
||||
state.Put("driver", new(parallelscommon.DriverMock))
|
||||
state.Put("ui", &packersdk.BasicUi{
|
||||
Reader: new(bytes.Buffer),
|
||||
Writer: new(bytes.Buffer),
|
||||
})
|
||||
return state
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
package version
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/packer-plugin-sdk/version"
|
||||
packerVersion "github.com/hashicorp/packer/version"
|
||||
)
|
||||
|
||||
var ParallelsPluginVersion *version.PluginVersion
|
||||
|
||||
func init() {
|
||||
ParallelsPluginVersion = version.InitializePluginVersion(
|
||||
packerVersion.Version, packerVersion.VersionPrerelease)
|
||||
}
|
|
@ -33,8 +33,6 @@ import (
|
|||
openstackbuilder "github.com/hashicorp/packer/builder/openstack"
|
||||
oracleclassicbuilder "github.com/hashicorp/packer/builder/oracle/classic"
|
||||
oracleocibuilder "github.com/hashicorp/packer/builder/oracle/oci"
|
||||
parallelsisobuilder "github.com/hashicorp/packer/builder/parallels/iso"
|
||||
parallelspvmbuilder "github.com/hashicorp/packer/builder/parallels/pvm"
|
||||
profitbricksbuilder "github.com/hashicorp/packer/builder/profitbricks"
|
||||
scalewaybuilder "github.com/hashicorp/packer/builder/scaleway"
|
||||
tencentcloudcvmbuilder "github.com/hashicorp/packer/builder/tencentcloud/cvm"
|
||||
|
@ -97,8 +95,6 @@ var Builders = map[string]packersdk.Builder{
|
|||
"openstack": new(openstackbuilder.Builder),
|
||||
"oracle-classic": new(oracleclassicbuilder.Builder),
|
||||
"oracle-oci": new(oracleocibuilder.Builder),
|
||||
"parallels-iso": new(parallelsisobuilder.Builder),
|
||||
"parallels-pvm": new(parallelspvmbuilder.Builder),
|
||||
"profitbricks": new(profitbricksbuilder.Builder),
|
||||
"scaleway": new(scalewaybuilder.Builder),
|
||||
"tencentcloud-cvm": new(tencentcloudcvmbuilder.Builder),
|
||||
|
|
|
@ -30,6 +30,8 @@ import (
|
|||
oscbsusurrogatebuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/bsusurrogate"
|
||||
oscbsuvolumebuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/bsuvolume"
|
||||
oscchrootbuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/chroot"
|
||||
parallelsisobuilder "github.com/hashicorp/packer-plugin-parallels/builder/parallels/iso"
|
||||
parallelspvmbuilder "github.com/hashicorp/packer-plugin-parallels/builder/parallels/pvm"
|
||||
proxmoxclone "github.com/hashicorp/packer-plugin-proxmox/builder/proxmox/clone"
|
||||
proxmoxiso "github.com/hashicorp/packer-plugin-proxmox/builder/proxmox/iso"
|
||||
qemubuilder "github.com/hashicorp/packer-plugin-qemu/builder/qemu"
|
||||
|
@ -65,6 +67,8 @@ var VendoredBuilders = map[string]packersdk.Builder{
|
|||
"proxmox": new(proxmoxiso.Builder),
|
||||
"proxmox-iso": new(proxmoxiso.Builder),
|
||||
"proxmox-clone": new(proxmoxclone.Builder),
|
||||
"parallels-iso": new(parallelsisobuilder.Builder),
|
||||
"parallels-pvm": new(parallelspvmbuilder.Builder),
|
||||
"qemu": new(qemubuilder.Builder),
|
||||
"vsphere-clone": new(vsphereclonebuilder.Builder),
|
||||
"vsphere-iso": new(vsphereisobuilder.Builder),
|
||||
|
|
2
go.mod
2
go.mod
|
@ -9,7 +9,6 @@ require (
|
|||
github.com/Azure/go-autorest/autorest/azure/cli v0.3.1
|
||||
github.com/Azure/go-autorest/autorest/date v0.2.0
|
||||
github.com/Azure/go-autorest/autorest/to v0.3.0
|
||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022
|
||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190418113227-25233c783f4e
|
||||
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20170113022742-e6dbea820a9f
|
||||
github.com/approvals/go-approval-tests v0.0.0-20160714161514-ad96e53bea43
|
||||
|
@ -48,6 +47,7 @@ require (
|
|||
github.com/hashicorp/packer-plugin-googlecompute v0.0.1
|
||||
github.com/hashicorp/packer-plugin-ncloud v0.0.2
|
||||
github.com/hashicorp/packer-plugin-outscale v0.0.1
|
||||
github.com/hashicorp/packer-plugin-parallels v0.0.1
|
||||
github.com/hashicorp/packer-plugin-proxmox v0.0.2
|
||||
github.com/hashicorp/packer-plugin-qemu v0.0.1
|
||||
github.com/hashicorp/packer-plugin-sdk v0.2.0
|
||||
|
|
5
go.sum
5
go.sum
|
@ -79,8 +79,9 @@ github.com/Azure/go-ntlmssp v0.0.0-20191115201650-bad6df29494a h1:3FwiePtHk5YJro
|
|||
github.com/Azure/go-ntlmssp v0.0.0-20191115201650-bad6df29494a/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022 h1:y8Gs8CzNfDF5AZvjr+5UyGQvQEBL7pwo+v+wX6q9JI8=
|
||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
|
||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20210404020558-97928f7e12b6 h1:w0E0fgc1YafGEh5cROhlROMWXiNoZqApk2PDN0M1+Ns=
|
||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20210404020558-97928f7e12b6/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
|
||||
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/NaverCloudPlatform/ncloud-sdk-go-v2 v1.1.0/go.mod h1:P+3VS0ETiQPyWOx3vB/oeC8J3qd7jnVZLYAFwWgGRt8=
|
||||
github.com/NaverCloudPlatform/ncloud-sdk-go-v2 v1.2.0 h1:c7GgSBfMt51UGM4SI1F7IFOokOVZO+uxNcJL3Xsmkp4=
|
||||
|
@ -468,6 +469,8 @@ github.com/hashicorp/packer-plugin-ncloud v0.0.2 h1:MGvGkOVfzeosqOSs5dteghLwv9VR
|
|||
github.com/hashicorp/packer-plugin-ncloud v0.0.2/go.mod h1:Hud2R1pkky96TQy3TPTTrr9Kej4b/4dqC/v+uEE0VDY=
|
||||
github.com/hashicorp/packer-plugin-outscale v0.0.1 h1:BrL8hKypNYrvP3NR+d+xX03SZKB08yTgXPRnH9piUI8=
|
||||
github.com/hashicorp/packer-plugin-outscale v0.0.1/go.mod h1:6jEWfJO7TgAbaL3e+St1bN5PoIC/MmDIsYqNUzAHF1w=
|
||||
github.com/hashicorp/packer-plugin-parallels v0.0.1 h1:fcaaiGWdU1+X4IGadXdUhJ2si1ZA3apXS9tMNJXln2A=
|
||||
github.com/hashicorp/packer-plugin-parallels v0.0.1/go.mod h1:FGNtZ7XFBr3IYuj7uvJtSaNnyhAwe457zP464m06+20=
|
||||
github.com/hashicorp/packer-plugin-proxmox v0.0.2 h1:x6QW7PeKh+IJymPEt3QdpBhSRi5vqXb8qTWv7rMLuns=
|
||||
github.com/hashicorp/packer-plugin-proxmox v0.0.2/go.mod h1:3URutEWX1yy10qcHNJncS4OMpZknA1FyvlrfL+5usYk=
|
||||
github.com/hashicorp/packer-plugin-qemu v0.0.1 h1:yGnmWf4Z+ZmOJXJF6w23V2KChtTCiPHsFnfg7+LRu74=
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
# goxpath [![GoDoc](https://godoc.org/gopkg.in/src-d/go-git.v2?status.svg)](https://godoc.org/github.com/ChrisTrenkamp/goxpath) [![Build Status](https://travis-ci.org/ChrisTrenkamp/goxpath.svg?branch=master)](https://travis-ci.org/ChrisTrenkamp/goxpath) [![codecov.io](https://codecov.io/github/ChrisTrenkamp/goxpath/coverage.svg?branch=master)](https://codecov.io/github/ChrisTrenkamp/goxpath?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/ChrisTrenkamp/goxpath)](https://goreportcard.com/report/github.com/ChrisTrenkamp/goxpath)
|
||||
An XPath 1.0 implementation written in Go. See the [wiki](https://github.com/ChrisTrenkamp/goxpath/wiki) for more information.
|
||||
# Deprecated. Use [xsel](https://github.com/ChrisTrenkamp/xsel) instead.
|
||||
|
|
|
@ -27,12 +27,12 @@ var beginPathType = map[lexer.XItemType]bool{
|
|||
func (n *Node) add(i lexer.XItem) {
|
||||
if n.Val.Typ == Empty {
|
||||
n.Val = i
|
||||
} else if n.Left == nil {
|
||||
} else if n.Left == nil && n.Right == nil {
|
||||
n.Left = &Node{Val: n.Val, Parent: n}
|
||||
n.Val = i
|
||||
} else if beginPathType[n.Val.Typ] {
|
||||
next := &Node{Val: n.Val, Left: n.Left, Parent: n}
|
||||
n.Left = next
|
||||
next := &Node{Val: n.Val, Left: n.Left, Right: n.Right, Parent: n}
|
||||
n.Left, n.Right = next, nil
|
||||
n.Val = i
|
||||
} else if n.Right == nil {
|
||||
n.Right = &Node{Val: i, Parent: n}
|
||||
|
|
|
@ -128,6 +128,12 @@ func xiEndPath(p *parseStack, i lexer.XItem) {
|
|||
}
|
||||
|
||||
func xiFunc(p *parseStack, i lexer.XItem) {
|
||||
if p.cur.Val.Typ == Empty {
|
||||
p.cur.pushNotEmpty(i)
|
||||
p.push(funcState)
|
||||
p.cur = p.cur.next
|
||||
return
|
||||
}
|
||||
p.cur.push(i)
|
||||
p.cur = p.cur.next
|
||||
p.push(funcState)
|
||||
|
|
|
@ -0,0 +1,373 @@
|
|||
Mozilla Public License Version 2.0
|
||||
==================================
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
1.1. "Contributor"
|
||||
means each individual or legal entity that creates, contributes to
|
||||
the creation of, or owns Covered Software.
|
||||
|
||||
1.2. "Contributor Version"
|
||||
means the combination of the Contributions of others (if any) used
|
||||
by a Contributor and that particular Contributor's Contribution.
|
||||
|
||||
1.3. "Contribution"
|
||||
means Covered Software of a particular Contributor.
|
||||
|
||||
1.4. "Covered Software"
|
||||
means Source Code Form to which the initial Contributor has attached
|
||||
the notice in Exhibit A, the Executable Form of such Source Code
|
||||
Form, and Modifications of such Source Code Form, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.5. "Incompatible With Secondary Licenses"
|
||||
means
|
||||
|
||||
(a) that the initial Contributor has attached the notice described
|
||||
in Exhibit B to the Covered Software; or
|
||||
|
||||
(b) that the Covered Software was made available under the terms of
|
||||
version 1.1 or earlier of the License, but not also under the
|
||||
terms of a Secondary License.
|
||||
|
||||
1.6. "Executable Form"
|
||||
means any form of the work other than Source Code Form.
|
||||
|
||||
1.7. "Larger Work"
|
||||
means a work that combines Covered Software with other material, in
|
||||
a separate file or files, that is not Covered Software.
|
||||
|
||||
1.8. "License"
|
||||
means this document.
|
||||
|
||||
1.9. "Licensable"
|
||||
means having the right to grant, to the maximum extent possible,
|
||||
whether at the time of the initial grant or subsequently, any and
|
||||
all of the rights conveyed by this License.
|
||||
|
||||
1.10. "Modifications"
|
||||
means any of the following:
|
||||
|
||||
(a) any file in Source Code Form that results from an addition to,
|
||||
deletion from, or modification of the contents of Covered
|
||||
Software; or
|
||||
|
||||
(b) any new file in Source Code Form that contains any Covered
|
||||
Software.
|
||||
|
||||
1.11. "Patent Claims" of a Contributor
|
||||
means any patent claim(s), including without limitation, method,
|
||||
process, and apparatus claims, in any patent Licensable by such
|
||||
Contributor that would be infringed, but for the grant of the
|
||||
License, by the making, using, selling, offering for sale, having
|
||||
made, import, or transfer of either its Contributions or its
|
||||
Contributor Version.
|
||||
|
||||
1.12. "Secondary License"
|
||||
means either the GNU General Public License, Version 2.0, the GNU
|
||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||
Public License, Version 3.0, or any later versions of those
|
||||
licenses.
|
||||
|
||||
1.13. "Source Code Form"
|
||||
means the form of the work preferred for making modifications.
|
||||
|
||||
1.14. "You" (or "Your")
|
||||
means an individual or a legal entity exercising rights under this
|
||||
License. For legal entities, "You" includes any entity that
|
||||
controls, is controlled by, or is under common control with You. For
|
||||
purposes of this definition, "control" means (a) the power, direct
|
||||
or indirect, to cause the direction or management of such entity,
|
||||
whether by contract or otherwise, or (b) ownership of more than
|
||||
fifty percent (50%) of the outstanding shares or beneficial
|
||||
ownership of such entity.
|
||||
|
||||
2. License Grants and Conditions
|
||||
--------------------------------
|
||||
|
||||
2.1. Grants
|
||||
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license:
|
||||
|
||||
(a) under intellectual property rights (other than patent or trademark)
|
||||
Licensable by such Contributor to use, reproduce, make available,
|
||||
modify, display, perform, distribute, and otherwise exploit its
|
||||
Contributions, either on an unmodified basis, with Modifications, or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||
for sale, have made, import, and otherwise transfer either its
|
||||
Contributions or its Contributor Version.
|
||||
|
||||
2.2. Effective Date
|
||||
|
||||
The licenses granted in Section 2.1 with respect to any Contribution
|
||||
become effective for each Contribution on the date the Contributor first
|
||||
distributes such Contribution.
|
||||
|
||||
2.3. Limitations on Grant Scope
|
||||
|
||||
The licenses granted in this Section 2 are the only rights granted under
|
||||
this License. No additional rights or licenses will be implied from the
|
||||
distribution or licensing of Covered Software under this License.
|
||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||
Contributor:
|
||||
|
||||
(a) for any code that a Contributor has removed from Covered Software;
|
||||
or
|
||||
|
||||
(b) for infringements caused by: (i) Your and any other third party's
|
||||
modifications of Covered Software, or (ii) the combination of its
|
||||
Contributions with other software (except as part of its Contributor
|
||||
Version); or
|
||||
|
||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||
its Contributions.
|
||||
|
||||
This License does not grant any rights in the trademarks, service marks,
|
||||
or logos of any Contributor (except as may be necessary to comply with
|
||||
the notice requirements in Section 3.4).
|
||||
|
||||
2.4. Subsequent Licenses
|
||||
|
||||
No Contributor makes additional grants as a result of Your choice to
|
||||
distribute the Covered Software under a subsequent version of this
|
||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||
permitted under the terms of Section 3.3).
|
||||
|
||||
2.5. Representation
|
||||
|
||||
Each Contributor represents that the Contributor believes its
|
||||
Contributions are its original creation(s) or it has sufficient rights
|
||||
to grant the rights to its Contributions conveyed by this License.
|
||||
|
||||
2.6. Fair Use
|
||||
|
||||
This License is not intended to limit any rights You have under
|
||||
applicable copyright doctrines of fair use, fair dealing, or other
|
||||
equivalents.
|
||||
|
||||
2.7. Conditions
|
||||
|
||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||
in Section 2.1.
|
||||
|
||||
3. Responsibilities
|
||||
-------------------
|
||||
|
||||
3.1. Distribution of Source Form
|
||||
|
||||
All distribution of Covered Software in Source Code Form, including any
|
||||
Modifications that You create or to which You contribute, must be under
|
||||
the terms of this License. You must inform recipients that the Source
|
||||
Code Form of the Covered Software is governed by the terms of this
|
||||
License, and how they can obtain a copy of this License. You may not
|
||||
attempt to alter or restrict the recipients' rights in the Source Code
|
||||
Form.
|
||||
|
||||
3.2. Distribution of Executable Form
|
||||
|
||||
If You distribute Covered Software in Executable Form then:
|
||||
|
||||
(a) such Covered Software must also be made available in Source Code
|
||||
Form, as described in Section 3.1, and You must inform recipients of
|
||||
the Executable Form how they can obtain a copy of such Source Code
|
||||
Form by reasonable means in a timely manner, at a charge no more
|
||||
than the cost of distribution to the recipient; and
|
||||
|
||||
(b) You may distribute such Executable Form under the terms of this
|
||||
License, or sublicense it under different terms, provided that the
|
||||
license for the Executable Form does not attempt to limit or alter
|
||||
the recipients' rights in the Source Code Form under this License.
|
||||
|
||||
3.3. Distribution of a Larger Work
|
||||
|
||||
You may create and distribute a Larger Work under terms of Your choice,
|
||||
provided that You also comply with the requirements of this License for
|
||||
the Covered Software. If the Larger Work is a combination of Covered
|
||||
Software with a work governed by one or more Secondary Licenses, and the
|
||||
Covered Software is not Incompatible With Secondary Licenses, this
|
||||
License permits You to additionally distribute such Covered Software
|
||||
under the terms of such Secondary License(s), so that the recipient of
|
||||
the Larger Work may, at their option, further distribute the Covered
|
||||
Software under the terms of either this License or such Secondary
|
||||
License(s).
|
||||
|
||||
3.4. Notices
|
||||
|
||||
You may not remove or alter the substance of any license notices
|
||||
(including copyright notices, patent notices, disclaimers of warranty,
|
||||
or limitations of liability) contained within the Source Code Form of
|
||||
the Covered Software, except that You may alter any license notices to
|
||||
the extent required to remedy known factual inaccuracies.
|
||||
|
||||
3.5. Application of Additional Terms
|
||||
|
||||
You may choose to offer, and to charge a fee for, warranty, support,
|
||||
indemnity or liability obligations to one or more recipients of Covered
|
||||
Software. However, You may do so only on Your own behalf, and not on
|
||||
behalf of any Contributor. You must make it absolutely clear that any
|
||||
such warranty, support, indemnity, or liability obligation is offered by
|
||||
You alone, and You hereby agree to indemnify every Contributor for any
|
||||
liability incurred by such Contributor as a result of warranty, support,
|
||||
indemnity or liability terms You offer. You may include additional
|
||||
disclaimers of warranty and limitations of liability specific to any
|
||||
jurisdiction.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation
|
||||
---------------------------------------------------
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Software due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description must
|
||||
be placed in a text file included with all distributions of the Covered
|
||||
Software under this License. Except to the extent prohibited by statute
|
||||
or regulation, such description must be sufficiently detailed for a
|
||||
recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Termination
|
||||
--------------
|
||||
|
||||
5.1. The rights granted under this License will terminate automatically
|
||||
if You fail to comply with any of its terms. However, if You become
|
||||
compliant, then the rights granted under this License from a particular
|
||||
Contributor are reinstated (a) provisionally, unless and until such
|
||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||
ongoing basis, if such Contributor fails to notify You of the
|
||||
non-compliance by some reasonable means prior to 60 days after You have
|
||||
come back into compliance. Moreover, Your grants from a particular
|
||||
Contributor are reinstated on an ongoing basis if such Contributor
|
||||
notifies You of the non-compliance by some reasonable means, this is the
|
||||
first time You have received notice of non-compliance with this License
|
||||
from such Contributor, and You become compliant prior to 30 days after
|
||||
Your receipt of the notice.
|
||||
|
||||
5.2. If You initiate litigation against any entity by asserting a patent
|
||||
infringement claim (excluding declaratory judgment actions,
|
||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||
directly or indirectly infringes any patent, then the rights granted to
|
||||
You by any and all Contributors for the Covered Software under Section
|
||||
2.1 of this License shall terminate.
|
||||
|
||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||
end user license agreements (excluding distributors and resellers) which
|
||||
have been validly granted by You or Your distributors under this License
|
||||
prior to termination shall survive termination.
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 6. Disclaimer of Warranty *
|
||||
* ------------------------- *
|
||||
* *
|
||||
* Covered Software is provided under this License on an "as is" *
|
||||
* basis, without warranty of any kind, either expressed, implied, or *
|
||||
* statutory, including, without limitation, warranties that the *
|
||||
* Covered Software is free of defects, merchantable, fit for a *
|
||||
* particular purpose or non-infringing. The entire risk as to the *
|
||||
* quality and performance of the Covered Software is with You. *
|
||||
* Should any Covered Software prove defective in any respect, You *
|
||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||
* essential part of this License. No use of any Covered Software is *
|
||||
* authorized under this License except under this disclaimer. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 7. Limitation of Liability *
|
||||
* -------------------------- *
|
||||
* *
|
||||
* Under no circumstances and under no legal theory, whether tort *
|
||||
* (including negligence), contract, or otherwise, shall any *
|
||||
* Contributor, or anyone who distributes Covered Software as *
|
||||
* permitted above, be liable to You for any direct, indirect, *
|
||||
* special, incidental, or consequential damages of any character *
|
||||
* including, without limitation, damages for lost profits, loss of *
|
||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||
* and all other commercial damages or losses, even if such party *
|
||||
* shall have been informed of the possibility of such damages. This *
|
||||
* limitation of liability shall not apply to liability for death or *
|
||||
* personal injury resulting from such party's negligence to the *
|
||||
* extent applicable law prohibits such limitation. Some *
|
||||
* jurisdictions do not allow the exclusion or limitation of *
|
||||
* incidental or consequential damages, so this exclusion and *
|
||||
* limitation may not apply to You. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
8. Litigation
|
||||
-------------
|
||||
|
||||
Any litigation relating to this License may be brought only in the
|
||||
courts of a jurisdiction where the defendant maintains its principal
|
||||
place of business and such litigation shall be governed by laws of that
|
||||
jurisdiction, without reference to its conflict-of-law provisions.
|
||||
Nothing in this Section shall prevent a party's ability to bring
|
||||
cross-claims or counter-claims.
|
||||
|
||||
9. Miscellaneous
|
||||
----------------
|
||||
|
||||
This License represents the complete agreement concerning the subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. Any law or regulation which provides
|
||||
that the language of a contract shall be construed against the drafter
|
||||
shall not be used to construe this License against a Contributor.
|
||||
|
||||
10. Versions of the License
|
||||
---------------------------
|
||||
|
||||
10.1. New Versions
|
||||
|
||||
Mozilla Foundation is the license steward. Except as provided in Section
|
||||
10.3, no one other than the license steward has the right to modify or
|
||||
publish new versions of this License. Each version will be given a
|
||||
distinguishing version number.
|
||||
|
||||
10.2. Effect of New Versions
|
||||
|
||||
You may distribute the Covered Software under the terms of the version
|
||||
of the License under which You originally received the Covered Software,
|
||||
or under the terms of any subsequent version published by the license
|
||||
steward.
|
||||
|
||||
10.3. Modified Versions
|
||||
|
||||
If you create software not governed by this License, and you want to
|
||||
create a new license for such software, you may create and use a
|
||||
modified version of this License if you rename the license and remove
|
||||
any references to the name of the license steward (except to note that
|
||||
such modified license differs from this License).
|
||||
|
||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||
Licenses
|
||||
|
||||
If You choose to distribute Source Code Form that is Incompatible With
|
||||
Secondary Licenses under the terms of this version of the License, the
|
||||
notice described in Exhibit B of this License must be attached.
|
||||
|
||||
Exhibit A - Source Code Form License Notice
|
||||
-------------------------------------------
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to look
|
||||
for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
|
||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||
---------------------------------------------------------
|
||||
|
||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||
defined by the Mozilla Public License, v. 2.0.
|
|
@ -285,7 +285,7 @@ func (d *Parallels9Driver) Version() (string, error) {
|
|||
func (d *Parallels9Driver) SendKeyScanCodes(vmName string, codes ...string) error {
|
||||
var stdout, stderr bytes.Buffer
|
||||
|
||||
if codes == nil || len(codes) == 0 {
|
||||
if len(codes) == 0 {
|
||||
log.Printf("No scan codes to send")
|
||||
return nil
|
||||
}
|
|
@ -44,7 +44,7 @@ func (s *StepAttachFloppy) Run(ctx context.Context, state multistep.StateBag) mu
|
|||
"--device-del", "fdd0",
|
||||
}
|
||||
// This will almost certainly fail with 'The fdd0 device does not exist.'
|
||||
driver.Prlctl(delCommand...)
|
||||
_ = driver.Prlctl(delCommand...)
|
||||
|
||||
ui.Say("Attaching floppy disk...")
|
||||
// Attaching the floppy disk
|
||||
|
@ -79,5 +79,5 @@ func (s *StepAttachFloppy) Cleanup(state multistep.StateBag) {
|
|||
"set", vmName,
|
||||
"--device-del", "fdd0",
|
||||
}
|
||||
driver.Prlctl(command...)
|
||||
_ = driver.Prlctl(command...)
|
||||
}
|
|
@ -9,6 +9,7 @@ import (
|
|||
"fmt"
|
||||
|
||||
"github.com/hashicorp/hcl/v2/hcldec"
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/bootcommand"
|
||||
"github.com/hashicorp/packer-plugin-sdk/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/communicator"
|
||||
|
@ -18,7 +19,6 @@ import (
|
|||
"github.com/hashicorp/packer-plugin-sdk/shutdowncommand"
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/config"
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
const BuilderId = "rickard-von-essen.parallels"
|
|
@ -5,9 +5,9 @@ import (
|
|||
"fmt"
|
||||
"log"
|
||||
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
// This step attaches the ISO to the virtual machine.
|
|
@ -5,9 +5,9 @@ import (
|
|||
"fmt"
|
||||
"strconv"
|
||||
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
// This step creates the virtual disk that will be used as the
|
|
@ -5,9 +5,9 @@ import (
|
|||
"fmt"
|
||||
"strconv"
|
||||
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
// This step creates the actual virtual machine.
|
|
@ -4,9 +4,9 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
// This step sets the device boot order for the virtual machine.
|
|
@ -6,11 +6,11 @@ import (
|
|||
"fmt"
|
||||
|
||||
"github.com/hashicorp/hcl/v2/hcldec"
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/communicator"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep/commonsteps"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
// Builder implements packersdk.Builder and builds the actual Parallels
|
|
@ -7,6 +7,7 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/bootcommand"
|
||||
"github.com/hashicorp/packer-plugin-sdk/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep/commonsteps"
|
||||
|
@ -14,7 +15,6 @@ import (
|
|||
"github.com/hashicorp/packer-plugin-sdk/shutdowncommand"
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/config"
|
||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
// Config is the configuration structure for the builder.
|
|
@ -4,9 +4,9 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
|
||||
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
||||
)
|
||||
|
||||
// This step imports an PVM VM into Parallels.
|
|
@ -54,8 +54,7 @@ github.com/Azure/go-autorest/logger
|
|||
github.com/Azure/go-autorest/tracing
|
||||
# github.com/Azure/go-ntlmssp v0.0.0-20191115201650-bad6df29494a
|
||||
github.com/Azure/go-ntlmssp
|
||||
# github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022
|
||||
## explicit
|
||||
# github.com/ChrisTrenkamp/goxpath v0.0.0-20210404020558-97928f7e12b6
|
||||
github.com/ChrisTrenkamp/goxpath
|
||||
github.com/ChrisTrenkamp/goxpath/internal/execxp
|
||||
github.com/ChrisTrenkamp/goxpath/internal/execxp/findutil
|
||||
|
@ -531,6 +530,11 @@ github.com/hashicorp/packer-plugin-outscale/builder/osc/bsuvolume
|
|||
github.com/hashicorp/packer-plugin-outscale/builder/osc/chroot
|
||||
github.com/hashicorp/packer-plugin-outscale/builder/osc/common
|
||||
github.com/hashicorp/packer-plugin-outscale/builder/osc/common/retry
|
||||
# github.com/hashicorp/packer-plugin-parallels v0.0.1
|
||||
## explicit
|
||||
github.com/hashicorp/packer-plugin-parallels/builder/parallels/common
|
||||
github.com/hashicorp/packer-plugin-parallels/builder/parallels/iso
|
||||
github.com/hashicorp/packer-plugin-parallels/builder/parallels/pvm
|
||||
# github.com/hashicorp/packer-plugin-proxmox v0.0.2
|
||||
## explicit
|
||||
github.com/hashicorp/packer-plugin-proxmox/builder/proxmox/clone
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
---
|
||||
description: |
|
||||
The Parallels Packer builder is able to create Parallels Desktop for Mac
|
||||
virtual machines and export them in the PVM format.
|
||||
page_title: Parallels - Builders
|
||||
---
|
||||
|
||||
# Parallels Builder
|
||||
|
||||
The Parallels Packer builder is able to create [Parallels Desktop for
|
||||
Mac](https://www.parallels.com/products/desktop/) virtual machines and export
|
||||
them in the PVM format.
|
||||
|
||||
Packer actually comes with multiple builders able to create Parallels machines,
|
||||
depending on the strategy you want to use to build the image. Packer supports
|
||||
the following Parallels builders:
|
||||
|
||||
- [parallels-iso](/docs/builders/parallels-iso) - Starts from an ISO
|
||||
file, creates a brand new Parallels VM, installs an OS, provisions software
|
||||
within the OS, then exports that machine to create an image. This is best
|
||||
for people who want to start from scratch.
|
||||
|
||||
- [parallels-pvm](/docs/builders/parallels-pvm) - This builder imports
|
||||
an existing PVM file, runs provisioners on top of that VM, and exports that
|
||||
machine to create an image. This is best if you have an existing Parallels
|
||||
VM export you want to use as the source. As an additional benefit, you can
|
||||
feed the artifact of this builder back into itself to iterate on a machine.
|
||||
|
||||
## Requirements
|
||||
|
||||
In addition to [Parallels Desktop for
|
||||
Mac](https://www.parallels.com/products/desktop/) this requires the [Parallels
|
||||
Virtualization SDK](https://www.parallels.com/downloads/desktop/).
|
||||
|
||||
The SDK can be installed by downloading and following the instructions in the
|
||||
dmg.
|
||||
|
||||
Parallels Desktop for Mac 9 and later is supported, from PD 11 Pro or Business
|
||||
edition is required.
|
|
@ -1,292 +0,0 @@
|
|||
---
|
||||
modeline: |
|
||||
vim: set ft=pandoc:
|
||||
description: |
|
||||
The Parallels Packer builder is able to create Parallels Desktop for Mac
|
||||
virtual machines and export them in the PVM format, starting from an ISO
|
||||
image.
|
||||
page_title: Parallels ISO - Builders
|
||||
---
|
||||
|
||||
# Parallels Builder (from an ISO)
|
||||
|
||||
Type: `parallels-iso`
|
||||
Artifact BuilderId: `packer.parallels`
|
||||
|
||||
The Parallels Packer builder is able to create [Parallels Desktop for
|
||||
Mac](https://www.parallels.com/products/desktop/) virtual machines and export
|
||||
them in the PVM format, starting from an ISO image.
|
||||
|
||||
The builder builds a virtual machine by creating a new virtual machine from
|
||||
scratch, booting it, installing an OS, provisioning software within the OS, then
|
||||
shutting it down. The result of the Parallels builder is a directory containing
|
||||
all the files necessary to run the virtual machine portably.
|
||||
|
||||
## Basic Example
|
||||
|
||||
Here is a basic example. This example is not functional. It will start the OS
|
||||
installer but then fail because we don't provide the preseed file for Ubuntu to
|
||||
self-install. Still, the example serves to show the basic configuration:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "parallels-iso",
|
||||
"guest_os_type": "ubuntu",
|
||||
"iso_url": "http://releases.ubuntu.com/12.04/ubuntu-12.04.3-server-amd64.iso",
|
||||
"iso_checksum": "2cbe868812a871242cdcdd8f2fd6feb9",
|
||||
"parallels_tools_flavor": "lin",
|
||||
"ssh_username": "packer",
|
||||
"ssh_password": "packer",
|
||||
"ssh_timeout": "30s",
|
||||
"shutdown_command": "echo 'packer' | sudo -S shutdown -P now"
|
||||
}
|
||||
```
|
||||
|
||||
It is important to add a `shutdown_command`. By default Packer halts the virtual
|
||||
machine and the file system may not be sync'd. Thus, changes made in a
|
||||
provisioner might not be saved.
|
||||
|
||||
## Configuration Reference
|
||||
|
||||
There are many configuration options available for the Parallels builder. They
|
||||
are organized below into two categories: required and optional. Within each
|
||||
category, the available options are alphabetized and described.
|
||||
|
||||
In addition to the options listed here, a
|
||||
[communicator](/docs/templates/legacy_json_templates/communicator) can be configured for this
|
||||
builder. In addition to the options defined there, a private key file
|
||||
can also be supplied to override the typical auto-generated key:
|
||||
|
||||
@include 'packer-plugin-sdk/communicator/SSH-Private-Key-File-not-required.mdx'
|
||||
|
||||
## ISO Configuration Reference
|
||||
|
||||
@include 'packer-plugin-sdk/multistep/commonsteps/ISOConfig.mdx'
|
||||
|
||||
### Required:
|
||||
|
||||
@include 'packer-plugin-sdk/multistep/commonsteps/ISOConfig-required.mdx'
|
||||
|
||||
### Optional:
|
||||
|
||||
@include 'packer-plugin-sdk/multistep/commonsteps/ISOConfig-not-required.mdx'
|
||||
|
||||
### Required:
|
||||
|
||||
- `parallels_tools_flavor` (string) - The flavor of the Parallels Tools ISO to
|
||||
install into the VM. Valid values are "win", "lin", "mac", "os2"
|
||||
and "other". This can be omitted only if `parallels_tools_mode`
|
||||
is "disable".
|
||||
|
||||
### Optional:
|
||||
|
||||
- `boot_command` (array of strings) - This is an array of commands to type
|
||||
when the virtual machine is first booted. The goal of these commands should
|
||||
be to type just enough to initialize the operating system installer. Special
|
||||
keys can be typed as well, and are covered in the section below on the
|
||||
boot command. If this is not specified, it is assumed the installer will
|
||||
start itself.
|
||||
|
||||
- `boot_wait` (string) - The time to wait after booting the initial virtual
|
||||
machine before typing the `boot_command`. The value of this should be
|
||||
a duration. Examples are "5s" and "1m30s" which will cause Packer to wait
|
||||
five seconds and one minute 30 seconds, respectively. If this isn't
|
||||
specified, the default is 10 seconds.
|
||||
|
||||
- `cpus` (number) - The number of cpus to use for building the VM.
|
||||
Defaults to `1`.
|
||||
|
||||
- `disk_size` (number) - The size, in megabytes, of the hard disk to create
|
||||
for the VM. By default, this is 40000 (about 40 GB).
|
||||
|
||||
- `disk_type` (string) - The type for image file based virtual disk drives,
|
||||
defaults to `expand`. Valid options are `expand` (expanding disk) that the
|
||||
image file is small initially and grows in size as you add data to it, and
|
||||
`plain` (plain disk) that the image file has a fixed size from the moment it
|
||||
is created (i.e the space is allocated for the full drive). Plain disks
|
||||
perform faster than expanding disks. `skip_compaction` will be set to true
|
||||
automatically for plain disks.
|
||||
|
||||
- `floppy_files` (array of strings) - A list of files to place onto a floppy
|
||||
disk that is attached when the VM is booted. This is most useful for
|
||||
unattended Windows installs, which look for an `Autounattend.xml` file on
|
||||
removable media. By default, no floppy will be attached. All files listed in
|
||||
this setting get placed into the root directory of the floppy and the floppy
|
||||
is attached as the first floppy device. Currently, no support exists for
|
||||
creating sub-directories on the floppy. Wildcard characters (\*, ?,
|
||||
and \[\]) are allowed. Directory names are also allowed, which will add all
|
||||
the files found in the directory to the floppy.
|
||||
|
||||
- `floppy_dirs` (array of strings) - A list of directories to place onto
|
||||
the floppy disk recursively. This is similar to the `floppy_files` option
|
||||
except that the directory structure is preserved. This is useful for when
|
||||
your floppy disk includes drivers or if you just want to organize it's
|
||||
contents as a hierarchy. Wildcard characters (\*, ?, and \[\]) are allowed.
|
||||
|
||||
- `floppy_label` (string) - The label to use for the floppy disk that
|
||||
is attached when the VM is booted. This is most useful for cloud-init,
|
||||
Kickstart or other early initialization tools, which can benefit from labelled floppy disks.
|
||||
By default, the floppy label will be 'packer'.
|
||||
|
||||
- `guest_os_type` (string) - The guest OS type being installed. By default
|
||||
this is "other", but you can get _dramatic_ performance improvements by
|
||||
setting this to the proper value. To view all available values for this run
|
||||
`prlctl create x --distribution list`. Setting the correct value hints to
|
||||
Parallels Desktop how to optimize the virtual hardware to work best with
|
||||
that operating system.
|
||||
|
||||
- `hard_drive_interface` (string) - The type of controller that the hard
|
||||
drives are attached to, defaults to "sata". Valid options are "sata", "ide",
|
||||
and "scsi".
|
||||
|
||||
- `host_interfaces` (array of strings) - A list of which interfaces on the
|
||||
host should be searched for a IP address. The first IP address found on one
|
||||
of these will be used as `{{ .HTTPIP }}` in the `boot_command`. Defaults to
|
||||
\["en0", "en1", "en2", "en3", "en4", "en5", "en6", "en7", "en8", "en9",
|
||||
"ppp0", "ppp1", "ppp2"\].
|
||||
|
||||
- `memory` (number) - The amount of memory to use for building the VM in
|
||||
megabytes. Defaults to `512` megabytes.
|
||||
|
||||
- `output_directory` (string) - This is the path to the directory where the
|
||||
resulting virtual machine will be created. This may be relative or absolute.
|
||||
If relative, the path is relative to the working directory when `packer`
|
||||
is executed. This directory must not exist or be empty prior to running
|
||||
the builder. By default this is "output-BUILDNAME" where "BUILDNAME" is the
|
||||
name of the build.
|
||||
|
||||
- `parallels_tools_guest_path` (string) - The path in the virtual machine to
|
||||
upload Parallels Tools. This only takes effect if `parallels_tools_mode`
|
||||
is "upload". This is a [configuration
|
||||
template](/docs/templates/legacy_json_templates/engine) that has a single
|
||||
valid variable: `Flavor`, which will be the value of
|
||||
`parallels_tools_flavor`. By default this is `prl-tools-{{.Flavor}}.iso`
|
||||
which should upload into the login directory of the user.
|
||||
|
||||
- `parallels_tools_mode` (string) - The method by which Parallels Tools are
|
||||
made available to the guest for installation. Valid options are "upload",
|
||||
"attach", or "disable". If the mode is "attach" the Parallels Tools ISO will
|
||||
be attached as a CD device to the virtual machine. If the mode is "upload"
|
||||
the Parallels Tools ISO will be uploaded to the path specified by
|
||||
`parallels_tools_guest_path`. The default value is "upload".
|
||||
|
||||
- `prlctl` (array of array of strings) - Custom `prlctl` commands to execute
|
||||
in order to further customize the virtual machine being created. The value
|
||||
of this is an array of commands to execute. The commands are executed in the
|
||||
order defined in the template. For each command, the command is defined
|
||||
itself as an array of strings, where each string represents a single
|
||||
argument on the command-line to `prlctl` (but excluding `prlctl` itself).
|
||||
Each arg is treated as a [configuration
|
||||
template](/docs/templates/legacy_json_templates/engine), where the `Name`
|
||||
variable is replaced with the VM name. More details on how to use `prlctl`
|
||||
are below.
|
||||
|
||||
- `prlctl_post` (array of array of strings) - Identical to `prlctl`, except
|
||||
that it is run after the virtual machine is shutdown, and before the virtual
|
||||
machine is exported.
|
||||
|
||||
- `prlctl_version_file` (string) - The path within the virtual machine to
|
||||
upload a file that contains the `prlctl` version that was used to create
|
||||
the machine. This information can be useful for provisioning. By default
|
||||
this is ".prlctl_version", which will generally upload it into the
|
||||
home directory.
|
||||
|
||||
- `shutdown_command` (string) - The command to use to gracefully shut down the
|
||||
machine once all the provisioning is done. By default this is an empty
|
||||
string, which tells Packer to just forcefully shut down the machine.
|
||||
|
||||
- `sound` (boolean) - Specifies whether to enable the sound device when
|
||||
building the VM. Defaults to `false`.
|
||||
|
||||
- `shutdown_timeout` (string) - The amount of time to wait after executing the
|
||||
`shutdown_command` for the virtual machine to actually shut down. If it
|
||||
doesn't shut down in this time, it is an error. By default, the timeout is
|
||||
"5m", or five minutes.
|
||||
|
||||
- `skip_compaction` (boolean) - Virtual disk image is compacted at the end of
|
||||
the build process using `prl_disk_tool` utility (except for the case that
|
||||
`disk_type` is set to `plain`). In certain rare cases, this might corrupt
|
||||
the resulting disk image. If you find this to be the case, you can disable
|
||||
compaction using this configuration value.
|
||||
|
||||
- `usb` (boolean) - Specifies whether to enable the USB bus when building
|
||||
the VM. Defaults to `false`.
|
||||
|
||||
- `vm_name` (string) - This is the name of the PVM directory for the new
|
||||
virtual machine, without the file extension. By default this is
|
||||
"packer-BUILDNAME", where "BUILDNAME" is the name of the build.
|
||||
|
||||
## Http directory configuration reference
|
||||
|
||||
@include 'packer-plugin-sdk/multistep/commonsteps/HTTPConfig.mdx'
|
||||
|
||||
### Optional:
|
||||
|
||||
@include 'packer-plugin-sdk/multistep/commonsteps/HTTPConfig-not-required.mdx'
|
||||
|
||||
## Boot Command
|
||||
|
||||
The `boot_command` configuration is very important: it specifies the keys to
|
||||
type when the virtual machine is first booted in order to start the OS
|
||||
installer. This command is typed after `boot_wait`, which gives the virtual
|
||||
machine some time to actually load the ISO.
|
||||
|
||||
As documented above, the `boot_command` is an array of strings. The strings are
|
||||
all typed in sequence. It is an array only to improve readability within the
|
||||
template.
|
||||
|
||||
The boot command is "typed" character for character (using the Parallels
|
||||
Virtualization SDK, see [Parallels Builder](/docs/builders/parallels))
|
||||
simulating a human actually typing the keyboard.
|
||||
|
||||
@include 'builders/boot-command.mdx'
|
||||
|
||||
Example boot command. This is actually a working boot command used to start an
|
||||
Ubuntu 12.04 installer:
|
||||
|
||||
```text
|
||||
[
|
||||
"<esc><esc><enter><wait>",
|
||||
"/install/vmlinuz noapic ",
|
||||
"preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg ",
|
||||
"debian-installer=en_US auto locale=en_US kbd-chooser/method=us ",
|
||||
"hostname={{ .Name }} ",
|
||||
"fb=false debconf/frontend=noninteractive ",
|
||||
"keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA ",
|
||||
"keyboard-configuration/variant=USA console-setup/ask_detect=false ",
|
||||
"initrd=/install/initrd.gz -- <enter>;"
|
||||
]
|
||||
```
|
||||
|
||||
For more examples of various boot commands, see the sample projects from our
|
||||
[community templates page](/community-tools#templates).
|
||||
|
||||
## prlctl Commands
|
||||
|
||||
In order to perform extra customization of the virtual machine, a template can
|
||||
define extra calls to `prlctl` to perform.
|
||||
[prlctl](http://download.parallels.com/desktop/v9/ga/docs/en_US/Parallels%20Command%20Line%20Reference%20Guide.pdf)
|
||||
is the command-line interface to Parallels Desktop. It can be used to configure
|
||||
the advanced virtual machine options.
|
||||
|
||||
Extra `prlctl` commands are defined in the template in the `prlctl` section. In the
|
||||
example below `prlctl` is used to explicitly enable the adaptive hypervisor, and
|
||||
disable 3d acceleration:
|
||||
|
||||
```json
|
||||
{
|
||||
"prlctl": [
|
||||
["set", "{{.Name}}", "--3d-accelerate", "off"],
|
||||
["set", "{{.Name}}", "--adaptive-hypervisor", "on"]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
The value of `prlctl` is an array of commands to execute. These commands are
|
||||
executed in the order defined. So in the above example, 3d acceleration will be disabled
|
||||
first, followed by the command which enables the adaptive hypervisor.
|
||||
|
||||
Each command itself is an array of strings, where each string is an argument to
|
||||
`prlctl`. Each argument is treated as a [template engine](/docs/templates/legacy_json_templates/engine). The only available
|
||||
variable is `Name` which is replaced with the unique name of the VM, which is
|
||||
required for many `prlctl` calls.
|
|
@ -1,224 +0,0 @@
|
|||
---
|
||||
modeline: |
|
||||
vim: set ft=pandoc:
|
||||
description: |
|
||||
This Parallels builder is able to create Parallels Desktop for Mac virtual
|
||||
machines and export them in the PVM format, starting from an existing PVM
|
||||
(exported virtual machine image).
|
||||
page_title: Parallels PVM - Builders
|
||||
---
|
||||
|
||||
# Parallels Builder (from a PVM)
|
||||
|
||||
Type: `parallels-pvm`
|
||||
Artifact BuilderId: `packer.parallels`
|
||||
|
||||
This Parallels builder is able to create [Parallels Desktop for
|
||||
Mac](https://www.parallels.com/products/desktop/) virtual machines and export
|
||||
them in the PVM format, starting from an existing PVM (exported virtual machine
|
||||
image).
|
||||
|
||||
The builder builds a virtual machine by importing an existing PVM file. It then
|
||||
boots this image, runs provisioners on this new VM, and exports that VM to
|
||||
create the image. The imported machine is deleted prior to finishing the build.
|
||||
|
||||
## Basic Example
|
||||
|
||||
Here is a basic example. This example is functional if you have an PVM matching
|
||||
the settings here.
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "parallels-pvm",
|
||||
"parallels_tools_flavor": "lin",
|
||||
"source_path": "source.pvm",
|
||||
"ssh_username": "packer",
|
||||
"ssh_password": "packer",
|
||||
"ssh_timeout": "30s",
|
||||
"shutdown_command": "echo 'packer' | sudo -S shutdown -P now"
|
||||
}
|
||||
```
|
||||
|
||||
It is important to add a `shutdown_command`. By default Packer halts the virtual
|
||||
machine and the file system may not be sync'd. Thus, changes made in a
|
||||
provisioner might not be saved.
|
||||
|
||||
## Configuration Reference
|
||||
|
||||
There are many configuration options available for the Parallels builder. They
|
||||
are organized below into two categories: required and optional. Within each
|
||||
category, the available options are alphabetized and described.
|
||||
|
||||
In addition to the options listed here, a
|
||||
[communicator](/docs/templates/legacy_json_templates/communicator) can be configured for this
|
||||
builder. In addition to the options defined there, a private key file
|
||||
can also be supplied to override the typical auto-generated key:
|
||||
|
||||
@include 'packer-plugin-sdk/communicator/SSH-Private-Key-File-not-required.mdx'
|
||||
|
||||
### Required:
|
||||
|
||||
- `parallels_tools_flavor` (string) - The flavor of the Parallels Tools ISO to
|
||||
install into the VM. Valid values are "win", "lin", "mac", "os2"
|
||||
and "other". This can be omitted only if `parallels_tools_mode`
|
||||
is "disable".
|
||||
|
||||
- `source_path` (string) - The path to a PVM directory that acts as the source
|
||||
of this build.
|
||||
|
||||
### Optional:
|
||||
|
||||
- `boot_command` (array of strings) - This is an array of commands to type
|
||||
when the virtual machine is first booted. The goal of these commands should
|
||||
be to type just enough to initialize the operating system installer. Special
|
||||
keys can be typed as well, and are covered in the section below on the
|
||||
boot command. If this is not specified, it is assumed the installer will
|
||||
start itself.
|
||||
|
||||
- `boot_wait` (string) - The time to wait after booting the initial virtual
|
||||
machine before typing the `boot_command`. The value of this should be
|
||||
a duration. Examples are "5s" and "1m30s" which will cause Packer to wait
|
||||
five seconds and one minute 30 seconds, respectively. If this isn't
|
||||
specified, the default is 10 seconds.
|
||||
|
||||
- `floppy_files` (array of strings) - A list of files to place onto a floppy
|
||||
disk that is attached when the VM is booted. This is most useful for
|
||||
unattended Windows installs, which look for an `Autounattend.xml` file on
|
||||
removable media. By default, no floppy will be attached. All files listed in
|
||||
this setting get placed into the root directory of the floppy and the floppy
|
||||
is attached as the first floppy device. Currently, no support exists for
|
||||
creating sub-directories on the floppy. Wildcard characters (\*, ?,
|
||||
and \[\]) are allowed. Directory names are also allowed, which will add all
|
||||
the files found in the directory to the floppy.
|
||||
|
||||
- `floppy_dirs` (array of strings) - A list of directories to place onto
|
||||
the floppy disk recursively. This is similar to the `floppy_files` option
|
||||
except that the directory structure is preserved. This is useful for when
|
||||
your floppy disk includes drivers or if you just want to organize it's
|
||||
contents as a hierarchy. Wildcard characters (\*, ?, and \[\]) are allowed.
|
||||
|
||||
- `floppy_label` (string) - The label to use for the floppy disk that
|
||||
is attached when the VM is booted. This is most useful for cloud-init,
|
||||
Kickstart or other early initialization tools, which can benefit from labelled floppy disks.
|
||||
By default, the floppy label will be 'packer'.
|
||||
|
||||
- `output_directory` (string) - This is the path to the directory where the
|
||||
resulting virtual machine will be created. This may be relative or absolute.
|
||||
If relative, the path is relative to the working directory when `packer`
|
||||
is executed. This directory must not exist or be empty prior to running
|
||||
the builder. By default this is "output-BUILDNAME" where "BUILDNAME" is the
|
||||
name of the build.
|
||||
|
||||
- `parallels_tools_guest_path` (string) - The path in the VM to upload
|
||||
Parallels Tools. This only takes effect if `parallels_tools_mode`
|
||||
is "upload". This is a [configuration
|
||||
template](/docs/templates/legacy_json_templates/engine) that has a single
|
||||
valid variable: `Flavor`, which will be the value of
|
||||
`parallels_tools_flavor`. By default this is `prl-tools-{{.Flavor}}.iso`
|
||||
which should upload into the login directory of the user.
|
||||
|
||||
- `parallels_tools_mode` (string) - The method by which Parallels Tools are
|
||||
made available to the guest for installation. Valid options are "upload",
|
||||
"attach", or "disable". If the mode is "attach" the Parallels Tools ISO will
|
||||
be attached as a CD device to the virtual machine. If the mode is "upload"
|
||||
the Parallels Tools ISO will be uploaded to the path specified by
|
||||
`parallels_tools_guest_path`. The default value is "upload".
|
||||
|
||||
- `prlctl` (array of array of strings) - Custom `prlctl` commands to execute
|
||||
in order to further customize the virtual machine being created. The value
|
||||
of this is an array of commands to execute. The commands are executed in the
|
||||
order defined in the template. For each command, the command is defined
|
||||
itself as an array of strings, where each string represents a single
|
||||
argument on the command-line to `prlctl` (but excluding `prlctl` itself).
|
||||
Each arg is treated as a [configuration
|
||||
template](/docs/templates/legacy_json_templates/engine), where the `Name`
|
||||
variable is replaced with the VM name. More details on how to use `prlctl`
|
||||
are below.
|
||||
|
||||
- `prlctl_post` (array of array of strings) - Identical to `prlctl`, except
|
||||
that it is run after the virtual machine is shutdown, and before the virtual
|
||||
machine is exported.
|
||||
|
||||
- `prlctl_version_file` (string) - The path within the virtual machine to
|
||||
upload a file that contains the `prlctl` version that was used to create
|
||||
the machine. This information can be useful for provisioning. By default
|
||||
this is ".prlctl_version", which will generally upload it into the
|
||||
home directory.
|
||||
|
||||
- `reassign_mac` (boolean) - If this is "false" the MAC address of the first
|
||||
NIC will reused when imported else a new MAC address will be generated
|
||||
by Parallels. Defaults to "false".
|
||||
|
||||
- `shutdown_command` (string) - The command to use to gracefully shut down the
|
||||
machine once all the provisioning is done. By default this is an empty
|
||||
string, which tells Packer to just forcefully shut down the machine.
|
||||
|
||||
- `shutdown_timeout` (string) - The amount of time to wait after executing the
|
||||
`shutdown_command` for the virtual machine to actually shut down. If it
|
||||
doesn't shut down in this time, it is an error. By default, the timeout is
|
||||
"5m", or five minutes.
|
||||
|
||||
- `skip_compaction` (boolean) - Virtual disk image is compacted at the end of
|
||||
the build process using `prl_disk_tool` utility. In certain rare cases, this
|
||||
might corrupt the resulting disk image. If you find this to be the case,
|
||||
you can disable compaction using this configuration value.
|
||||
|
||||
- `vm_name` (string) - This is the name of the virtual machine when it is
|
||||
imported as well as the name of the PVM directory when the virtual machine
|
||||
is exported. By default this is "packer-BUILDNAME", where "BUILDNAME" is the
|
||||
name of the build.
|
||||
|
||||
## Parallels Tools
|
||||
|
||||
After the virtual machine is up and the operating system is installed, Packer
|
||||
uploads the Parallels Tools into the virtual machine. The path where they are
|
||||
uploaded is controllable by `parallels_tools_path`, and defaults to
|
||||
"prl-tools.iso". Without an absolute path, it is uploaded to the home directory
|
||||
of the SSH user. Parallels Tools ISO's can be found in: "/Applications/Parallels
|
||||
Desktop.app/Contents/Resources/Tools/"
|
||||
|
||||
## Boot Command
|
||||
|
||||
The `boot_command` specifies the keys to type when the virtual machine is first
|
||||
booted. This command is typed after `boot_wait`.
|
||||
|
||||
As documented above, the `boot_command` is an array of strings. The strings are
|
||||
all typed in sequence. It is an array only to improve readability within the
|
||||
template.
|
||||
|
||||
The boot command is "typed" character for character (using the Parallels
|
||||
Virtualization SDK, see [Parallels Builder](/docs/builders/parallels))
|
||||
simulating a human actually typing the keyboard.
|
||||
|
||||
@include 'builders/boot-command.mdx'
|
||||
|
||||
## prlctl Commands
|
||||
|
||||
In order to perform extra customization of the virtual machine, a template can
|
||||
define extra calls to `prlctl` to perform.
|
||||
[prlctl](http://download.parallels.com/desktop/v9/ga/docs/en_US/Parallels%20Command%20Line%20Reference%20Guide.pdf)
|
||||
is the command-line interface to Parallels Desktop. It can be used to configure
|
||||
the virtual machine, such as set RAM, CPUs, etc.
|
||||
|
||||
Extra `prlctl` commands are defined in the template in the `prlctl` section. An
|
||||
example is shown below that sets the memory and number of CPUs within the
|
||||
virtual machine:
|
||||
|
||||
```json
|
||||
{
|
||||
"prlctl": [
|
||||
["set", "{{.Name}}", "--memsize", "1024"],
|
||||
["set", "{{.Name}}", "--cpus", "2"]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
The value of `prlctl` is an array of commands to execute. These commands are
|
||||
executed in the order defined. So in the above example, the memory will be set
|
||||
followed by the CPUs.
|
||||
|
||||
Each command itself is an array of strings, where each string is an argument to
|
||||
`prlctl`. Each argument is treated as a [configuration
|
||||
template](/docs/templates/legacy_json_templates/engine). The only available
|
||||
variable is `Name` which is replaced with the unique name of the VM, which is
|
||||
required for many `prlctl` calls.
|
|
@ -1,15 +0,0 @@
|
|||
<!-- Code generated from the comments of the HWConfig struct in builder/parallels/common/hw_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `cpus` (int) - The number of cpus to use for building the VM.
|
||||
Defaults to 1.
|
||||
|
||||
- `memory` (int) - The amount of memory to use for building the VM in
|
||||
megabytes. Defaults to 512 megabytes.
|
||||
|
||||
- `sound` (bool) - Specifies whether to enable the sound device when
|
||||
building the VM. Defaults to false.
|
||||
|
||||
- `usb` (bool) - Specifies whether to enable the USB bus when building
|
||||
the VM. Defaults to false.
|
||||
|
||||
<!-- End of code generated from the comments of the HWConfig struct in builder/parallels/common/hw_config.go; -->
|
|
@ -1,10 +0,0 @@
|
|||
<!-- Code generated from the comments of the OutputConfig struct in builder/parallels/common/output_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `output_directory` (string) - This is the path to the directory where the
|
||||
resulting virtual machine will be created. This may be relative or absolute.
|
||||
If relative, the path is relative to the working directory when packer
|
||||
is executed. This directory must not exist or be empty prior to running
|
||||
the builder. By default this is "output-BUILDNAME" where "BUILDNAME" is the
|
||||
name of the build.
|
||||
|
||||
<!-- End of code generated from the comments of the OutputConfig struct in builder/parallels/common/output_config.go; -->
|
|
@ -1,5 +0,0 @@
|
|||
<!-- Code generated from the comments of the OutputConfig struct in builder/parallels/common/output_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
OutputConfig contains the configuration for builder's output.
|
||||
|
||||
<!-- End of code generated from the comments of the OutputConfig struct in builder/parallels/common/output_config.go; -->
|
|
@ -1,14 +0,0 @@
|
|||
<!-- Code generated from the comments of the PrlctlConfig struct in builder/parallels/common/prlctl_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `prlctl` ([][]string) - Custom prlctl commands to execute
|
||||
in order to further customize the virtual machine being created. The value
|
||||
of this is an array of commands to execute. The commands are executed in the
|
||||
order defined in the template. For each command, the command is defined
|
||||
itself as an array of strings, where each string represents a single
|
||||
argument on the command-line to prlctl (but excluding prlctl itself).
|
||||
Each arg is treated as a configuration
|
||||
template, where the Name
|
||||
variable is replaced with the VM name. More details on how to use prlctl
|
||||
are below.
|
||||
|
||||
<!-- End of code generated from the comments of the PrlctlConfig struct in builder/parallels/common/prlctl_config.go; -->
|
|
@ -1,6 +0,0 @@
|
|||
<!-- Code generated from the comments of the PrlctlConfig struct in builder/parallels/common/prlctl_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
PrlctlConfig contains the configuration for running "prlctl" commands
|
||||
before the VM start.
|
||||
|
||||
<!-- End of code generated from the comments of the PrlctlConfig struct in builder/parallels/common/prlctl_config.go; -->
|
|
@ -1,7 +0,0 @@
|
|||
<!-- Code generated from the comments of the PrlctlPostConfig struct in builder/parallels/common/prlctl_post_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `prlctl_post` ([][]string) - Identical to prlctl, except
|
||||
that it is run after the virtual machine is shutdown, and before the virtual
|
||||
machine is exported.
|
||||
|
||||
<!-- End of code generated from the comments of the PrlctlPostConfig struct in builder/parallels/common/prlctl_post_config.go; -->
|
|
@ -1,6 +0,0 @@
|
|||
<!-- Code generated from the comments of the PrlctlPostConfig struct in builder/parallels/common/prlctl_post_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
PrlctlPostConfig contains the configuration for running "prlctl" commands
|
||||
in the end of artifact build.
|
||||
|
||||
<!-- End of code generated from the comments of the PrlctlPostConfig struct in builder/parallels/common/prlctl_post_config.go; -->
|
|
@ -1,9 +0,0 @@
|
|||
<!-- Code generated from the comments of the PrlctlVersionConfig struct in builder/parallels/common/prlctl_version_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `prlctl_version_file` (string) - The path within the virtual machine to
|
||||
upload a file that contains the prlctl version that was used to create
|
||||
the machine. This information can be useful for provisioning. By default
|
||||
this is ".prlctl_version", which will generally upload it into the
|
||||
home directory.
|
||||
|
||||
<!-- End of code generated from the comments of the PrlctlVersionConfig struct in builder/parallels/common/prlctl_version_config.go; -->
|
|
@ -1,5 +0,0 @@
|
|||
<!-- Code generated from the comments of the PrlctlVersionConfig struct in builder/parallels/common/prlctl_version_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
PrlctlVersionConfig contains the configuration for `prlctl` version.
|
||||
|
||||
<!-- End of code generated from the comments of the PrlctlVersionConfig struct in builder/parallels/common/prlctl_version_config.go; -->
|
|
@ -1,18 +0,0 @@
|
|||
<!-- Code generated from the comments of the ToolsConfig struct in builder/parallels/common/tools_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `parallels_tools_guest_path` (string) - The path in the virtual machine to
|
||||
upload Parallels Tools. This only takes effect if parallels_tools_mode
|
||||
is "upload". This is a configuration
|
||||
template that has a single
|
||||
valid variable: Flavor, which will be the value of
|
||||
parallels_tools_flavor. By default this is `prl-tools-{{.Flavor}}.iso`
|
||||
which should upload into the login directory of the user.
|
||||
|
||||
- `parallels_tools_mode` (string) - The method by which Parallels Tools are
|
||||
made available to the guest for installation. Valid options are "upload",
|
||||
"attach", or "disable". If the mode is "attach" the Parallels Tools ISO will
|
||||
be attached as a CD device to the virtual machine. If the mode is "upload"
|
||||
the Parallels Tools ISO will be uploaded to the path specified by
|
||||
parallels_tools_guest_path. The default value is "upload".
|
||||
|
||||
<!-- End of code generated from the comments of the ToolsConfig struct in builder/parallels/common/tools_config.go; -->
|
|
@ -1,8 +0,0 @@
|
|||
<!-- Code generated from the comments of the ToolsConfig struct in builder/parallels/common/tools_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `parallels_tools_flavor` (string) - The flavor of the Parallels Tools ISO to
|
||||
install into the VM. Valid values are "win", "lin", "mac", "os2"
|
||||
and "other". This can be omitted only if parallels_tools_mode
|
||||
is "disable".
|
||||
|
||||
<!-- End of code generated from the comments of the ToolsConfig struct in builder/parallels/common/tools_config.go; -->
|
|
@ -1,5 +0,0 @@
|
|||
<!-- Code generated from the comments of the ToolsConfig struct in builder/parallels/common/tools_config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
ToolsConfig contains the builder configuration related to Parallels Tools.
|
||||
|
||||
<!-- End of code generated from the comments of the ToolsConfig struct in builder/parallels/common/tools_config.go; -->
|
|
@ -1,41 +0,0 @@
|
|||
<!-- Code generated from the comments of the Config struct in builder/parallels/iso/builder.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `disk_size` (uint) - The size, in megabytes, of the hard disk to create
|
||||
for the VM. By default, this is 40000 (about 40 GB).
|
||||
|
||||
- `disk_type` (string) - The type for image file based virtual disk drives,
|
||||
defaults to expand. Valid options are expand (expanding disk) that the
|
||||
image file is small initially and grows in size as you add data to it, and
|
||||
plain (plain disk) that the image file has a fixed size from the moment it
|
||||
is created (i.e the space is allocated for the full drive). Plain disks
|
||||
perform faster than expanding disks. skip_compaction will be set to true
|
||||
automatically for plain disks.
|
||||
|
||||
- `guest_os_type` (string) - The guest OS type being installed. By default
|
||||
this is "other", but you can get dramatic performance improvements by
|
||||
setting this to the proper value. To view all available values for this run
|
||||
prlctl create x --distribution list. Setting the correct value hints to
|
||||
Parallels Desktop how to optimize the virtual hardware to work best with
|
||||
that operating system.
|
||||
|
||||
- `hard_drive_interface` (string) - The type of controller that the hard
|
||||
drives are attached to, defaults to "sata". Valid options are "sata", "ide",
|
||||
and "scsi".
|
||||
|
||||
- `host_interfaces` ([]string) - A list of which interfaces on the
|
||||
host should be searched for a IP address. The first IP address found on one
|
||||
of these will be used as `{{ .HTTPIP }}` in the boot_command. Defaults to
|
||||
["en0", "en1", "en2", "en3", "en4", "en5", "en6", "en7", "en8", "en9",
|
||||
"ppp0", "ppp1", "ppp2"].
|
||||
|
||||
- `skip_compaction` (bool) - Virtual disk image is compacted at the end of
|
||||
the build process using prl_disk_tool utility (except for the case that
|
||||
disk_type is set to plain). In certain rare cases, this might corrupt
|
||||
the resulting disk image. If you find this to be the case, you can disable
|
||||
compaction using this configuration value.
|
||||
|
||||
- `vm_name` (string) - This is the name of the PVM directory for the new
|
||||
virtual machine, without the file extension. By default this is
|
||||
"packer-BUILDNAME", where "BUILDNAME" is the name of the build.
|
||||
|
||||
<!-- End of code generated from the comments of the Config struct in builder/parallels/iso/builder.go; -->
|
|
@ -1,17 +0,0 @@
|
|||
<!-- Code generated from the comments of the Config struct in builder/parallels/pvm/config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `skip_compaction` (bool) - Virtual disk image is compacted at the end of
|
||||
the build process using prl_disk_tool utility (except for the case that
|
||||
disk_type is set to plain). In certain rare cases, this might corrupt
|
||||
the resulting disk image. If you find this to be the case, you can disable
|
||||
compaction using this configuration value.
|
||||
|
||||
- `vm_name` (string) - This is the name of the PVM directory for the new
|
||||
virtual machine, without the file extension. By default this is
|
||||
"packer-BUILDNAME", where "BUILDNAME" is the name of the build.
|
||||
|
||||
- `reassign_mac` (bool) - If this is "false" the MAC address of the first
|
||||
NIC will reused when imported else a new MAC address will be generated
|
||||
by Parallels. Defaults to "false".
|
||||
|
||||
<!-- End of code generated from the comments of the Config struct in builder/parallels/pvm/config.go; -->
|
|
@ -1,6 +0,0 @@
|
|||
<!-- Code generated from the comments of the Config struct in builder/parallels/pvm/config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
- `source_path` (string) - The path to a PVM directory that acts as the source
|
||||
of this build.
|
||||
|
||||
<!-- End of code generated from the comments of the Config struct in builder/parallels/pvm/config.go; -->
|
|
@ -1,5 +0,0 @@
|
|||
<!-- Code generated from the comments of the Config struct in builder/parallels/pvm/config.go; DO NOT EDIT MANUALLY -->
|
||||
|
||||
Config is the configuration structure for the builder.
|
||||
|
||||
<!-- End of code generated from the comments of the Config struct in builder/parallels/pvm/config.go; -->
|
|
@ -778,23 +778,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Parallels",
|
||||
"routes": [
|
||||
{
|
||||
"title": "Overview",
|
||||
"path": "builders/parallels"
|
||||
},
|
||||
{
|
||||
"title": "ISO",
|
||||
"path": "builders/parallels/iso"
|
||||
},
|
||||
{
|
||||
"title": "PVM",
|
||||
"path": "builders/parallels/pvm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "ProfitBricks",
|
||||
"path": "builders/profitbricks"
|
||||
|
|
|
@ -67,5 +67,11 @@
|
|||
"repo": "hashicorp/packer-plugin-outscale",
|
||||
"version": "latest",
|
||||
"pluginTier": "community"
|
||||
},
|
||||
{
|
||||
"title": "Parallels",
|
||||
"path": "parallels",
|
||||
"repo": "hashicorp/packer-plugin-parallels",
|
||||
"version": "latest"
|
||||
}
|
||||
]
|
||||
|
|
Loading…
Reference in New Issue