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
}