diff --git a/builder/xenserver/common/common_config.go b/builder/xenserver/common/common_config.go index 4ae5edd..bf63ae2 100644 --- a/builder/xenserver/common/common_config.go +++ b/builder/xenserver/common/common_config.go @@ -20,7 +20,7 @@ type CommonConfig struct { VMName string `mapstructure:"vm_name"` VMDescription string `mapstructure:"vm_description"` SrName string `mapstructure:"sr_name"` - SrISOName string `mapstructure:"sr_iso_name"` + SrISOName string `mapstructure:"sr_iso_name" required:"false"` FloppyFiles []string `mapstructure:"floppy_files"` NetworkNames []string `mapstructure:"network_names"` ExportNetworkNames []string `mapstructure:"export_network_names"` @@ -223,29 +223,11 @@ func (c CommonConfig) ShouldKeepVM(state multistep.StateBag) bool { } func (config CommonConfig) GetSR(c *Connection) (xenapi.SRRef, error) { - var srRef xenapi.SRRef if config.SrName == "" { - hostRef, err := c.GetClient().Session.GetThisHost(c.session, c.session) - - if err != nil { - return srRef, err - } - - pools, err := c.GetClient().Pool.GetAllRecords(c.session) - - if err != nil { - return srRef, err - } - - for _, pool := range pools { - if pool.Master == hostRef { - return pool.DefaultSR, nil - } - } - - return srRef, errors.New(fmt.Sprintf("failed to find default SR on host '%s'", hostRef)) - + return getDefaultSR(c) } else { + var srRef xenapi.SRRef + // Use the provided name label to find the SR to use srs, err := c.GetClient().SR.GetByNameLabel(c.session, config.SrName) @@ -267,7 +249,7 @@ func (config CommonConfig) GetSR(c *Connection) (xenapi.SRRef, error) { func (config CommonConfig) GetISOSR(c *Connection) (xenapi.SRRef, error) { var srRef xenapi.SRRef if config.SrISOName == "" { - return srRef, errors.New("sr_iso_name must be specified in the packer configuration") + return getDefaultSR(c) } else { // Use the provided name label to find the SR to use @@ -287,3 +269,34 @@ func (config CommonConfig) GetISOSR(c *Connection) (xenapi.SRRef, error) { return srs[0], nil } } + +func getDefaultSR(c *Connection) (xenapi.SRRef, error) { + var srRef xenapi.SRRef + client := c.GetClient() + hostRef, err := client.Session.GetThisHost(c.session, c.session) + + if err != nil { + return srRef, err + } + + // The current version of the go-xen-api-client does not fully support XenAPI version 8.2 + // In particular, some values for the pool `allowed_operations` are not recognised, resulting + // in a parse error when retrieving pool records. As a workaround, we only fetch pool refs. + pool_refs, err := client.Pool.GetAll(c.session) + + if err != nil { + return srRef, err + } + + for _, pool_ref := range pool_refs { + pool_master, err := client.Pool.GetMaster(c.session, pool_ref) + if err != nil { + return srRef, err + } + if pool_master == hostRef { + return client.Pool.GetDefaultSR(c.session, pool_ref) + } + } + + return srRef, errors.New(fmt.Sprintf("failed to find default SR on host '%s'", hostRef)) +} diff --git a/builder/xenserver/common/config.hcl2spec.go b/builder/xenserver/common/config.hcl2spec.go index 04d4479..9b3fcb7 100644 --- a/builder/xenserver/common/config.hcl2spec.go +++ b/builder/xenserver/common/config.hcl2spec.go @@ -24,7 +24,7 @@ type FlatConfig struct { VMName *string `mapstructure:"vm_name" cty:"vm_name" hcl:"vm_name"` VMDescription *string `mapstructure:"vm_description" cty:"vm_description" hcl:"vm_description"` SrName *string `mapstructure:"sr_name" cty:"sr_name" hcl:"sr_name"` - SrISOName *string `mapstructure:"sr_iso_name" cty:"sr_iso_name" hcl:"sr_iso_name"` + SrISOName *string `mapstructure:"sr_iso_name" required:"false" cty:"sr_iso_name" hcl:"sr_iso_name"` FloppyFiles []string `mapstructure:"floppy_files" cty:"floppy_files" hcl:"floppy_files"` NetworkNames []string `mapstructure:"network_names" cty:"network_names" hcl:"network_names"` ExportNetworkNames []string `mapstructure:"export_network_names" cty:"export_network_names" hcl:"export_network_names"`