#769 master

Merged
yangxzh1 merged 12 commits from openioctopus/octopus:master into master 6 months ago
  1. +14
    -14
      Makefile
  2. +6
    -1
      admin-portal/src/views/devManager/components/notebook/detailDialog.vue
  3. +61
    -0
      admin-portal/src/views/devManager/components/notebook/notebookExit.vue
  4. +2
    -2
      admin-portal/vue.config.js
  5. +4
    -4
      build/application/admin-portal/dockerfile
  6. +7
    -0
      build/application/admin-server/dockerfile
  7. +6
    -0
      build/application/api-doc/dockerfile
  8. +6
    -0
      build/application/base-server/dockerfile
  9. +4
    -4
      build/application/openai-portal/dockerfile
  10. +6
    -0
      build/application/openai-server/dockerfile
  11. +4
    -0
      build/application/volcano/scheduler/dockerfile
  12. +4
    -0
      build/application/volcano/vc-controller/dockerfile
  13. +4
    -0
      deploy/charts/octopus/crds/fluid-system.yaml
  14. +1
    -1
      deploy/charts/octopus/templates/logger.yaml
  15. +6
    -1
      openai-portal/src/views/modelDev/components/notebook/detailDialog.vue
  16. +61
    -0
      openai-portal/src/views/modelDev/components/notebook/notebookExit.vue
  17. +1
    -0
      server/admin-server/api/v1/develop.proto
  18. +1
    -0
      server/base-server/api/v1/develop.proto
  19. +23
    -0
      server/base-server/internal/data/registry/harbor.go
  20. +1
    -0
      server/base-server/internal/data/registry/registry.go
  21. +13
    -0
      server/base-server/internal/service/develop/develop.go
  22. +15
    -1
      server/base-server/internal/service/image/image.go
  23. +9
    -6
      server/common/errors/codes.go
  24. +1
    -0
      server/openai-server/api/v1/develop.proto

+ 14
- 14
Makefile View File

@@ -48,17 +48,17 @@ init:
mkdir -p ${SERVER_BINARY_DIR}

base-server_build: init
cd ./server && go mod download && go generate
cd ./server && go generate

cd ./server/base-server && go build -ldflags ${LD_FLAGS} -o ${SERVER_BINARY_DIR} ./...

admin-server_build: init
cd ./server && go mod download && go generate
cd ./server && go generate

cd ./server/admin-server && go build -ldflags ${LD_FLAGS} -o ${SERVER_BINARY_DIR} ./...

openai-server_build: init
cd ./server && go mod download && go generate
cd ./server && go generate

cd ./server/openai-server && go build -ldflags ${LD_FLAGS} -o ${SERVER_BINARY_DIR} ./...

@@ -71,7 +71,7 @@ scheduler_build: init
cd ./server/volcano && go build -ldflags ${LD_FLAGS} -o ${SERVER_BINARY_DIR} ./cmd/scheduler

api-doc_build: init
cd ./server && go mod download && go generate
cd ./server && go generate
# 运行
all_run: server_run

@@ -139,7 +139,7 @@ lint_init:
golangci-lint version

lint: lint_init
cd ./server && go mod download && golangci-lint run ./...
cd ./server && golangci-lint run ./...

common_lint: lint_init
cd ./server/common && golangci-lint run ./...
@@ -160,33 +160,33 @@ volcano_lint: lint_init
images: base-server_image admin-server_image openai-server_image volcano_image admin-portal_image openai-portal_image api-doc_image node-agent_image

base-server_image:
docker build --no-cache -t base-server:${RELEASE_VER} -f ./build/application/base-server/dockerfile .
docker build -t base-server:${RELEASE_VER} -f ./build/application/base-server/dockerfile .

admin-server_image:
docker build --no-cache -t admin-server:${RELEASE_VER} -f ./build/application/admin-server/dockerfile .
docker build -t admin-server:${RELEASE_VER} -f ./build/application/admin-server/dockerfile .

openai-server_image:
docker build --no-cache -t openai-server:${RELEASE_VER} -f ./build/application/openai-server/dockerfile .
docker build -t openai-server:${RELEASE_VER} -f ./build/application/openai-server/dockerfile .

volcano_image: vc-controller_image scheduler_image

vc-controller_image:
docker build --no-cache -t vc-controller:${RELEASE_VER} -f ./build/application/volcano/vc-controller/dockerfile .
docker build -t vc-controller:${RELEASE_VER} -f ./build/application/volcano/vc-controller/dockerfile .

scheduler_image:
docker build --no-cache -t scheduler:${RELEASE_VER} -f ./build/application/volcano/scheduler/dockerfile .
docker build -t scheduler:${RELEASE_VER} -f ./build/application/volcano/scheduler/dockerfile .

admin-portal_image:
docker build --no-cache -t admin-portal:${RELEASE_VER} -f ./build/application/admin-portal/dockerfile .
docker build -t admin-portal:${RELEASE_VER} -f ./build/application/admin-portal/dockerfile .

openai-portal_image:
docker build --no-cache -t openai-portal:${RELEASE_VER} -f ./build/application/openai-portal/dockerfile .
docker build -t openai-portal:${RELEASE_VER} -f ./build/application/openai-portal/dockerfile .

api-doc_image:
docker build --no-cache -t api-doc:${RELEASE_VER} -f ./build/application/api-doc/dockerfile .
docker build -t api-doc:${RELEASE_VER} -f ./build/application/api-doc/dockerfile .

node-agent_image:
docker build --no-cache -t node-agent:${RELEASE_VER} -f ./build/application/nodeagent/dockerfile ./controller/nodeagent
docker build -t node-agent:${RELEASE_VER} -f ./build/application/nodeagent/dockerfile ./controller/nodeagent

# 镜像推送
images_push: base-server_image_push admin-server_image_push openai-server_image_push volcano_image_push admin-portal_image_push openai-portal_image_push api-doc_image_push node-agent_image_push


+ 6
- 1
admin-portal/src/views/devManager/components/notebook/detailDialog.vue View File

@@ -19,6 +19,9 @@ v<template>
<el-tab-pane label="事件记录">
<notebookEventRecord :notebook-data="notebookData" />
</el-tab-pane>
<el-tab-pane label="退出信息">
<notebookExit :notebook-data="notebookData" />
</el-tab-pane>
</el-tabs>
</el-dialog>
</div>
@@ -27,6 +30,7 @@ v<template>
import notebookInfo from "./notebookInfo.vue"
import notebookProfile from "./notebookProfile.vue"
import notebookEventRecord from "./notebookEventRecord.vue"
import notebookExit from "./notebookExit.vue"
export default {
name: "DetailDialog",
props: {
@@ -38,7 +42,8 @@ export default {
components: {
notebookInfo,
notebookProfile,
notebookEventRecord
notebookEventRecord,
notebookExit
},
data() {
return {


+ 61
- 0
admin-portal/src/views/devManager/components/notebook/notebookExit.vue View File

@@ -0,0 +1,61 @@
<template>
<div>
<div>
<el-row>
<el-col :span="12">
<div>任务名称:<span>{{ notebookInfo.name }}</span></div>
</el-col>
<el-col :span="12">
<div>是否分布式:<span>{{ this.notebookInfo.tasks.length > 1 ? '是' : '否'}}</span></div>
</el-col>

</el-row>
<el-input v-model="exitMsg" type="textarea" :readonly="true" :rows="20" />
</div>

<div slot="footer" class="dialog-footer" />
</div>
</template>

<script>
export default {
name: "NotebookExit",
props: {
notebookData: {
type: Object,
default: () => { }
}
},
data() {
return {
notebookInfo: {},
exitMsg: '暂无相关信息'
}
},
created() {
this.notebookInfo = this.notebookData
if(this.notebookInfo.exitMsg) {
this.exitMsg = this.notebookInfo.exitMsg
}
}
}
</script>

<style lang="scss" scoped>
.el-col {
margin: 10px 0 20px 0;
font-size: 15px;
font-weight: 800;

span {
font-weight: 400;
margin-left: 20px
}
}


.block {
float: right;
margin: 20px;
}
</style>

+ 2
- 2
admin-portal/vue.config.js View File

@@ -38,14 +38,14 @@ module.exports = {
},
proxy: {
[process.env.VUE_APP_BASE_API]: {
target: 'http://192.168.203.154',
target: 'http://192.168.202.73',
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '/adminserver'
}
},
[process.env.VUE_APP_BASE_API2]: {
target: 'http://192.168.203.154',
target: 'http://192.168.202.73',
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API2]: ''


+ 4
- 4
build/application/admin-portal/dockerfile View File

@@ -4,11 +4,11 @@ ENV PROJECT_ENV production
ENV NODE_ENV production

WORKDIR /admin-portal

COPY ./admin-portal ./
COPY ./admin-portal/package.json ./
RUN npm config set registry https://registry.npm.taobao.org && \
npm install --dev && \
npm run build:prod
npm install --dev
COPY ./admin-portal ./
RUN npm run build:prod

FROM nginx:1.21.0-alpine
COPY --from=builder /admin-portal/dist/ /usr/share/nginx/html

+ 7
- 0
build/application/admin-server/dockerfile View File

@@ -1,5 +1,12 @@
from swr.cn-south-1.myhuaweicloud.com/openioctopus/kratos:v2 as builder
WORKDIR /app
COPY ./controller/nodeagent/go.mod ./controller/nodeagent/go.sum ./controller/nodeagent/
RUN cd ./controller/nodeagent && go mod download
COPY ./server/apis/go.mod ./server/apis/go.sum ./server/apis/
RUN cd ./server/apis && go mod download
COPY ./server/go.mod ./server/go.sum ./server/
RUN cd ./server && go mod download

COPY ./ ./

RUN make admin-server_build binary_dir="/app/server/bin"


+ 6
- 0
build/application/api-doc/dockerfile View File

@@ -1,5 +1,11 @@
from swr.cn-south-1.myhuaweicloud.com/openioctopus/kratos:v2 as builder
WORKDIR /app
COPY ./controller/nodeagent/go.mod ./controller/nodeagent/go.sum ./controller/nodeagent/
RUN cd ./controller/nodeagent && go mod download
COPY ./server/apis/go.mod ./server/apis/go.sum ./server/apis/
RUN cd ./server/apis && go mod download
COPY ./server/go.mod ./server/go.sum ./server/
RUN cd ./server && go mod download
COPY ./ ./

RUN make api-doc_build


+ 6
- 0
build/application/base-server/dockerfile View File

@@ -1,5 +1,11 @@
from swr.cn-south-1.myhuaweicloud.com/openioctopus/kratos:v2 as builder
WORKDIR /app
COPY ./controller/nodeagent/go.mod ./controller/nodeagent/go.sum ./controller/nodeagent/
RUN cd ./controller/nodeagent && go mod download
COPY ./server/apis/go.mod ./server/apis/go.sum ./server/apis/
RUN cd ./server/apis && go mod download
COPY ./server/go.mod ./server/go.sum ./server/
RUN cd ./server && go mod download
COPY ./ ./

RUN make base-server_build binary_dir="/app/server/bin"


+ 4
- 4
build/application/openai-portal/dockerfile View File

@@ -4,11 +4,11 @@ ENV PROJECT_ENV production
ENV NODE_ENV production

WORKDIR /openai-portal

COPY ./openai-portal ./
COPY ./openai-portal/package.json ./
RUN npm config set registry https://registry.npm.taobao.org && \
npm install --dev && \
npm run build:prod
npm install --dev
COPY ./openai-portal ./
RUN npm run build:prod

FROM nginx:1.21.0-alpine
COPY --from=builder /openai-portal/dist/ /usr/share/nginx/html

+ 6
- 0
build/application/openai-server/dockerfile View File

@@ -1,5 +1,11 @@
from swr.cn-south-1.myhuaweicloud.com/openioctopus/kratos:v2 as builder
WORKDIR /app
COPY ./controller/nodeagent/go.mod ./controller/nodeagent/go.sum ./controller/nodeagent/
RUN cd ./controller/nodeagent && go mod download
COPY ./server/apis/go.mod ./server/apis/go.sum ./server/apis/
RUN cd ./server/apis && go mod download
COPY ./server/go.mod ./server/go.sum ./server/
RUN cd ./server && go mod download
COPY ./ ./

RUN make openai-server_build binary_dir="/app/server/bin"


+ 4
- 0
build/application/volcano/scheduler/dockerfile View File

@@ -1,5 +1,9 @@
from swr.cn-south-1.myhuaweicloud.com/openioctopus/kratos:v2 as builder
WORKDIR /app
COPY ./server/apis/go.mod ./server/apis/go.sum ./server/apis/
RUN cd ./server/apis && go mod download
COPY ./server/volcano/go.mod ./server/volcano/go.sum ./server/volcano/
RUN cd ./server/volcano && go mod download
COPY ./ ./

ENV GOPATH /go


+ 4
- 0
build/application/volcano/vc-controller/dockerfile View File

@@ -1,5 +1,9 @@
from swr.cn-south-1.myhuaweicloud.com/openioctopus/kratos:v2 as builder
WORKDIR /app
COPY ./server/apis/go.mod ./server/apis/go.sum ./server/apis/
RUN cd ./server/apis && go mod download
COPY ./server/volcano/go.mod ./server/volcano/go.sum ./server/volcano/
RUN cd ./server/volcano && go mod download
COPY ./ ./

ENV GOPATH /go


+ 4
- 0
deploy/charts/octopus/crds/fluid-system.yaml View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: fluid-system

+ 1
- 1
deploy/charts/octopus/templates/logger.yaml View File

@@ -289,7 +289,7 @@ spec:
{{- end }}
containers:
- name: logstash
image: docker.elastic.co/logstash/logstash:7.13.0
image: docker.elastic.co/logstash/logstash:7.17.13
args: [
"bin/logstash","-f", "/usr/share/logstash/pipeline/logstash.conf",
]


+ 6
- 1
openai-portal/src/views/modelDev/components/notebook/detailDialog.vue View File

@@ -12,6 +12,9 @@
<el-tab-pane label="事件记录">
<notebookEventRecord :notebook-data="notebookData" />
</el-tab-pane>
<el-tab-pane label="退出信息">
<notebookExit :notebook-data="notebookData" />
</el-tab-pane>
</el-tabs>
</el-dialog>
</div>
@@ -20,12 +23,14 @@
import notebookInfo from "./notebookInfo.vue"
import notebookProfile from "./notebookProfile.vue"
import notebookEventRecord from "./notebookEventRecord.vue"
import notebookExit from "./notebookExit.vue"
export default {
name: "DetailDialog",
components: {
notebookInfo,
notebookProfile,
notebookEventRecord
notebookEventRecord,
notebookExit
},
props: {
detailData: {


+ 61
- 0
openai-portal/src/views/modelDev/components/notebook/notebookExit.vue View File

@@ -0,0 +1,61 @@
<template>
<div>
<div>
<el-row>
<el-col :span="12">
<div>任务名称:<span>{{ notebookInfo.name }}</span></div>
</el-col>
<el-col :span="12">
<div>是否分布式:<span>{{ this.notebookInfo.tasks.length > 1 ? '是' : '否'}}</span></div>
</el-col>

</el-row>
<el-input v-model="exitMsg" type="textarea" :readonly="true" :rows="20" />
</div>

<div slot="footer" class="dialog-footer" />
</div>
</template>

<script>
export default {
name: "NotebookExit",
props: {
notebookData: {
type: Object,
default: () => { }
}
},
data() {
return {
notebookInfo: {},
exitMsg: '暂无相关信息'
}
},
created() {
this.notebookInfo = this.notebookData
if(this.notebookInfo.exitMsg) {
this.exitMsg = this.notebookInfo.exitMsg
}
}
}
</script>

<style lang="scss" scoped>
.el-col {
margin: 10px 0 20px 0;
font-size: 15px;
font-weight: 800;

span {
font-weight: 400;
margin-left: 20px
}
}


.block {
float: right;
margin: 20px;
}
</style>

+ 1
- 0
server/admin-server/api/v1/develop.proto View File

@@ -91,6 +91,7 @@ message Notebook {
repeated Task tasks = 25;
string userEmail = 26;
string resourcePool=27;
string exitMsg = 28;
}

message ListNotebookReply {


+ 1
- 0
server/base-server/api/v1/develop.proto View File

@@ -123,6 +123,7 @@ message Notebook {
repeated Task tasks = 23;
string resourcePool=24;
string imageUrl = 25;
string exitMsg = 26;
}

message ListNotebookReply {


+ 23
- 0
server/base-server/internal/data/registry/harbor.go View File

@@ -5,6 +5,7 @@ import (
"crypto/tls"
"net/http"
"net/url"
"path"
"server/base-server/internal/conf"
"server/common/errors"
"strconv"
@@ -138,6 +139,17 @@ func (h *v1Registry) CreateProject(projectReq *ProjectReq) error {
}
}

func (h *v1Registry) DeleteArtifact(projectName string, repositoryName string, reference string) error {
if projectName == "" || repositoryName == "" || reference == "" {
return errors.Errorf(nil, errors.ErrorInvalidRequestParameter)
}
_, err := h.client.ProductsApi.RepositoriesRepoNameTagsTagDelete(h.GetAuth(nil), path.Join(projectName, repositoryName), reference)
if err != nil {
return errors.Errorf(err, errors.ErrorHarborDeleteArtifactFailed)
}
return nil
}

func (h *v1Registry) GetAuth(ctx context.Context) context.Context {
if ctx == nil {
ctx = context.TODO()
@@ -172,3 +184,14 @@ func (h *v2Registry) CreateProject(projectReq *ProjectReq) error {
return errors.Errorf(err1, errors.ErrorHarborCheckProjectFailed)
}
}

func (h *v2Registry) DeleteArtifact(projectName string, repositoryName string, reference string) error {
if projectName == "" || repositoryName == "" || reference == "" {
return errors.Errorf(nil, errors.ErrorInvalidRequestParameter)
}
_, err := h.client.ArtifactApi.DeleteArtifact(h.GetAuth(nil), projectName, url.PathEscape(url.PathEscape(repositoryName)), reference, nil)
if err != nil {
return errors.Errorf(err, errors.ErrorHarborDeleteArtifactFailed)
}
return nil
}

+ 1
- 0
server/base-server/internal/data/registry/registry.go View File

@@ -2,4 +2,5 @@ package registry

type ArtifactRegistry interface {
CreateProject(projectReq *ProjectReq) error
DeleteArtifact(projectName string, repositoryName string, reference string) error
}

+ 13
- 0
server/base-server/internal/service/develop/develop.go View File

@@ -925,8 +925,10 @@ func (s *developService) convertNotebook(ctx context.Context, notebooksTbl []*mo
return nil, err
}
priceMap := make(map[string]float64)
jobMap := make(map[string]*model.NotebookJob)
for _, j := range notebookJobs {
priceMap[j.Id] = j.ResourceSpecPrice
jobMap[j.Id] = j
}

notebooks := make([]*api.Notebook, 0)
@@ -942,11 +944,22 @@ func (s *developService) convertNotebook(ctx context.Context, notebooksTbl []*mo
for i := 0; i < n.TaskNumber; i++ {
notebook.Tasks = append(notebook.Tasks, &api.Notebook_Task{Name: buildTaskName(i), Url: buildNotebookUrl(n.NotebookJobId, i)})
}
notebook.ExitMsg = s.getExitMsg(ctx, jobMap[n.NotebookJobId])
notebooks = append(notebooks, notebook)
}
return notebooks, nil
}

func (s *developService) getExitMsg(ctx context.Context, job *model.NotebookJob) string {
detail := &typeJob.JobStatusDetail{}
err := json.Unmarshal([]byte(job.Detail), detail)
if err != nil || detail.Job == nil {
return ""
}

return detail.Job.ExitDiagnostics
}

func (s *developService) GetNotebook(ctx context.Context, req *api.GetNotebookRequest) (*api.GetNotebookReply, error) {
notebookTbl, err := s.data.DevelopDao.GetNotebook(ctx, req.Id)
if err != nil {


+ 15
- 1
server/base-server/internal/service/image/image.go View File

@@ -345,7 +345,21 @@ func (s *ImageService) DeleteImage(ctx context.Context, req *pb.DeleteImageReque
}
}

_, err := s.data.ImageDao.Delete(ctx, &model.ImageDel{
image, err := s.data.ImageDao.Find(ctx, &model.ImageQuery{Id: req.ImageId})
if err != nil {
return nil, err
}

if (image.SourceType == int32(pb.ImageSourceType_IMAGE_SOURCE_TYPE_UPLOADED) || image.SourceType == int32(pb.ImageSourceType_IMAGE_SOURCE_TYPE_SAVED)) &&
image.Status == int32(pb.ImageStatus_IMAGE_STATUS_MADE) {
index := strings.Index(image.ImageAddr, "/")
err := s.data.Registry.DeleteArtifact(image.ImageAddr[:index], image.ImageAddr[index+1:], image.ImageVersion)
if err != nil {
log.Error(ctx, err)
}
}

_, err = s.data.ImageDao.Delete(ctx, &model.ImageDel{
Id: req.ImageId,
})
if err != nil {


+ 9
- 6
server/common/errors/codes.go View File

@@ -62,9 +62,11 @@ const (
ErrorK8sDeleteSecretFailed = 10076 // k8s删除Secret失败
ErrorFluidInitFailed = 10077 // Fluid初始化失败
// Harbor操作相关错误
ErrorHarborProjectExists = 10080 // harbor项目已存在
ErrorHarborCreateProjectFailed = 10081 // harbor创建项目失败
ErrorHarborCheckProjectFailed = 10082 // harbor查询项目失败
ErrorHarborProjectExists = 10080 // harbor项目已存在
ErrorHarborCreateProjectFailed = 10081 // harbor创建项目失败
ErrorHarborCheckProjectFailed = 10082 // harbor查询项目失败
ErrorHarborDeleteArtifactFailed = 10083 // harbor删除镜像失败

// redis操作相关错误
ErroRedisParseUrlFailed = 10100 // redis解析url失败
ErroRedisHSetFailed = 10101 // redisHSet失败
@@ -298,9 +300,10 @@ var codeMsgMap = map[int]codeMsg{
ErrorK8sCreateIngressFailed: {codeType: Internal, msg: "create k8s ingress failed"},
ErrorK8sDeleteIngressFailed: {codeType: Internal, msg: "delete k8s ingress failed"},
// Harbor操作相关错误
ErrorHarborProjectExists: {codeType: AlreadyExists, msg: "harbor project exists"},
ErrorHarborCreateProjectFailed: {codeType: Internal, msg: "create harbor project failed"},
ErrorHarborCheckProjectFailed: {codeType: Internal, msg: "check harbor project failed"},
ErrorHarborProjectExists: {codeType: AlreadyExists, msg: "harbor project exists"},
ErrorHarborCreateProjectFailed: {codeType: Internal, msg: "create harbor project failed"},
ErrorHarborCheckProjectFailed: {codeType: Internal, msg: "check harbor project failed"},
ErrorHarborDeleteArtifactFailed: {codeType: Internal, msg: "delete harbor image failed"},
// redis操作相关错误
ErroRedisParseUrlFailed: {codeType: Internal, msg: "redis parse url failed"},
ErroRedisHSetFailed: {codeType: Internal, msg: "redis HSet failed"},


+ 1
- 0
server/openai-server/api/v1/develop.proto View File

@@ -163,6 +163,7 @@ message Notebook {
string imageVersion = 22;
repeated Task tasks = 23;
string imageUrl = 24;
string exitMsg = 25;
}

message ListNotebookReply {


Loading…
Cancel
Save