packer-cn/fix/fixer_vmware_compaction.go

92 lines
2.0 KiB
Go

package fix
import (
"github.com/mitchellh/mapstructure"
)
// FixerVMwareCompaction adds "skip_compaction = true" to "vmware-iso" builders with incompatible disk_type_id
type FixerVMwareCompaction struct{}
func (FixerVMwareCompaction) Fix(input map[string]interface{}) (map[string]interface{}, error) {
// The type we'll decode into; we only care about builders
type template struct {
Builders []map[string]interface{}
}
// Decode the input into our structure, if we can
var tpl template
if err := mapstructure.Decode(input, &tpl); err != nil {
return nil, err
}
for _, builder := range tpl.Builders {
builderTypeRaw, ok := builder["type"]
if !ok {
continue
}
builderType, ok := builderTypeRaw.(string)
if !ok {
continue
}
if builderType != "vmware-iso" {
continue
}
builderRemoteTypeRaw, ok := builder["remote_type"]
if !ok {
continue
}
builderRemoteType, ok := builderRemoteTypeRaw.(string)
if !ok {
continue
}
if builderRemoteType != "esx5" {
continue
}
builderDiskTypeIdRaw, ok := builder["disk_type_id"]
// set to default when this fixer was added due to incompatibility of defaults
if !ok {
builderDiskTypeId := "zeroedthick"
builder["disk_type_id"] = builderDiskTypeId
}
if ok {
builderDiskTypeId, ok := builderDiskTypeIdRaw.(string)
if !ok {
continue
}
if builderDiskTypeId == "thin" {
continue
}
}
builderSkipCompactionRaw, ok := builder["skip_compaction"]
// already verified this is not creating a "thin" disk, will need to skip_compaction
if ok {
builderSkipCompaction, ok := builderSkipCompactionRaw.(bool)
if !ok {
continue
}
if !builderSkipCompaction {
builder["skip_compaction"] = !builderSkipCompaction
}
continue
}
builderSkipCompaction := true
builder["skip_compaction"] = builderSkipCompaction
}
input["builders"] = tpl.Builders
return input, nil
}
func (FixerVMwareCompaction) Synopsis() string {
return `Adds "skip_compaction = true" to "vmware-iso" builders with incompatible disk_type_id`
}