Skip to content

Commit

Permalink
add check delivery version api
Browse files Browse the repository at this point in the history
Signed-off-by: Patrick Zhao <[email protected]>
  • Loading branch information
PetrusZ committed Jun 19, 2024
1 parent f0277d4 commit 4ec448a
Show file tree
Hide file tree
Showing 8 changed files with 913 additions and 48 deletions.
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ require (
github.com/gin-gonic/gin v1.9.1
github.com/go-co-op/gocron v1.17.0
github.com/go-ldap/ldap/v3 v3.3.0
github.com/go-redis/redis v6.15.9+incompatible
github.com/go-redsync/redsync/v4 v4.11.0
github.com/go-resty/resty/v2 v2.7.0
github.com/go-sql-driver/mysql v1.7.1
Expand Down
1 change: 1 addition & 0 deletions pkg/microservice/aslan/core/delivery/handler/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ func (*Router) Inject(router *gin.RouterGroup) {
deliveryRelease.DELETE("/:id", GetProductNameByDelivery, DeleteDeliveryVersion)
deliveryRelease.POST("/k8s", CreateK8SDeliveryVersion)
deliveryRelease.POST("/helm", CreateHelmDeliveryVersion)
deliveryRelease.GET("/check", CheckDeliveryVersion)
deliveryRelease.POST("/helm/global-variables", ApplyDeliveryGlobalVariables)
deliveryRelease.GET("/helm/charts", DownloadDeliveryChart)
deliveryRelease.GET("/helm/charts/version", GetChartVersionFromRepo)
Expand Down
25 changes: 25 additions & 0 deletions pkg/microservice/aslan/core/delivery/handler/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -513,3 +513,28 @@ func ApplyDeliveryGlobalVariables(c *gin.Context) {
}
ctx.Resp, ctx.Err = deliveryservice.ApplyDeliveryGlobalVariables(args, ctx.Logger)
}

// @Summary Check Delivery Version
// @Description Check Delivery Version
// @Tags delivery
// @Accept json
// @Produce json
// @Param projectName query string true "project name"
// @Param version query string true "version"
// @Success 200
// @Router /api/aslan/delivery/releases/check [get]
func CheckDeliveryVersion(c *gin.Context) {
ctx, err := internalhandler.NewContextWithAuthorization(c)
defer func() { internalhandler.JSONResponse(c, ctx) }()

if err != nil {
ctx.Err = fmt.Errorf("authorization Info Generation failed: err %s", err)
ctx.UnAuthorized = true
return
}

versionName := c.Query("version")
projectName := c.Query("projectName")

ctx.Err = deliveryservice.CheckDeliveryVersion(projectName, versionName)
}
140 changes: 97 additions & 43 deletions pkg/microservice/aslan/core/delivery/service/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import (
commonmodels "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/models"
"github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/models/task"
"github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/models/template"
"github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/mongodb"
commonrepo "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/mongodb"
templaterepo "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/mongodb/template"
commonservice "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service"
Expand Down Expand Up @@ -951,6 +952,25 @@ func CreateHelmDeliveryVersion(args *CreateHelmDeliveryVersionArgs, logger *zap.
}
}

func CheckDeliveryVersion(projectName, deliveryVersionName string) error {
if len(deliveryVersionName) == 0 {
return e.ErrCheckDeliveryVersion.AddDesc("版本不能为空")
}
if len(projectName) == 0 {
return e.ErrCheckDeliveryVersion.AddDesc("项目名称不能为空")
}

_, err := commonrepo.NewDeliveryVersionColl().Get(&commonrepo.DeliveryVersionArgs{
ProductName: projectName,
Version: deliveryVersionName,
})
if !mongodb.IsErrNoDocuments(err) {
return e.ErrCheckDeliveryVersion.AddErr(fmt.Errorf("版本 %s 已存在", deliveryVersionName))
}

return nil
}

// validate yamlInfo, make sure service is in environment
// prepare data set for yaml delivery
func prepareYamlData(yamlDatas []*CreateK8SDeliveryVersionYamlData, productInfo *commonmodels.Product) (map[string]string, error) {
Expand Down Expand Up @@ -1128,6 +1148,10 @@ func buildDeliveryImages(productInfo *commonmodels.Product, targetRegistry *comm

for _, yamlData := range args.YamlDatas {
for _, imageData := range yamlData.ImageDatas {
if !imageData.Selected {
continue
}

deliveryDeploy := new(commonmodels.DeliveryDeploy)
deliveryDeploy.ReleaseID = deliveryVersion.ID
deliveryDeploy.StartTime = time.Now().Unix()
Expand All @@ -1136,6 +1160,10 @@ func buildDeliveryImages(productInfo *commonmodels.Product, targetRegistry *comm
deliveryDeploy.ContainerName = imageData.ImageName
deliveryDeploy.RegistryID = args.ImageRegistryID

if targetRegistry == nil {
return fmt.Errorf("target registry not found, registryID: %s", args.ImageRegistryID)
}

regAddr, err := targetRegistry.GetRegistryAddress()
if err != nil {
return fmt.Errorf("failed to get registry address, err: %s", err)
Expand All @@ -1159,20 +1187,25 @@ func buildDeliveryImages(productInfo *commonmodels.Product, targetRegistry *comm
if err != nil {
return fmt.Errorf("failed to generate workflow from delivery version, versionName: %s, err: %s", deliveryVersion.Version, err)
}
createResp, err := workflowservice.CreateWorkflowTaskV4(&workflowservice.CreateWorkflowTaskV4Args{
Name: "system",
Type: config.WorkflowTaskTypeDelivery,
}, deliveryVersionWorkflowV4, logger)
if err != nil {
return fmt.Errorf("failed to create delivery version custom workflow task, versionName: %s, err: %s", deliveryVersion.Version, err)
}

deliveryVersion.WorkflowName = createResp.WorkflowName
deliveryVersion.TaskID = int(createResp.TaskID)
err = commonrepo.NewDeliveryVersionColl().UpdateWorkflowTask(deliveryVersion.Version, deliveryVersion.ProductName, deliveryVersion.WorkflowName, int32(deliveryVersion.TaskID))
if err != nil {
logger.Errorf("failed to update delivery version task_id, version: %s, task_id: %s, err: %s", deliveryVersion, deliveryVersion.ProductName, deliveryVersion.TaskID)
if len(deliveryVersionWorkflowV4.Stages) != 0 {
createResp, err := workflowservice.CreateWorkflowTaskV4(&workflowservice.CreateWorkflowTaskV4Args{
Name: "system",
Type: config.WorkflowTaskTypeDelivery,
}, deliveryVersionWorkflowV4, logger)
if err != nil {
return fmt.Errorf("failed to create delivery version custom workflow task, versionName: %s, err: %s", deliveryVersion.Version, err)
}

deliveryVersion.WorkflowName = createResp.WorkflowName
deliveryVersion.TaskID = int(createResp.TaskID)

err = commonrepo.NewDeliveryVersionColl().UpdateWorkflowTask(deliveryVersion.Version, deliveryVersion.ProductName, deliveryVersion.WorkflowName, int32(deliveryVersion.TaskID))
if err != nil {
logger.Errorf("failed to update delivery version task_id, version: %s, task_id: %s, err: %s", deliveryVersion, deliveryVersion.ProductName, deliveryVersion.TaskID)
}
}

// start a new routine to check task results
go waitK8SImageVersionDone(deliveryVersion)

Expand Down Expand Up @@ -1446,26 +1479,37 @@ func checkK8SImageVersionStatus(deliveryVersion *commonmodels.DeliveryVersion) (
if deliveryVersion.Status == setting.DeliveryVersionStatusSuccess || deliveryVersion.Status == setting.DeliveryVersionStatusFailed {
return true, nil
}

workflowTaskExist := true
workflowTask, err := commonrepo.NewworkflowTaskv4Coll().Find(deliveryVersion.WorkflowName, int64(deliveryVersion.TaskID))
if err != nil {
return false, fmt.Errorf("failed to find workflow task, workflowName: %s, taskID: %d", deliveryVersion.WorkflowName, deliveryVersion.TaskID)
}

if len(workflowTask.Stages) != 1 {
return false, fmt.Errorf("invalid task data, stage length not leagal")
if err == mongo.ErrNoDocuments {
workflowTaskExist = false
} else {
return false, fmt.Errorf("failed to find workflow task, workflowName: %s, taskID: %d", deliveryVersion.WorkflowName, deliveryVersion.TaskID)
}
}

done := false
if workflowTask.Status == config.StatusPassed {
deliveryVersion.Status = setting.DeliveryVersionStatusSuccess
done = true
} else if workflowTask.Status == config.StatusFailed || workflowTask.Status == config.StatusTimeout || workflowTask.Status == config.StatusCancelled {
deliveryVersion.Status = setting.DeliveryVersionStatusFailed
if workflowTaskExist {
if len(workflowTask.Stages) != 1 {
return false, fmt.Errorf("invalid task data, stage length not leagal")
}
if workflowTask.Status == config.StatusPassed {
deliveryVersion.Status = setting.DeliveryVersionStatusSuccess
done = true
} else if workflowTask.Status == config.StatusFailed || workflowTask.Status == config.StatusTimeout || workflowTask.Status == config.StatusCancelled {
deliveryVersion.Status = setting.DeliveryVersionStatusFailed
done = true
}
} else {
done = true
}
if done {
updateVersionStatus(deliveryVersion.Version, deliveryVersion.ProductName, deliveryVersion.Status, deliveryVersion.Error)
}

return done, nil
}

Expand Down Expand Up @@ -1627,9 +1671,6 @@ func checkHelmChartVersionStatus(deliveryVersion *commonmodels.DeliveryVersion)
}

func CreateNewK8SDeliveryVersion(args *CreateK8SDeliveryVersionArgs, logger *zap.SugaredLogger) error {
if len(args.ImageRegistryID) == 0 {
return e.ErrCreateDeliveryVersion.AddDesc("image registry not appointed")
}
// prepare data
productInfo, err := getProductEnvInfo(args.ProductName, args.EnvName, args.Production)
if err != nil {
Expand All @@ -1643,18 +1684,20 @@ func CreateNewK8SDeliveryVersion(args *CreateK8SDeliveryVersionArgs, logger *zap
}

var targetRegistry *commonmodels.RegistryNamespace
for _, registry := range registryMap {
if registry.ID.Hex() == args.ImageRegistryID {
targetRegistry = registry
break
if len(args.ImageRegistryID) != 0 {
for _, registry := range registryMap {
if registry.ID.Hex() == args.ImageRegistryID {
targetRegistry = registry
break
}
}
targetRegistryProjectSet := sets.NewString()
for _, project := range targetRegistry.Projects {
targetRegistryProjectSet.Insert(project)
}
if !targetRegistryProjectSet.Has(productInfo.ProductName) && !targetRegistryProjectSet.Has(setting.AllProjects) {
return fmt.Errorf("registry %s/%s not support project %s", targetRegistry.RegAddr, targetRegistry.Namespace, productInfo.ProductName)
}
}
targetRegistryProjectSet := sets.NewString()
for _, project := range targetRegistry.Projects {
targetRegistryProjectSet.Insert(project)
}
if !targetRegistryProjectSet.Has(productInfo.ProductName) && !targetRegistryProjectSet.Has(setting.AllProjects) {
return fmt.Errorf("registry %s/%s not support project %s", targetRegistry.RegAddr, targetRegistry.Namespace, productInfo.ProductName)
}

productInfo.ID, _ = primitive.ObjectIDFromHex("")
Expand Down Expand Up @@ -2184,6 +2227,9 @@ func generateCustomWorkflowFromDeliveryVersion(productInfo *commonmodels.Product
registryDatasMap := map[*commonmodels.RegistryNamespace]map[string][]*ImageData{}
for _, yamlData := range args.YamlDatas {
for _, imageData := range yamlData.ImageDatas {
if !imageData.Selected {
continue
}
sourceImageTag := ""
registryURL := strings.TrimSuffix(imageData.Image, fmt.Sprintf("/%s", imageData.ImageName))
tmpArr := strings.Split(imageData.Image, ":")
Expand Down Expand Up @@ -2229,6 +2275,13 @@ func generateCustomWorkflowFromDeliveryVersion(productInfo *commonmodels.Product
for sourceRegistry, serviceNameImageDatasMap := range registryDatasMap {
for serviceName, imageDatas := range serviceNameImageDatasMap {
for _, imageData := range imageDatas {
if !imageData.Selected {
continue
}

if targetRegistry == nil {
return nil, fmt.Errorf("target registry not appointed")
}
sourceContainter := serviceNameContainerMap[serviceName][imageData.ContainerName]
if sourceContainter == nil {
return nil, fmt.Errorf("can't find source container: %s", imageData.ContainerName)
Expand Down Expand Up @@ -2269,14 +2322,15 @@ func generateCustomWorkflowFromDeliveryVersion(productInfo *commonmodels.Product
}
}

stage = append(stage, &commonmodels.WorkflowStage{
Name: "distribute-image",
Parallel: false,
Approval: nil,
Jobs: jobs,
})

resp.Stages = stage
if len(jobs) > 0 {
stage = append(stage, &commonmodels.WorkflowStage{
Name: "distribute-image",
Parallel: false,
Approval: nil,
Jobs: jobs,
})
resp.Stages = stage
}

return resp, nil
}
Expand Down
Loading

0 comments on commit 4ec448a

Please sign in to comment.