func()

in cli_tools/gce_ovf_import/gce_utils/machine_type_provider.go [39:90]


func (mp *MachineTypeProvider) GetMachineType() (string, error) {
	if mp.MachineType != "" {
		return mp.MachineType, nil
	}

	virtualSystem, err := ovfutils.GetVirtualSystem(mp.OvfDescriptor)
	if err != nil {
		return "", err
	}
	virtualHardwareSection, err := ovfutils.GetVirtualHardwareSection(virtualSystem)
	if err != nil {
		return "", err
	}
	memoryMB, err := ovfutils.GetMemoryInMB(virtualHardwareSection)
	if err != nil {
		return "", err
	}
	cpuCount, err := ovfutils.GetNumberOfCPUs(virtualHardwareSection)
	if err != nil {
		return "", err
	}
	machineTypes, err := mp.ComputeClient.ListMachineTypes(mp.Project, mp.Zone)
	if err != nil {
		return "", err
	}
	cpuCountToMachineTypes, cpuCounts := groupMachineTypesByCPUCount(machineTypes)

	cpuIndex := 0
	memoryIndex := 0

	for cpuIndex < len(cpuCounts) {
		if cpuCounts[cpuIndex] < cpuCount {
			cpuIndex++
			memoryIndex = 0
			continue
		}

		for memoryIndex < len(cpuCountToMachineTypes[cpuCounts[cpuIndex]]) &&
			cpuCountToMachineTypes[cpuCounts[cpuIndex]][memoryIndex].MemoryMb < memoryMB {
			memoryIndex++
		}
		if memoryIndex >= len(cpuCountToMachineTypes[cpuCounts[cpuIndex]]) {
			cpuIndex++
			memoryIndex = 0
			continue
		}
		return cpuCountToMachineTypes[cpuCounts[cpuIndex]][memoryIndex].Name, nil
	}

	return "", daisy.Errf(
		"no machine type has at least %v MBs of memory and %v vCPUs", memoryMB, cpuCount)
}