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"
|
openstackbuilder "github.com/hashicorp/packer/builder/openstack"
|
||||||
oracleclassicbuilder "github.com/hashicorp/packer/builder/oracle/classic"
|
oracleclassicbuilder "github.com/hashicorp/packer/builder/oracle/classic"
|
||||||
oracleocibuilder "github.com/hashicorp/packer/builder/oracle/oci"
|
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"
|
profitbricksbuilder "github.com/hashicorp/packer/builder/profitbricks"
|
||||||
scalewaybuilder "github.com/hashicorp/packer/builder/scaleway"
|
scalewaybuilder "github.com/hashicorp/packer/builder/scaleway"
|
||||||
tencentcloudcvmbuilder "github.com/hashicorp/packer/builder/tencentcloud/cvm"
|
tencentcloudcvmbuilder "github.com/hashicorp/packer/builder/tencentcloud/cvm"
|
||||||
|
@ -97,8 +95,6 @@ var Builders = map[string]packersdk.Builder{
|
||||||
"openstack": new(openstackbuilder.Builder),
|
"openstack": new(openstackbuilder.Builder),
|
||||||
"oracle-classic": new(oracleclassicbuilder.Builder),
|
"oracle-classic": new(oracleclassicbuilder.Builder),
|
||||||
"oracle-oci": new(oracleocibuilder.Builder),
|
"oracle-oci": new(oracleocibuilder.Builder),
|
||||||
"parallels-iso": new(parallelsisobuilder.Builder),
|
|
||||||
"parallels-pvm": new(parallelspvmbuilder.Builder),
|
|
||||||
"profitbricks": new(profitbricksbuilder.Builder),
|
"profitbricks": new(profitbricksbuilder.Builder),
|
||||||
"scaleway": new(scalewaybuilder.Builder),
|
"scaleway": new(scalewaybuilder.Builder),
|
||||||
"tencentcloud-cvm": new(tencentcloudcvmbuilder.Builder),
|
"tencentcloud-cvm": new(tencentcloudcvmbuilder.Builder),
|
||||||
|
|
|
@ -30,6 +30,8 @@ import (
|
||||||
oscbsusurrogatebuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/bsusurrogate"
|
oscbsusurrogatebuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/bsusurrogate"
|
||||||
oscbsuvolumebuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/bsuvolume"
|
oscbsuvolumebuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/bsuvolume"
|
||||||
oscchrootbuilder "github.com/hashicorp/packer-plugin-outscale/builder/osc/chroot"
|
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"
|
proxmoxclone "github.com/hashicorp/packer-plugin-proxmox/builder/proxmox/clone"
|
||||||
proxmoxiso "github.com/hashicorp/packer-plugin-proxmox/builder/proxmox/iso"
|
proxmoxiso "github.com/hashicorp/packer-plugin-proxmox/builder/proxmox/iso"
|
||||||
qemubuilder "github.com/hashicorp/packer-plugin-qemu/builder/qemu"
|
qemubuilder "github.com/hashicorp/packer-plugin-qemu/builder/qemu"
|
||||||
|
@ -65,6 +67,8 @@ var VendoredBuilders = map[string]packersdk.Builder{
|
||||||
"proxmox": new(proxmoxiso.Builder),
|
"proxmox": new(proxmoxiso.Builder),
|
||||||
"proxmox-iso": new(proxmoxiso.Builder),
|
"proxmox-iso": new(proxmoxiso.Builder),
|
||||||
"proxmox-clone": new(proxmoxclone.Builder),
|
"proxmox-clone": new(proxmoxclone.Builder),
|
||||||
|
"parallels-iso": new(parallelsisobuilder.Builder),
|
||||||
|
"parallels-pvm": new(parallelspvmbuilder.Builder),
|
||||||
"qemu": new(qemubuilder.Builder),
|
"qemu": new(qemubuilder.Builder),
|
||||||
"vsphere-clone": new(vsphereclonebuilder.Builder),
|
"vsphere-clone": new(vsphereclonebuilder.Builder),
|
||||||
"vsphere-iso": new(vsphereisobuilder.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/azure/cli v0.3.1
|
||||||
github.com/Azure/go-autorest/autorest/date v0.2.0
|
github.com/Azure/go-autorest/autorest/date v0.2.0
|
||||||
github.com/Azure/go-autorest/autorest/to v0.3.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/alibaba-cloud-sdk-go v0.0.0-20190418113227-25233c783f4e
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20170113022742-e6dbea820a9f
|
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20170113022742-e6dbea820a9f
|
||||||
github.com/approvals/go-approval-tests v0.0.0-20160714161514-ad96e53bea43
|
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-googlecompute v0.0.1
|
||||||
github.com/hashicorp/packer-plugin-ncloud v0.0.2
|
github.com/hashicorp/packer-plugin-ncloud v0.0.2
|
||||||
github.com/hashicorp/packer-plugin-outscale v0.0.1
|
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-proxmox v0.0.2
|
||||||
github.com/hashicorp/packer-plugin-qemu v0.0.1
|
github.com/hashicorp/packer-plugin-qemu v0.0.1
|
||||||
github.com/hashicorp/packer-plugin-sdk v0.2.0
|
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/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/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/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-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/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.1.0/go.mod h1:P+3VS0ETiQPyWOx3vB/oeC8J3qd7jnVZLYAFwWgGRt8=
|
||||||
github.com/NaverCloudPlatform/ncloud-sdk-go-v2 v1.2.0 h1:c7GgSBfMt51UGM4SI1F7IFOokOVZO+uxNcJL3Xsmkp4=
|
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-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 h1:BrL8hKypNYrvP3NR+d+xX03SZKB08yTgXPRnH9piUI8=
|
||||||
github.com/hashicorp/packer-plugin-outscale v0.0.1/go.mod h1:6jEWfJO7TgAbaL3e+St1bN5PoIC/MmDIsYqNUzAHF1w=
|
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 h1:x6QW7PeKh+IJymPEt3QdpBhSRi5vqXb8qTWv7rMLuns=
|
||||||
github.com/hashicorp/packer-plugin-proxmox v0.0.2/go.mod h1:3URutEWX1yy10qcHNJncS4OMpZknA1FyvlrfL+5usYk=
|
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=
|
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)
|
# Deprecated. Use [xsel](https://github.com/ChrisTrenkamp/xsel) instead.
|
||||||
An XPath 1.0 implementation written in Go. See the [wiki](https://github.com/ChrisTrenkamp/goxpath/wiki) for more information.
|
|
||||||
|
|
|
@ -27,12 +27,12 @@ var beginPathType = map[lexer.XItemType]bool{
|
||||||
func (n *Node) add(i lexer.XItem) {
|
func (n *Node) add(i lexer.XItem) {
|
||||||
if n.Val.Typ == Empty {
|
if n.Val.Typ == Empty {
|
||||||
n.Val = i
|
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.Left = &Node{Val: n.Val, Parent: n}
|
||||||
n.Val = i
|
n.Val = i
|
||||||
} else if beginPathType[n.Val.Typ] {
|
} else if beginPathType[n.Val.Typ] {
|
||||||
next := &Node{Val: n.Val, Left: n.Left, Parent: n}
|
next := &Node{Val: n.Val, Left: n.Left, Right: n.Right, Parent: n}
|
||||||
n.Left = next
|
n.Left, n.Right = next, nil
|
||||||
n.Val = i
|
n.Val = i
|
||||||
} else if n.Right == nil {
|
} else if n.Right == nil {
|
||||||
n.Right = &Node{Val: i, Parent: n}
|
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) {
|
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.push(i)
|
||||||
p.cur = p.cur.next
|
p.cur = p.cur.next
|
||||||
p.push(funcState)
|
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 {
|
func (d *Parallels9Driver) SendKeyScanCodes(vmName string, codes ...string) error {
|
||||||
var stdout, stderr bytes.Buffer
|
var stdout, stderr bytes.Buffer
|
||||||
|
|
||||||
if codes == nil || len(codes) == 0 {
|
if len(codes) == 0 {
|
||||||
log.Printf("No scan codes to send")
|
log.Printf("No scan codes to send")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
|
@ -44,7 +44,7 @@ func (s *StepAttachFloppy) Run(ctx context.Context, state multistep.StateBag) mu
|
||||||
"--device-del", "fdd0",
|
"--device-del", "fdd0",
|
||||||
}
|
}
|
||||||
// This will almost certainly fail with 'The fdd0 device does not exist.'
|
// This will almost certainly fail with 'The fdd0 device does not exist.'
|
||||||
driver.Prlctl(delCommand...)
|
_ = driver.Prlctl(delCommand...)
|
||||||
|
|
||||||
ui.Say("Attaching floppy disk...")
|
ui.Say("Attaching floppy disk...")
|
||||||
// Attaching the floppy disk
|
// Attaching the floppy disk
|
||||||
|
@ -79,5 +79,5 @@ func (s *StepAttachFloppy) Cleanup(state multistep.StateBag) {
|
||||||
"set", vmName,
|
"set", vmName,
|
||||||
"--device-del", "fdd0",
|
"--device-del", "fdd0",
|
||||||
}
|
}
|
||||||
driver.Prlctl(command...)
|
_ = driver.Prlctl(command...)
|
||||||
}
|
}
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/hashicorp/hcl/v2/hcldec"
|
"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/bootcommand"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/common"
|
"github.com/hashicorp/packer-plugin-sdk/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/communicator"
|
"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/shutdowncommand"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/template/config"
|
"github.com/hashicorp/packer-plugin-sdk/template/config"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const BuilderId = "rickard-von-essen.parallels"
|
const BuilderId = "rickard-von-essen.parallels"
|
|
@ -5,9 +5,9 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
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.
|
// This step attaches the ISO to the virtual machine.
|
|
@ -5,9 +5,9 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
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
|
// This step creates the virtual disk that will be used as the
|
|
@ -5,9 +5,9 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// This step creates the actual virtual machine.
|
// This step creates the actual virtual machine.
|
|
@ -4,9 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
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.
|
// This step sets the device boot order for the virtual machine.
|
|
@ -6,11 +6,11 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/hashicorp/hcl/v2/hcldec"
|
"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/communicator"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep/commonsteps"
|
"github.com/hashicorp/packer-plugin-sdk/multistep/commonsteps"
|
||||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
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
|
// Builder implements packersdk.Builder and builds the actual Parallels
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/bootcommand"
|
"github.com/hashicorp/packer-plugin-sdk/bootcommand"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/common"
|
"github.com/hashicorp/packer-plugin-sdk/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep/commonsteps"
|
"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/shutdowncommand"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/template/config"
|
"github.com/hashicorp/packer-plugin-sdk/template/config"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
|
||||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config is the configuration structure for the builder.
|
// Config is the configuration structure for the builder.
|
|
@ -4,9 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
parallelscommon "github.com/hashicorp/packer-plugin-parallels/builder/parallels/common"
|
||||||
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
||||||
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
||||||
parallelscommon "github.com/hashicorp/packer/builder/parallels/common"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// This step imports an PVM VM into Parallels.
|
// 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-autorest/tracing
|
||||||
# github.com/Azure/go-ntlmssp v0.0.0-20191115201650-bad6df29494a
|
# github.com/Azure/go-ntlmssp v0.0.0-20191115201650-bad6df29494a
|
||||||
github.com/Azure/go-ntlmssp
|
github.com/Azure/go-ntlmssp
|
||||||
# github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022
|
# github.com/ChrisTrenkamp/goxpath v0.0.0-20210404020558-97928f7e12b6
|
||||||
## explicit
|
|
||||||
github.com/ChrisTrenkamp/goxpath
|
github.com/ChrisTrenkamp/goxpath
|
||||||
github.com/ChrisTrenkamp/goxpath/internal/execxp
|
github.com/ChrisTrenkamp/goxpath/internal/execxp
|
||||||
github.com/ChrisTrenkamp/goxpath/internal/execxp/findutil
|
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/chroot
|
||||||
github.com/hashicorp/packer-plugin-outscale/builder/osc/common
|
github.com/hashicorp/packer-plugin-outscale/builder/osc/common
|
||||||
github.com/hashicorp/packer-plugin-outscale/builder/osc/common/retry
|
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
|
# github.com/hashicorp/packer-plugin-proxmox v0.0.2
|
||||||
## explicit
|
## explicit
|
||||||
github.com/hashicorp/packer-plugin-proxmox/builder/proxmox/clone
|
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",
|
"title": "ProfitBricks",
|
||||||
"path": "builders/profitbricks"
|
"path": "builders/profitbricks"
|
||||||
|
|
|
@ -67,5 +67,11 @@
|
||||||
"repo": "hashicorp/packer-plugin-outscale",
|
"repo": "hashicorp/packer-plugin-outscale",
|
||||||
"version": "latest",
|
"version": "latest",
|
||||||
"pluginTier": "community"
|
"pluginTier": "community"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Parallels",
|
||||||
|
"path": "parallels",
|
||||||
|
"repo": "hashicorp/packer-plugin-parallels",
|
||||||
|
"version": "latest"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in New Issue