func()

in cli_tools/common/image/importer/inflater.go [117:165]


func (facade *inflaterFacade) Inflate() (persistentDisk, inflationInfo, error) {
	var pd persistentDisk
	var ii inflationInfo
	var err error
	var fallbackReason string

	if facade.qemuChecksum == "" {
		fallbackReason = "qemu_checksum_missing"
	} else {
		//  Run API inflater as the primary inflation method.
		pd, ii, err = facade.apiInflater.Inflate()

		if err != nil {
			// If the inflation is failed but not due to unsupported format, don't rerun inflation.
			if !isCausedByUnsupportedFormat(err) {
				facade.logger.Metric(&pb.OutputInfo{
					InflationType:   "api_failed",
					InflationTimeMs: []int64{ii.inflationTime.Milliseconds()},
				})
				return pd, ii, err
			}
			fallbackReason = "unsupported_format"
		} else {
			if isChecksumMatch(ii.checksum, facade.qemuChecksum) {
				facade.logger.Metric(&pb.OutputInfo{
					InflationType:   "api_success",
					InflationTimeMs: []int64{ii.inflationTime.Milliseconds()},
				})
				return pd, ii, err
			}

			diskName := getDiskName(facade.request.ExecutionID)

			// If checksum mismatches , delete the corrupted disk.
			err = facade.computeClient.DeleteDisk(facade.request.Project, facade.request.Zone, diskName)
			if err != nil {
				return pd, ii, daisy.Errf("Tried to delete the disk after checksum mismatch is detected, but failed on: %v", err)
			}
			facade.logger.User("Disk checksum mismatch, recreating...")
			fallbackReason = "checksum_mismatch"
		}
	}

	// Now fallback to daisy inflater. As described above, it is due to one of the below reasons:
	// 1. The API failed because it doesn't support the format of the image file.
	// 2. Checksum mismatch, which means the API produced a corrupted disk.
	// 3. QEMU checksum is missing, which means we have no way to compare the checksum.
	return facade.fallbackToDaisyInflater(fallbackReason)
}