func GetDiskInfos()

in cli_tools/gce_ovf_import/ovf_utils/ovf_utils.go [249:306]


func GetDiskInfos(virtualHardware *ovf.VirtualHardwareSection, diskSection *ovf.DiskSection,
	references *[]ovf.File) ([]DiskInfo, error) {
	if virtualHardware == nil {
		return nil, daisy.Errf("virtualHardware cannot be nil")
	}
	if diskSection == nil || diskSection.Disks == nil || len(diskSection.Disks) == 0 {
		return nil, daisy.Errf("diskSection cannot be nil")
	}
	if references == nil || *references == nil {
		return nil, daisy.Errf("references cannot be nil")
	}

	diskControllers := getDiskControllersPrioritized(virtualHardware)
	if len(diskControllers) == 0 {
		return nil, daisy.Errf("no disk controllers found in OVF, can't retrieve disk info")
	}

	allDiskItems := filterItemsByResourceTypes(virtualHardware, disk)
	diskInfos := make([]DiskInfo, 0)
	processedDisks := make(map[string]bool)

	for _, diskController := range diskControllers {
		controllerDisks := make([]ovf.ResourceAllocationSettingData, 0)

		for _, diskItem := range allDiskItems {
			if *diskItem.Parent == diskController.InstanceID {
				controllerDisks = append(controllerDisks, diskItem)
			}
		}

		sortItemsByStringValue(controllerDisks, func(disk ovf.ResourceAllocationSettingData) string {
			return *disk.AddressOnParent
		})

		for _, diskItem := range controllerDisks {
			diskInfo, diskInfoErr := buildDiskInfo(&diskItem, diskSection, references)
			if diskInfoErr != nil {
				return diskInfos, diskInfoErr
			}
			diskInfos = append(diskInfos, *diskInfo)
			processedDisks[diskItem.InstanceID] = true
		}
	}

	// Add disks that don't belong to any controllers to disk infos
	for _, diskItem := range allDiskItems {
		if !processedDisks[diskItem.InstanceID] {
			diskInfo, diskInfoErr := buildDiskInfo(&diskItem, diskSection, references)
			if diskInfoErr != nil {
				return diskInfos, diskInfoErr
			}
			diskInfos = append(diskInfos, *diskInfo)
			processedDisks[diskItem.InstanceID] = true
		}
	}

	return diskInfos, nil
}