package build
import (
"fleetmanager/api/errors"
"fleetmanager/api/params"
"fleetmanager/api/service/constants"
"fleetmanager/client"
"fleetmanager/db/dao"
"github.com/beego/beego/v2/server/web/context"
"strings"
)
func (s *Service) Delete(ctx *context.Context) *errors.CodedError {
projectId := ctx.Input.Param(params.ProjectId)
buildId := ctx.Input.Param(params.BuildId)
s.Logger.Info("buildId=%s projectId=%s delete begin!", buildId, projectId)
tmpBuild, e := dao.GetBuildById(buildId, projectId)
if e != nil {
return s.ErrorMsg(errors.ServerInternalError,
"Delete build Failed!Search DB failed!", e)
}
if tmpBuild.State == constants.BuildDeleted {
return s.ErrorMsg(errors.BuildNotExists, "This build is in deleted state", nil)
}
err := s.CheckBuildInUsedSystem(buildId, projectId)
if err != nil {
return err
}
if tmpBuild.BuildType == constants.VMTYPE && tmpBuild.StorageBucketName != "" && tmpBuild.StorageKey != "" {
err = s.DeleteBuildInIMS(buildId, projectId)
if err != nil {
return err
}
}
if tmpBuild.BuildType == constants.PODTYPE {
err = s.DeleteBuildInSwr(buildId, projectId)
if err != nil {
return err
}
}
err = s.DeleteByBuild(buildId, projectId)
if err != nil {
return err
}
s.Logger.Info("buildId=%s projectId=%s delete success!", buildId, projectId)
return nil
}
func (s *Service) CheckBuildInUsedSystem(buildId string, projectId string) (e *errors.CodedError) {
res, err := dao.CheckBuildInUsedSystem(buildId, projectId)
if err != nil {
return s.ErrorMsg(errors.ServerInternalError,
"Check build relate fleet Failed!Search DB failed!", err)
}
if res == false {
return s.ErrorMsg(errors.BuildIsInUseNotSupportDelete,
"This build is in used! Can not Delete!", err)
}
return nil
}
func (s *Service) DeleteByBuild(buildId string, projectId string) (e *errors.CodedError) {
err := dao.DeleteByBuild(buildId, projectId)
if err != nil {
return s.ErrorMsg(errors.ServerInternalError, "Build Delete error!", err)
}
s.Logger.Info("BuildId %s delete from db success!", buildId)
return nil
}
func (s *Service) DeleteBuildInIMS(buildId string, projectId string) (e *errors.CodedError) {
s.Logger.Info("BuildId %s start to delete build in IMS!", buildId)
tmpBuild, err := dao.GetBuildById(buildId, projectId)
if err != nil {
s.Logger.Error("BuildId %s Get Build info failed %v!", buildId, err)
return s.ErrorMsg(errors.ServerInternalError, "Get Build info failed!", err)
}
if tmpBuild.ImageId == "" {
s.Logger.Warn("This build %s has no image in IMS", buildId)
return nil
}
u, err := dao.GetUserResConfByOriProjectId(projectId)
if err != nil {
s.Logger.Error("get user res conf by project id %s failed %v", projectId, err)
return s.ErrorMsg(errors.ServerInternalError, "get user res conf failed!", err)
}
imsClient := client.GetIMSClient(u.AccessKey, u.SecretAccessKey, u.Region, u.ProjectId)
err = client.DeleteBuildInIMS(imsClient, tmpBuild.ImageId)
if err != nil {
return s.ErrorMsg(errors.ServerInternalError, "Delete build in IMS failed!", err)
}
return nil
}
func (s *Service) DeleteBuildInObs(buildId string, projectId string) (e *errors.CodedError) {
s.Logger.Info("BuildId %s start to delete build in OBS !", buildId)
tmpBuild, err := dao.GetBuildById(buildId, projectId)
if err != nil {
s.Logger.Warn("BuildId %s Get Build info failed %v!", buildId, err)
return s.ErrorMsg(errors.ServerInternalError, "Get Build info failed!", err)
}
u, err := dao.GetUserResConfByOriProjectId(projectId)
if err != nil {
s.Logger.Warn("get user res conf by project id %s failed %v", projectId, err)
return s.ErrorMsg(errors.ServerInternalError, "get user res conf failed!", err)
}
obsClient, obserror := client.GetObsClient(u.AccessKey, u.SecretAccessKey, u.Region)
if obserror != nil {
return s.ErrorMsg(errors.ServerInternalError, "Delete build Get obsclient error!",
obserror)
}
exist, obsErr := client.HeadBucket(obsClient, tmpBuild.StorageBucketName)
if exist {
s.Logger.Info("Bucket already exist.BucketName = %s ", tmpBuild.StorageBucketName)
if obsErr == nil {
err = client.DeleteObsObject(obsClient, tmpBuild.StorageKey, tmpBuild.StorageBucketName)
if err != nil {
return s.ErrorMsg(errors.ServerInternalError, "Delete build from OBS failed!", err)
}
client.DeleteObsBucket(obsClient, tmpBuild.StorageBucketName)
} else {
return s.ErrorMsg(errors.ServerInternalError, "Delete buildBucket from OBS failed!", obsErr)
}
} else {
if obserror != nil {
return s.ErrorMsg(errors.ServerInternalError,
"Delete buildBucket when HeadBucket from OBS failed!", obserror)
}
}
obsClient.Close()
s.Logger.Info("BuildId %s object and bucket delete from obs success!", buildId)
return nil
}
func (s *Service) DeleteBuildInSwr(buildId string, projectId string) (e *errors.CodedError) {
s.Logger.Info("BuildId %s start to delete build in SWR !", buildId)
tmpBuild, err := dao.GetBuildById(buildId, projectId)
if err != nil {
s.Logger.Error("BuildId %s Get Build info failed %v!", buildId, err)
return s.ErrorMsg(errors.ServerInternalError, "Get Build info failed!", err)
}
u, err := dao.GetUserResConfByOriProjectId(projectId)
if err != nil {
s.Logger.Error("get user res conf by project id %s failed %v", projectId, err)
return s.ErrorMsg(errors.ServerInternalError, "get user res conf failed!", err)
}
swrClient := client.GetSwrClient(u.AccessKey, u.SecretAccessKey, u.Region, u.ProjectId)
imageId := tmpBuild.ImageId
urlList := strings.Split(imageId, "/")
if len(urlList) <= 2 {
s.Logger.Error("current image id is invalid %s", imageId)
return nil
}
nameList := strings.Split(urlList[2], ":")
if len(nameList) <= 1 {
s.Logger.Error("current image name and tag is invalid %s", urlList[2])
}
err = client.DeleteBuildSwrImages(swrClient, urlList[1], nameList[0], nameList[1])
if err != nil {
s.Logger.Error("delete images in swr failed failed %v", err)
return s.ErrorMsg(errors.ServerInternalError, "delete images in swr failed!", err)
}
s.Logger.Info("BuildId %s object and bucket delete from swr success!", buildId)
return nil
}