* initial changes: added host and pool parameters * backup * clones only within the same host * added some debug-output * minor fixes * vm experiments * added datastore to realocation spec * added datastore parameter; fixed copying between hosts * removed debug-output * changed dependencies
This commit is contained in:
parent
ca41b34285
commit
0b17912c07
20
config.go
20
config.go
|
@ -19,15 +19,19 @@ type Config struct {
|
||||||
Username string `mapstructure:"username"`
|
Username string `mapstructure:"username"`
|
||||||
Password string `mapstructure:"password"`
|
Password string `mapstructure:"password"`
|
||||||
|
|
||||||
Template string `mapstructure:"template"`
|
// Location
|
||||||
VMName string `mapstructure:"vm_name"`
|
Template string `mapstructure:"template"`
|
||||||
FolderName string `mapstructure:"folder_name"`
|
VMName string `mapstructure:"vm_name"`
|
||||||
DCName string `mapstructure:"dc_name"`
|
FolderName string `mapstructure:"folder_name"`
|
||||||
|
DCName string `mapstructure:"dc_name"`
|
||||||
|
Host string `mapstructure:"host"`
|
||||||
|
ResourcePool string `mapstructure:"resource_pool"`
|
||||||
|
Datastore string `mapstructure:"datastore"`
|
||||||
|
|
||||||
|
// Hardware
|
||||||
Cpus string `mapstructure:"cpus"`
|
Cpus string `mapstructure:"cpus"`
|
||||||
ShutdownCommand string `mapstructure:"shutdown_command"`
|
ShutdownCommand string `mapstructure:"shutdown_command"`
|
||||||
Ram string `mapstructure:"RAM"`
|
Ram string `mapstructure:"RAM"`
|
||||||
//TODO: add more options
|
|
||||||
|
|
||||||
ctx interpolate.Context
|
ctx interpolate.Context
|
||||||
}
|
}
|
||||||
|
@ -64,6 +68,9 @@ func NewConfig(raws ...interface{}) (*Config, []string, error) {
|
||||||
if c.VMName == "" {
|
if c.VMName == "" {
|
||||||
errs = packer.MultiErrorAppend(errs, fmt.Errorf("Target VM name required"))
|
errs = packer.MultiErrorAppend(errs, fmt.Errorf("Target VM name required"))
|
||||||
}
|
}
|
||||||
|
if c.Host == "" {
|
||||||
|
errs = packer.MultiErrorAppend(errs, fmt.Errorf("Target host required"))
|
||||||
|
}
|
||||||
|
|
||||||
// Verify numeric parameters if present
|
// Verify numeric parameters if present
|
||||||
if c.Cpus != "" {
|
if c.Cpus != "" {
|
||||||
|
@ -79,6 +86,9 @@ func NewConfig(raws ...interface{}) (*Config, []string, error) {
|
||||||
|
|
||||||
// Warnings
|
// Warnings
|
||||||
var warnings []string
|
var warnings []string
|
||||||
|
if c.Datastore == "" {
|
||||||
|
warnings = append(warnings, "Datastore is not specified, will try to find a default one")
|
||||||
|
}
|
||||||
|
|
||||||
if len(errs.Errors) > 0 {
|
if len(errs.Errors) > 0 {
|
||||||
return nil, warnings, errs
|
return nil, warnings, errs
|
||||||
|
|
|
@ -1,101 +0,0 @@
|
||||||
hash: 9caf4a309ee0ce30e273ceb77d66b9b49090765e1f0dcbe6e05ce0da88b1435f
|
|
||||||
updated: 2017-05-16T08:15:30.457888159+03:00
|
|
||||||
imports:
|
|
||||||
- name: github.com/Azure/go-ntlmssp
|
|
||||||
version: 29affced641074a59483ed003b5ef73a8bd3593c
|
|
||||||
- name: github.com/dylanmei/iso8601
|
|
||||||
version: 2075bf119b58e5576c6ed9f867b8f3d17f2e54d4
|
|
||||||
- name: github.com/hashicorp/errwrap
|
|
||||||
version: 7554cd9344cec97297fa6649b055a8c98c2a1e55
|
|
||||||
- name: github.com/hashicorp/go-multierror
|
|
||||||
version: ed905158d87462226a13fe39ddf685ea65f1c11f
|
|
||||||
- name: github.com/hashicorp/go-version
|
|
||||||
version: 03c5bf6be031b6dd45afec16b1cf94fc8938bc77
|
|
||||||
- name: github.com/hashicorp/packer
|
|
||||||
version: 45a48132d0c455f777163538002aeb8784b64e50
|
|
||||||
subpackages:
|
|
||||||
- common
|
|
||||||
- common/ssh
|
|
||||||
- common/uuid
|
|
||||||
- communicator/none
|
|
||||||
- communicator/ssh
|
|
||||||
- communicator/winrm
|
|
||||||
- helper/communicator
|
|
||||||
- helper/config
|
|
||||||
- packer
|
|
||||||
- packer/plugin
|
|
||||||
- packer/rpc
|
|
||||||
- template
|
|
||||||
- template/interpolate
|
|
||||||
- name: github.com/hashicorp/yamux
|
|
||||||
version: d1caa6c97c9fc1cc9e83bbe34d0603f9ff0ce8bd
|
|
||||||
- name: github.com/kr/fs
|
|
||||||
version: 2788f0dbd16903de03cb8186e5c7d97b69ad387b
|
|
||||||
- name: github.com/masterzen/azure-sdk-for-go
|
|
||||||
version: ee4f0065d00cd12b542f18f5bc45799e88163b12
|
|
||||||
subpackages:
|
|
||||||
- core/http
|
|
||||||
- core/tls
|
|
||||||
- name: github.com/masterzen/simplexml
|
|
||||||
version: 4572e39b1ab9fe03ee513ce6fc7e289e98482190
|
|
||||||
subpackages:
|
|
||||||
- dom
|
|
||||||
- name: github.com/masterzen/winrm
|
|
||||||
version: acf371f6aff113fc0104a61cd72db45a7c27d310
|
|
||||||
subpackages:
|
|
||||||
- soap
|
|
||||||
- name: github.com/masterzen/xmlpath
|
|
||||||
version: 13f4951698adc0fa9c1dda3e275d489a24201161
|
|
||||||
- name: github.com/mitchellh/go-fs
|
|
||||||
version: 7bae45d9a684750e82b97ff320c82556614e621b
|
|
||||||
subpackages:
|
|
||||||
- fat
|
|
||||||
- name: github.com/mitchellh/iochan
|
|
||||||
version: 87b45ffd0e9581375c491fef3d32130bb15c5bd7
|
|
||||||
- name: github.com/mitchellh/mapstructure
|
|
||||||
version: cc8532a8e9a55ea36402aa21efdf403a60d34096
|
|
||||||
- name: github.com/mitchellh/multistep
|
|
||||||
version: 391576a156a54cfbb4cf5d5eda40cf6ffa3e3a4d
|
|
||||||
- name: github.com/mitchellh/reflectwalk
|
|
||||||
version: 8d802ff4ae93611b807597f639c19f76074df5c6
|
|
||||||
- name: github.com/nu7hatch/gouuid
|
|
||||||
version: 179d4d0c4d8d407a32af483c2354df1d2c91e6c3
|
|
||||||
- name: github.com/packer-community/winrmcp
|
|
||||||
version: c804d432b8b7fa77896f43cc426134348c3fd19e
|
|
||||||
subpackages:
|
|
||||||
- winrmcp
|
|
||||||
- name: github.com/pkg/errors
|
|
||||||
version: c605e284fe17294bda444b34710735b29d1a9d90
|
|
||||||
- name: github.com/pkg/sftp
|
|
||||||
version: a5f8514e29e90a859e93871b1582e5c81f466f82
|
|
||||||
- name: github.com/ugorji/go
|
|
||||||
version: 708a42d246822952f38190a8d8c4e6b16a0e600c
|
|
||||||
subpackages:
|
|
||||||
- codec
|
|
||||||
- name: github.com/vmware/govmomi
|
|
||||||
version: 9bfdc5ce62c0585b48b154cc460f8664dcd124c3
|
|
||||||
subpackages:
|
|
||||||
- find
|
|
||||||
- list
|
|
||||||
- object
|
|
||||||
- property
|
|
||||||
- session
|
|
||||||
- task
|
|
||||||
- vim25
|
|
||||||
- vim25/debug
|
|
||||||
- vim25/methods
|
|
||||||
- vim25/mo
|
|
||||||
- vim25/progress
|
|
||||||
- vim25/soap
|
|
||||||
- vim25/types
|
|
||||||
- vim25/xml
|
|
||||||
- name: golang.org/x/crypto
|
|
||||||
version: ab89591268e0c8b748cbe4047b00197516011af5
|
|
||||||
subpackages:
|
|
||||||
- curve25519
|
|
||||||
- ed25519
|
|
||||||
- ed25519/internal/edwards25519
|
|
||||||
- md4
|
|
||||||
- ssh
|
|
||||||
- ssh/agent
|
|
||||||
testImports: []
|
|
|
@ -13,11 +13,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type CloneParameters struct {
|
type CloneParameters struct {
|
||||||
client *govmomi.Client
|
client *govmomi.Client
|
||||||
folder *object.Folder
|
folder *object.Folder
|
||||||
vmSrc *object.VirtualMachine
|
resourcePool *object.ResourcePool
|
||||||
ctx context.Context
|
datastore *object.Datastore
|
||||||
vmName string
|
vmSrc *object.VirtualMachine
|
||||||
|
ctx context.Context
|
||||||
|
vmName string
|
||||||
}
|
}
|
||||||
|
|
||||||
type StepCloneVM struct{
|
type StepCloneVM struct{
|
||||||
|
@ -35,31 +37,56 @@ func (s *StepCloneVM) Run(state multistep.StateBag) multistep.StepAction {
|
||||||
state.Put("error", err)
|
state.Put("error", err)
|
||||||
return multistep.ActionHalt
|
return multistep.ActionHalt
|
||||||
}
|
}
|
||||||
finder, ctx, err := createFinder(ctx, client, s.config.DCName)
|
|
||||||
|
// Set up finder
|
||||||
|
finder := find.NewFinder(client.Client, false)
|
||||||
|
dc, err := finder.DatacenterOrDefault(ctx, s.config.DCName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
state.Put("error", err)
|
state.Put("error", err)
|
||||||
return multistep.ActionHalt
|
return multistep.ActionHalt
|
||||||
}
|
}
|
||||||
|
finder.SetDatacenter(dc)
|
||||||
|
|
||||||
|
// Get folder
|
||||||
folder, err := finder.FolderOrDefault(ctx, s.config.FolderName)
|
folder, err := finder.FolderOrDefault(ctx, s.config.FolderName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
state.Put("error", err)
|
state.Put("error", err)
|
||||||
return multistep.ActionHalt
|
return multistep.ActionHalt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get resource pool
|
||||||
|
pool, err := finder.ResourcePoolOrDefault(ctx, fmt.Sprintf("/%v/host/%v/Resources/%v", dc.Name(), s.config.Host, s.config.ResourcePool))
|
||||||
|
if err != nil {
|
||||||
|
state.Put("error", err)
|
||||||
|
return multistep.ActionHalt
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get datastore
|
||||||
|
var datastore *object.Datastore = nil
|
||||||
|
if s.config.Datastore != "" {
|
||||||
|
datastore, err = finder.Datastore(ctx, s.config.Datastore)
|
||||||
|
if err != nil {
|
||||||
|
state.Put("error", err)
|
||||||
|
return multistep.ActionHalt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get source VM
|
||||||
vmSrc, err := finder.VirtualMachine(ctx, s.config.Template)
|
vmSrc, err := finder.VirtualMachine(ctx, s.config.Template)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
state.Put("error", err)
|
state.Put("error", err)
|
||||||
return multistep.ActionHalt
|
return multistep.ActionHalt
|
||||||
}
|
}
|
||||||
|
|
||||||
cloneParameters := CloneParameters{
|
vm, err := cloneVM(&CloneParameters{
|
||||||
client: client,
|
client: client,
|
||||||
folder: folder,
|
folder: folder,
|
||||||
vmSrc: vmSrc,
|
resourcePool: pool,
|
||||||
ctx: ctx,
|
datastore: datastore,
|
||||||
vmName: s.config.VMName,
|
vmSrc: vmSrc,
|
||||||
}
|
ctx: ctx,
|
||||||
|
vmName: s.config.VMName,
|
||||||
vm, err := cloneVM(&cloneParameters)
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
state.Put("error", err)
|
state.Put("error", err)
|
||||||
return multistep.ActionHalt
|
return multistep.ActionHalt
|
||||||
|
@ -102,9 +129,17 @@ func (s *StepCloneVM) Cleanup(state multistep.StateBag) {
|
||||||
func cloneVM(params *CloneParameters) (vm *object.VirtualMachine, err error) {
|
func cloneVM(params *CloneParameters) (vm *object.VirtualMachine, err error) {
|
||||||
vm = nil
|
vm = nil
|
||||||
err = nil
|
err = nil
|
||||||
|
poolRef := params.resourcePool.Reference()
|
||||||
|
|
||||||
// Creating specs for cloning
|
// Creating specs for cloning
|
||||||
var relocateSpec types.VirtualMachineRelocateSpec
|
relocateSpec := types.VirtualMachineRelocateSpec{
|
||||||
|
Pool: &(poolRef),
|
||||||
|
}
|
||||||
|
if params.datastore != nil {
|
||||||
|
datastoreRef := params.datastore.Reference()
|
||||||
|
relocateSpec.Datastore = &datastoreRef
|
||||||
|
}
|
||||||
|
|
||||||
cloneSpec := types.VirtualMachineCloneSpec{
|
cloneSpec := types.VirtualMachineCloneSpec{
|
||||||
Location: relocateSpec,
|
Location: relocateSpec,
|
||||||
PowerOn: false,
|
PowerOn: false,
|
||||||
|
@ -145,23 +180,3 @@ func createClient(URL, username, password string) (*govmomi.Client, context.Cont
|
||||||
|
|
||||||
return client, ctx, nil
|
return client, ctx, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createFinder(ctx context.Context, client *govmomi.Client, dcName string) (*find.Finder, context.Context, error) {
|
|
||||||
// Create a finder to search for a vm with the specified name
|
|
||||||
finder := find.NewFinder(client.Client, false)
|
|
||||||
// Need to specify the datacenter
|
|
||||||
if dcName == "" {
|
|
||||||
dc, err := finder.DefaultDatacenter(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
finder.SetDatacenter(dc)
|
|
||||||
} else {
|
|
||||||
dc, err := finder.Datacenter(ctx, dcName)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
finder.SetDatacenter(dc)
|
|
||||||
}
|
|
||||||
return finder, ctx, nil
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue