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  }