Merge pull request #65 from ddelnano/ddelnano/sohonetlabs/iso-sr
Allow ISO Storage repository to fallback to default SR if unspecified
This commit is contained in:
commit
de46bb8b2f
@ -20,7 +20,7 @@ type CommonConfig struct {
|
|||||||
VMName string `mapstructure:"vm_name"`
|
VMName string `mapstructure:"vm_name"`
|
||||||
VMDescription string `mapstructure:"vm_description"`
|
VMDescription string `mapstructure:"vm_description"`
|
||||||
SrName string `mapstructure:"sr_name"`
|
SrName string `mapstructure:"sr_name"`
|
||||||
SrISOName string `mapstructure:"sr_iso_name"`
|
SrISOName string `mapstructure:"sr_iso_name" required:"false"`
|
||||||
FloppyFiles []string `mapstructure:"floppy_files"`
|
FloppyFiles []string `mapstructure:"floppy_files"`
|
||||||
NetworkNames []string `mapstructure:"network_names"`
|
NetworkNames []string `mapstructure:"network_names"`
|
||||||
ExportNetworkNames []string `mapstructure:"export_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) {
|
func (config CommonConfig) GetSR(c *Connection) (xenapi.SRRef, error) {
|
||||||
var srRef xenapi.SRRef
|
|
||||||
if config.SrName == "" {
|
if config.SrName == "" {
|
||||||
hostRef, err := c.GetClient().Session.GetThisHost(c.session, c.session)
|
return getDefaultSR(c)
|
||||||
|
|
||||||
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))
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
var srRef xenapi.SRRef
|
||||||
|
|
||||||
// Use the provided name label to find the SR to use
|
// Use the provided name label to find the SR to use
|
||||||
srs, err := c.GetClient().SR.GetByNameLabel(c.session, config.SrName)
|
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) {
|
func (config CommonConfig) GetISOSR(c *Connection) (xenapi.SRRef, error) {
|
||||||
var srRef xenapi.SRRef
|
var srRef xenapi.SRRef
|
||||||
if config.SrISOName == "" {
|
if config.SrISOName == "" {
|
||||||
return srRef, errors.New("sr_iso_name must be specified in the packer configuration")
|
return getDefaultSR(c)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Use the provided name label to find the SR to use
|
// 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
|
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))
|
||||||
|
}
|
||||||
|
@ -24,7 +24,7 @@ type FlatConfig struct {
|
|||||||
VMName *string `mapstructure:"vm_name" cty:"vm_name" hcl:"vm_name"`
|
VMName *string `mapstructure:"vm_name" cty:"vm_name" hcl:"vm_name"`
|
||||||
VMDescription *string `mapstructure:"vm_description" cty:"vm_description" hcl:"vm_description"`
|
VMDescription *string `mapstructure:"vm_description" cty:"vm_description" hcl:"vm_description"`
|
||||||
SrName *string `mapstructure:"sr_name" cty:"sr_name" hcl:"sr_name"`
|
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"`
|
FloppyFiles []string `mapstructure:"floppy_files" cty:"floppy_files" hcl:"floppy_files"`
|
||||||
NetworkNames []string `mapstructure:"network_names" cty:"network_names" hcl:"network_names"`
|
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"`
|
ExportNetworkNames []string `mapstructure:"export_network_names" cty:"export_network_names" hcl:"export_network_names"`
|
||||||
|
Loading…
Reference in New Issue
Block a user