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)
}