diff --git a/pkg/image/models/images.go b/pkg/image/models/images.go index 628235c9fe..6d75367aef 100644 --- a/pkg/image/models/images.go +++ b/pkg/image/models/images.go @@ -394,6 +394,14 @@ func (self *SImage) CustomizeCreate(ctx context.Context, userCred mcclient.Token return nil } +func (self *SImage) GetLocalPath(format string) string { + path := filepath.Join(options.Options.FilesystemStoreDatadir, self.Id) + if len(format) > 0 { + path = fmt.Sprintf("%s.%s", path, format) + } + return path +} + func (self *SImage) GetPath(format string) string { path := filepath.Join(options.Options.FilesystemStoreDatadir, self.Id) if options.Options.StorageDriver == api.IMAGE_STORAGE_DRIVER_S3 { @@ -483,51 +491,61 @@ func (self *SImage) saveSize(newSize, totalSize int64) error { //Image always do probe and customize after save from stream func (self *SImage) SaveImageFromStream(reader io.Reader, totalSize int64, calChecksum bool) error { - localPath := self.GetPath("") + localPath := self.GetLocalPath("") - sp, err := self.saveImageFromStream(localPath, reader, totalSize, calChecksum) - if err != nil { - log.Errorf("saveImageFromStream fail %s", err) - return err - } + err := func() error { + sp, err := self.saveImageFromStream(localPath, reader, totalSize, calChecksum) + if err != nil { + return errors.Wrapf(err, "saveImageFromStream") + } - virtualSizeBytes := int64(0) - format := "" - img, err := qemuimg.NewQemuImage(localPath) - if err != nil { - return err - } - format = string(img.Format) - virtualSizeBytes = img.SizeBytes - - var fastChksum string - if calChecksum { - fastChksum, err = fileutils2.FastCheckSum(localPath) + virtualSizeBytes := int64(0) + format := "" + img, err := qemuimg.NewQemuImage(localPath) if err != nil { return err } - } + format = string(img.Format) + virtualSizeBytes = img.SizeBytes - _, err = db.Update(self, func() error { - self.Size = sp.Size + var fastChksum string if calChecksum { - self.Checksum = sp.CheckSum - self.FastHash = fastChksum + fastChksum, err = fileutils2.FastCheckSum(localPath) + if err != nil { + return errors.Wrapf(err, "FastCheckSum %s", localPath) + } } - self.Location = fmt.Sprintf("%s%s", LocalFilePrefix, localPath) - if len(format) > 0 { - self.DiskFormat = format - } - if virtualSizeBytes > 0 { - self.MinDiskMB = int32(math.Ceil(float64(virtualSizeBytes) / 1024 / 1024)) + + _, err = db.Update(self, func() error { + self.Size = sp.Size + if calChecksum { + self.Checksum = sp.CheckSum + self.FastHash = fastChksum + } + self.Location = fmt.Sprintf("%s%s", LocalFilePrefix, localPath) + if len(format) > 0 { + self.DiskFormat = format + } + if virtualSizeBytes > 0 { + self.MinDiskMB = int32(math.Ceil(float64(virtualSizeBytes) / 1024 / 1024)) + } + return nil + }) + if err != nil { + return errors.Wrapf(err, "db.Update") } + return nil - }) + }() if err != nil { - return err + if fileutils2.IsFile(localPath) { + if e := os.Remove(localPath); e != nil { + log.Errorf("remove failed file %s error: %v", err) + } + } } - return nil + return err } func (self *SImage) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) { diff --git a/pkg/image/models/storage.go b/pkg/image/models/storage.go index 6ff9e352cc..c673af16fe 100644 --- a/pkg/image/models/storage.go +++ b/pkg/image/models/storage.go @@ -156,6 +156,9 @@ func (s *S3Storage) Type() string { } func (s *S3Storage) SaveImage(ctx context.Context, imagePath string) (string, error) { + if !fileutils2.IsFile(imagePath) { + return "", fmt.Errorf("%s not valid file", imagePath) + } return s3.Put(ctx, imagePath, imagePathToName(imagePath)) } diff --git a/pkg/image/tasks/image_probe_task.go b/pkg/image/tasks/image_probe_task.go index 8067ee56e8..c24d8fe7cc 100644 --- a/pkg/image/tasks/image_probe_task.go +++ b/pkg/image/tasks/image_probe_task.go @@ -82,10 +82,11 @@ func (self *ImageProbeTask) StartImageProbe(ctx context.Context, image *models.S } func imageGetPath(image *models.SImage) string { - diskPath := image.GetPath("") + diskPath := image.GetLocalPath("") if !fileutils2.Exists(diskPath) { - diskPath = image.GetPath(image.DiskFormat) + diskPath = image.GetLocalPath(image.DiskFormat) if !fileutils2.Exists(diskPath) { + log.Errorf("file %s not exist", image.Location) return "" } } @@ -113,7 +114,7 @@ func (self *ImageProbeTask) updateImageMetadata( ) error { imagePath := imageGetPath(image) if len(imagePath) == 0 { - return errors.Wrap(httperrors.ErrNotFound, "image file not found") + return errors.Wrapf(httperrors.ErrNotFound, "image file %s not found", image.Location) } fp, err := os.Open(imagePath) if err != nil { @@ -123,12 +124,12 @@ func (self *ImageProbeTask) updateImageMetadata( stat, err := fp.Stat() if err != nil { - return err + return errors.Wrapf(err, "stat %s", imagePath) } chksum, err := fileutils2.MD5(imagePath) if err != nil { - return err + return errors.Wrapf(err, "md5 %s", imagePath) } fastchksum, err := fileutils2.FastCheckSum(imagePath)