github.com/hashicorp/packer@v1.14.3/fix/fixer_vsphere_network_storage.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package fix 5 6 import ( 7 "github.com/mitchellh/mapstructure" 8 ) 9 10 // FixerVSphereNetworkDisk changes vsphere-iso network and networkCard fields 11 // into a network adapter and changes the disk_size, disk_thin_provisioned, and 12 // disk_eagerly_scrub into a storage adapter 13 type FixerVSphereNetworkDisk struct{} 14 15 func (FixerVSphereNetworkDisk) DeprecatedOptions() map[string][]string { 16 return map[string][]string{ 17 "jetbrains.vsphere": []string{"network_card", "network", "networkCard", "disk_size", 18 "disk_thin_provisioned", "disk_eagerly_scrub"}, 19 } 20 } 21 22 func (FixerVSphereNetworkDisk) Fix(input map[string]interface{}) (map[string]interface{}, error) { 23 // The type we'll decode into; we only care about builders 24 type template struct { 25 Builders []map[string]interface{} 26 } 27 28 // Decode the input into our structure, if we can 29 var tpl template 30 if err := mapstructure.Decode(input, &tpl); err != nil { 31 return nil, err 32 } 33 34 for _, builder := range tpl.Builders { 35 builderTypeRaw, ok := builder["type"] 36 if !ok { 37 continue 38 } 39 40 builderType, ok := builderTypeRaw.(string) 41 if !ok { 42 continue 43 } 44 45 if builderType != "vsphere-iso" { 46 continue 47 } 48 49 var networkAdapters []interface{} 50 nic := make(map[string]interface{}) 51 hasNetwork := false 52 53 networkRaw, ok := builder["network"] 54 if ok { 55 nic["network"] = networkRaw 56 delete(builder, "network") 57 hasNetwork = true 58 } 59 60 // legacy syntax from when VSphere was 3rd party 61 networkCardRaw, ok := builder["networkCard"] 62 if ok { 63 nic["network_card"] = networkCardRaw 64 delete(builder, "networkCard") 65 hasNetwork = true 66 } 67 68 // underscored syntax used when Packer merged vSphere 69 networkCardRaw, ok = builder["network_card"] 70 if ok { 71 nic["network_card"] = networkCardRaw 72 delete(builder, "network_card") 73 hasNetwork = true 74 } 75 76 if hasNetwork { 77 networkAdapters = append(networkAdapters, nic) 78 adaptersRaw, ok := builder["network_adapters"] 79 if ok { 80 existingAdapters := adaptersRaw.([]interface{}) 81 networkAdapters = append(networkAdapters, existingAdapters...) 82 } 83 84 builder["network_adapters"] = networkAdapters 85 } 86 87 var storage []interface{} 88 disk := make(map[string]interface{}) 89 hasStorage := false 90 91 diskSizeRaw, ok := builder["disk_size"] 92 if ok { 93 disk["disk_size"] = diskSizeRaw 94 delete(builder, "disk_size") 95 hasStorage = true 96 } 97 98 discThinProvisionedRaw, ok := builder["disk_thin_provisioned"] 99 if ok { 100 disk["disk_thin_provisioned"] = discThinProvisionedRaw 101 hasStorage = true 102 delete(builder, "disk_thin_provisioned") 103 } 104 105 diskEagerlyScrubRaw, ok := builder["disk_eagerly_scrub"] 106 if ok { 107 disk["disk_eagerly_scrub"] = diskEagerlyScrubRaw 108 hasStorage = true 109 delete(builder, "disk_eagerly_scrub") 110 } 111 112 if hasStorage { 113 storage = append(storage, disk) 114 storageRaw, ok := builder["storage"] 115 if ok { 116 existingStorage := storageRaw.([]interface{}) 117 storage = append(storage, existingStorage...) 118 } 119 120 builder["storage"] = storage 121 } 122 } 123 124 input["builders"] = tpl.Builders 125 return input, nil 126 } 127 128 func (FixerVSphereNetworkDisk) Synopsis() string { 129 return `Removes deprecated network and disk fields from "vsphere-iso" builder` 130 }