diff --git a/modules/storage/local.go b/modules/storage/local.go old mode 100644 new mode 100755 index d46a5528d..df5807f87 --- a/modules/storage/local.go +++ b/modules/storage/local.go @@ -80,3 +80,7 @@ func (l *LocalStorage) HasObject(path string) (bool, error) { func (l *LocalStorage) UploadObject(fileName, filePath string) error { return nil } + +func (l *LocalStorage) DeleteDir(dir string) error { + return nil +} diff --git a/modules/storage/minio.go b/modules/storage/minio.go index 664e58d1b..bdc2b6eb0 100755 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -11,6 +11,8 @@ import ( "strings" "time" + "code.gitea.io/gitea/modules/log" + "github.com/minio/minio-go" ) @@ -76,6 +78,29 @@ func (m *MinioStorage) Delete(path string) error { return m.client.RemoveObject(m.bucket, m.buildMinioPath(path)) } +// Delete delete a file +func (m *MinioStorage) DeleteDir(dir string) error { + objectsCh := make(chan string) + + // Send object names that are needed to be removed to objectsCh + go func() { + defer close(objectsCh) + // List all objects from a bucket-name with a matching prefix. + for object := range m.client.ListObjects(m.bucket, dir, true, nil) { + if object.Err != nil { + log.Error("ListObjects failed:%v", object.Err) + } + objectsCh <- object.Key + } + }() + + for rErr := range m.client.RemoveObjects(m.bucket, objectsCh) { + log.Error("Error detected during deletion: ", rErr) + } + + return nil +} + //Get Presigned URL for get object func (m *MinioStorage) PresignedGetURL(path string, fileName string) (string, error) { // Set request parameters for content-disposition. diff --git a/modules/storage/storage.go b/modules/storage/storage.go index d364346f0..fc9d38020 100755 --- a/modules/storage/storage.go +++ b/modules/storage/storage.go @@ -23,6 +23,7 @@ type ObjectStorage interface { Save(path string, r io.Reader) (int64, error) Open(path string) (io.ReadCloser, error) Delete(path string) error + DeleteDir(dir string) error PresignedGetURL(path string, fileName string) (string, error) PresignedPutURL(path string) (string, error) HasObject(path string) (bool, error) diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index 3f5fce013..cc4eddd51 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -478,6 +478,9 @@ func CloudBrainDel(ctx *context.Context) { ctx.ServerError("DeleteJob failed", err) return } + + //todo: delete local and oss's job + deleteJobName(task.JobName, models.TypeCloudBrainOne) ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob") } @@ -756,6 +759,32 @@ func mkModelPath(modelPath string) error { return nil } +func deleteJobName(jobName string, cloudbrainType int) error { + //delete local + localJobPath := setting.JobPath + jobName + log.Info("%s", localJobPath) + err := os.RemoveAll(localJobPath) + if err != nil { + log.Error("RemoveAll(%s) failed:%v", localJobPath, err) + } + + //delete oss + if cloudbrainType == models.TypeCloudBrainOne { + dirPath := setting.CBCodePathPrefix + jobName + "/" + log.Info("%s", dirPath) + err = storage.Attachments.DeleteDir(dirPath) + if err != nil { + log.Error("Delete(%s) failed:%v", localJobPath, err) + } + } else if cloudbrainType == models.TypeCloudBrainTwo { + + } else { + log.Error("cloudbrainType(%d) error", cloudbrainType) + } + + return nil +} + func SyncCloudbrainStatus() { cloudBrains, err := models.GetCloudBrainUnStoppedJob() if err != nil {