|
- /* ******************************************************************************
- * 2019 - present Contributed by Apulis Technology (Shenzhen) Co. LTD
- *
- * This program and the accompanying materials are made available under the
- * terms of the MIT License, which is available at
- * https://www.opensource.org/licenses/MIT
- *
- * See the NOTICE file distributed with this work for additional
- * information regarding copyright ownership.
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- * SPDX-License-Identifier: MIT
- ******************************************************************************/
- package controllers
-
- import (
- "fmt"
- "github.com/apulis/app/ai-arts-backend/internal/constant"
- "strconv"
-
- "github.com/apulis/app/ai-arts-backend/pkg/exports"
-
- "github.com/apulis/app/ai-arts-backend/internal/dto"
- "github.com/apulis/app/ai-arts-backend/internal/middlewares"
- "github.com/apulis/app/ai-arts-backend/internal/services"
- "github.com/apulis/sdk/go-utils/logging"
- "github.com/gin-gonic/gin"
- )
-
- type CodeLab struct {
- }
-
- func (r *CodeLab) Create(c *gin.Context) {
- var createRunningConfigDto dto.CreateCodeLabConfig
- if bindAndValidate(c, &createRunningConfigDto) {
- createRunningConfigDto.Uid, _ = middlewares.UserId(c)
- createRunningConfigDto.GroupId, _ = middlewares.GroupId(c)
- createRunningConfigDto.UserName = middlewares.UserName(c)
-
- if groupId, err := strconv.ParseInt(c.Query("groupId"), 0, 64); err == nil && groupId > 0 {
- createRunningConfigDto.GroupId = groupId
- }
- //@add: add quota check before create job
- if createRunningConfigDto.Config.ResourceInfo.QuotaId == 0 {
- fail(c, exports.ParameterError("start dev job invalid quota id !"))
- }
- quota, err := services.ValidateUserGroupQuota(c.GetHeader("Authorization"), createRunningConfigDto.GroupId,
- createRunningConfigDto.Config.ResourceInfo.QuotaId, createRunningConfigDto.Config.ResourceInfo.Num,
- createRunningConfigDto.Config.ResourceInfo.Node, nil,c.Query("checkUsed") == "1")
- if err != nil {
- fail(c, err)
- return
- }
- //createRunningConfigDto.Config.ResourceInfo = *quota
- fmt.Println(quota, *quota)
-
- logging.Info().Msgf("create RunningConfig %v", createRunningConfigDto)
- projectModel, err1 := services.GetGlobalCodeLabService().Create(&createRunningConfigDto)
- if err1 != nil {
- fail(c, err1)
- return
- }
-
- //获取模型工厂临时路径
- resp, commResp, err2 := services.GetGlobalApWorkShopService().GetModelTmpPath(&dto.ApWorkShopGetTmpReq{UserName: createRunningConfigDto.UserName}, c.Request.Header)
- if err2 != nil {
- fail(c, err2)
- return
- } else if commResp.Code != 0 {
- failWithData(c, commResp.Code, commResp.Msg, commResp.Data)
- return
- }
- fmt.Println("ApWorkShop tmp path:", resp.TmpStoragePath)
-
- aiLabService := &services.AiLabService{}
- startCodeRunLabReq := &dto.CreateAiLabRunReq{}
- startCodeRunLabReq.Name = fmt.Sprintf("%s-%d", createRunningConfigDto.UserName, createRunningConfigDto.ProjectId)
- startCodeRunLabReq.Creator = createRunningConfigDto.UserName
- //startCodeRunLabReq.Quota.Request = createRunningConfigDto.Config.ResourceInfo
- // 在 quota中增加节点个数表示分布式节点
- //startCodeRunLabReq.Quota.Node = startCodeRunLabReq.Quota.Request.Node
- //startCodeRunLabReq.Quota.Request.Node = 0
- startCodeRunLabReq.Quota = *quota
- startCodeRunLabReq.Arch = quota.Arch
-
- startCodeRunLabReq.Resource = map[string]dto.ResourceType{}
- startCodeRunLabReq.LabId = projectModel.LabId
- startCodeRunLabReq.UserId = createRunningConfigDto.Uid
- if createRunningConfigDto.Config.ImageSource.String() == "1" {
- startCodeRunLabReq.Engine = createRunningConfigDto.Config.ImageId.String()
- } else if !createRunningConfigDto.Config.ValidateImageName(){
- fail(c,exports.ParameterError("invalid image name !!!"))
- }else{
- startCodeRunLabReq.Engine = createRunningConfigDto.Config.ImageName
- }
-
- //startCodeRunLabReq.Engine = "harbor.apulis.cn:8443/algorithm/apulistech/horovod:0.20.0-tf2.3.0-torch1.6.0-mxnet1.6.0.post0-py3.7-cuda10.1-nni2.4"
-
- startCodeRunLabReq.InitResource(createRunningConfigDto.Config.DataSets, createRunningConfigDto.UserName, createRunningConfigDto.ProjectId, createRunningConfigDto.Uid, createRunningConfigDto.GroupId, projectModel.CodeId, resp.TmpStoragePath)
- //@add: allocate output for `dev`
- startCodeRunLabReq.Output=constant.AILAB_RESOURCE_TYPE_OUTPUT
- startCodeRunLabReq.Cmd = []string{"/start/aiarts_launcher"}
- startCodeRunLabReq.EndPoints = append(startCodeRunLabReq.EndPoints, dto.EndPointType{
- Name: "$jupyter", Port: 8888,
- })
- //@add: support for SSH
- if createRunningConfigDto.Config.EnableSSH {
- startCodeRunLabReq.EndPoints = append(startCodeRunLabReq.EndPoints, dto.EndPointType{
- Name: "$ssh", Port: 22, SecretKey: "*",
- })
- }
- //@add: support for NNI
- if createRunningConfigDto.Config.EnableNNI {
- startCodeRunLabReq.EndPoints = append(startCodeRunLabReq.EndPoints, dto.EndPointType{
- Name: "$nni", Port: 8080,
- }, dto.EndPointType{
- Name: "$nni-rest", Port: 8081,
- })
- }
- if _, commResp, err := aiLabService.StartCodeRunLab(startCodeRunLabReq, c.Request.Header); err != nil {
- fail(c, err)
- } else if commResp.Code != 0 {
- failWithData(c, commResp.Code, commResp.Msg, commResp.Data)
- } else {
- ok(c)
- }
- }
- }
-
- func (r *CodeLab) List(c *gin.Context) {
- var listRunningConfigDto dto.ListCodeLabConfig
- if bindAndValidate(c, &listRunningConfigDto) {
- logging.Info().Msgf("list RunningConfig %v", listRunningConfigDto)
- listRunningConfigDto.Uid = -1
- listRunningConfigResp, total, err := services.GetGlobalCodeLabService().List(&listRunningConfigDto)
-
- if err != nil {
- fail(c, err)
- } else {
- resp := &dto.BaseListResp{}
- resp.Items = listRunningConfigResp.Configs
- resp.Total = total
-
- respWithData(c, resp)
- }
- }
- }
-
- func (r *CodeLab) Get(c *gin.Context) {
- var getRunningConfigDto dto.GetCodeLabConfig
- if bindAndValidate(c, &getRunningConfigDto) {
- logging.Info().Msgf("get RunningConfig %v", getRunningConfigDto)
- if getRunningConfigDto.Uid == 0 {
- getRunningConfigDto.Uid, _ = middlewares.UserId(c)
- }
- getRunningConfigResp, err := services.GetGlobalCodeLabService().Get(&getRunningConfigDto)
-
- if err != nil {
- fail(c, err)
- return
- }
-
- creator := getRunningConfigResp.Creator
- projectId := getRunningConfigResp.ProjectId
- uid := getRunningConfigResp.Uid
- gid := getRunningConfigResp.GroupId
-
- ret := dto.CodeLabDetailResp{
- CodeLabResp: *getRunningConfigResp,
- }
-
- for _, v := range getRunningConfigResp.DataSets {
- datasetCreator := dto.DataSetResourceCreator{
- ResourceCreator: dto.ResourceCreator{UserName: creator},
- Name: v.Name,
- Version: v.Version,
- ID: v.DatasetId,
- }
- ret.DataSetPath = append(ret.DataSetPath, datasetCreator.Rpath())
- }
- {
- creator := dto.CodeResourceCreator{
- ResourceCreator: dto.ResourceCreator{UserName: creator},
- ProjectId: projectId,
- UserId: uid,
- }
- ret.CodePath = creator.Rpath()
- }
- {
- creator := dto.OutPutResourceCreator{
- ResourceCreator: dto.ResourceCreator{UserName: creator},
- ProjectId: projectId,
- UserId: uid,
- }
- ret.OutPutPath = creator.Rpath()
- }
- {
- creator := dto.UserDataResourceCreator{
- ResourceCreator: dto.ResourceCreator{UserName: creator},
- UserId: uid,
- }
- ret.UserDataPath = creator.Rpath()
- }
- {
- creator := dto.TeamDataResourceCreator{
- ResourceCreator: dto.ResourceCreator{UserName: creator},
- GroupId: gid,
- }
- ret.TeamDataPath = creator.Rpath()
- }
- {
- creator := dto.UserDataResourceCreator{
- ResourceCreator: dto.ResourceCreator{UserName: creator},
- UserId: uid,
- }
- ret.UserCondaPath = creator.Rpath()
- }
- if err != nil {
- fail(c, err)
- } else {
- respWithData(c, ret)
- }
- }
- }
-
- func (r *CodeLab) Stop(c *gin.Context) {
- var stop dto.StopCodeLabConfig
- if bindAndValidate(c, &stop) {
- logging.Info().Msgf("stop codeLab %v", stop)
- err := services.GetGlobalCodeLabService().Stop(&stop)
- if err != nil {
- fail(c, err)
- return
- }
- projectService := services.ProjectService{}
- projectInfo, err := projectService.Get(&dto.GetProjectReq{Id: stop.ProjectId})
- if err != nil {
- fail(c, err)
- return
- }
- aiLabService := &services.AiLabService{}
- deleteReq := &dto.DeleteAiLabRunReq{}
- deleteReq.LabId = projectInfo.LabId
- deleteReq.RunId = stop.RunId
- _, commResp, err := aiLabService.StopCodeRunLab(deleteReq, nil)
- if err != nil {
- fail(c, err)
- } else if commResp.Code != 0 {
- failWithData(c, commResp.Code, commResp.Msg, commResp.Data)
- } else {
- ok(c)
- }
- }
- }
|