From b1f0013d8cc259271a3311d9e5bdc896f0e4e863 Mon Sep 17 00:00:00 2001 From: kunm Date: Mon, 22 Aug 2016 20:13:15 +0800 Subject: [PATCH] CP-18646: Make packer-build-xenserver support other-config for vm packing Signed-off-by: kunm --- builder/xenserver/iso/builder.go | 7 ++++--- builder/xenserver/iso/step_create_instance.go | 20 +++++++++++++++++-- .../xenserver/go-xenserver-client/vm.go | 15 ++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/builder/xenserver/iso/builder.go b/builder/xenserver/iso/builder.go index 9fff5ab..2f50a6d 100644 --- a/builder/xenserver/iso/builder.go +++ b/builder/xenserver/iso/builder.go @@ -22,9 +22,10 @@ type config struct { common.PackerConfig `mapstructure:",squash"` xscommon.CommonConfig `mapstructure:",squash"` - VMMemory uint `mapstructure:"vm_memory"` - DiskSize uint `mapstructure:"disk_size"` - CloneTemplate string `mapstructure:"clone_template"` + VMMemory uint `mapstructure:"vm_memory"` + DiskSize uint `mapstructure:"disk_size"` + CloneTemplate string `mapstructure:"clone_template"` + VMOtherConfig map[string]string `mapstructure:"vm_other_config"` ISOChecksum string `mapstructure:"iso_checksum"` ISOChecksumType string `mapstructure:"iso_checksum_type"` diff --git a/builder/xenserver/iso/step_create_instance.go b/builder/xenserver/iso/step_create_instance.go index f0aaf1b..8a0362b 100644 --- a/builder/xenserver/iso/step_create_instance.go +++ b/builder/xenserver/iso/step_create_instance.go @@ -56,18 +56,34 @@ func (self *stepCreateInstance) Run(state multistep.StateBag) multistep.StepActi return multistep.ActionHalt } - instance.SetPlatform(config.PlatformArgs) + err = instance.SetPlatform(config.PlatformArgs) if err != nil { ui.Error(fmt.Sprintf("Error setting VM platform: %s", err.Error())) return multistep.ActionHalt } - instance.SetDescription(config.VMDescription) + err = instance.SetDescription(config.VMDescription) if err != nil { ui.Error(fmt.Sprintf("Error setting VM description: %s", err.Error())) return multistep.ActionHalt } + if len(config.VMOtherConfig) != 0 { + vm_other_config, err := instance.GetOtherConfig() + if err != nil { + ui.Error(fmt.Sprintf("Error getting VM other-config: %s", err.Error())) + return multistep.ActionHalt + } + for key, value := range config.VMOtherConfig { + vm_other_config[key] = value + } + err = instance.SetOtherConfig(vm_other_config) + if err != nil { + ui.Error(fmt.Sprintf("Error setting VM other-config: %s", err.Error())) + return multistep.ActionHalt + } + } + // Create VDI for the instance sr, err := config.GetSR(client) diff --git a/vendor/github.com/xenserver/go-xenserver-client/vm.go b/vendor/github.com/xenserver/go-xenserver-client/vm.go index c733c13..bf0098b 100644 --- a/vendor/github.com/xenserver/go-xenserver-client/vm.go +++ b/vendor/github.com/xenserver/go-xenserver-client/vm.go @@ -521,6 +521,21 @@ func (self *VM) SetIsATemplate(is_a_template bool) (err error) { return } +func (self *VM) GetOtherConfig() (other_config map[string]string, err error) { + result := APIResult{} + other_config = make(map[string]string) + err = self.Client.APICall(&result, "VM.get_other_config", self.Ref) + if err != nil { + return + } + for key, value := range result.Value.(xmlrpc.Struct) { + if valueStr, ok := value.(string); ok { + other_config[key] = valueStr + } + } + return +} + func (self *VM) SetOtherConfig(other_config map[string]string) (err error) { result := APIResult{} other_config_rec := make(xmlrpc.Struct)