#1 master

Merged
lyb merged 100 commits from OpenI/octopus:master into master 1 year ago
  1. +1
    -1
      .drone.yml
  2. +0
    -9
      .github/PULL_REQUEST_TEMPLATE.md
  3. +1
    -1
      Makefile
  4. +16
    -0
      admin-portal/src/api/userManager.js
  5. +1
    -1
      admin-portal/src/layout/components/Navbar.vue
  6. +4
    -4
      admin-portal/src/views/resourceManager/components/nodeList.vue
  7. +148
    -10
      admin-portal/src/views/resourceManager/components/poolManager.vue
  8. +17
    -2
      admin-portal/src/views/resourceManager/components/resource.vue
  9. +107
    -0
      admin-portal/src/views/userManager/components/minioAccount.vue
  10. +108
    -0
      admin-portal/src/views/userManager/components/minioBuckets.vue
  11. +29
    -1
      admin-portal/src/views/userManager/user.vue
  12. +2
    -2
      admin-portal/vue.config.js
  13. BIN
      deploy/charts/octopus/charts/minio-11.2.6.tgz
  14. BIN
      deploy/charts/octopus/charts/minio-7.1.3.tgz
  15. +1
    -1
      deploy/charts/octopus/templates/_helpers.tpl
  16. +1
    -1
      deploy/charts/octopus/templates/api-doc.yaml
  17. +74
    -0
      deploy/charts/octopus/templates/ascend.yaml
  18. +0
    -1
      deploy/charts/octopus/templates/base-server.yaml
  19. +26
    -11
      deploy/charts/octopus/templates/cambricon-device-plugin.yaml
  20. +7581
    -3
      deploy/charts/octopus/templates/grafana.yaml
  21. +2
    -2
      deploy/charts/octopus/templates/ingress.yaml
  22. +70
    -0
      deploy/charts/octopus/templates/nvidia-device-plugin.yaml
  23. +91
    -13
      deploy/charts/octopus/templates/prometheus.yaml
  24. +20
    -3
      deploy/charts/octopus/values.yaml
  25. +9
    -1
      deploy/single_master_k8s_install/comm.sh
  26. +2
    -0
      deploy/single_master_k8s_install/master_install_k8s.sh
  27. +2
    -0
      deploy/single_master_k8s_install/node_install_k8s.sh
  28. +8
    -0
      deploy/upgrade.md
  29. +1
    -1
      openai-portal/src/layout/components/Navbar.vue
  30. +12
    -12
      openai-portal/src/router/index.js
  31. +21
    -0
      openai-portal/src/utils/index.js
  32. +2
    -19
      openai-portal/src/views/GeneralView/index.vue
  33. +12
    -2
      openai-portal/src/views/modelDev/components/notebook/notebookCreation.vue
  34. +17
    -5
      openai-portal/src/views/trainingManager/components/createDialog/index.vue
  35. +16
    -16
      openai-portal/src/views/trainingManager/components/editDialog/index.vue
  36. +2
    -2
      openai-portal/src/views/trainingManager/index.vue
  37. +39
    -32
      openai-portal/src/views/trainingManager/traningTask.vue
  38. +6
    -6
      readme.md
  39. +6
    -6
      readme_en.md
  40. +2
    -0
      server/admin-server/api/v1/resourcepool.proto
  41. +35
    -0
      server/admin-server/api/v1/user.proto
  42. +1
    -3
      server/admin-server/internal/service/billing.go
  43. +54
    -0
      server/admin-server/internal/service/resourcepool.go
  44. +31
    -0
      server/admin-server/internal/service/user.go
  45. +2
    -0
      server/base-server/api/v1/develop.proto
  46. +1
    -0
      server/base-server/api/v1/trainJob.proto
  47. +23
    -0
      server/base-server/api/v1/user.proto
  48. +3
    -4
      server/base-server/configs/config.yaml
  49. +11
    -1
      server/base-server/internal/common/common.go
  50. +5
    -3
      server/base-server/internal/data/dao/billing.go
  51. +4
    -1
      server/base-server/internal/data/dao/model/develop.go
  52. +1
    -0
      server/base-server/internal/data/dao/model/train_job.go
  53. +6
    -2
      server/base-server/internal/data/dao/model/user.go
  54. +3
    -1
      server/base-server/internal/data/dao/user.go
  55. +60
    -6
      server/base-server/internal/data/minio/minio.go
  56. +22
    -0
      server/base-server/internal/data/minio/minio_test.go
  57. +0
    -1
      server/base-server/internal/service/billing/billing.go
  58. +44
    -16
      server/base-server/internal/service/develop/develop.go
  59. +25
    -8
      server/base-server/internal/service/trainjob/train_job.go
  60. +62
    -0
      server/base-server/internal/service/user/user.go
  61. +5
    -0
      server/common/api/v1/common.proto
  62. +28
    -18
      server/common/errors/codes.go
  63. +13
    -3
      server/common/sql/sql.go
  64. +76
    -61
      server/go.mod
  65. +112
    -32
      server/go.sum
  66. +2
    -0
      server/openai-server/api/v1/develop.proto
  67. +44
    -39
      server/openai-server/api/v1/trainJob.proto
  68. +0
    -1
      server/platform-server/api/v1/swagger.json
  69. +0
    -1951
      server/platform-server/api/v1/trainJob.pb.go
  70. +0
    -1658
      server/platform-server/api/v1/trainJob.pb.validate.go
  71. +0
    -638
      server/platform-server/api/v1/trainJob.swagger.json
  72. +0
    -294
      server/platform-server/api/v1/trainJob_grpc.pb.go
  73. +0
    -199
      server/platform-server/api/v1/trainJob_http.pb.go
  74. +0
    -674
      server/platform-server/internal/conf/conf.pb.go
  75. +0
    -579
      server/platform-server/internal/conf/conf.pb.validate.go
  76. +0
    -35
      third-party/cambricon-k8s-device-plugin/.drone.yml
  77. +0
    -7
      third-party/cambricon-k8s-device-plugin/.github/issue_template.md
  78. +0
    -50
      third-party/cambricon-k8s-device-plugin/.github/workflows/ci.yaml
  79. +0
    -41
      third-party/cambricon-k8s-device-plugin/.gitlab-ci.yml
  80. +0
    -25
      third-party/cambricon-k8s-device-plugin/.golangci.yml
  81. +0
    -201
      third-party/cambricon-k8s-device-plugin/LICENSE
  82. +0
    -7
      third-party/cambricon-k8s-device-plugin/README.md
  83. +0
    -5
      third-party/cambricon-k8s-device-plugin/device-plugin/.gitignore
  84. +0
    -50
      third-party/cambricon-k8s-device-plugin/device-plugin/.gitlab-ci.yml
  85. +0
    -14
      third-party/cambricon-k8s-device-plugin/device-plugin/CHANGELOG.md
  86. +0
    -31
      third-party/cambricon-k8s-device-plugin/device-plugin/Dockerfile
  87. +0
    -58
      third-party/cambricon-k8s-device-plugin/device-plugin/Makefile
  88. +0
    -120
      third-party/cambricon-k8s-device-plugin/device-plugin/README.md
  89. +0
    -93
      third-party/cambricon-k8s-device-plugin/device-plugin/build_image.sh
  90. +0
    -198
      third-party/cambricon-k8s-device-plugin/device-plugin/cambricon.go
  91. +0
    -98
      third-party/cambricon-k8s-device-plugin/device-plugin/cambricon_test.go
  92. +0
    -34
      third-party/cambricon-k8s-device-plugin/device-plugin/create_release_package.sh
  93. +0
    -48
      third-party/cambricon-k8s-device-plugin/device-plugin/examples/cambricon-device-plugin-static-pod.yaml
  94. +0
    -38
      third-party/cambricon-k8s-device-plugin/device-plugin/examples/deployment.yaml
  95. +0
    -11
      third-party/cambricon-k8s-device-plugin/device-plugin/go.mod
  96. +0
    -373
      third-party/cambricon-k8s-device-plugin/device-plugin/go.sum
  97. +0
    -135
      third-party/cambricon-k8s-device-plugin/device-plugin/main.go
  98. +0
    -112
      third-party/cambricon-k8s-device-plugin/device-plugin/pkg/cndev/bindings.go
  99. +0
    -72
      third-party/cambricon-k8s-device-plugin/device-plugin/pkg/cndev/bindings_test.go
  100. +0
    -155
      third-party/cambricon-k8s-device-plugin/device-plugin/pkg/cndev/cndev.go

+ 1
- 1
.drone.yml View File

@@ -9,6 +9,7 @@ trigger:
event:
- push
- pull_request

steps:
- name: 代码检查
image: golangci/golangci-lint:v1.40.1
@@ -17,7 +18,6 @@ steps:
GOPROXY: https://goproxy.cn,direct
commands:
- make lint

---
kind: pipeline
name: base-server


+ 0
- 9
.github/PULL_REQUEST_TEMPLATE.md View File

@@ -1,9 +0,0 @@
Describe what this PR does / why we need it

Does this pull request fix one issue?

Describe how you did it.

Describe how to verify it.

Special notes for reviews.

+ 1
- 1
Makefile View File

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

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

common_lint: lint_init
cd ./server/common && golangci-lint run ./...


+ 16
- 0
admin-portal/src/api/userManager.js View File

@@ -114,4 +114,20 @@ export function updateUserConfig(userId,params) {
}
})
}
// 创建minio账户
export function createMinIOAccount(userId,data) {
return request({
url: `/v1/usermanage/user/${userId}/minioaccount`,
method: 'put',
data
})
}
// 创建minio桶
export function createMinIOBucket(userId,data) {
return request({
url: `/v1/usermanage/user/${userId}/miniobuckets`,
method: 'put',
data
})
}


+ 1
- 1
admin-portal/src/layout/components/Navbar.vue View File

@@ -6,7 +6,7 @@
<el-row class="demo-avatar demo-basic">
<el-dropdown>
<i class="el-icon-document" style="color:#666699;"></i>
<a href="https://octopus.openi.org.cn/docs/management/intro" target="_blank" class="manual">管理手册</a>
<a href="https://octopus.pcl.ac.cn/" target="_blank" class="manual">管理手册</a>
<i class="el-icon-service" style="color:#666699 ;"></i>
<a href="https://git.openi.org.cn/OpenI/octopus/issues" target="_blank" class="manual">问题意见</a>
<el-dropdown-menu slot="dropdown" />


+ 4
- 4
admin-portal/src/views/resourceManager/components/nodeList.vue View File

@@ -1,6 +1,6 @@
<template>
<div>
<el-table :data="tableData" style="width: 100%;font-size: 15px" :header-cell-style="{'color':'black'}"
<el-table :data="tableData" style="width: 100%;font-size: 15px" :header-cell-style="{'text-align':'center','color':'black'}"
:span-method="listSpanMethod" :row-style="{height:'5px'}" :cell-style="{padding:'5px 0'}">
<el-table-column label="节点名字">
<template slot-scope="scope">
@@ -22,7 +22,7 @@
<span>{{ scope.row.resourcePools }}</span>
</template>
</el-table-column>
<el-table-column label="节点信息" align="center">
<el-table-column label="资源信息">
<el-table-column label="名称">
<template slot-scope="scope">
<span style="color: #409eff">
@@ -30,7 +30,7 @@
</span>
</template>
</el-table-column>
<el-table-column label="使用量">
<el-table-column label="已分配">
<template slot-scope="scope">
<span style="color: #409eff;">
{{ scope.row.use }}
@@ -44,7 +44,7 @@
</span>
</template>
</el-table-column>
<el-table-column label="使用百分比" align="center" width="120px">
<el-table-column label="已分配百分比" width="120px">
<template slot-scope="scope">
<div class="circleBox" v-if="!scope.row.children">
<el-progress color="#409EFF" type="circle" :show-text="false"


+ 148
- 10
admin-portal/src/views/resourceManager/components/poolManager.vue View File

@@ -3,36 +3,71 @@
<div class="function">
<el-button type="primary" @click="add">添加资源池</el-button>
</div>
<el-table v-loading="isLoading" :data="tableData" style="width: 100%;font-size: 15px;"
:header-cell-style="{'text-align':'left','color':'black'}" :cell-style="{'text-align':'left'}">
<el-table-column label="资源池名称" align="center">
<el-table v-loading="isLoading" :data="tableData" style="width: 100%;font-size: 15px;" :span-method="listSpanMethod"
:header-cell-style="{'text-align':'center','color':'black'}" :cell-style="{'text-align':'left'}">
<el-table-column label="资源池名称">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column label="默认资源池" align="center">
<el-table-column label="默认资源池">
<template slot-scope="scope">
<span>{{ scope.row.default?'是':'否' }}</span>
</template>
</el-table-column>
<el-table-column label="描述" align="center">
<el-table-column label="描述">
<template slot-scope="scope">
<span>{{ scope.row.desc }}</span>
</template>
</el-table-column>
<el-table-column label="节点列表" align="center" show-overflow-tooltip>
<el-table-column label="节点列表" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ nodeList(scope.row.bindingNodes) }}</span>
</template>
</el-table-column>
<el-table-column label="资源规格" align="center">
<el-table-column label="资源规格">
<template slot-scope="scope">
<el-button type="text" @click="handleDetail(scope.row)">详情</el-button>
</template>
</el-table-column>
<el-table-column label="资源信息">
<el-table-column label="名称">
<template slot-scope="scope">
<span style="color: #409eff">
{{ scope.row.childName }}
</span>
</template>
</el-table-column>
<el-table-column label="已分配">
<template slot-scope="scope">
<span style="color: #409eff;">
{{ scope.row.use }}
</span>
</template>
</el-table-column>
<el-table-column label="总量">
<template slot-scope="scope">
<span style="color: #409eff;">
{{ scope.row.total }}
</span>
</template>
</el-table-column>
<el-table-column label="已分配百分比" width="120px">
<template slot-scope="scope">
<div class="circleBox" v-if="!scope.row.children">
<el-progress color="#409EFF" type="circle" :show-text="false"
:percentage="scope.row.percentage" :width="60" :height="60">
</el-progress>
<div class="circleCenter">
<div style=" font-weight: bold; font-size: 12px;"> {{scope.row.percentage?scope.row.percentage:0}}%</div>
</div>
</div>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button v-if="scope.row.default===false" type="text" @click="open(scope.row)">删除</el-button>
<el-button v-if="scope.row.default===false" type="text" @click="handleDeletePool(scope.row)">删除</el-button>
<el-button type="text" @click="handleEdit( scope.row)">编辑</el-button>
</template>
</el-table-column>
@@ -106,6 +141,7 @@

<script>
import { getResourcePool, deleteResourcePool, createResourcePool, updateResourcePool, getNodeList, getResource } from '@/api/resourceManager.js'
import { formatSize } from '@/utils/index.js'
export default {
name: "ResourcePool",
data() {
@@ -157,6 +193,88 @@
clearInterval(this.timer);
},
methods: {
listSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex < 5 || columnIndex > 8) {
if (row.span_num > 0) {
return {
rowspan: row.span_num,
colspan: 1
};

}
else {
return { rowspan: 0, colspan: 0 }
}
}
},
handleTableData(data) {
let arr = [];
let on = 0;
let spanNum = 0;
for (let i = 0; i < data.length; i++) {
let node_info = data[i].children
on++;
for (let j = 0; j < node_info.length; j++) {
let info = {
on: on,
span_num: j === 0 ? node_info.length : 0,
childName: node_info[j].childName,
use: node_info[j].use,
total: node_info[j].total,
percentage: node_info[j].percentage,
name: data[i].name,
default: data[i].default,
desc: data[i].desc,
bindingNodes: data[i].bindingNodes,
mapResourceSpecIdList: data[i].mapResourceSpecIdList,
id: data[i].id,
}
arr.push(info)
}
}
return arr
},
getDetail(val) {
let data = []
if (Object.getOwnPropertyNames(val.resourceAllocated).length && Object.getOwnPropertyNames(val.resourceCapacity).length) {
for (const key1 in val.resourceAllocated) {
for (const key2 in val.resourceCapacity) {
if (key1 === key2) {
let percentage
if (parseInt(val.resourceAllocated[key1]) === 0) {
0
} else if ((/^\d+$/.test(val.resourceAllocated[key1])) && (/^\d+$/.test(val.resourceCapacity[key1]))) {
percentage = val.resourceAllocated[key1] / val.resourceCapacity[key1] * 100
percentage = parseFloat(percentage.toFixed(2))
} else {
percentage = formatSize(val.resourceAllocated[key1]) / formatSize(val.resourceCapacity[key1])
percentage = percentage * 100
percentage = parseFloat(percentage.toFixed(2))
}
data.push({ childName: key1, use: val.resourceAllocated[key1], total: val.resourceCapacity[key1], percentage: percentage})
}
}
}
} else {
data.push(
{
childName: "cpu",
id: "",
percentage: 0,
total: "0",
use: "0"
},
{
childName: "memory",
id: "",
percentage: 0,
total: "0",
use: "0"
},
)
}
return data
},
handleDetail(val) {
this.detailDialog = true
const mapResourceSpecIdList = JSON.parse(JSON.stringify(val.mapResourceSpecIdList))
@@ -315,8 +433,17 @@
getResourcePool().then(response => {
if (response.success) {
if (response.data !== null && response.data.resourcePools !== null) {
this.tableData = response.data.resourcePools
this.isLoading = false
response.data.resourcePools.forEach(
item => {
// item.id = Math.random()
if (this.getDetail(item) !== []) {
item.children = this.getDetail(item)
}
else { item.children = [] }
}
)
this.tableData = this.handleTableData(response.data.resourcePools)
} else {
this.tableData = []
}
@@ -362,7 +489,7 @@
})
},
// 删除确认
open(val) {
handleDeletePool(val) {
this.$confirm('此操作将永久删除该资源规格, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
@@ -411,4 +538,15 @@
.item {
margin: 5px;
}
.circleBox {
position: relative;
text-align: center;
top:20px
}

.circleCenter {
position: relative;
top: -45px;

}
</style>

+ 17
- 2
admin-portal/src/views/resourceManager/components/resource.vue View File

@@ -174,8 +174,8 @@
}
});
},
handleDelete(row) {
deleteResource(row.id).then(response => {
deleteRes(val) {
deleteResource(val.id).then(response => {
if (response.success) {
this.$message({
message: '删除成功',
@@ -190,6 +190,21 @@
}
})
},
handleDelete(row) {
this.$confirm('此操作将永久删除该资源规格, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.deleteRes(row)
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
});
});
},
add() {
this.ruleForm = {}
this.flag = true


+ 107
- 0
admin-portal/src/views/userManager/components/minioAccount.vue View File

@@ -0,0 +1,107 @@
<template>
<div>
<el-dialog
title="minio用户信息"
width="35%"
:visible.sync="CreateFormVisible"
:before-close="handleDialogClose"
:close-on-click-modal="false"
>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm">
<el-form-item label="minio用户名称" prop="minioUserName" :label-width="formLabelWidth">
<el-input v-model="ruleForm.minioUserName" placeholder="请填写账号" :disabled="isShow" minlength="3" maxlength="20" show-word-limit/>
</el-form-item>
<el-form-item label="minio账户密码" prop="minioPassword" :label-width="formLabelWidth">
<el-input v-model="ruleForm.minioPassword" show-password placeholder="请输入密码" minlength="8" maxlength="40" show-word-limit />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel">取 消</el-button>
<el-button type="primary" @click="submit">确 定</el-button>
</div>
</el-dialog>
</div>
</template>

<script>
import { createMinIOAccount } from "@/api/userManager.js"
export default {
name: "minioAccount",
props: {
row: {
type: Object,
default: () => { }
}
},
data() {
// var checkName = (rule, value, callback) => {
// const regName = /^[a-zA-Z][0-9a-zA-Z_]{3,30}$/;
// if (regName.test(value)) {
// return callback();
// }
// callback(new Error("账号由字母开头,长度4-30个字符,允许字母数字下划线"));
// };
return {
isShow: false,
CreateFormVisible: true,
formLabelWidth: '120px',
ruleForm: {
minioUserName: "",
minioPassword: ""
},
rules: {
minioUserName: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ min: 3, max: 20, message: '名称长度在3-20个字符', trigger: 'blur' }

], minioPassword: [
{ required: true, message: '请输入密码!', trigger: 'blur' },
{ min: 8, max: 40, message: '密码长度在8-40位之间', trigger: 'blur' }
]
},
}
},
created () {
if (this.row.minioUserName) {
this.ruleForm.minioUserName = this.row.minioUserName
this.isShow = true
}
},
methods: {
handleDialogClose() {
this.$emit('close', false)
},
cancel() {
this.$emit('cancel', false)
},
submit() {
this.$refs.ruleForm.validate(valid => {
if (valid) {
const params = {
minioUserName: this.ruleForm.minioUserName,
minioPassword: this.ruleForm.minioPassword
}
const userId = this.row.id
createMinIOAccount(userId,params).then((response) => {
if (response.success) {
this.$message.success("创建成功")
this.ruleForm.minioPassword = ''
this.isShow = true
this.$emit('confirm', false)
} else {
this.$message({
message: this.getErrorMsg(
response.error.subcode
),
type: "warning"
})
}
})
} else {
console.log('error')
}
})
}
}
}
</script>

+ 108
- 0
admin-portal/src/views/userManager/components/minioBuckets.vue View File

@@ -0,0 +1,108 @@
<template>
<div>
<el-dialog
title="可读写minio桶"
width="35%"
:visible.sync="CreateFormVisible"
:before-close="handleDialogClose"
:close-on-click-modal="false"
>
<el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="60px">
<el-form-item label="名称" prop="buckets">
<div v-for="(item, index) in ruleForm.buckets" :key="index">
<el-input v-model="ruleForm.buckets[index]" style="width: 60%;margin-bottom:10px" />
<i class="el-icon-delete" @click="deleteItem(index)"></i>
</div>
<el-button type="primary" @click="addItem">增加</el-button>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit" v-preventReClick>提交</el-button>
<el-button @click="cancel">取消</el-button>
</div>
</el-dialog>
</div>
</template>

<script>
import { createMinIOBucket } from "@/api/userManager.js"
export default {
name: "minioBuckets",
props: {
row: {
type: Object,
default: () => { }
}
},
data () {
var checkName = (rule, value, callback) => {
// const regName = /^[a-z][0-9a-z]{3,}$/;
const regName = /^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/;
for(let i = 0; i < value.length; i++) {
if (!regName.test(value[i])) {
callback(new Error("小写字母或数字开头结尾,3-63个字符,允许小写字母、数字、'-'和'.'"));
}
}
return callback();
};
return {
CreateFormVisible: true,
ruleForm: {
buckets: [],
},
rules: {
buckets: [
{required: true, message: '请输入minio桶的名称', trigger: 'blur'},
{ validator: checkName, trigger: "blur" }
]
}
}
},
created () {
if(this.row.buckets) {
this.ruleForm.buckets = this.row.buckets
}
},
methods: {
handleDialogClose() {
this.$emit('close', false)
},
addItem() {
this.ruleForm.buckets.push("")
},
deleteItem(index) {
this.ruleForm.buckets.splice(index, 1)
},
cancel() {
this.$emit('cancel', false)
},
submit() {
this.$refs.ruleForm.validate(valid => {
if (valid) {
const params = {
buckets: this.ruleForm.buckets,
}
const userId = this.row.id
createMinIOBucket(userId,params).then((response) => {
if (response.success) {
this.$message.success("创建成功")
this.ruleForm.minioPassword = ''
this.isShow = true
this.$emit('confirm', false)
} else {
this.$message({
message: this.getErrorMsg(
response.error.subcode
),
type: "warning"
})
}
})
} else {
console.log('error')
}
})
}
}
}
</script>

+ 29
- 1
admin-portal/src/views/userManager/user.vue View File

@@ -65,6 +65,8 @@
<el-button v-if="group" type="text" @click="handleEdit(scope.row)">编辑</el-button>
<!-- <el-button @click="handleDelete(scope.row)" type="text" v-if="group">删除</el-button> -->
<el-button type="text" @click="handleDetail(scope.row)">{{ user?'所属群组':'用户列表' }}</el-button>
<el-button v-if="user" type="text" @click="handleMinioUserDialog(scope.row)">minio用户</el-button>
<el-button v-if="user" type="text" @click="handleMinioBucketDialog(scope.row)">minio桶</el-button>
<!-- <el-button v-if="user" type="text" @click="handleUserConfig(scope.row)">用户配置</el-button> -->
</template>
</el-table-column>
@@ -79,6 +81,12 @@
<!-- 创修改信息对话框 -->
<operateDialog v-if="operateVisible" :row="row" :user-type="change" @cancel="cancel" @confirm="confirm"
@close="close" :type='type'/>
<!-- 创建minio账户 -->
<minioAccount v-if="minioUserDialogVisible" :row="row" @cancel="cancel" @confirm="confirm"
@close="close" />
<!-- 创建minio桶 -->
<minioBuckets v-if="minioBucketDialogVisible" :row="row" @cancel="cancel" @confirm="confirm"
@close="close" />
<!-- 用户配置对话框 -->
<userConfig v-if="userConfigVisible" :conKey="conKey" :conValue="conValue" :row="row" @cancel="cancel"
@confirm="confirm" @close="close">
@@ -109,6 +117,8 @@
import { getResourcePool } from '@/api/resourceManager.js'
import { getUserConfigKey, getUserConfig } from '@/api/userManager.js'
import operateDialog from "./components/operateDialog.vue";
import minioAccount from "./components/minioAccount.vue";
import minioBuckets from "./components/minioBuckets.vue";
import addDialog from "./components/addDialog.vue";
import userConfig from "./components/userConfig.vue";
import userEdit from "./components/userEdit.vue";
@@ -120,13 +130,17 @@
addDialog,
searchForm,
userConfig,
userEdit
userEdit,
minioAccount,
minioBuckets
},
props: {
userTabType: { type: Number, default: undefined }
},
data() {
return {
minioUserDialogVisible: false,
minioBucketDialogVisible: false,
tableData: [],
row: {},
CreateVisible: false,
@@ -185,6 +199,14 @@
this.timer = null;
},
methods: {
handleMinioUserDialog(row) {
this.row = row
this.minioUserDialogVisible = true
},
handleMinioBucketDialog(row) {
this.row = row
this.minioBucketDialogVisible = true
},
handleUserEdit(row) {
this.row = row
getResourcePool().then(response => {
@@ -306,6 +328,8 @@
this.operateVisible = val
this.userConfigVisible = val
this.userEdit = val
this.minioUserDialogVisible = val
this.minioBucketDialogVisible = val
this.getList(this.searchData)
},
confirm(val) {
@@ -313,6 +337,8 @@
this.operateVisible = val
this.userConfigVisible = val
this.userEdit = val
this.minioUserDialogVisible = val
this.minioBucketDialogVisible = val
this.timer = setTimeout(this.getList, 500)

},
@@ -321,6 +347,8 @@
this.operateVisible = val
this.userConfigVisible = val
this.userEdit = val
this.minioUserDialogVisible = val
this.minioBucketDialogVisible = val
this.getList(this.searchData)
},
create() {


+ 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.202.73',
target: 'http://192.168.202.71/',
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '/adminserver'
}
},
[process.env.VUE_APP_BASE_API2]: {
target: 'http://192.168.202.73',
target: 'http://192.168.202.71/',
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''


BIN
deploy/charts/octopus/charts/minio-11.2.6.tgz View File


BIN
deploy/charts/octopus/charts/minio-7.1.3.tgz View File


+ 1
- 1
deploy/charts/octopus/templates/_helpers.tpl View File

@@ -566,7 +566,7 @@ octopus.pcl.ac.cn/resource: {{ .Values.common.resourceTagValuePrefix }}_{{ inclu
{{- end -}}

{{- define "minio.serviceAddr" -}}
{{- printf "%s:%s" (include "minio.serviceName" .) .Values.minio.service.port -}}
{{- printf "%s:%s" (include "minio.serviceName" .) .Values.minio.service.ports.api -}}
{{- end -}}

{{/******************mysql******************/}}


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

@@ -51,7 +51,7 @@ spec:
mountPath: /etc/localtime
env:
- name: URLS
value: "[{url:\"{{ .Values.ingress.apidocPath }}/admin.swagger.json\",name:\"admin\"},{url:\"{{ .Values.ingress.apidocPath }}/openai.swagger.json\",name:\"openai\"}]"
value: "[{url:\"{{ .Values.ingress.apidocPath }}/openai.swagger.json\",name:\"计算平台API\"},{url:\"{{ .Values.ingress.apidocPath }}/admin.swagger.json\",name:\"管理后台API\"}]"
ports:
- name: http
containerPort: {{ template "apidoc.targetPort" . }}


+ 74
- 0
deploy/charts/octopus/templates/ascend.yaml View File

@@ -0,0 +1,74 @@
{{- if .Values.ascend.enabled }}
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ascend-device-plugin-daemonset
namespace: kube-system
spec:
selector:
matchLabels:
name: ascend-device-plugin-ds
updateStrategy:
type: RollingUpdate
template:
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
seccomp.security.alpha.kubernetes.io/pod: runtime/default
labels:
name: ascend-device-plugin-ds
spec:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
- key: huawei.com/Ascend910
operator: Exists
effect: NoSchedule
- key: "device-plugin"
operator: "Equal"
value: "v2"
effect: NoSchedule
priorityClassName: "system-node-critical"
nodeSelector:
hardware-type: ASCENDNPU
containers:
- image: swr.cn-south-1.myhuaweicloud.com/openioctopus/ascend-k8sdeviceplugin:v3.0.RC1
name: device-plugin-01
resources:
requests:
memory: 500Mi
cpu: 500m
limits:
memory: 500Mi
cpu: 500m
command: [ "/bin/bash", "-c", "--"]
args: [ "device-plugin -useAscendDocker=true
-logFile=/var/log/mindx-dl/devicePlugin/devicePlugin.log -logLevel=0" ]
securityContext:
privileged: true
readOnlyRootFilesystem: true
imagePullPolicy: IfNotPresent
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
- name: hiai-driver
mountPath: /usr/local/Ascend/driver
- name: log-path
mountPath: /var/log/mindx-dl/devicePlugin
- name: tmp
mountPath: /tmp
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
- name: hiai-driver
hostPath:
path: /usr/local/Ascend/driver
- name: log-path
hostPath:
path: /var/log/mindx-dl/devicePlugin
type: Directory
- name: tmp
hostPath:
path: /tmp
{{- end }}

+ 0
- 1
deploy/charts/octopus/templates/base-server.yaml View File

@@ -157,7 +157,6 @@ data:
resourceLabelKey: {{ .Values.common.resourceTagKey }}
billingPeriodSec: {{ .Values.baseserver.service.billingPeriodSec }}
develop:
jpyBaseUrlEnv: OCTOPUS_JPY_BASE_URL
autoStopIntervalSec: {{ .Values.baseserver.service.develop.autoStopIntervalSec }}
isSetUploadFileSize: {{ .Values.baseserver.service.develop.isSetUploadFileSize }}
resource:


third-party/cambricon-k8s-device-plugin/device-plugin/examples/cambricon-device-plugin-daemonset.yaml → deploy/charts/octopus/templates/cambricon-device-plugin.yaml View File

@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

{{- if .Values.cambricon.enabled }}
apiVersion: apps/v1
kind: DaemonSet
metadata:
@@ -23,34 +24,47 @@ spec:
name: cambricon-device-plugin-ds
template:
metadata:
# Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
# reserves resources for critical add-on pods so that they can be rescheduled after
# a failure. This annotation works in tandem with the toleration below.
# This annotation is deprecated. Kept here for backward compatibility
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
name: cambricon-device-plugin-ds
spec:
# Mark this pod as a critical add-on; when enabled, the critical add-on
# scheduler reserves resources for critical add-on pods so that they can
# be rescheduled after a failure.
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
priorityClassName: "system-node-critical"
tolerations:
# Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
# This, along with the annotation above marks this pod as a critical add-on.
# This toleration is deprecated. Kept here for backward compatibility
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
- key: CriticalAddonsOnly
operator: Exists
- key: cambricon.com/mlu
operator: Exists
effect: NoSchedule
#serviceAccount: cambricon-device-plugin # uncomment to add rbac
nodeSelector:
hardware-type: CAMBRICONMLU
containers:
- image: cambricon-k8s-device-plugin:v1.1.1
- image: {{ .Values.cambricon.mluDevicePluginImage }}
name: cambricon-device-plugin-ctr
command:
- /usr/bin/k8s-device-plugin
args:
- -mode
- default # switch mode here
- --mode=default #device plugin mode: default, sriov, env-share, mlu-share or topology-aware
- --virtualization-num=1 # virtualization number for each MLU, used only in sriov mode or env-share mode
- --mlulink-policy=best-effort # MLULink topology policy: best-effort, guaranteed or restricted, used only in topology-aware mode
- --cnmon-path=/usr/bin/cnmon # host machine cnmon path, must be absolute path. comment out this line to avoid mounting cnmon.
#- --enable-console #uncomment to enable UART console device(/dev/ttyMS) in container
#- --disable-health-check #uncomment to disable health check
#- --enable-device-type #uncomment to enable device registration with type info
env:
# change this if env-share mode or sriov mode is enabled.
- name: VIRTUALIZATION_NUM
value: "0"
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
securityContext:
privileged: true
volumeMounts:
@@ -67,3 +81,4 @@ spec:
- name: sys
hostPath:
path: /sys
{{- end }}

+ 7581
- 3
deploy/charts/octopus/templates/grafana.yaml
File diff suppressed because it is too large
View File


+ 2
- 2
deploy/charts/octopus/templates/ingress.yaml View File

@@ -110,7 +110,7 @@ spec:
paths:
- backend:
serviceName: {{ $minioName }}
servicePort: {{ .Values.minio.service.port }}
servicePort: {{ .Values.minio.service.ports.console }}
path: {{ $minioWebPath }}

---
@@ -135,7 +135,7 @@ spec:
paths:
- backend:
serviceName: {{ $minioName }}
servicePort: {{ .Values.minio.service.port }}
servicePort: {{ .Values.minio.service.ports.api}}
path: {{ $minioApiPath }}(/|$)(.*)

---


+ 70
- 0
deploy/charts/octopus/templates/nvidia-device-plugin.yaml View File

@@ -0,0 +1,70 @@
# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

{{- if .Values.nvidia.enabled }}
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-device-plugin-daemonset
namespace: kube-system
spec:
selector:
matchLabels:
name: nvidia-device-plugin-ds
updateStrategy:
type: RollingUpdate
template:
metadata:
# This annotation is deprecated. Kept here for backward compatibility
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
name: nvidia-device-plugin-ds
spec:
nodeSelector:
hardware-type: NVIDIAGPU
tolerations:
# This toleration is deprecated. Kept here for backward compatibility
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
- key: CriticalAddonsOnly
operator: Exists
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
# Mark this pod as a critical add-on; when enabled, the critical add-on
# scheduler reserves resources for critical add-on pods so that they can
# be rescheduled after a failure.
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
priorityClassName: "system-node-critical"
containers:
- image: nvcr.io/nvidia/k8s-device-plugin:v0.9.0
name: nvidia-device-plugin-ctr
args: ["--fail-on-init-error=false","--mig-strategy=mixed"]
env:
- name: NVIDIA_MIG_MONITOR_DEVICES
value: all
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
add: ["SYS_ADMIN"]
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
{{- end }}

+ 91
- 13
deploy/charts/octopus/templates/prometheus.yaml View File

@@ -374,6 +374,59 @@ spec:
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: {{ template "prometheus.fullname" . }}-mlu-exporter
spec:
selector:
matchLabels:
app.kubernetes.io/name: {{ template "prometheus.name" . }}-mlu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-mlu-exporter
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}
template:
metadata:
name: {{ template "prometheus.fullname" . }}-mlu-exporter
labels:
{{ include "prometheus.common-labels" . | indent 8 }}
app.kubernetes.io/name: {{ template "prometheus.name" . }}-mlu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-mlu-exporter
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}
spec:
nodeSelector:
hardware-type: CAMBRICONMLU
containers:
- image: {{ .Values.cambricon.mluExporterImage }}
imagePullPolicy: IfNotPresent #Always
name: pod-cambricon-mlu-metrics-exporter
command:
- /usr/bin/mlu-exporter
args:
- --metrics-config=/etc/mlu-exporter/metrics.yaml
- --metrics-path=/metrics
- --port=9400
- --collector=cndev
- --collector=podresources
- --metrics-prefix=mlu
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 2000Mi
cpu: 2000m
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/lib/kubelet/pod-resources/
name: pod-resources
hostPID: true
hostIPC: true
volumes:
- name: pod-resources
hostPath:
path: /var/lib/kubelet/pod-resources/
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: {{ template "prometheus.fullname" . }}-npu-exporter
spec:
@@ -393,10 +446,10 @@ spec:
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}
spec:
nodeSelector:
workerselector: dls-worker-node
hardware-type: ASCENDNPU
containers:
- name: huawei-npu-exporter
image: 192.168.202.110:5000/octopus/npu-exporter:v2.0.2
image: swr.cn-south-1.myhuaweicloud.com/openioctopus/npu-exporter:v3.0.RC1
resources:
requests:
memory: 1000Mi
@@ -404,7 +457,7 @@ spec:
limits:
memory: 1000Mi
cpu: 1000m
imagePullPolicy: Never
imagePullPolicy: IfNotPresent
command: [ "/bin/bash", "-c", "--"]
# NOTE: enable HTTPS needs to use
# ./cert-importer -certFile=../cert/rsa_aes.crt -keyFile=../cert/rsa_aes_private.key to import certificate
@@ -507,6 +560,30 @@ spec:
---
kind: Service
apiVersion: v1
metadata:
labels:
{{ include "prometheus.common-labels" . | indent 4 }}
app.kubernetes.io/name: {{ template "prometheus.name" . }}-npu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-npu-exporter
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}
annotations:
prometheus.io/port: "8082"
prometheus.io/path: "/metrics"
prometheus.io/scrape: "true"
name: {{ template "prometheus.fullname" . }}-npu-exporter
spec:
type: NodePort
ports:
- port: 8082
targetPort: 8082
nodePort: 30401
selector:
app.kubernetes.io/name: {{ template "prometheus.name" . }}-npu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-npu-exporter
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}
---
kind: Service
apiVersion: v1
metadata:
labels:
{{ include "prometheus.common-labels" . | indent 4 }}
@@ -534,21 +611,22 @@ apiVersion: v1
metadata:
labels:
{{ include "prometheus.common-labels" . | indent 4 }}
app.kubernetes.io/name: {{ template "prometheus.name" . }}-npu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-npu-exporter
app.kubernetes.io/name: {{ template "prometheus.name" . }}-mlu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-mlu-exporter
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}
annotations:
prometheus.io/port: "8082"
prometheus.io/port: "9400"
prometheus.io/path: "/metrics"
prometheus.io/scrape: "true"
name: {{ template "prometheus.fullname" . }}-npu-exporter
name: {{ template "prometheus.fullname" . }}-mlu-exporter
spec:
type: NodePort
ports:
- port: 8082
targetPort: 8082
nodePort: 30401
- port: 9400
targetPort: 9400
nodePort: 30403
selector:
app.kubernetes.io/name: {{ template "prometheus.name" . }}-npu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-npu-exporter
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}
app.kubernetes.io/name: {{ template "prometheus.name" . }}-mlu-exporter
app.kubernetes.io/instance: {{ template "prometheus.fullname" . }}-mlu-exporter
app.kubernetes.io/part-of: {{ template "prometheus.name" . }}


+ 20
- 3
deploy/charts/octopus/values.yaml View File

@@ -268,8 +268,12 @@ minio:
existingClaim: "octopus-minio-pvc"
service:
type: NodePort
nodePort: "31311"
port: "9000"
ports:
api: "9000"
console: "9001"
nodePorts:
api: "31311"
console: "31312"
nodeSelector:
<<: *nodeSelector
affinity:
@@ -498,4 +502,17 @@ rdma:
enflame:
enabled: false
gcuDevicePluginImage: 192.168.202.110:5000/octopus/enflame-gcu-k8s-device-plugin:v1.0.0-dev
gcuExporterImage: 192.168.202.110:5000/octopus/enflame-gcu-exporter:v1.0.1-dev
gcuExporterImage: 192.168.202.110:5000/octopus/enflame-gcu-exporter:v1.0.1-dev

cambricon:
enabled: false
mluDevicePluginImage: swr.cn-south-1.myhuaweicloud.com/openioctopus/cambricon-k8s-device-plugin:v1.3.6
mluExporterImage: swr.cn-south-1.myhuaweicloud.com/openioctopus/cambricon-mlu-exporter:v1.6.7

nvidia:
# nvidia节点需要打标签hardware-type=NVIDIAGPU
enabled: true

ascend:
# ascend节点需要打标签hardware-type=ASCENDNPU
enabled: false

+ 9
- 1
deploy/single_master_k8s_install/comm.sh View File

@@ -240,7 +240,15 @@ enflame_gcu_label() {
echo -e "---------------------\033[31m enflame gcu label success \033[0m---------------------"
}

# cambricon mlu节点打标签
cambricon_mlu_label() {
set -e
echo -e "---------------------\033[31m cambricon mlu label \033[0m---------------------"
kubectl label nodes `hostname` hardware-type=CAMBRICONMLU
echo -e "---------------------\033[31m cambricon mlu label success \033[0m---------------------"
}

# huawei a910节点打标签
huawei_a910_label() {
kubectl label nodes `hostname` a910-device-plugin=active
kubectl label nodes `hostname` hardware-type=ASCENDNPU
}

+ 2
- 0
deploy/single_master_k8s_install/master_install_k8s.sh View File

@@ -118,6 +118,8 @@ main() {
huawei_a910_label
elif [[ $node_type == "enflame_gcu" ]];then
enflame_gcu_label
elif [[ $node_type == "cambricon_mlu" ]];then
cambricon_mlu_label
fi
# 验证


+ 2
- 0
deploy/single_master_k8s_install/node_install_k8s.sh View File

@@ -86,6 +86,8 @@ main() {
huawei_a910_label
elif [[ $node_type == "enflame_gcu" ]];then
enflame_gcu_label
elif [[ $node_type == "cambricon_mlu" ]];then
cambricon_mlu_label
fi
}



+ 8
- 0
deploy/upgrade.md View File

@@ -61,3 +61,11 @@ alter table model_deploy modify res_spec_price decimal(10,2) null comment '资
```


## v4.2.6

升级前:
1. v4.2.6已经将nvidia设备插件集成到章鱼安装包,需要先将原先的nvidia设备插件卸载
```
wget https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
kubectl delete -f nvidia-device-plugin.yml
```

+ 1
- 1
openai-portal/src/layout/components/Navbar.vue View File

@@ -13,7 +13,7 @@
<el-dropdown>
<div v-show="!this.GLOBAL.THEME_MANUAL_INVISIBLE">
<i class="el-icon-document" :style="{'color':fontColor?fontColor:'#666699'}" />
<a href="https://octopus.openi.org.cn/docs/manual/intro" target="_blank" class="manual"
<a href="https://octopus.pcl.ac.cn/" target="_blank" class="manual"
:style="{'color':fontColor}">使用手册</a>
<i class="el-icon-service" :style="{'color':fontColor?fontColor:'#666699'}" />
<a href="https://git.openi.org.cn/OpenI/octopus/issues" target="_blank" class="manual"


+ 12
- 12
openai-portal/src/router/index.js View File

@@ -138,18 +138,18 @@ export const constantRoutes = [
}
]
},
{
path: '/cloudInterconnection',
component: Layout,
children: [
{
path: 'index',
name: 'cloudInterconnection',
component: () => import('@/views/cloudInterconnection/index'),
meta: { title: '云际互联', icon: 'cloudConnection' }
}
]
},
// {
// path: '/cloudInterconnection',
// component: Layout,
// children: [
// {
// path: 'index',
// name: 'cloudInterconnection',
// component: () => import('@/views/cloudInterconnection/index'),
// meta: { title: '云际互联', icon: 'cloudConnection' }
// }
// ]
// },
{
path: '/setting',
component: Layout,


+ 21
- 0
openai-portal/src/utils/index.js View File

@@ -152,3 +152,24 @@ export function clearProgress(paraName) {
}
}

// 生成随机名字
export function randomName(val) {
var myDate = new Date();
const year = myDate.getFullYear().toString()
let month = (myDate.getMonth() + 1).toString()
if (month < 10) {
month = '0' + (myDate.getMonth() + 1).toString()
}
let date = myDate.getDate().toString()
if (date < 10) {
date = '0' + myDate.getDate().toString()
}
var charactors = "ab1cd2ef3gh4ij5kl6mn7opq8rst9uvw0xyz";
var value = ''; var i;
for (let j = 1; j <= 4; j++) {
i = parseInt(35 * Math.random());
value = value + charactors.charAt(i);
}
const name = val + '-' + year + month + date + '-' + value
return name
}

+ 2
- 19
openai-portal/src/views/GeneralView/index.vue View File

@@ -111,12 +111,6 @@
创建训练任务
</span>
</el-button>
<el-button :style="{'border-color':mainColor}" class="mainButtonBorder" size="small"
@click="create('trainingTemplate')">
<span :style="{'color':mainColor}" class="mainButtonText">
创建训练模板
</span>
</el-button>
</div>
<div class="mainColText">
总训练任务:
@@ -125,13 +119,13 @@
</span>
</div>
<div class="mainBlockText">
<!-- <div class="mainBlockText">
任务模板:
<span :style="{'color':mainColor}" class="mainNum">
{{ trainingTemplateNum }}
</span>
</div>
</div> -->
</el-col>
<el-col :span="8">
<span class="mainTitle" :style="{'color':mainColor}">
@@ -251,7 +245,6 @@
</el-col>
</el-row>
</el-col>

<el-col :span="8">
<span class="mainTitle" :style="{'color':mainColor}">
镜像
@@ -443,16 +436,6 @@
});
}
})
getTemplate(param).then(response => {
if (response.success) {
this.trainingTemplateNum = response.data.totalSize
} else {
this.$message({
message: this.getErrorMsg(response.error.subcode),
type: 'warning'
});
}
})
getMyModel(param).then(response => {
if (response.success) {
this.myModelNum = response.data.totalSize


+ 12
- 2
openai-portal/src/views/modelDev/components/notebook/notebookCreation.vue View File

@@ -123,6 +123,7 @@
import { getMyImage, getPublicImage, getPreImage } from "@/api/imageManager";
import { getResourceList } from "@/api/trainingManager";
import { mapGetters } from 'vuex'
import { randomName } from '@/utils/index'
export default {
name: "NotebookCreation",
directives: {
@@ -264,6 +265,7 @@
created() {
// this.getResource();
this.getSpacePools();
this.ruleForm.name = this.randomName('notebook')
},
computed: {
...mapGetters([
@@ -271,6 +273,9 @@
])
},
methods: {
randomName(val) {
return randomName(val)
},
clearDataSetVersionOption() {
this.dataSetVersionOption = []
},
@@ -762,9 +767,14 @@

.tip {
margin: 16px 0 16px 120px;
color:#B3B3B3
color: #B3B3B3
}

.tip span {
color: #000;
font-weight: 600;
}
.tip span{color:#000;font-weight: 600;}
.el-alert__icon {
color: orange
}

+ 17
- 5
openai-portal/src/views/trainingManager/components/createDialog/index.vue View File

@@ -4,7 +4,8 @@
:close-on-click-modal="false">
<el-form ref="ruleForm" :model="ruleForm" :rules="rules" :label-width="formLabelWidth"
class="demo-ruleForm">
<el-form-item :label="name" :label-width="formLabelWidth" placeholder="请输入任务名称" prop="name" class="[flag ==2 : 'name'? '']">
<el-form-item :label="name" :label-width="formLabelWidth" placeholder="请输入任务名称" prop="name"
class="[flag ==2 : 'name'? '']">
<el-input v-model="ruleForm.name" maxlength="30" show-word-limit />
</el-form-item>
<div class="tip" v-if="flag!=2"><i
@@ -139,8 +140,8 @@
<div slot="footer" class="dialog-footer">
<el-button v-if="showTraning" type="success" @click="traningAndSave('traning')" v-preventReClick>开始训练
</el-button>
<el-button v-if="showTemplate" type="primary" @click="traningAndSave('save')" v-preventReClick>保存模板
</el-button>
<!-- <el-button v-if="showTemplate" type="primary" @click="traningAndSave('save')" v-preventReClick>保存模板
</el-button> -->
<el-button type="warning" @click="cancel">取消</el-button>
</div>
</el-dialog>
@@ -154,6 +155,7 @@
import { getPresetAlgorithmList, getPublicAlgorithmList, getMyAlgorithmList, getAlgorithmVersionList } from '@/api/modelDev'
import { getMyImage, getPublicImage, getPreImage } from '@/api/imageManager'
import { getMyDatasetList, getPublicDatasetList, getPresetDatasetList, getVersionList } from '@/api/datasetManager'
import { randomName } from '@/utils/index'
export default {
name: "DialogCreateForm",
components: {
@@ -360,8 +362,12 @@
this.algorithmName = true
this.algorithmVersion = true
}
this.ruleForm.name = this.randomName('trainjob')
},
methods: {
randomName(val) {
return randomName(val)
},
clearDataSetVersionOption() {
this.dataSetVersionOption = []
},
@@ -886,15 +892,21 @@
.block {
display: block !important;
}

.name {
margin-bottom: 0px
}

.tip {
margin: 16px 0 16px 120px;
color:#B3B3B3
color: #B3B3B3
}
.tip span{color:#000;font-weight: 600;}

.tip span {
color: #000;
font-weight: 600;
}

.el-alert__icon {
color: orange
}

+ 16
- 16
openai-portal/src/views/trainingManager/components/editDialog/index.vue View File

@@ -4,14 +4,13 @@
:close-on-click-modal="false">
<el-form ref="ruleForm" :model="ruleForm" :rules="rules" :label-width="formLabelWidth"
class="demo-ruleForm">
<el-form-item :label="name" :label-width="formLabelWidth" placeholder="请输入镜像名称" prop="name"
class="[flag ==2 : 'name'? '']">
<el-form-item label="任务名称" :label-width="formLabelWidth" placeholder="请输入任务名称" prop="name">
<el-input v-model="ruleForm.name" maxlength="30" show-word-limit />
</el-form-item>
<div class="tip" v-if="flag==2"><i
<div class="tip"><i
class="el-alert__icon el-icon-warning"></i>算法存储在<span>/code</span>中,数据集存储在<span>/dataset</span>中,用户目录在<span>/userhome</span>中,训练输出请存储在<span>/model</span>中以供后续下载
</div>
<el-form-item :label="desc" :label-width="formLabelWidth">
<el-form-item label="任务描述" :label-width="formLabelWidth">
<el-input v-model="ruleForm.desc" type="textarea" maxlength="300" show-word-limit />
</el-form-item>
<!-- 算法三级框 -->
@@ -137,10 +136,10 @@
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button v-if="showTraning" type="success" @click="traningAndSave('traning')" v-preventReClick>开始训练
</el-button>
<el-button v-if="!showTemplate" type="primary" @click="traningAndSave('save')" v-preventReClick>保存模板
<el-button type="success" @click="traningAndSave('traning')" v-preventReClick>开始训练
</el-button>
<!-- <el-button v-if="!showTemplate" type="primary" @click="traningAndSave('save')" v-preventReClick>保存模板
</el-button> -->
<el-button type="warning" @click="cancel">取消</el-button>
</div>
</el-dialog>
@@ -154,6 +153,7 @@
import { getPresetAlgorithmList, getPublicAlgorithmList, getMyAlgorithmList, getAlgorithmVersionList } from '@/api/modelDev'
import { getMyImage, getPublicImage, getPreImage } from '@/api/imageManager'
import { getMyDatasetList, getPublicDatasetList, getPresetDatasetList, getVersionList } from '@/api/datasetManager'
import { randomName } from '@/utils/index'
export default {
name: "DialogEditForm",
components: {
@@ -283,8 +283,6 @@
algorithmNameTemp: '',
imageTemp: '',
dataSetTemp: '',
name: '',
desc: ''

}
},
@@ -293,15 +291,13 @@
switch (this.flag) {
case 1:
this.showTraning = false
this.name = '模版名称'
this.desc = '模版描述'
return '编辑任务模板'
delete this.rules.resourcePool
return '编辑训练任务'
break
case 2:
this.showTraning = true
this.showTemplate = true
this.name = '任务名称'
this.desc = '任务描述'

return '创建训练任务'
break
}
@@ -344,8 +340,12 @@
this.dataSetVersion = true
// 获取模板信息
this.getSpacePools()
this.ruleForm.name = this.randomName('trainjob')
},
methods: {
randomName(val) {
return randomName(val)
},
clearDataSetVersionOption() {
this.dataSetVersionOption = []
},
@@ -387,7 +387,7 @@
if (this.flag === 2) {
this.ruleForm.name = ''
}
this.getResourceList()
// this.getResourceList()
},
changeDisResourceList() {
this.resourceOptions = []
@@ -437,7 +437,7 @@
},
cancel() {
let message = ''
if (this.flag === 1) { message = '此操作将放弃编辑任务模板, 是否继续?' } else { message = '此操作将放弃创建训练任务,是否继续' }
if (this.flag === 1) { message = '此操作将放弃编辑训练任务, 是否继续?' } else { message = '此操作将放弃创建训练任务,是否继续' }
this.$confirm(message, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',


+ 2
- 2
openai-portal/src/views/trainingManager/index.vue View File

@@ -3,9 +3,9 @@
<el-tab-pane label="训练任务" name="menu1">
<traningTask v-if="tabRefresh.menu1" :training-task="trainingTask" />
</el-tab-pane>
<el-tab-pane label="任务模板" name="menu2">
<!-- <el-tab-pane label="任务模板" name="menu2">
<taskTemplate v-if="tabRefresh.menu2" :training-template="trainingTemplate" @createTraning="createTraning" />
</el-tab-pane>
</el-tab-pane> -->
</el-tabs>
</template>
<script>


+ 39
- 32
openai-portal/src/views/trainingManager/traningTask.vue View File

@@ -5,14 +5,9 @@
</div>
<el-button type="primary" class="create" @click="open()">批量删除</el-button>
<el-button type="primary" class="create" @click="create">创建任务</el-button>
<el-table
ref="multipleTable"
:data="tableData"
style="width: 100%;font-size: 15px;"
:header-cell-style="{'text-align':'left','color':'black'}"
:cell-style="{'text-align':'left'}"
@selection-change="handleSelectionChange"
>
<el-table ref="multipleTable" :data="tableData" style="width: 100%;font-size: 15px;"
:header-cell-style="{'text-align':'left','color':'black'}" :cell-style="{'text-align':'left'}"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" :selectable="checkSelectable" />
<el-table-column label="任务名称" align="center">
<template slot-scope="scope">
@@ -59,42 +54,35 @@
<template slot-scope="scope">
<el-button
v-if="scope.row.status==='pending'||scope.row.status==='running'||scope.row.status==='preparing'"
type="text"
@click="open2(scope.row)"
>
type="text" @click="open2(scope.row)">
停止
</el-button>
<el-button type="text" @click="handleDetail(scope.row)">详情</el-button>
<el-button
v-if="scope.row.status==='failed'||scope.row.status==='succeeded'||scope.row.status==='stopped'"
type="text"
@click="open(scope.row)"
>删除
type="text" @click="open(scope.row)">删除
</el-button>
<el-button type="text" @click="handleEdit(scope.row,'editTemplate')">重新训练</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination
:current-page="searchData.pageIndex"
:page-sizes="[10, 20, 50, 80]"
:page-size="searchData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<el-pagination :current-page="searchData.pageIndex" :page-sizes="[10, 20, 50, 80]"
:page-size="searchData.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
<!-- 创建对话框 -->
<createDialog v-if="createDialog" :row="row" :flag="flag" @cancel="cancel" @confirm="confirm" @close="close" />
<!-- 详情对话框 -->
<detailDialog v-if="detailDialog" :data="data" @cancel="cancel" @confirm="confirm" @close="close" />
<editDialog v-if="editDialog" :flag="flag" :row="row" @cancel="cancel" @confirm="confirm" @close="close" />

</div>
</template>
<script>
import createDialog from "./components/createDialog/index.vue";
import detailDialog from "./components/detailDialog/index.vue";
import editDialog from "./components/editDialog/index.vue";
import { getList, stop, Delete, getTraningDetail } from '@/api/trainingManager'
import searchForm from '@/components/search/index.vue'
import { formatDuring } from '@/utils/index'
@@ -103,13 +91,14 @@
components: {
createDialog,
detailDialog,
searchForm
searchForm,
editDialog,
},
props: {
trainingTask: {
type: Boolean,
default: false
}
trainingTask: {
type: Boolean,
default: false
}
},
data() {
return {
@@ -119,6 +108,7 @@
data: {},
createDialog: false,
detailDialog: false,
editDialog: false,
total: undefined,
statusText: { 'preparing': ['status-ready', '初始中'], 'pending': ['status-agent', '等待中'], 'running': ['status-running', '运行中'], 'failed': ['status-danger', '失败'], 'succeeded': ['status-success', '成功'], 'stopped': ['status-stopping', '已停止'] },
flag: undefined,
@@ -266,17 +256,20 @@
cancel(val) {
this.getList(this.searchData)
this.createDialog = val;
this.detailDialog = val
this.detailDialog = val;
this.editDialog = val
},
confirm(val) {
this.getList(this.searchData)
this.createDialog = val;
this.detailDialog = val
this.detailDialog = val;
this.editDialog = val
},
close(val) {
this.getList(this.searchData)
this.createDialog = val;
this.detailDialog = val
this.detailDialog = val;
this.editDialog = val
},
create() {
this.createDialog = true; this.row = {}
@@ -327,7 +320,21 @@
message: '已取消操作'
});
});
}
},
handleEdit(val, name) {
getTraningDetail(val.id).then(response => {
if (response.success) {
this.editDialog = true
this.row = response.data.trainJob
if (name === 'editTemplate') { this.flag = 1 } else { this.flag = 2 }
} else {
this.$message({
message: this.getErrorMsg(response.error.subcode),
type: 'warning'
});
}
})
},

}
}


+ 6
- 6
readme.md View File

@@ -12,7 +12,7 @@

## 文档

详细文档请参考[这里](https://octopus.openi.org.cn/docs/introduction/intro)。
详细文档请参考[这里](https://octopus.pcl.ac.cn/docs/introduction/intro)。

## 特点与场景

@@ -46,20 +46,20 @@ Octopus 为集群用户和管理员提供端到端的手册。

与集群管理员相关的文档包括如下:

- ***集群部署指南***: 此部分主要提供的内容包括:集群依赖环境与组件的准备与安装、Octopus系统部署指南以及后续系统的升级说明等,以方便安装维护。详细内容请参考[这里](https://octopus.openi.org.cn/docs/deployment/environment) 。
- ***集群部署指南***: 此部分主要提供的内容包括:集群依赖环境与组件的准备与安装、Octopus系统部署指南以及后续系统的升级说明等,以方便安装维护。详细内容请参考[这里](https://octopus.pcl.ac.cn/docs/deployment/environment) 。

- ***集群管理手册***: 此部分主要介绍集群管理员通过管理系统页面入口进入Octopus管理系统后可进行的操作,主要功能说明包括:平台监控、资源管理、用户管理、机时管理、数据管理、算法管理以及开发与训练管理等功能。详细内容请参考[这里](https://octopus.openi.org.cn/docs/management/intro) 。
- ***集群管理手册***: 此部分主要介绍集群管理员通过管理系统页面入口进入Octopus管理系统后可进行的操作,主要功能说明包括:平台监控、资源管理、用户管理、机时管理、数据管理、算法管理以及开发与训练管理等功能。详细内容请参考[这里](https://octopus.pcl.ac.cn/docs/management/intro) 。

### 对于集群用户

与集群用户相关的文档主要如下:

- ***用户使用手册***: 此部分主要介绍集群用户通过Octopus系统页面入口进入Octopus系统后可进行的操作,主要功能说明包括:数据管理、算法管理、镜像管理以及开发与训练管理等功能。详细内容请参考[这里](https://octopus.openi.org.cn/docs/manual/intro) 。
- ***用户使用手册***: 此部分主要介绍集群用户通过Octopus系统页面入口进入Octopus系统后可进行的操作,主要功能说明包括:数据管理、算法管理、镜像管理以及开发与训练管理等功能。详细内容请参考[这里](https://octopus.pcl.ac.cn/docs/manual/intro) 。

## 如何贡献

详细贡献指南请参考[这里](https://octopus.openi.org.cn/docs/community/contribution) 。
详细贡献指南请参考[这里](https://octopus.pcl.ac.cn/docs/community/contribution) 。

## License

[Apache License](https://octopus.openi.org.cn/docs/community/LICENSE)
[Apache License](https://octopus.pcl.ac.cn/docs/community/LICENSE)

+ 6
- 6
readme_en.md View File

@@ -13,7 +13,7 @@ At the same time, cluster management personnel are provided with functions such

## Documentations

For detailed documentation, please refer to [here](https:///octopus.openi.org.cn/docs/introduction/intro).
For detailed documentation, please refer to [here](https:///octopus.pcl.ac.cn/docs/introduction/intro).

## Features and Scenarios

@@ -47,20 +47,20 @@ Octopus provides end-to-end manuals for cluster users and administrators.

Documents related to cluster administrators include the following:

- ***Cluster Deployment Guide***: the main contents provided in this part include: preparation and installation of cluster dependent environment and components, Octopus system deployment guide and follow-up system upgrade instructions to facilitate installation and maintenance. For details, please refer to [here](https://octopus.openi.org.cn/docs/deployment/environment) 。
- ***Cluster Deployment Guide***: the main contents provided in this part include: preparation and installation of cluster dependent environment and components, Octopus system deployment guide and follow-up system upgrade instructions to facilitate installation and maintenance. For details, please refer to [here](https://octopus.pcl.ac.cn/docs/deployment/environment) 。

- ***Cluster Management Manual***: This part mainly introduces the operations that the cluster administrator can perform after entering the Octopus management system through the management system page entrance. The main function descriptions include: platform monitoring, resource management, user management, machine time management, data management, algorithm management, development and training management And other functions. For details, please refer to [here](https://octopus.openi.org.cn/docs/management/intro).
- ***Cluster Management Manual***: This part mainly introduces the operations that the cluster administrator can perform after entering the Octopus management system through the management system page entrance. The main function descriptions include: platform monitoring, resource management, user management, machine time management, data management, algorithm management, development and training management And other functions. For details, please refer to [here](https://octopus.pcl.ac.cn/docs/management/intro).

### For cluster users

The main documents related to cluster users are as follows:

- ***User Manual***: this part mainly introduces the operations that cluster users can perform after entering the Octopus system through the Octopus system page entrance. The main function descriptions include: data management, algorithm management, mirroring management, development and training management and other functions. For details, please refer to [here](https://octopus.openi.org.cn/docs/manual/intro).
- ***User Manual***: this part mainly introduces the operations that cluster users can perform after entering the Octopus system through the Octopus system page entrance. The main function descriptions include: data management, algorithm management, mirroring management, development and training management and other functions. For details, please refer to [here](https://octopus.pcl.ac.cn/docs/manual/intro).

## How to Contribute

For detailed contribution guidelines, please refer to [here](https://octopus.openi.org.cn/docs/community/contribution).
For detailed contribution guidelines, please refer to [here](https://octopus.pcl.ac.cn/docs/community/contribution).

## License

[Apache License](https://octopus.openi.org.cn/docs/community/LICENSE)
[Apache License](https://octopus.pcl.ac.cn/docs/community/LICENSE)

+ 2
- 0
server/admin-server/api/v1/resourcepool.proto View File

@@ -43,6 +43,8 @@ message ResourcePool {
bool default = 4;
repeated string bindingNodes = 5;
map<string,ResourceSpecIdList> mapResourceSpecIdList = 6;
map<string,string> resourceCapacity = 7;
map<string,string> resourceAllocated = 8;
}

message ResourcePoolList {


+ 35
- 0
server/admin-server/api/v1/user.proto View File

@@ -65,6 +65,20 @@ service User {
body: "*"
};
};

rpc UpdateUserMinioAccount (UpdateUserMinioAccountRequest) returns (UpdateUserMinioAccountReply) {
option (google.api.http) = {
put: "/v1/usermanage/user/{userId}/minioaccount"
body: "*"
};
};

rpc UpdateUserMinioBuckets (UpdateUserMinioBucketsRequest) returns (UpdateUserMinioBucketsReply) {
option (google.api.http) = {
put: "/v1/usermanage/user/{userId}/miniobuckets"
body: "*"
};
};
}

message UserItem {
@@ -79,6 +93,8 @@ message UserItem {
repeated string resourcePools = 9;
string desc=10;
common.api.v1.UserPermission permission = 11;
repeated string buckets = 12;
string minioUserName = 13;
}

message ListUserRequest {
@@ -178,4 +194,23 @@ message UpdateUserConfigRequest {

message UpdateUserConfigReply {

}

message UpdateUserMinioAccountRequest {
string userId = 1;
string minioUserName = 2;
string minioPassword = 3;
}

message UpdateUserMinioAccountReply {

}

message UpdateUserMinioBucketsRequest {
string userId = 1;
repeated string buckets = 2;
}

message UpdateUserMinioBucketsReply {

}

+ 1
- 3
server/admin-server/internal/service/billing.go View File

@@ -2,6 +2,7 @@ package service

import (
"context"
"github.com/jinzhu/copier"
api "server/admin-server/api/v1"
"server/admin-server/internal/conf"
"server/admin-server/internal/data"
@@ -9,8 +10,6 @@ import (
"server/common/errors"
"server/common/log"
"server/common/utils/collections/set"

"github.com/jinzhu/copier"
)

type billingService struct {
@@ -111,7 +110,6 @@ func (s *billingService) RechargeUser(ctx context.Context, req *api.RechargeUser
Amount: req.Amount,
Title: req.Title,
})

if err != nil {
return nil, err
}


+ 54
- 0
server/admin-server/internal/service/resourcepool.go View File

@@ -10,6 +10,10 @@ import (
"server/common/errors"
"server/common/log"

"k8s.io/apimachinery/pkg/api/resource"

"google.golang.org/protobuf/types/known/emptypb"

"github.com/golang/protobuf/ptypes/empty"
)

@@ -49,6 +53,56 @@ func (rsps *ResourcePoolService) ListResourcePool(ctx context.Context, req *empt
return nil, errors.Errorf(err, errors.ErrorListResourcePool)
}

nodes, err := rsps.data.NodeClient.ListNode(ctx, &emptypb.Empty{})
if err != nil {
return nil, errors.Errorf(err, errors.ErrorListResourcePool)
}
for _, p := range apiReply.ResourcePools {
capacity := make(map[string]*resource.Quantity)
allocated := make(map[string]*resource.Quantity)
for _, nn := range p.BindingNodes {
for _, n := range nodes.Nodes {
if nn == n.Name {
for k, v := range n.Capacity {
q, err := resource.ParseQuantity(v)
if err != nil {
log.Errorf(ctx, "parse %s error", v)
continue
}
_, exist := capacity[k]
if !exist {
capacity[k] = &q
} else {
capacity[k].Add(q)
}
}

for k, v := range n.Allocated {
q, err := resource.ParseQuantity(v)
if err != nil {
log.Errorf(ctx, "parse %s error", v)
continue
}
_, exist := allocated[k]
if !exist {
allocated[k] = &q
} else {
allocated[k].Add(q)
}
}
}
}
}
p.ResourceCapacity = make(map[string]string)
p.ResourceAllocated = make(map[string]string)
for k, v := range capacity {
p.ResourceCapacity[k] = v.String()
}
for k, v := range allocated {
p.ResourceAllocated[k] = v.String()
}
}

return apiReply, nil
}



+ 31
- 0
server/admin-server/internal/service/user.go View File

@@ -60,6 +60,8 @@ func (s *UserService) ListUser(ctx context.Context, req *pb.ListUserRequest) (*p
ResourcePools: user.ResourcePools,
Desc: user.Desc,
Permission: user.Permission,
MinioUserName: user.MinioUserName,
Buckets: user.Buckets,
}
}

@@ -106,6 +108,8 @@ func (s *UserService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.
ResourcePools: user.ResourcePools,
Desc: user.Desc,
Permission: user.Permission,
MinioUserName: user.MinioUserName,
Buckets: user.Buckets,
},
Workspaces: workspaces,
}, nil
@@ -241,3 +245,30 @@ func (s *UserService) UpdateUserConfig(ctx context.Context, req *pb.UpdateUserCo
}
return &pb.UpdateUserConfigReply{}, nil
}

func (s *UserService) UpdateUserMinioAccount(ctx context.Context, req *pb.UpdateUserMinioAccountRequest) (*pb.UpdateUserMinioAccountReply, error) {
_, err := s.data.UserClient.UpdateUserMinioAccount(ctx, &innterapi.UpdateUserMinioAccountRequest{
MinioUserName: req.MinioUserName,
MinioPassword: req.MinioPassword,
UserId: req.UserId,
})

if err != nil {
return nil, err
}

return &pb.UpdateUserMinioAccountReply{}, nil
}

func (s *UserService) UpdateUserMinioBuckets(ctx context.Context, req *pb.UpdateUserMinioBucketsRequest) (*pb.UpdateUserMinioBucketsReply, error) {
_, err := s.data.UserClient.UpdateUserMinioBuckets(ctx, &innterapi.UpdateUserMinioBucketsRequest{
UserId: req.UserId,
Buckets: req.Buckets,
})

if err != nil {
return nil, err
}

return &pb.UpdateUserMinioBucketsReply{}, nil
}

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

@@ -47,6 +47,8 @@ message CreateNotebookRequest {
repeated common.api.v1.Mount mounts = 13;
//镜像地址,非必填,镜像地址和镜像ID填一个
string imageUrl = 14;
map<string, string> envs = 15;
string command = 16;
}

message CreateNotebookReply {


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

@@ -92,6 +92,7 @@ message Config {
double resourceSpecPrice = 10;
repeated ReplicaState replicaStates = 11;
string subTaskState = 12;
map<string, string> envs = 13;
}

message ReplicaState {


+ 23
- 0
server/base-server/api/v1/user.proto View File

@@ -21,6 +21,8 @@ service UserService {
rpc GetUserConfig (GetUserConfigRequest) returns (GetUserConfigReply);
rpc UpdateUserConfig (UpdateUserConfigRequest) returns (UpdateUserConfigReply);
rpc UpdateUserFtpAccount (UpdateUserFtpAccountRequest) returns (UpdateUserFtpAccountReply);
rpc UpdateUserMinioAccount (UpdateUserMinioAccountRequest) returns (UpdateUserMinioAccountReply);
rpc UpdateUserMinioBuckets (UpdateUserMinioBucketsRequest) returns (UpdateUserMinioBucketsReply);
}

enum UserStatus
@@ -52,6 +54,8 @@ message UserItem {
repeated string resourcePools = 12;
string desc=13;
common.api.v1.UserPermission permission = 14;
repeated string buckets = 15;
string minioUserName = 16;
}

message Bind {
@@ -171,4 +175,23 @@ message UpdateUserFtpAccountRequest {

message UpdateUserFtpAccountReply {

}

message UpdateUserMinioAccountRequest {
string userId = 1;
string minioUserName = 2;
string minioPassword = 3;
}

message UpdateUserMinioAccountReply {

}

message UpdateUserMinioBucketsRequest {
string userId = 1;
repeated string buckets = 2;
}

message UpdateUserMinioBucketsReply {

}

+ 3
- 4
server/base-server/configs/config.yaml View File

@@ -15,8 +15,8 @@ data:
driver: mysql
source: root:root@tcp(192.168.203.154:30336)/octopus?charset=utf8&parseTime=True&loc=Local
kubernetes:
masterUrl: https://192.168.202.73:6443/
configPath: C:/Users/dell/Desktop/154kubeconfig
masterUrl: https://192.168.203.154:6443/
configPath: C:/Users/dell/Desktop/kubeconfig
minio:
base:
endPoint: 192.168.203.154:31311
@@ -36,7 +36,7 @@ data:
apiVersion: v1.0
useSSL: false
redis:
addr: 192.168.203.154:32112
addr: 192.168.203.154:32260
username:
password: abcde
influxdb:
@@ -67,7 +67,6 @@ service:
resourceLabelKey: octopus.pcl.ac.cn/type
billingPeriodSec: 60
develop:
jpyBaseUrlEnv: OCTOPUS_JPY_BASE_URL
autoStopIntervalSec: 7200
isSetUploadFileSize: true #值为false时,上传文件大小不能超过1M;为true时,不限制
resource:


+ 11
- 1
server/base-server/internal/common/common.go View File

@@ -4,6 +4,7 @@ import (
"database/sql/driver"
"encoding/json"
"fmt"
"path"
commapi "server/common/api/v1"

v1 "k8s.io/api/core/v1"
@@ -24,7 +25,7 @@ func (r *Mounts) Scan(input interface{}) error {
}
}

func GetVolumes(mounts Mounts) ([]v1.Volume, []v1.VolumeMount) {
func GetVolumes(mounts Mounts, octopusVolume string) ([]v1.Volume, []v1.VolumeMount) {
volumes := make([]v1.Volume, 0)
volumeMounts := make([]v1.VolumeMount, 0)
for i, m := range mounts {
@@ -45,6 +46,15 @@ func GetVolumes(mounts Mounts) ([]v1.Volume, []v1.VolumeMount) {
ReadOnly: m.ReadOnly,
})
}

if m.Octopus != nil {
volumeMounts = append(volumeMounts, v1.VolumeMount{
Name: octopusVolume,
MountPath: m.ContainerPath,
SubPath: path.Join(m.Octopus.Bucket, m.Octopus.Object),
ReadOnly: m.ReadOnly,
})
}
}

return volumes, volumeMounts


+ 5
- 3
server/base-server/internal/data/dao/billing.go View File

@@ -4,14 +4,13 @@ import (
"context"
stderrors "errors"
"fmt"
"gorm.io/gorm"
"server/base-server/internal/data/dao/model"
"server/common/errors"
"server/common/log"
"server/common/transaction"
"server/common/utils"
"time"

"gorm.io/gorm"
)

type BillingDao interface {
@@ -74,7 +73,10 @@ func (d *billingDao) CreateBillingOwner(ctx context.Context, owner *model.Billin

func (d *billingDao) UpdateBillingOwnerSelective(ctx context.Context, key *model.BillingOwnerKey, owner *model.BillingOwner) error {
db := d.db(ctx)
res := db.Where("owner_id = ? and owner_type = ? ", key.OwnerId, key.OwnerType).Updates(owner)
ownerMap := map[string]interface{}{
"amount":owner.Amount,
}
res := db.Model(model.BillingOwner{}).Where("owner_id = ? and owner_type = ? ", key.OwnerId, key.OwnerType).Updates(ownerMap)

if res.Error != nil {
return errors.Errorf(res.Error, errors.ErrorDBUpdateFailed)


+ 4
- 1
server/base-server/internal/data/dao/model/develop.go View File

@@ -5,6 +5,7 @@ import (
"server/base-server/internal/common"
v1 "server/common/api/v1"
"server/common/dao"
"server/common/sql"
"time"

"gorm.io/plugin/soft_delete"
@@ -33,7 +34,9 @@ type Notebook struct {
Status string `gorm:"type:varchar(50);not null;default:'';comment:preparing/pending/running/stopped"`
TaskNumber int `gorm:"type:int;not null;default:1;comment:任务个数"`
ResourcePool string `gorm:"type:varchar(300);default:'';comment:资源池"`
Mounts common.Mounts `gorm:"type:json;comment:挂载外部存储"`
Mounts common.Mounts `gorm:"type:json;comment:挂载存储"`
Envs sql.Map `gorm:"type:json;comment:环境变量"`
Command string `gorm:"type:text;comment:启动命令"`
DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:name_userId_spaceId,priority:4"`
}



+ 1
- 0
server/base-server/internal/data/dao/model/train_job.go View File

@@ -69,6 +69,7 @@ type Config struct {
ResourceSpecPrice float64 `json:"resourceSpecPrice"`
IsMainRole bool `json:"isMainRole"`
ShareMemory *resource.Quantity `json:"shareMemory"`
Envs map[string]string `json:"envs"`
}

type ResourceSpecPrice struct {


+ 6
- 2
server/base-server/internal/data/dao/model/user.go View File

@@ -68,6 +68,8 @@ type User struct {
ResourcePools ResourcePools `gorm:"type:json;comment:'资源池'"`
Desc string `gorm:"type:varchar(100);default:'';index;comment:'备注'"`
Permission *Permission `gorm:"type:json;comment:权限"`
MinioUserName string `gorm:"type:varchar(100);uniqueIndex:minioUserName;comment:'minio用户名'"`
Buckets sql.Strings `gorm:"type:json;comment:'允许访问的buckets'"`
}

func (User) TableName() string {
@@ -198,6 +200,8 @@ type UserUpdate struct {
ResourcePools []string
Desc string
Permission *Permission
MinioUserName string
Buckets []string
}

type UserUpdateCond struct {
@@ -212,8 +216,8 @@ type UserListIn struct {

type UserConfig struct {
dao.Model
UserId string `gorm:"primaryKey;type:varchar(100);not null;default:'';comment:用户id"`
Config sql.SqlJson `gorm:"type:json;comment:配置"`
UserId string `gorm:"primaryKey;type:varchar(100);not null;default:'';comment:用户id"`
Config sql.Map `gorm:"type:json;comment:配置"`
}

func (UserConfig) TableName() string {


+ 3
- 1
server/base-server/internal/data/dao/user.go View File

@@ -125,7 +125,7 @@ func (d *userDao) Add(ctx context.Context, user *model.UserAdd) (*model.User, er
Desc: user.Desc,
}

result := db.Omit("ftp_user_name").Create(&u)
result := db.Omit("ftp_user_name", "minio_user_name").Create(&u)
if result.Error != nil {
return nil, result.Error
}
@@ -156,6 +156,8 @@ func (d *userDao) Update(ctx context.Context, cond *model.UserUpdateCond, user *
ResourcePools: user.ResourcePools,
Desc: user.Desc,
Permission: user.Permission,
MinioUserName: user.MinioUserName,
Buckets: user.Buckets,
})
if result.Error != nil {
return nil, result.Error


+ 60
- 6
server/base-server/internal/data/minio/minio.go View File

@@ -9,8 +9,11 @@ import (
"server/base-server/internal/common"
"server/base-server/internal/conf"
"server/common/errors"
"strings"
"time"

"github.com/minio/madmin-go"

"server/common/log"

miniogo "github.com/minio/minio-go/v7"
@@ -30,6 +33,12 @@ type Minio interface {
ListObjects(bucketName string, objectPrefix string, recurSvie bool) ([]*ObjectInfo, error)
// 查看对象是否存在
ObjectExist(bucketName string, objectName string) (bool, error)

CreateOrUpdateAccount(ctx context.Context, userName string, password string) error

BucketExists(ctx context.Context, bucketName string) (bool, error)

SetUserBucketsAccess(ctx context.Context, userName string, buckets []string) error
}

type ObjectInfo struct {
@@ -40,9 +49,10 @@ type ObjectInfo struct {
}

type minio struct {
log *log.Helper
conf *conf.Data
client *miniogo.Client
log *log.Helper
conf *conf.Data
client *miniogo.Client
adminClient *madmin.AdminClient
}

func NewMinio(conf *conf.Data, logger log.Logger) Minio {
@@ -55,10 +65,16 @@ func NewMinio(conf *conf.Data, logger log.Logger) Minio {
panic(err)
}

adminClient, err := madmin.New(conf.Minio.Base.EndPoint, conf.Minio.Base.AccessKeyID, conf.Minio.Base.SecretAccessKey, false)
if err != nil {
panic(err)
}

minio := &minio{
log: log.NewHelper("Minio", logger),
conf: conf,
client: client,
log: log.NewHelper("Minio", logger),
conf: conf,
client: client,
adminClient: adminClient,
}

// 创建默认的桶
@@ -241,3 +257,41 @@ func (m *minio) ObjectExist(bucketName string, objectName string) (bool, error)

return true, nil
}

func (m *minio) CreateOrUpdateAccount(ctx context.Context, userName string, password string) error {
err := m.adminClient.AddUser(ctx, userName, password)
if err != nil {
return errors.Errorf(err, errors.ErrorMinioCreateAccountFailed)
}
return nil
}

func (m *minio) BucketExists(ctx context.Context, bucketName string) (bool, error) {
isExist, err := m.client.BucketExists(ctx, bucketName)
if err != nil {
return false, errors.Errorf(err, errors.ErrorMinioCheckBucketExistFailed)
}

return isExist, nil
}

func (m *minio) SetUserBucketsAccess(ctx context.Context, userName string, buckets []string) error {
rs := make([]string, 0)
for _, b := range buckets {
rs = append(rs, fmt.Sprintf(`"arn:aws:s3:::%s/*"`, b))
}

policy := fmt.Sprintf(`{"Version": "2012-10-17","Statement": [{"Action": ["s3:*"],"Effect": "Allow","Resource": [%s]}]}`, strings.Join(rs, ","))
fmt.Println(policy)
err := m.adminClient.AddCannedPolicy(ctx, userName, []byte(policy))
if err != nil {
return errors.Errorf(nil, errors.ErrorMinioOperationFailed)
}

err = m.adminClient.SetPolicy(ctx, userName, userName, false)
if err != nil {
return errors.Errorf(nil, errors.ErrorMinioOperationFailed)
}

return nil
}

+ 22
- 0
server/base-server/internal/data/minio/minio_test.go View File

@@ -1,6 +1,7 @@
package minio_test

import (
"context"
"fmt"
"server/base-server/internal/conf"
"server/base-server/internal/data/minio"
@@ -8,6 +9,8 @@ import (
"server/common/utils"
"testing"

"github.com/minio/madmin-go"

"server/common/log"

"github.com/go-kratos/kratos/v2/config"
@@ -114,3 +117,22 @@ func TestPresignedUploadObject(t *testing.T) {

logger.Print(url.String())
}

func TestUser(t *testing.T) {
ctx := context.Background()
madmClnt, err := madmin.New("192.168.202.73:31311", "minioadmin", "minioadmin", false)
if err != nil {
t.Fatal(err)
}

if err = madmClnt.AddCannedPolicy(ctx, "lfj", []byte(`{"Version": "2012-10-17","Statement": [{"Action": ["s3:*"],"Effect": "Allow","Resource": ["arn:aws:s3:::lfj"]}]}`)); err != nil {
t.Fatal(err)
}

if err = madmClnt.AddUser(ctx, "lfj", "123456789"); err != nil {
t.Fatal(err)
}
if err = madmClnt.SetPolicy(ctx, "lfj", "lfj", false); err != nil {
panic(err)
}
}

+ 0
- 1
server/base-server/internal/service/billing/billing.go View File

@@ -210,7 +210,6 @@ func (s *billingService) Recharge(ctx context.Context, req *api.RechargeRequest)
if err != nil {
return err
}

err = s.data.BillingDao.UpdateBillingOwnerSelective(ctx, ownerKey, &model.BillingOwner{Amount: owner.Amount + req.Amount})
if err != nil {
return err


+ 44
- 16
server/base-server/internal/service/develop/develop.go View File

@@ -12,9 +12,12 @@ import (
"server/common/constant"
"server/common/errors"
"server/common/utils"
"strconv"
"strings"
"time"

"k8s.io/utils/strings/slices"

vcBus "volcano.sh/apis/pkg/apis/bus/v1alpha1"

"server/common/log"
@@ -66,9 +69,15 @@ const (
nodeActionLabelNotebookId = "nodebook.octopus.dev/id"
nodeActionLabelImageId = "image.octopus.dev/id"
kubeAnnotationsProxyBodySize = "nginx.ingress.kubernetes.io/proxy-body-size"
jpyCommand = "jupyter lab --no-browser --ip=0.0.0.0 --allow-root --notebook-dir='%s' --port=8888 --LabApp.token='' --LabApp.allow_origin='*' --LabApp.base_url=$OCTOPUS_JPY_BASE_URL"
envNotebookBaseUrl = "OCTOPUS_NOTEBOOK_BASE_URL"
envNotebookPort = "OCTOPUS_NOTEBOOK_PORT"
)

func buildCommand(nbDir string) string {
c := `! [ -x "$(command -v jupyter)" ] && pip install jupyterlab==3 -i https://pypi.tuna.tsinghua.edu.cn/simple;jupyter lab --no-browser --ip=0.0.0.0 --allow-root --notebook-dir='%s' --port=$%s --LabApp.token='' --LabApp.allow_origin='*' --LabApp.base_url=$%s;`
return fmt.Sprintf(c, nbDir, envNotebookPort, envNotebookBaseUrl)
}

func buildTaskName(idx int) string {
return fmt.Sprintf("%s%d", k8sTaskNamePrefix, idx)
}
@@ -282,15 +291,27 @@ func (s *developService) checkPermAndAssign(ctx context.Context, nb *model.Noteb
}
}

if (user.User.Permission == nil || !user.User.Permission.MountExternalStorage) && len(nb.Mounts) > 0 {
return nil, errors.Errorf(nil, errors.ErrorTrainMountExternalForbidden)
for _, m := range nb.Mounts {
if m.Octopus != nil {
if !slices.Contains(user.User.Buckets, m.Octopus.Bucket) {
return nil, errors.Errorf(nil, errors.ErrorInvalidRequestParameter)
}
}

if m.Nfs != nil && (user.User.Permission == nil || !user.User.Permission.MountExternalStorage) {
return nil, errors.Errorf(nil, errors.ErrorNotebookMountExternalForbidden)
}
}

command := ""
if nb.AlgorithmId != "" {
command = fmt.Sprintf(jpyCommand, s.conf.Service.DockerCodePath)
if nb.Command != "" {
command = nb.Command
} else {
command = fmt.Sprintf(jpyCommand, s.conf.Service.DockerUserHomePath)
if nb.AlgorithmId != "" {
command = buildCommand(s.conf.Service.DockerCodePath)
} else {
command = buildCommand(s.conf.Service.DockerUserHomePath)
}
}

return &startJobInfo{
@@ -529,10 +550,10 @@ func (s *developService) StartNotebook(ctx context.Context, req *api.StartNotebo
}

func (s *developService) submitJob(ctx context.Context, nb *model.Notebook, nbJob *model.NotebookJob, startJobInfo *startJobInfo) error {
volume := "data"
volumeMounts := []v1.VolumeMount{
{
Name: "data",
Name: volume,
MountPath: s.conf.Service.DockerUserHomePath,
SubPath: common.GetUserHomePath(nb.UserId),
ReadOnly: false,
@@ -545,7 +566,7 @@ func (s *developService) submitJob(ctx context.Context, nb *model.Notebook, nbJo

if startJobInfo.algorithmPath != "" {
volumeMounts = append(volumeMounts, v1.VolumeMount{
Name: "data",
Name: volume,
MountPath: s.conf.Service.DockerCodePath,
SubPath: startJobInfo.algorithmPath,
ReadOnly: false,
@@ -554,7 +575,7 @@ func (s *developService) submitJob(ctx context.Context, nb *model.Notebook, nbJo

if startJobInfo.datasetPath != "" {
volumeMounts = append(volumeMounts, v1.VolumeMount{
Name: "data",
Name: volume,
MountPath: s.conf.Service.DockerDatasetPath,
SubPath: startJobInfo.datasetPath,
ReadOnly: true,
@@ -563,7 +584,7 @@ func (s *developService) submitJob(ctx context.Context, nb *model.Notebook, nbJo

volumes := []v1.Volume{
{
Name: "data",
Name: volume,
VolumeSource: v1.VolumeSource{
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
ClaimName: common.GetStoragePersistentVolumeChaim(nb.UserId),
@@ -595,7 +616,7 @@ func (s *developService) submitJob(ctx context.Context, nb *model.Notebook, nbJo
})
}

vs, vms := common.GetVolumes(nb.Mounts)
vs, vms := common.GetVolumes(nb.Mounts, volume)
if len(vms) > 0 {
volumeMounts = append(volumeMounts, vms...)
volumes = append(volumes, vs...)
@@ -607,6 +628,16 @@ func (s *developService) submitJob(ctx context.Context, nb *model.Notebook, nbJo
task := typeJob.TaskSpec{}
task.Name = taskName
task.Replicas = 1
envs := []v1.EnvVar{{
Name: envNotebookBaseUrl,
Value: buildNotebookUrl(nbJob.Id, i),
}, {
Name: envNotebookPort,
Value: strconv.Itoa(servicePort),
}}
for k, v := range nb.Envs {
envs = append(envs, v1.EnvVar{Name: k, Value: v})
}
task.Template = v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{"volcano.sh/task-spec": buildTaskName(i)},
@@ -623,10 +654,7 @@ func (s *developService) submitJob(ctx context.Context, nb *model.Notebook, nbJo
Limits: startJobInfo.resources,
},
VolumeMounts: volumeMounts,
Env: []v1.EnvVar{{
Name: s.conf.Service.Develop.JpyBaseUrlEnv,
Value: buildNotebookUrl(nbJob.Id, i),
}},
Env: envs,
},
},
NodeSelector: startJobInfo.nodeSelectors,


+ 25
- 8
server/base-server/internal/service/trainjob/train_job.go View File

@@ -19,6 +19,8 @@ import (
"strings"
"time"

"k8s.io/utils/strings/slices"

typeJob "volcano.sh/apis/pkg/apis/batch/v1alpha1"

"encoding/json"
@@ -437,8 +439,16 @@ func (s *trainJobService) checkPermForJob(ctx context.Context, job *model.TrainJ
}
}

if (user.User.Permission == nil || !user.User.Permission.MountExternalStorage) && len(job.Mounts) > 0 {
return nil, errors.Errorf(nil, errors.ErrorTrainMountExternalForbidden)
for _, m := range job.Mounts {
if m.Octopus != nil {
if !slices.Contains(user.User.Buckets, m.Octopus.Bucket) {
return nil, errors.Errorf(nil, errors.ErrorInvalidRequestParameter)
}
}

if m.Nfs != nil && (user.User.Permission == nil || !user.User.Permission.MountExternalStorage) {
return nil, errors.Errorf(nil, errors.ErrorTrainMountExternalForbidden)
}
}

return &startJobInfo{
@@ -473,6 +483,7 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st
}
}()

volume := "data"
minAvailable := 0
tasks := make([]typeJob.TaskSpec, 0)

@@ -482,13 +493,13 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st
//挂载卷
volumeMounts := []v1.VolumeMount{
{
Name: "data",
Name: volume,
MountPath: s.conf.Service.DockerModelPath,
SubPath: s.getModelSubPath(job),
ReadOnly: false,
},
{
Name: "data",
Name: volume,
MountPath: s.conf.Service.DockerUserHomePath,
SubPath: common.GetUserHomePath(job.UserId),
ReadOnly: false,
@@ -502,7 +513,7 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st
if startJobInfo.algorithmPath != "" {
volumeMounts = append(volumeMounts,
v1.VolumeMount{
Name: "data",
Name: volume,
MountPath: readonlyCodeDir,
SubPath: startJobInfo.algorithmPath,
ReadOnly: true,
@@ -518,7 +529,7 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st
if startJobInfo.datasetPath != "" {
volumeMounts = append(volumeMounts,
v1.VolumeMount{
Name: "data",
Name: volume,
MountPath: s.conf.Service.DockerDatasetPath,
SubPath: startJobInfo.datasetPath,
ReadOnly: true,
@@ -527,7 +538,7 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st

volumes := []v1.Volume{
{
Name: "data",
Name: volume,
VolumeSource: v1.VolumeSource{
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
ClaimName: common.GetStoragePersistentVolumeChaim(job.UserId),
@@ -548,7 +559,7 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st
},
}

vs, vms := common.GetVolumes(job.Mounts)
vs, vms := common.GetVolumes(job.Mounts, volume)
if len(vms) > 0 {
volumeMounts = append(volumeMounts, vms...)
volumes = append(volumes, vs...)
@@ -570,6 +581,11 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st
},
})
}

envs := make([]v1.EnvVar, 0)
for k, v := range i.Envs {
envs = append(envs, v1.EnvVar{Name: k, Value: v})
}
//pod template
task := typeJob.TaskSpec{
CompletionPolicy: typeJob.CompletionPolicy{
@@ -595,6 +611,7 @@ func (s *trainJobService) submitJob(ctx context.Context, job *model.TrainJob, st
},
VolumeMounts: volumeMounts,
Command: s.buildCmd(job, i),
Env: envs,
},
},
NodeSelector: startJobInfo.specs[i.ResourceSpecId].nodeSelectors,


+ 62
- 0
server/base-server/internal/service/user/user.go View File

@@ -94,6 +94,8 @@ func (s *UserService) ListUser(ctx context.Context, req *api.ListUserRequest) (*
ResourcePools: user.ResourcePools,
Desc: user.Desc,
Permission: (*v1.UserPermission)(user.Permission),
MinioUserName: user.MinioUserName,
Buckets: user.Buckets,
}
users[idx] = item
}
@@ -161,6 +163,8 @@ func (s *UserService) FindUser(ctx context.Context, req *api.FindUserRequest) (*
ResourcePools: user.ResourcePools,
Desc: user.Desc,
Permission: (*v1.UserPermission)(user.Permission),
MinioUserName: user.MinioUserName,
Buckets: user.Buckets,
},
}

@@ -447,3 +451,61 @@ func (s *UserService) UpdateUserFtpAccount(ctx context.Context, req *api.UpdateU

return &api.UpdateUserFtpAccountReply{}, nil
}

func (s *UserService) UpdateUserMinioAccount(ctx context.Context, req *api.UpdateUserMinioAccountRequest) (*api.UpdateUserMinioAccountReply, error) {
user, err := s.data.UserDao.Find(ctx, &model.UserQuery{Id: req.UserId})
if err != nil {
return nil, err
}

if user.MinioUserName != "" && user.MinioUserName != req.MinioUserName {
return nil, errors.Errorf(nil, errors.ErrorUserChangeMinioUsernameForbidden)
}
err = s.data.Minio.CreateOrUpdateAccount(ctx, req.MinioUserName, req.MinioPassword)
if err != nil {
return nil, err
}

_, err = s.data.UserDao.Update(ctx, &model.UserUpdateCond{Id: req.UserId}, &model.UserUpdate{MinioUserName: req.MinioUserName})
if err != nil {
return nil, err
}

return &api.UpdateUserMinioAccountReply{}, nil
}

func (s *UserService) UpdateUserMinioBuckets(ctx context.Context, req *api.UpdateUserMinioBucketsRequest) (*api.UpdateUserMinioBucketsReply, error) {
user, err := s.data.UserDao.Find(ctx, &model.UserQuery{Id: req.UserId})
if err != nil {
return nil, err
}

if user.MinioUserName == "" {
return nil, errors.Errorf(nil, errors.ErrorUserMinioUsernameNotExist)
}

for _, b := range req.Buckets {
isExist, err := s.data.Minio.BucketExists(ctx, b)
if err != nil {
return nil, err
}
if !isExist {
err := s.data.Minio.CreateBucket(b)
if err != nil {
return nil, err
}
}
}

err = s.data.Minio.SetUserBucketsAccess(ctx, user.MinioUserName, req.Buckets)
if err != nil {
return nil, err
}

_, err = s.data.UserDao.Update(ctx, &model.UserUpdateCond{Id: req.UserId}, &model.UserUpdate{Buckets: req.Buckets})
if err != nil {
return nil, err
}

return &api.UpdateUserMinioBucketsReply{}, nil
}

+ 5
- 0
server/common/api/v1/common.proto View File

@@ -9,9 +9,14 @@ message Mount {
string server = 1;
string path = 2;
}
message Octopus {
string bucket = 1;
string object = 2;
}
string containerPath = 1;
bool readOnly = 2;
Nfs nfs = 3;
Octopus octopus = 4;
}

message UserPermission {


+ 28
- 18
server/common/errors/codes.go View File

@@ -36,6 +36,9 @@ const (
ErrorMinioListObjectFailed = 10038 // 查看对象列表失败
ErrorMinioCheckObjectExistFailed = 10039 // 查看对象失败
ErrorMinioCheckObjectNotExisted = 10040 // 对象不存在
ErrorMinioCreateAccountFailed = 10041 // 创建用户失败
ErrorMinioOperationFailed = 10042 // 操作失败

// db操作相关错误
ErrorDBInitFailed = 10050 // db初始化失败
ErrorDBFindFailed = 10051 // db列表查询失败
@@ -160,15 +163,17 @@ const (
ErrorTokenRenew = 16010 // 认证失败,token被重置

// 用户管理
ErrorUserAccountNotExisted = 16020 // 用户不存在
ErrorUserAccountExisted = 16021 // 用户已存在
ErrorUserIdNotRight = 16022 // 用户id错误
ErrorWorkSpaceExisted = 16023 // 空间已存在
ErrorWorkSpaceNotExist = 16024 // 空间不存在
ErrorUserWorkSpaceNoPermission = 16025 // 用户无空间权限
ErrorWorkSpaceResourcePoolBound = 16026 // 空间与资源池已绑定
ErrorUserConfigKeyNotExist = 16027 // 配置项不存在
ErrorUserAccountBinded = 16028 // 账号已绑定
ErrorUserAccountNotExisted = 16020 // 用户不存在
ErrorUserAccountExisted = 16021 // 用户已存在
ErrorUserIdNotRight = 16022 // 用户id错误
ErrorWorkSpaceExisted = 16023 // 空间已存在
ErrorWorkSpaceNotExist = 16024 // 空间不存在
ErrorUserWorkSpaceNoPermission = 16025 // 用户无空间权限
ErrorWorkSpaceResourcePoolBound = 16026 // 空间与资源池已绑定
ErrorUserConfigKeyNotExist = 16027 // 配置项不存在
ErrorUserAccountBinded = 16028 // 账号已绑定
ErrorUserChangeMinioUsernameForbidden = 16029 // 不能修改minio用户名
ErrorUserMinioUsernameNotExist = 16030 // minio用户不存在

/* 17001~18000 计费管理错误*/
ErrorBillingObtainLockFailed = 17001 // 获取锁失败
@@ -262,6 +267,9 @@ var codeMsgMap = map[int]codeMsg{
ErrorMinioListObjectFailed: {codeType: Internal, msg: "minio list object failed"},
ErrorMinioCheckObjectExistFailed: {codeType: Internal, msg: "minio check object failed"},
ErrorMinioCheckObjectNotExisted: {codeType: NotFound, msg: "minio object not exist"},
ErrorMinioCreateAccountFailed: {codeType: Internal, msg: "minio create account failed"},
ErrorMinioOperationFailed: {codeType: Internal, msg: "minio operation failed"},

// db 操作相关错误
ErrorDBInitFailed: {codeType: Internal, msg: "db init failed"},
ErrorDBFindFailed: {codeType: Internal, msg: "db find failed"},
@@ -377,15 +385,17 @@ var codeMsgMap = map[int]codeMsg{
ErrorAuthenticationFailed: {codeType: Unauthorized, msg: "user account authentication failed"},
ErrorTokenRenew: {codeType: InvalidArgument, msg: "token renew"},
// 用户管理
ErrorUserAccountNotExisted: {codeType: NotFound, msg: "user account not exists"},
ErrorUserAccountExisted: {codeType: AlreadyExists, msg: "user account exists"},
ErrorUserAccountBinded: {codeType: AlreadyExists, msg: "user account exists"},
ErrorUserIdNotRight: {codeType: InvalidArgument, msg: "userid not valid"},
ErrorWorkSpaceExisted: {codeType: AlreadyExists, msg: "workspace existed"},
ErrorWorkSpaceNotExist: {codeType: NotFound, msg: "workspace not existed"},
ErrorUserWorkSpaceNoPermission: {codeType: PermissionDenied, msg: "user workspace permission deny"},
ErrorWorkSpaceResourcePoolBound: {codeType: ResourceExhausted, msg: "workspace and resource pool had bind"},
ErrorUserConfigKeyNotExist: {codeType: InvalidArgument, msg: "user config key not exist"},
ErrorUserAccountNotExisted: {codeType: NotFound, msg: "user account not exists"},
ErrorUserAccountExisted: {codeType: AlreadyExists, msg: "user account exists"},
ErrorUserAccountBinded: {codeType: AlreadyExists, msg: "user account exists"},
ErrorUserIdNotRight: {codeType: InvalidArgument, msg: "userid not valid"},
ErrorWorkSpaceExisted: {codeType: AlreadyExists, msg: "workspace existed"},
ErrorWorkSpaceNotExist: {codeType: NotFound, msg: "workspace not existed"},
ErrorUserWorkSpaceNoPermission: {codeType: PermissionDenied, msg: "user workspace permission deny"},
ErrorWorkSpaceResourcePoolBound: {codeType: ResourceExhausted, msg: "workspace and resource pool had bind"},
ErrorUserConfigKeyNotExist: {codeType: InvalidArgument, msg: "user config key not exist"},
ErrorUserChangeMinioUsernameForbidden: {codeType: InvalidArgument, msg: "change minio username forbidden"},
ErrorUserMinioUsernameNotExist: {codeType: InvalidArgument, msg: "minio username not exist"},

/* 17001~18000 机时管理错误*/
ErrorBillingObtainLockFailed: {codeType: Internal, msg: "billing obtain lock failed"},


+ 13
- 3
server/common/sql/sql.go View File

@@ -6,13 +6,13 @@ import (
"fmt"
)

type SqlJson map[string]string
type Map map[string]string

func (r SqlJson) Value() (driver.Value, error) {
func (r Map) Value() (driver.Value, error) {
return json.Marshal(r)
}

func (r *SqlJson) Scan(input interface{}) error {
func (r *Map) Scan(input interface{}) error {
switch v := input.(type) {
case []byte:
return json.Unmarshal(input.([]byte), r)
@@ -21,6 +21,16 @@ func (r *SqlJson) Scan(input interface{}) error {
}
}

type Strings []string

func (r Strings) Value() (driver.Value, error) {
return Value(r)
}

func (r *Strings) Scan(input interface{}) error {
return Scan(r, input)
}

func Value(r interface{}) (driver.Value, error) {
return json.Marshal(r)
}


+ 76
- 61
server/go.mod View File

@@ -18,14 +18,15 @@ require (
github.com/imdario/mergo v0.3.12
github.com/influxdata/influxdb v1.9.4
github.com/jinzhu/copier v0.2.5
github.com/minio/minio-go/v7 v7.0.11
github.com/minio/madmin-go v1.3.8
github.com/minio/minio-go/v7 v7.0.23
github.com/seldonio/seldon-core/operator v1.11.2
github.com/sony/sonyflake v1.0.0
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78
golang.org/x/text v0.3.6
gonum.org/v1/gonum v0.8.2
google.golang.org/genproto v0.0.0-20210416161957-9910b6c460de
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c
google.golang.org/grpc v1.40.0
google.golang.org/protobuf v1.27.1
gopkg.in/errgo.v2 v2.1.0
@@ -37,14 +38,17 @@ require (
k8s.io/api v0.22.1
k8s.io/apimachinery v0.22.1
k8s.io/client-go v12.0.0+incompatible
k8s.io/utils v0.0.0-20210802155522-efc7438f0176
nodeagent v0.0.0-00010101000000-000000000000
volcano.sh/apis v0.0.0-20210518032656-21e2239e42bc
)

require (
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
cloud.google.com/go v0.81.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
github.com/Microsoft/go-winio v0.5.1 // indirect
github.com/Microsoft/hcsshim v0.9.1 // indirect
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 // indirect
github.com/apache/arrow/go/arrow v0.0.0-20200923215132-ac86123a3f01 // indirect
github.com/benbjohnson/immutable v0.2.1 // indirect
@@ -60,6 +64,7 @@ require (
github.com/docker/go-units v0.4.0 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/go-logr/logr v0.4.0 // indirect
github.com/go-ole/go-ole v1.2.4 // indirect
github.com/go-sql-driver/mysql v1.5.0 // indirect
github.com/gofrs/uuid v3.3.0+incompatible // indirect
github.com/gogo/protobuf v1.3.2 // indirect
@@ -68,68 +73,78 @@ require (
github.com/google/go-cmp v0.5.6 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/googleapis/gnostic v0.5.5 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/influxdata/flux v0.127.3 // indirect
github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.2 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/kedacore/keda v0.0.0-20200911122749-717aab81817f // indirect
github.com/klauspost/compress v1.13.5 // indirect
github.com/klauspost/cpuid v1.3.1 // indirect
github.com/klauspost/cpuid/v2 v2.0.4 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/minio/argon2 v1.0.0 // indirect
github.com/minio/md5-simd v1.1.0 // indirect
github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/moby/sys/mount v0.3.0 // indirect
github.com/moby/sys/mountinfo v0.5.0 // indirect
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2 // indirect
github.com/opencontainers/runc v1.0.2 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/philhofer/fwd v1.1.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.11.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.26.0 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/rs/xid v1.2.1 // indirect
github.com/secure-io/sio-go v0.3.1 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/shirou/gopsutil/v3 v3.21.6 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/tinylib/msgp v1.1.3 // indirect
github.com/tklauser/go-sysconf v0.3.6 // indirect
github.com/tklauser/numcpus v0.2.2 // indirect
github.com/uber/jaeger-client-go v2.28.0+incompatible // indirect
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6 // indirect
go.opencensus.io v0.23.0 // indirect
go.opentelemetry.io/otel v0.20.0 // indirect
go.opentelemetry.io/otel/metric v0.20.0 // indirect
go.opentelemetry.io/otel/trace v0.20.0 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.19.0 // indirect
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827 // indirect
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
golang.org/x/tools v0.1.5 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
google.golang.org/api v0.44.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
gopkg.in/evanphx/json-patch.v4 v4.9.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/apiextensions-apiserver v0.22.1 // indirect
k8s.io/component-base v0.22.1 // indirect
k8s.io/utils v0.0.0-20210802155522-efc7438f0176 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/influxdata/flux v0.127.3 // indirect
github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.2 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/kedacore/keda v0.0.0-20200911122749-717aab81817f // indirect
github.com/klauspost/cpuid v1.3.1 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/minio/md5-simd v1.1.0 // indirect
github.com/minio/sha256-simd v0.1.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/moby/sys/mount v0.3.0 // indirect
github.com/moby/sys/mountinfo v0.5.0 // indirect
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2 // indirect
github.com/opencontainers/runc v1.0.2 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.26.0 // indirect
github.com/prometheus/procfs v0.6.0 // indirect
github.com/rs/xid v1.2.1 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/uber/jaeger-client-go v2.28.0+incompatible // indirect
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6 // indirect
go.opencensus.io v0.23.0 // indirect
go.opentelemetry.io/otel v0.20.0 // indirect
go.opentelemetry.io/otel/metric v0.20.0 // indirect
go.opentelemetry.io/otel/trace v0.20.0 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.19.0 // indirect
golang.org/x/net v0.0.0-20210825183410-e898025ed96a // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 // indirect
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/appengine v1.6.7 // indirect
gopkg.in/evanphx/json-patch.v4 v4.9.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.57.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/klog/v2 v2.4.0 // indirect
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 // indirect
knative.dev/pkg v0.0.0-20210426101439-2a0fc657a712 // indirect
sigs.k8s.io/controller-runtime v0.10.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.0.3 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
k8s.io/klog/v2 v2.4.0 // indirect
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 // indirect
knative.dev/pkg v0.0.0-20210426101439-2a0fc657a712 // indirect
sigs.k8s.io/controller-runtime v0.10.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.0.3 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
)

replace (


+ 112
- 32
server/go.sum View File

@@ -26,8 +26,12 @@ cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eA
cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0 h1:eWRCuwubtDrCJG0oSUMgnsbD4CmPFQF2ei4OFbXvwww=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8=
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
@@ -53,7 +57,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.9.0/go.mod h1:m+/etGaqZbylxaNT876QGXqEHp4PR2Rq5GMqICWb9bU=
cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY=
collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
@@ -162,7 +165,6 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/autorest/to v0.1.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc=
github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc=
@@ -247,6 +249,8 @@ github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sE
github.com/Shopify/sarama v1.27.0/go.mod h1:aCdj6ymI8uyPEux1JJ9gcaDT6cinjGhNCAhs54taSUo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
@@ -321,11 +325,9 @@ github.com/aws/aws-sdk-go v1.34.18/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZve
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/aws/aws-sdk-go-v2 v1.3.2 h1:RQj8l98yKUm0UV2Wd3w/Ms+TXV9Rs1E6Kr5tRRMfyU4=
github.com/aws/aws-sdk-go-v2 v1.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8=
github.com/aws/aws-sdk-go-v2/config v1.1.5 h1:imDWOGwlIrRpHLallJ9mli2SIQ4egtGKtFUFsuGRIaQ=
github.com/aws/aws-sdk-go-v2/config v1.1.5/go.mod h1:P3F1hku7qzC81txjwXnwOM6Ex6ezkU6+/557Teyb64E=
github.com/aws/aws-sdk-go-v2/credentials v1.1.5 h1:R9v/eN5cXv5yMLC619xRYl5PgCSuy5SarizmM7+qqSA=
github.com/aws/aws-sdk-go-v2/credentials v1.1.5/go.mod h1:Ir1R6tPiR1/2y1hes8yOijFMz54hzSmgcmCDo6F45Qc=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.6 h1:zoOz5V56jO/rGixsCDnrQtAzYRYM2hGA/43U6jVMFbo=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.6/go.mod h1:0+fWMitrmIpENiY8/1DyhdYPUCAPvd9UNz9mtCsEoLQ=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.1.2 h1:Doa5wabOIDA0XZzBX5yCTAPGwDCVZ8Ux0wh29AUDmN4=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.1.2/go.mod h1:Azf567f5wBUfUbwpyJJnLM/geFFIzEulGR30L+nQZOE=
@@ -337,9 +339,7 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.2.2 h1:aU8H58DoYxNo8R1
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.2.2/go.mod h1:nnutjMLuna0s3GVY/MAkpLX03thyNER06gXvnMAPj5g=
github.com/aws/aws-sdk-go-v2/service/s3 v1.5.0 h1:VbwXUI3L0hyhVmrFxbDxrs6cBX8TNFX0YxCpooMNjvY=
github.com/aws/aws-sdk-go-v2/service/s3 v1.5.0/go.mod h1:uwA7gs93Qcss43astPUb1eq4RyceNmYWAQjZFDOAMLo=
github.com/aws/aws-sdk-go-v2/service/sso v1.1.5 h1:B7ec5wE4+3Ldkurmq0C4gfQFtElGTG+/iTpi/YPMzi4=
github.com/aws/aws-sdk-go-v2/service/sso v1.1.5/go.mod h1:bpGz0tidC4y39sZkQSkpO/J0tzWCMXHbw6FZ0j1GkWM=
github.com/aws/aws-sdk-go-v2/service/sts v1.2.2 h1:fKw6QSGcFlvZCBPYx3fo4sL0HfTmaT06ZtMHJfQQNQQ=
github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7ypfil/BIlgmQnCSW4DistU=
github.com/aws/smithy-go v1.3.1 h1:xJFO4pK0y9J8fCl34uGsSJX5KNnGbdARDlA5BPhXnwE=
github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
@@ -359,6 +359,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI=
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
@@ -427,6 +428,7 @@ github.com/cloudevents/sdk-go v0.0.0-20190509003705-56931988abe3/go.mod h1:j1nZW
github.com/cloudevents/sdk-go v1.0.0/go.mod h1:3TkmM0cFqkhCHOq5JzzRU/RxRkwzoS8TZ+G448qVTog=
github.com/cloudevents/sdk-go/v2 v2.0.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoaAhqaRVnOr2rCU=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
@@ -637,6 +639,7 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
@@ -665,7 +668,6 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
github.com/frankban/quicktest v1.8.1/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY=
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
@@ -715,6 +717,8 @@ github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aA
github.com/go-logr/zapr v0.2.0 h1:v6Ji8yBW77pva6NkJKQdHLAJKrIJKRHz0RXwPqCHSR4=
github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
@@ -879,6 +883,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -896,10 +901,10 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
@@ -936,7 +941,6 @@ github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP
github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs=
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/flatbuffers v2.0.0+incompatible h1:dicJ2oXwypfwUGnB2/TYWYEKiuk9eYQlQO/AnOHl5mI=
@@ -980,10 +984,8 @@ github.com/google/licenseclassifier v0.0.0-20200402202327-879cb1424de0/go.mod h1
github.com/google/licenseclassifier v0.0.0-20200708223521-3d09a0ea2f39/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M=
github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE=
github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@@ -996,6 +998,9 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg=
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
@@ -1025,8 +1030,9 @@ github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97Dwqy
github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20220104163920-15ed2e8cf2bd h1:D/H64OK+VY7O0guGbCQaFKwAZlU5t764R++kgIdAGog=
github.com/gopherjs/gopherjs v0.0.0-20220104163920-15ed2e8cf2bd/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI=
github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904=
github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w=
github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40=
@@ -1197,7 +1203,6 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
@@ -1246,6 +1251,8 @@ github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.13.5 h1:9O69jUPDcsT9fEm74W92rZL9FQY7rCdaXVneq+yyzl4=
github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
@@ -1253,6 +1260,8 @@ github.com/klauspost/cpuid v1.2.2/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgo
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s=
github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
@@ -1261,10 +1270,10 @@ github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f26
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -1292,6 +1301,7 @@ github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQ
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -1363,12 +1373,17 @@ github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg=
github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE=
github.com/minio/argon2 v1.0.0 h1:cLB/fl0EeBqiDYhsIzIPTdLZhCykRrvdx3Eu3E5oqsE=
github.com/minio/argon2 v1.0.0/go.mod h1:XtOGJ7MjwUJDPtCqqrisx5QwVB/jDx+adQHigJVsQHQ=
github.com/minio/madmin-go v1.3.8 h1:sL0vTRKoGi0bjAKa2f4+RsM4eFdH+uKQCe7k4E2tyjk=
github.com/minio/madmin-go v1.3.8/go.mod h1:vGKGboQgGIWx4DuDUaXixjlIEZOCIp6ivJkQoiVaACc=
github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4=
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
github.com/minio/minio-go/v7 v7.0.11 h1:7utSkCtMQPYYB1UB8FR3d0QSiOWE6F/JYXon29imYek=
github.com/minio/minio-go/v7 v7.0.11/go.mod h1:WoyW+ySKAKjY98B9+7ZbI8z8S3jaxaisdcvj9TGlazA=
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
github.com/minio/minio-go/v7 v7.0.23 h1:NleyGQvAn9VQMU+YHVrgV4CX+EPtxPt/78lHOOTncy4=
github.com/minio/minio-go/v7 v7.0.23/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2DAn1ou4+Do=
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
@@ -1388,6 +1403,7 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
@@ -1437,6 +1453,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
@@ -1538,17 +1556,19 @@ github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUr
github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys=
github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs=
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw=
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI=
github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
@@ -1558,6 +1578,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5 h1:tFwafIEMf0B7NlcxV/zJ6leBIa81D3hgGSgsE5hCkOQ=
github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -1630,8 +1651,9 @@ github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+G
github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY=
github.com/prometheus/statsd_exporter v0.15.0/go.mod h1:Dv8HnkoLQkeEjkIE4/2ndAA7WL1zHKK7WMqFQqu72rw=
github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ=
@@ -1672,6 +1694,8 @@ github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrY
github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
github.com/secure-io/sio-go v0.3.1 h1:dNvY9awjabXTYGsTF1PiCySl9Ltofk9GA3VdWlo7rRc=
github.com/secure-io/sio-go v0.3.1/go.mod h1:+xbkjDzPjwh4Axd07pRKSNriS9SCiYksWnZqdnfpQxs=
github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE=
github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A=
github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME=
@@ -1683,18 +1707,23 @@ github.com/seldonio/seldon-core/operator v1.11.2/go.mod h1:t55mI0E9CucN2qW3NBTsL
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada h1:WokF3GuxBeL+n4Lk4Fa8v9mbdjlrl7bHuneF4N1bk2I=
github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
github.com/shirou/gopsutil/v3 v3.21.6 h1:vU7jrp1Ic/2sHB7w6UNs7MIkn7ebVtTb5D9j45o9VYE=
github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+LwHTKj0ST88=
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
github.com/shurcooL/githubv4 v0.0.0-20180925043049-51d7b505e2e9/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo=
github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo=
github.com/shurcooL/githubv4 v0.0.0-20191102174205-af46314aec7b/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo=
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
github.com/shurcooL/graphql v0.0.0-20180924043259-e4a3a37e6d42/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg=
github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg=
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
@@ -1708,8 +1737,9 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
github.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck=
github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
@@ -1728,6 +1758,7 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
@@ -1735,6 +1766,7 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
@@ -1748,6 +1780,7 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8=
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
@@ -1797,10 +1830,16 @@ github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiff
github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tinylib/msgp v1.1.3 h1:3giwAkmtaEDLSV0MdO1lDLuPgklgPzmk8H9+So2BVfA=
github.com/tinylib/msgp v1.1.3/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0=
github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0=
github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao=
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
github.com/tklauser/go-sysconf v0.3.6 h1:oc1sJWvKkmvIxhDHeKWvZS4f6AW+YcoguSfRF2/Hmo4=
github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA=
github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
@@ -1886,6 +1925,9 @@ go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
go.etcd.io/etcd v0.0.0-20181031231232-83304cfc808c/go.mod h1:weASp41xM3dk0YHg1s/W8ecdGP5G4teSTMBPpYAaUgA=
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
@@ -1948,6 +1990,7 @@ go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE=
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI=
@@ -1974,6 +2017,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
@@ -1989,14 +2033,15 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc h1:+q90ECDSAQirdykUN6sPEiBXBsp8Csjcca8Oy7bgLTA=
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -2028,8 +2073,9 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20190806162312-597adff16ade/go.mod h1:AlhUtkH4DA4asiFC5RgK7ZKmauvtkAVcy9L0epCzlWo=
@@ -2040,6 +2086,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -2100,6 +2148,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
@@ -2107,8 +2156,9 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210825183410-e898025ed96a h1:bRuuGXV8wwSdGTB+CtJf+FjgO1APK1CoO39T4BN/XBw=
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -2120,6 +2170,11 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78 h1:rPRtHfUb0UKZeZ6GH4K4Nt4YRbE9V1u+QZX5upZXqJQ=
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -2242,24 +2297,32 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210216224549-f992740a1bac/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc=
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827 h1:A0Qkn7Z/n8zC1xd9LTw17AiKlBRK64tw3ejWQiEqca0=
golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201113234701-d7a72108b828/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
@@ -2401,11 +2464,15 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u
golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -2421,7 +2488,6 @@ gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM=
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
@@ -2452,8 +2518,12 @@ google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
google.golang.org/api v0.36.0 h1:l2Nfbl2GPXdWorv+dT2XfinX2jOOw4zv1VhLstx+6rE=
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA=
google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -2527,9 +2597,17 @@ google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210114201628-6edceaf6022f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210416161957-9910b6c460de h1:+nG/xknR+Gc5ByHOtK1dT0Pl3LYo8NLR+Jz3XeBeGEg=
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
google.golang.org/genproto v0.0.0-20210416161957-9910b6c460de/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
@@ -2557,10 +2635,12 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
@@ -2603,8 +2683,9 @@ gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww=
gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
@@ -2763,7 +2844,6 @@ pack.ag/amqp v0.8.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
pack.ag/amqp v0.11.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=
pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=


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

@@ -83,6 +83,8 @@ message CreateNotebookRequest {
repeated common.api.v1.Mount mounts = 11;
//镜像地址,非必填,镜像地址和镜像ID填一个
string imageUrl = 12;
map<string, string> envs = 13;
string command = 14;
}

message CreateNotebookReply {


+ 44
- 39
server/openai-server/api/v1/trainJob.proto View File

@@ -43,44 +43,46 @@ service TrainJobService {
get: "/v1/trainmanage/trainjob"
};
};
// 创建训练任务模板
rpc CreateJobTemplate (TrainJobTemplateRequest) returns (TrainJobTemplateReply) {
option (google.api.http) = {
post: "/v1/trainmanage/trainjobtemplate"
body: "*"
};
};
// 编辑训练任务模板
rpc UpdateJobTemplate (TrainJobTemplate) returns (TrainJobTemplateReply) {
option (google.api.http) = {
put: "/v1/trainmanage/trainjobtemplate/{id}"
body: "*"
};
};
// 删除训练任务模板
rpc DeleteTemplate (DeleteJobTemplateRequest) returns (DeleteJobTemplateReply) {
option (google.api.http) = {
delete: "/v1/trainmanage/trainjobtemplate"
};
};
// 获取训练任务模板详情
rpc GetJobTemplate (GetJobTemplateRequest) returns (GetJobTemplateReply) {
option (google.api.http) = {
get: "/v1/trainmanage/trainjobtemplate/{id}"
};
};
// 获取训练任务列表
rpc TrainJobTemplateList (TrainJobTemplateListRequest) returns (TrainJobTemplateListReply) {
option (google.api.http) = {
get: "/v1/trainmanage/trainjobtemplate"
};
};
// 复制训练任务模板
rpc CopyJobTemplate (CopyJobTemplateRequest) returns (CopyJobTemplateReply) {
option (google.api.http) = {
post: "/v1/trainmanage/trainjobtemplate/{id}/copy"
};
};

// // 创建训练任务模板
// rpc CreateJobTemplate (TrainJobTemplateRequest) returns (TrainJobTemplateReply) {
// option (google.api.http) = {
// post: "/v1/trainmanage/trainjobtemplate"
// body: "*"
// };
// };
// // 编辑训练任务模板
// rpc UpdateJobTemplate (TrainJobTemplate) returns (TrainJobTemplateReply) {
// option (google.api.http) = {
// put: "/v1/trainmanage/trainjobtemplate/{id}"
// body: "*"
// };
// };
// // 删除训练任务模板
// rpc DeleteTemplate (DeleteJobTemplateRequest) returns (DeleteJobTemplateReply) {
// option (google.api.http) = {
// delete: "/v1/trainmanage/trainjobtemplate"
// };
// };
// // 获取训练任务模板详情
// rpc GetJobTemplate (GetJobTemplateRequest) returns (GetJobTemplateReply) {
// option (google.api.http) = {
// get: "/v1/trainmanage/trainjobtemplate/{id}"
// };
// };
// // 获取训练任务列表
// rpc TrainJobTemplateList (TrainJobTemplateListRequest) returns (TrainJobTemplateListReply) {
// option (google.api.http) = {
// get: "/v1/trainmanage/trainjobtemplate"
// };
// };
// // 复制训练任务模板
// rpc CopyJobTemplate (CopyJobTemplateRequest) returns (CopyJobTemplateReply) {
// option (google.api.http) = {
// post: "/v1/trainmanage/trainjobtemplate/{id}/copy"
// };
// };

// 获取训练任务事件列表
rpc GetJobEventList (JobEventListRequest) returns (JobEventListReply) {
option (google.api.http) = {
@@ -139,6 +141,7 @@ message Config {
repeated ReplicaState replicaStates = 11;
//子任务状态
string subTaskState = 12;
map<string, string> envs = 13;
}

message ReplicaState {
@@ -178,7 +181,7 @@ message TrainJobTemplateRequest {
bool isDistributed = 9;
//job子任务及其配置信息,必填
repeated Config config = 10[(validate.rules).repeated.min_items = 1];
string resourcePool = 11[(validate.rules).string = {min_len: 1}];
string resourcePool = 11[(validate.rules).string = {min_len:1}];
}

message TrainJobTemplateReply {
@@ -334,6 +337,8 @@ message TrainJob{
//启动时间
int64 startedAt = 22;
string imageUrl = 23;
//资源池
string resourcePool=24;
}

message TrainJobTemplate{


+ 0
- 1
server/platform-server/api/v1/swagger.json
File diff suppressed because it is too large
View File


+ 0
- 1951
server/platform-server/api/v1/trainJob.pb.go View File

@@ -1,1951 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
// protoc v3.15.8
// source: server/platform-server/api/v1/trainJob.proto

package v1

import (
_ "github.com/envoyproxy/protoc-gen-validate/validate"
_ "google.golang.org/genproto/googleapis/api/annotations"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
emptypb "google.golang.org/protobuf/types/known/emptypb"
reflect "reflect"
sync "sync"
)

const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type TrainJobRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//训练任务名称,必填,长度1-30
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"`
//训练任务描述,非必填
Desc string `protobuf:"bytes,2,opt,name=desc,proto3" json:"desc"`
//镜像信息
Image *Image `protobuf:"bytes,3,opt,name=image,proto3" json:"image"`
//输出路径信息
Output *Output `protobuf:"bytes,4,opt,name=output,proto3" json:"output"`
//数据集信息
Datasets []*Dataset `protobuf:"bytes,5,rep,name=datasets,proto3" json:"datasets"`
//子任务信息
Tasks []*Task `protobuf:"bytes,6,rep,name=tasks,proto3" json:"tasks"`
}

func (x *TrainJobRequest) Reset() {
*x = TrainJobRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobRequest) ProtoMessage() {}

func (x *TrainJobRequest) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobRequest.ProtoReflect.Descriptor instead.
func (*TrainJobRequest) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{0}
}

func (x *TrainJobRequest) GetName() string {
if x != nil {
return x.Name
}
return ""
}

func (x *TrainJobRequest) GetDesc() string {
if x != nil {
return x.Desc
}
return ""
}

func (x *TrainJobRequest) GetImage() *Image {
if x != nil {
return x.Image
}
return nil
}

func (x *TrainJobRequest) GetOutput() *Output {
if x != nil {
return x.Output
}
return nil
}

func (x *TrainJobRequest) GetDatasets() []*Dataset {
if x != nil {
return x.Datasets
}
return nil
}

func (x *TrainJobRequest) GetTasks() []*Task {
if x != nil {
return x.Tasks
}
return nil
}

type Image struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"`
Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version"`
}

func (x *Image) Reset() {
*x = Image{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Image) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Image) ProtoMessage() {}

func (x *Image) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Image.ProtoReflect.Descriptor instead.
func (*Image) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{1}
}

func (x *Image) GetName() string {
if x != nil {
return x.Name
}
return ""
}

func (x *Image) GetVersion() string {
if x != nil {
return x.Version
}
return ""
}

type Dataset struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//存储配置名称,必填
StorageConfigName string `protobuf:"bytes,1,opt,name=storageConfigName,proto3" json:"storageConfigName"`
//数据集子目录
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr"`
//数据集名称,必填
Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name"`
//数据集容器内路径
Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path"`
}

func (x *Dataset) Reset() {
*x = Dataset{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Dataset) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Dataset) ProtoMessage() {}

func (x *Dataset) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Dataset.ProtoReflect.Descriptor instead.
func (*Dataset) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{2}
}

func (x *Dataset) GetStorageConfigName() string {
if x != nil {
return x.StorageConfigName
}
return ""
}

func (x *Dataset) GetAddr() string {
if x != nil {
return x.Addr
}
return ""
}

func (x *Dataset) GetName() string {
if x != nil {
return x.Name
}
return ""
}

func (x *Dataset) GetPath() string {
if x != nil {
return x.Path
}
return ""
}

type Output struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//存储配置名称,必填
StorageConfigName string `protobuf:"bytes,1,opt,name=storageConfigName,proto3" json:"storageConfigName"`
//存储子目录
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr"`
//容器内输出路径
Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path"`
}

func (x *Output) Reset() {
*x = Output{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Output) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Output) ProtoMessage() {}

func (x *Output) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Output.ProtoReflect.Descriptor instead.
func (*Output) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{3}
}

func (x *Output) GetStorageConfigName() string {
if x != nil {
return x.StorageConfigName
}
return ""
}

func (x *Output) GetAddr() string {
if x != nil {
return x.Addr
}
return ""
}

func (x *Output) GetPath() string {
if x != nil {
return x.Path
}
return ""
}

type Task struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//子任务名称,非必填,校验规则"^[0-9a-zA-Z_]*$",最大长度30个字符
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"`
//子任务执行命令
Command string `protobuf:"bytes,2,opt,name=command,proto3" json:"command"`
//command执行命令参数,key-value,数组
Parameters []*Parameter `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters"`
//资源
Resources []*Resource `protobuf:"bytes,4,rep,name=resources,proto3" json:"resources"`
//副本个数,非必填
TaskNumber int64 `protobuf:"varint,5,opt,name=taskNumber,proto3" json:"taskNumber"`
//子任务最小失败数,非必填
MinFailedTaskCount int64 `protobuf:"varint,6,opt,name=minFailedTaskCount,proto3" json:"minFailedTaskCount"`
//子任务最小成功数,非必填
MinSucceededTaskCount int64 `protobuf:"varint,7,opt,name=minSucceededTaskCount,proto3" json:"minSucceededTaskCount"`
//是否主任务,非必填
IsMainRole bool `protobuf:"varint,8,opt,name=isMainRole,proto3" json:"isMainRole"`
}

func (x *Task) Reset() {
*x = Task{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Task) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Task) ProtoMessage() {}

func (x *Task) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Task.ProtoReflect.Descriptor instead.
func (*Task) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{4}
}

func (x *Task) GetName() string {
if x != nil {
return x.Name
}
return ""
}

func (x *Task) GetCommand() string {
if x != nil {
return x.Command
}
return ""
}

func (x *Task) GetParameters() []*Parameter {
if x != nil {
return x.Parameters
}
return nil
}

func (x *Task) GetResources() []*Resource {
if x != nil {
return x.Resources
}
return nil
}

func (x *Task) GetTaskNumber() int64 {
if x != nil {
return x.TaskNumber
}
return 0
}

func (x *Task) GetMinFailedTaskCount() int64 {
if x != nil {
return x.MinFailedTaskCount
}
return 0
}

func (x *Task) GetMinSucceededTaskCount() int64 {
if x != nil {
return x.MinSucceededTaskCount
}
return 0
}

func (x *Task) GetIsMainRole() bool {
if x != nil {
return x.IsMainRole
}
return false
}

type Parameter struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//命令参数key,非必填
Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key"`
//命令参数value,非必填
Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value"`
}

func (x *Parameter) Reset() {
*x = Parameter{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Parameter) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Parameter) ProtoMessage() {}

func (x *Parameter) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Parameter.ProtoReflect.Descriptor instead.
func (*Parameter) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{5}
}

func (x *Parameter) GetKey() string {
if x != nil {
return x.Key
}
return ""
}

func (x *Parameter) GetValue() string {
if x != nil {
return x.Value
}
return ""
}

type Resource struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//命令参数key,必填
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"`
//命令参数value,必填
Size string `protobuf:"bytes,2,opt,name=size,proto3" json:"size"`
}

func (x *Resource) Reset() {
*x = Resource{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Resource) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Resource) ProtoMessage() {}

func (x *Resource) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Resource.ProtoReflect.Descriptor instead.
func (*Resource) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{6}
}

func (x *Resource) GetName() string {
if x != nil {
return x.Name
}
return ""
}

func (x *Resource) GetSize() string {
if x != nil {
return x.Size
}
return ""
}

type TrainJobReply struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//训练任务ID,必填
JobId string `protobuf:"bytes,1,opt,name=jobId,proto3" json:"jobId"`
}

func (x *TrainJobReply) Reset() {
*x = TrainJobReply{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobReply) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobReply) ProtoMessage() {}

func (x *TrainJobReply) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobReply.ProtoReflect.Descriptor instead.
func (*TrainJobReply) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{7}
}

func (x *TrainJobReply) GetJobId() string {
if x != nil {
return x.JobId
}
return ""
}

type StopJobRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//任务ID
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
}

func (x *StopJobRequest) Reset() {
*x = StopJobRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *StopJobRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*StopJobRequest) ProtoMessage() {}

func (x *StopJobRequest) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use StopJobRequest.ProtoReflect.Descriptor instead.
func (*StopJobRequest) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{8}
}

func (x *StopJobRequest) GetId() string {
if x != nil {
return x.Id
}
return ""
}

type StopJobReply struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//停止时间
StoppedAt int64 `protobuf:"varint,1,opt,name=stoppedAt,proto3" json:"stoppedAt"`
}

func (x *StopJobReply) Reset() {
*x = StopJobReply{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *StopJobReply) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*StopJobReply) ProtoMessage() {}

func (x *StopJobReply) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use StopJobReply.ProtoReflect.Descriptor instead.
func (*StopJobReply) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{9}
}

func (x *StopJobReply) GetStoppedAt() int64 {
if x != nil {
return x.StoppedAt
}
return 0
}

type TrainJobListRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

// 页码,从1开始,必填
PageIndex int64 `protobuf:"varint,1,opt,name=pageIndex,proto3" json:"pageIndex"`
// 页大小,最小1条,最大100条,必填
PageSize int64 `protobuf:"varint,2,opt,name=pageSize,proto3" json:"pageSize"`
// 分组依据,非必填
SortBy string `protobuf:"bytes,3,opt,name=sortBy,proto3" json:"sortBy"`
//升序、降序,非必填
OrderBy string `protobuf:"bytes,4,opt,name=orderBy,proto3" json:"orderBy"`
//大于某个时间创建,非必填
CreatedAtGte int64 `protobuf:"varint,5,opt,name=createdAtGte,proto3" json:"createdAtGte"`
//小于某个时间创建,非必填
CreatedAtLt int64 `protobuf:"varint,6,opt,name=createdAtLt,proto3" json:"createdAtLt"`
//状态查询,非必填
Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status"`
//模糊查找字段,可用于name等模糊查找,非必填
SearchKey string `protobuf:"bytes,8,opt,name=searchKey,proto3" json:"searchKey"`
}

func (x *TrainJobListRequest) Reset() {
*x = TrainJobListRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobListRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobListRequest) ProtoMessage() {}

func (x *TrainJobListRequest) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[10]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobListRequest.ProtoReflect.Descriptor instead.
func (*TrainJobListRequest) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{10}
}

func (x *TrainJobListRequest) GetPageIndex() int64 {
if x != nil {
return x.PageIndex
}
return 0
}

func (x *TrainJobListRequest) GetPageSize() int64 {
if x != nil {
return x.PageSize
}
return 0
}

func (x *TrainJobListRequest) GetSortBy() string {
if x != nil {
return x.SortBy
}
return ""
}

func (x *TrainJobListRequest) GetOrderBy() string {
if x != nil {
return x.OrderBy
}
return ""
}

func (x *TrainJobListRequest) GetCreatedAtGte() int64 {
if x != nil {
return x.CreatedAtGte
}
return 0
}

func (x *TrainJobListRequest) GetCreatedAtLt() int64 {
if x != nil {
return x.CreatedAtLt
}
return 0
}

func (x *TrainJobListRequest) GetStatus() string {
if x != nil {
return x.Status
}
return ""
}

func (x *TrainJobListRequest) GetSearchKey() string {
if x != nil {
return x.SearchKey
}
return ""
}

type TrainJobListReply struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//查询结果总数
TotalSize int64 `protobuf:"varint,1,opt,name=totalSize,proto3" json:"totalSize"`
//任务
TrainJobs []*TrainJob `protobuf:"bytes,2,rep,name=trainJobs,proto3" json:"trainJobs"`
}

func (x *TrainJobListReply) Reset() {
*x = TrainJobListReply{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobListReply) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobListReply) ProtoMessage() {}

func (x *TrainJobListReply) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[11]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobListReply.ProtoReflect.Descriptor instead.
func (*TrainJobListReply) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{11}
}

func (x *TrainJobListReply) GetTotalSize() int64 {
if x != nil {
return x.TotalSize
}
return 0
}

func (x *TrainJobListReply) GetTrainJobs() []*TrainJob {
if x != nil {
return x.TrainJobs
}
return nil
}

type TrainJob struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//任务ID
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
//job名称
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
//job描述
Desc string `protobuf:"bytes,3,opt,name=desc,proto3" json:"desc"`
//数据集
Datasets []*Dataset `protobuf:"bytes,4,rep,name=datasets,proto3" json:"datasets"`
//镜像
Image *Image `protobuf:"bytes,5,opt,name=image,proto3" json:"image"`
//子任务配置信息
Tasks []*Task `protobuf:"bytes,6,rep,name=tasks,proto3" json:"tasks"`
//创建时间
CreatedAt int64 `protobuf:"varint,7,opt,name=createdAt,proto3" json:"createdAt"`
//更新时间
UpdatedAt int64 `protobuf:"varint,8,opt,name=updatedAt,proto3" json:"updatedAt"`
//任务状态
Status string `protobuf:"bytes,9,opt,name=status,proto3" json:"status"`
//job完成时间
CompletedAt int64 `protobuf:"varint,10,opt,name=completedAt,proto3" json:"completedAt"`
//运行时
RunSec int64 `protobuf:"varint,11,opt,name=runSec,proto3" json:"runSec"`
//启动时间
StartedAt int64 `protobuf:"varint,12,opt,name=startedAt,proto3" json:"startedAt"`
}

func (x *TrainJob) Reset() {
*x = TrainJob{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJob) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJob) ProtoMessage() {}

func (x *TrainJob) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[12]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJob.ProtoReflect.Descriptor instead.
func (*TrainJob) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{12}
}

func (x *TrainJob) GetId() string {
if x != nil {
return x.Id
}
return ""
}

func (x *TrainJob) GetName() string {
if x != nil {
return x.Name
}
return ""
}

func (x *TrainJob) GetDesc() string {
if x != nil {
return x.Desc
}
return ""
}

func (x *TrainJob) GetDatasets() []*Dataset {
if x != nil {
return x.Datasets
}
return nil
}

func (x *TrainJob) GetImage() *Image {
if x != nil {
return x.Image
}
return nil
}

func (x *TrainJob) GetTasks() []*Task {
if x != nil {
return x.Tasks
}
return nil
}

func (x *TrainJob) GetCreatedAt() int64 {
if x != nil {
return x.CreatedAt
}
return 0
}

func (x *TrainJob) GetUpdatedAt() int64 {
if x != nil {
return x.UpdatedAt
}
return 0
}

func (x *TrainJob) GetStatus() string {
if x != nil {
return x.Status
}
return ""
}

func (x *TrainJob) GetCompletedAt() int64 {
if x != nil {
return x.CompletedAt
}
return 0
}

func (x *TrainJob) GetRunSec() int64 {
if x != nil {
return x.RunSec
}
return 0
}

func (x *TrainJob) GetStartedAt() int64 {
if x != nil {
return x.StartedAt
}
return 0
}

type TrainJobInfoRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//任务ID
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
}

func (x *TrainJobInfoRequest) Reset() {
*x = TrainJobInfoRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobInfoRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobInfoRequest) ProtoMessage() {}

func (x *TrainJobInfoRequest) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[13]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobInfoRequest.ProtoReflect.Descriptor instead.
func (*TrainJobInfoRequest) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{13}
}

func (x *TrainJobInfoRequest) GetId() string {
if x != nil {
return x.Id
}
return ""
}

type TrainJobInfoReply struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//训练任务
TrainJob *TrainJob `protobuf:"bytes,1,opt,name=trainJob,proto3" json:"trainJob"`
}

func (x *TrainJobInfoReply) Reset() {
*x = TrainJobInfoReply{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobInfoReply) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobInfoReply) ProtoMessage() {}

func (x *TrainJobInfoReply) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[14]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobInfoReply.ProtoReflect.Descriptor instead.
func (*TrainJobInfoReply) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{14}
}

func (x *TrainJobInfoReply) GetTrainJob() *TrainJob {
if x != nil {
return x.TrainJob
}
return nil
}

type TrainJobStasticsRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//大于某个时间创建,非必填
CreatedAtGte int64 `protobuf:"varint,1,opt,name=createdAtGte,proto3" json:"createdAtGte"`
//小于某个时间创建,非必填
CreatedAtLt int64 `protobuf:"varint,2,opt,name=createdAtLt,proto3" json:"createdAtLt"`
}

func (x *TrainJobStasticsRequest) Reset() {
*x = TrainJobStasticsRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobStasticsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobStasticsRequest) ProtoMessage() {}

func (x *TrainJobStasticsRequest) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[15]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobStasticsRequest.ProtoReflect.Descriptor instead.
func (*TrainJobStasticsRequest) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{15}
}

func (x *TrainJobStasticsRequest) GetCreatedAtGte() int64 {
if x != nil {
return x.CreatedAtGte
}
return 0
}

func (x *TrainJobStasticsRequest) GetCreatedAtLt() int64 {
if x != nil {
return x.CreatedAtLt
}
return 0
}

type TrainJobStasticsReply struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

//任务数量
TotalSize int64 `protobuf:"varint,1,opt,name=totalSize,proto3" json:"totalSize"`
//成功数量
SucceededSize int64 `protobuf:"varint,2,opt,name=succeededSize,proto3" json:"succeededSize"`
//失败数量
FailedSize int64 `protobuf:"varint,3,opt,name=failedSize,proto3" json:"failedSize"`
//停止数量
StoppedSize int64 `protobuf:"varint,4,opt,name=stoppedSize,proto3" json:"stoppedSize"`
//正在运行数量
RunningSize int64 `protobuf:"varint,5,opt,name=runningSize,proto3" json:"runningSize"`
//等待数量
WaitingSize int64 `protobuf:"varint,6,opt,name=waitingSize,proto3" json:"waitingSize"`
}

func (x *TrainJobStasticsReply) Reset() {
*x = TrainJobStasticsReply{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *TrainJobStasticsReply) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*TrainJobStasticsReply) ProtoMessage() {}

func (x *TrainJobStasticsReply) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[16]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use TrainJobStasticsReply.ProtoReflect.Descriptor instead.
func (*TrainJobStasticsReply) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{16}
}

func (x *TrainJobStasticsReply) GetTotalSize() int64 {
if x != nil {
return x.TotalSize
}
return 0
}

func (x *TrainJobStasticsReply) GetSucceededSize() int64 {
if x != nil {
return x.SucceededSize
}
return 0
}

func (x *TrainJobStasticsReply) GetFailedSize() int64 {
if x != nil {
return x.FailedSize
}
return 0
}

func (x *TrainJobStasticsReply) GetStoppedSize() int64 {
if x != nil {
return x.StoppedSize
}
return 0
}

func (x *TrainJobStasticsReply) GetRunningSize() int64 {
if x != nil {
return x.RunningSize
}
return 0
}

func (x *TrainJobStasticsReply) GetWaitingSize() int64 {
if x != nil {
return x.WaitingSize
}
return 0
}

type Node struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

NodeName string `protobuf:"bytes,1,opt,name=nodeName,proto3" json:"nodeName"`
Ip string `protobuf:"bytes,2,opt,name=ip,proto3" json:"ip"`
Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status"`
Capacity map[string]string `protobuf:"bytes,4,rep,name=capacity,proto3" json:"capacity" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Allocated map[string]string `protobuf:"bytes,5,rep,name=allocated,proto3" json:"allocated" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

func (x *Node) Reset() {
*x = Node{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Node) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Node) ProtoMessage() {}

func (x *Node) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[17]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Node.ProtoReflect.Descriptor instead.
func (*Node) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{17}
}

func (x *Node) GetNodeName() string {
if x != nil {
return x.NodeName
}
return ""
}

func (x *Node) GetIp() string {
if x != nil {
return x.Ip
}
return ""
}

func (x *Node) GetStatus() string {
if x != nil {
return x.Status
}
return ""
}

func (x *Node) GetCapacity() map[string]string {
if x != nil {
return x.Capacity
}
return nil
}

func (x *Node) GetAllocated() map[string]string {
if x != nil {
return x.Allocated
}
return nil
}

type PlatformResourcesReply struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Resources []*Node `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources"`
}

func (x *PlatformResourcesReply) Reset() {
*x = PlatformResourcesReply{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *PlatformResourcesReply) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*PlatformResourcesReply) ProtoMessage() {}

func (x *PlatformResourcesReply) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_api_v1_trainJob_proto_msgTypes[18]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use PlatformResourcesReply.ProtoReflect.Descriptor instead.
func (*PlatformResourcesReply) Descriptor() ([]byte, []int) {
return file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP(), []int{18}
}

func (x *PlatformResourcesReply) GetResources() []*Node {
if x != nil {
return x.Resources
}
return nil
}

var File_server_platform_server_api_v1_trainJob_proto protoreflect.FileDescriptor

var file_server_platform_server_api_v1_trainJob_proto_rawDesc = []byte{
0x0a, 0x2c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
0x6d, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f,
0x74, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15,
0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61,
0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d,
0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa8, 0x02, 0x0a, 0x0f, 0x54, 0x72,
0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06,
0x72, 0x04, 0x10, 0x01, 0x18, 0x1e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x04,
0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72,
0x03, 0x18, 0xac, 0x02, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x32, 0x0a, 0x05, 0x69, 0x6d,
0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x35,
0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d,
0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74,
0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e,
0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74,
0x73, 0x12, 0x31, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x1b, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74,
0x61, 0x73, 0x6b, 0x73, 0x22, 0x4c, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07,
0x72, 0x05, 0x10, 0x01, 0x18, 0xac, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a,
0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09,
0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x1e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
0x6f, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x07, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x12, 0x35,
0x0a, 0x11, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e,
0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02,
0x18, 0x1e, 0x52, 0x11, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69,
0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20,
0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xac, 0x02, 0x52, 0x04, 0x61,
0x64, 0x64, 0x72, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xac, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d,
0x65, 0x12, 0x1c, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42,
0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xac, 0x02, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22,
0x7b, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x35, 0x0a, 0x11, 0x73, 0x74, 0x6f,
0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x1e, 0x52, 0x11, 0x73,
0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65,
0x12, 0x1c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08,
0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xac, 0x02, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1c,
0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42,
0x05, 0x72, 0x03, 0x18, 0xac, 0x02, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x8d, 0x03, 0x0a,
0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x1e, 0x52, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18,
0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x00, 0x18, 0xac,
0x02, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61,
0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20,
0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x09,
0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x1f, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0a, 0x74,
0x61, 0x73, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42,
0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x75,
0x6d, 0x62, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65,
0x64, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03,
0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x46, 0x61,
0x69, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a,
0x15, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x54, 0x61, 0x73,
0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xfa, 0x42,
0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65,
0x64, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a,
0x69, 0x73, 0x4d, 0x61, 0x69, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08,
0x52, 0x0a, 0x69, 0x73, 0x4d, 0x61, 0x69, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x33, 0x0a, 0x09,
0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
0x65, 0x22, 0x32, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f,
0x62, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x0e,
0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17,
0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72,
0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2c, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x4a,
0x6f, 0x62, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70,
0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70,
0x70, 0x65, 0x64, 0x41, 0x74, 0x22, 0xa5, 0x02, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a,
0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a,
0x09, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
0x42, 0x07, 0xfa, 0x42, 0x04, 0x22, 0x02, 0x28, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x49,
0x6e, 0x64, 0x65, 0x78, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x22, 0x04, 0x10, 0x64, 0x28,
0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73,
0x6f, 0x72, 0x74, 0x42, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x72,
0x74, 0x42, 0x79, 0x12, 0x2c, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x04,
0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0xfa, 0x42, 0x0f, 0x72, 0x0d, 0x52, 0x00, 0x52, 0x03, 0x61,
0x73, 0x63, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42,
0x79, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x47, 0x74,
0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
0x41, 0x74, 0x47, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
0x41, 0x74, 0x4c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61,
0x74, 0x65, 0x64, 0x41, 0x74, 0x4c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
0x1c, 0x0a, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01,
0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x70, 0x0a,
0x11, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70,
0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18,
0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65,
0x12, 0x3d, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20,
0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65,
0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69,
0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x09, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x73, 0x22,
0x91, 0x03, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02,
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x64, 0x65, 0x73, 0x63, 0x12, 0x3a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x73,
0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44,
0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x73,
0x12, 0x32, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x1c, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69,
0x6d, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x06, 0x20,
0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65,
0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b,
0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
0x65, 0x64, 0x41, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
0x41, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20,
0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63,
0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03,
0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a,
0x06, 0x72, 0x75, 0x6e, 0x53, 0x65, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72,
0x75, 0x6e, 0x53, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64,
0x41, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65,
0x64, 0x41, 0x74, 0x22, 0x2e, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x49,
0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52,
0x02, 0x69, 0x64, 0x22, 0x50, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x49,
0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x69,
0x6e, 0x4a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6c, 0x61,
0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x08, 0x74, 0x72, 0x61,
0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f,
0x62, 0x53, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x12, 0x22, 0x0a, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x47, 0x74, 0x65,
0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
0x74, 0x47, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,
0x74, 0x4c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74,
0x65, 0x64, 0x41, 0x74, 0x4c, 0x74, 0x22, 0xe1, 0x01, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x69, 0x6e,
0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79,
0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24,
0x0a, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18,
0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64,
0x53, 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x69,
0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64,
0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x53,
0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x70,
0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e,
0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x75, 0x6e,
0x6e, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x77, 0x61, 0x69, 0x74,
0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x77,
0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd6, 0x02, 0x0a, 0x04, 0x4e,
0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12,
0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63,
0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45,
0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x48,
0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76,
0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41,
0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61,
0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61,
0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3c, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74,
0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x16, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52,
0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x39, 0x0a,
0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x1b, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x72,
0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x32, 0xb4, 0x06, 0x0a, 0x0f, 0x54, 0x72, 0x61,
0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7a, 0x0a, 0x08,
0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x26, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66,
0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x24, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f,
0x62, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15,
0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x74, 0x72, 0x61,
0x69, 0x6e, 0x6a, 0x6f, 0x62, 0x3a, 0x01, 0x2a, 0x12, 0x81, 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f,
0x70, 0x4a, 0x6f, 0x62, 0x12, 0x25, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73,
0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f,
0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x70, 0x6c, 0x79,
0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x6a, 0x6f, 0x62, 0x2f,
0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x3a, 0x01, 0x2a, 0x12, 0x86, 0x01, 0x0a,
0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2a, 0x2e, 0x70, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x49, 0x6e, 0x66, 0x6f,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e,
0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c,
0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x70,
0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x6a, 0x6f, 0x62,
0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x83, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a,
0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54,
0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72,
0x76, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e,
0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
0x72, 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x6a, 0x6f, 0x62, 0x12, 0x96, 0x01, 0x0a, 0x10,
0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x73,
0x12, 0x2e, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f,
0x62, 0x53, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x2c, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4a, 0x6f,
0x62, 0x53, 0x74, 0x61, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24,
0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x76, 0x65, 0x72,
0x61, 0x6c, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x73,
0x74, 0x69, 0x63, 0x73, 0x12, 0x79, 0x0a, 0x11, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x79, 0x1a, 0x2d, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76,
0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f,
0x72, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79,
0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42,
0x22, 0x5a, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
0x72, 0x6d, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31,
0x3b, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
file_server_platform_server_api_v1_trainJob_proto_rawDescOnce sync.Once
file_server_platform_server_api_v1_trainJob_proto_rawDescData = file_server_platform_server_api_v1_trainJob_proto_rawDesc
)

func file_server_platform_server_api_v1_trainJob_proto_rawDescGZIP() []byte {
file_server_platform_server_api_v1_trainJob_proto_rawDescOnce.Do(func() {
file_server_platform_server_api_v1_trainJob_proto_rawDescData = protoimpl.X.CompressGZIP(file_server_platform_server_api_v1_trainJob_proto_rawDescData)
})
return file_server_platform_server_api_v1_trainJob_proto_rawDescData
}

var file_server_platform_server_api_v1_trainJob_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
var file_server_platform_server_api_v1_trainJob_proto_goTypes = []interface{}{
(*TrainJobRequest)(nil), // 0: platformserver.api.v1.TrainJobRequest
(*Image)(nil), // 1: platformserver.api.v1.Image
(*Dataset)(nil), // 2: platformserver.api.v1.Dataset
(*Output)(nil), // 3: platformserver.api.v1.Output
(*Task)(nil), // 4: platformserver.api.v1.Task
(*Parameter)(nil), // 5: platformserver.api.v1.Parameter
(*Resource)(nil), // 6: platformserver.api.v1.Resource
(*TrainJobReply)(nil), // 7: platformserver.api.v1.TrainJobReply
(*StopJobRequest)(nil), // 8: platformserver.api.v1.StopJobRequest
(*StopJobReply)(nil), // 9: platformserver.api.v1.StopJobReply
(*TrainJobListRequest)(nil), // 10: platformserver.api.v1.TrainJobListRequest
(*TrainJobListReply)(nil), // 11: platformserver.api.v1.TrainJobListReply
(*TrainJob)(nil), // 12: platformserver.api.v1.TrainJob
(*TrainJobInfoRequest)(nil), // 13: platformserver.api.v1.TrainJobInfoRequest
(*TrainJobInfoReply)(nil), // 14: platformserver.api.v1.TrainJobInfoReply
(*TrainJobStasticsRequest)(nil), // 15: platformserver.api.v1.TrainJobStasticsRequest
(*TrainJobStasticsReply)(nil), // 16: platformserver.api.v1.TrainJobStasticsReply
(*Node)(nil), // 17: platformserver.api.v1.Node
(*PlatformResourcesReply)(nil), // 18: platformserver.api.v1.PlatformResourcesReply
nil, // 19: platformserver.api.v1.Node.CapacityEntry
nil, // 20: platformserver.api.v1.Node.AllocatedEntry
(*emptypb.Empty)(nil), // 21: google.protobuf.Empty
}
var file_server_platform_server_api_v1_trainJob_proto_depIdxs = []int32{
1, // 0: platformserver.api.v1.TrainJobRequest.image:type_name -> platformserver.api.v1.Image
3, // 1: platformserver.api.v1.TrainJobRequest.output:type_name -> platformserver.api.v1.Output
2, // 2: platformserver.api.v1.TrainJobRequest.datasets:type_name -> platformserver.api.v1.Dataset
4, // 3: platformserver.api.v1.TrainJobRequest.tasks:type_name -> platformserver.api.v1.Task
5, // 4: platformserver.api.v1.Task.parameters:type_name -> platformserver.api.v1.Parameter
6, // 5: platformserver.api.v1.Task.resources:type_name -> platformserver.api.v1.Resource
12, // 6: platformserver.api.v1.TrainJobListReply.trainJobs:type_name -> platformserver.api.v1.TrainJob
2, // 7: platformserver.api.v1.TrainJob.datasets:type_name -> platformserver.api.v1.Dataset
1, // 8: platformserver.api.v1.TrainJob.image:type_name -> platformserver.api.v1.Image
4, // 9: platformserver.api.v1.TrainJob.tasks:type_name -> platformserver.api.v1.Task
12, // 10: platformserver.api.v1.TrainJobInfoReply.trainJob:type_name -> platformserver.api.v1.TrainJob
19, // 11: platformserver.api.v1.Node.capacity:type_name -> platformserver.api.v1.Node.CapacityEntry
20, // 12: platformserver.api.v1.Node.allocated:type_name -> platformserver.api.v1.Node.AllocatedEntry
17, // 13: platformserver.api.v1.PlatformResourcesReply.resources:type_name -> platformserver.api.v1.Node
0, // 14: platformserver.api.v1.TrainJobService.TrainJob:input_type -> platformserver.api.v1.TrainJobRequest
8, // 15: platformserver.api.v1.TrainJobService.StopJob:input_type -> platformserver.api.v1.StopJobRequest
13, // 16: platformserver.api.v1.TrainJobService.GetJobInfo:input_type -> platformserver.api.v1.TrainJobInfoRequest
10, // 17: platformserver.api.v1.TrainJobService.TrainJobList:input_type -> platformserver.api.v1.TrainJobListRequest
15, // 18: platformserver.api.v1.TrainJobService.TrainJobStastics:input_type -> platformserver.api.v1.TrainJobStasticsRequest
21, // 19: platformserver.api.v1.TrainJobService.PlatformResources:input_type -> google.protobuf.Empty
7, // 20: platformserver.api.v1.TrainJobService.TrainJob:output_type -> platformserver.api.v1.TrainJobReply
9, // 21: platformserver.api.v1.TrainJobService.StopJob:output_type -> platformserver.api.v1.StopJobReply
14, // 22: platformserver.api.v1.TrainJobService.GetJobInfo:output_type -> platformserver.api.v1.TrainJobInfoReply
11, // 23: platformserver.api.v1.TrainJobService.TrainJobList:output_type -> platformserver.api.v1.TrainJobListReply
16, // 24: platformserver.api.v1.TrainJobService.TrainJobStastics:output_type -> platformserver.api.v1.TrainJobStasticsReply
18, // 25: platformserver.api.v1.TrainJobService.PlatformResources:output_type -> platformserver.api.v1.PlatformResourcesReply
20, // [20:26] is the sub-list for method output_type
14, // [14:20] is the sub-list for method input_type
14, // [14:14] is the sub-list for extension type_name
14, // [14:14] is the sub-list for extension extendee
0, // [0:14] is the sub-list for field type_name
}

func init() { file_server_platform_server_api_v1_trainJob_proto_init() }
func file_server_platform_server_api_v1_trainJob_proto_init() {
if File_server_platform_server_api_v1_trainJob_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_server_platform_server_api_v1_trainJob_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Image); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Dataset); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Output); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Task); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Parameter); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Resource); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobReply); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*StopJobRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*StopJobReply); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobListRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobListReply); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJob); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobInfoRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobInfoReply); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobStasticsRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainJobStasticsReply); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Node); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_api_v1_trainJob_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PlatformResourcesReply); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_server_platform_server_api_v1_trainJob_proto_rawDesc,
NumEnums: 0,
NumMessages: 21,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_server_platform_server_api_v1_trainJob_proto_goTypes,
DependencyIndexes: file_server_platform_server_api_v1_trainJob_proto_depIdxs,
MessageInfos: file_server_platform_server_api_v1_trainJob_proto_msgTypes,
}.Build()
File_server_platform_server_api_v1_trainJob_proto = out.File
file_server_platform_server_api_v1_trainJob_proto_rawDesc = nil
file_server_platform_server_api_v1_trainJob_proto_goTypes = nil
file_server_platform_server_api_v1_trainJob_proto_depIdxs = nil
}

+ 0
- 1658
server/platform-server/api/v1/trainJob.pb.validate.go View File

@@ -1,1658 +0,0 @@
// Code generated by protoc-gen-validate. DO NOT EDIT.
// source: server/platform-server/api/v1/trainJob.proto

package v1

import (
"bytes"
"errors"
"fmt"
"net"
"net/mail"
"net/url"
"regexp"
"strings"
"time"
"unicode/utf8"

"github.com/golang/protobuf/ptypes"
)

// ensure the imports are used
var (
_ = bytes.MinRead
_ = errors.New("")
_ = fmt.Print
_ = utf8.UTFMax
_ = (*regexp.Regexp)(nil)
_ = (*strings.Reader)(nil)
_ = net.IPv4len
_ = time.Duration(0)
_ = (*url.URL)(nil)
_ = (*mail.Address)(nil)
_ = ptypes.DynamicAny{}
)

// Validate checks the field values on TrainJobRequest with the rules defined
// in the proto definition for this message. If any rules are violated, an
// error is returned.
func (m *TrainJobRequest) Validate() error {
if m == nil {
return nil
}

if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 30 {
return TrainJobRequestValidationError{
field: "Name",
reason: "value length must be between 1 and 30 runes, inclusive",
}
}

if utf8.RuneCountInString(m.GetDesc()) > 300 {
return TrainJobRequestValidationError{
field: "Desc",
reason: "value length must be at most 300 runes",
}
}

if v, ok := interface{}(m.GetImage()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobRequestValidationError{
field: "Image",
reason: "embedded message failed validation",
cause: err,
}
}
}

if v, ok := interface{}(m.GetOutput()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobRequestValidationError{
field: "Output",
reason: "embedded message failed validation",
cause: err,
}
}
}

for idx, item := range m.GetDatasets() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobRequestValidationError{
field: fmt.Sprintf("Datasets[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

for idx, item := range m.GetTasks() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobRequestValidationError{
field: fmt.Sprintf("Tasks[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

return nil
}

// TrainJobRequestValidationError is the validation error returned by
// TrainJobRequest.Validate if the designated constraints aren't met.
type TrainJobRequestValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobRequestValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobRequestValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobRequestValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobRequestValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobRequestValidationError) ErrorName() string { return "TrainJobRequestValidationError" }

// Error satisfies the builtin error interface
func (e TrainJobRequestValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobRequest.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobRequestValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobRequestValidationError{}

// Validate checks the field values on Image with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Image) Validate() error {
if m == nil {
return nil
}

if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 300 {
return ImageValidationError{
field: "Name",
reason: "value length must be between 1 and 300 runes, inclusive",
}
}

if l := utf8.RuneCountInString(m.GetVersion()); l < 1 || l > 30 {
return ImageValidationError{
field: "Version",
reason: "value length must be between 1 and 30 runes, inclusive",
}
}

return nil
}

// ImageValidationError is the validation error returned by Image.Validate if
// the designated constraints aren't met.
type ImageValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e ImageValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e ImageValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e ImageValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e ImageValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e ImageValidationError) ErrorName() string { return "ImageValidationError" }

// Error satisfies the builtin error interface
func (e ImageValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sImage.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = ImageValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = ImageValidationError{}

// Validate checks the field values on Dataset with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Dataset) Validate() error {
if m == nil {
return nil
}

if utf8.RuneCountInString(m.GetStorageConfigName()) > 30 {
return DatasetValidationError{
field: "StorageConfigName",
reason: "value length must be at most 30 runes",
}
}

if utf8.RuneCountInString(m.GetAddr()) > 300 {
return DatasetValidationError{
field: "Addr",
reason: "value length must be at most 300 runes",
}
}

if utf8.RuneCountInString(m.GetName()) > 300 {
return DatasetValidationError{
field: "Name",
reason: "value length must be at most 300 runes",
}
}

if utf8.RuneCountInString(m.GetPath()) > 300 {
return DatasetValidationError{
field: "Path",
reason: "value length must be at most 300 runes",
}
}

return nil
}

// DatasetValidationError is the validation error returned by Dataset.Validate
// if the designated constraints aren't met.
type DatasetValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e DatasetValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e DatasetValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e DatasetValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e DatasetValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e DatasetValidationError) ErrorName() string { return "DatasetValidationError" }

// Error satisfies the builtin error interface
func (e DatasetValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sDataset.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = DatasetValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = DatasetValidationError{}

// Validate checks the field values on Output with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Output) Validate() error {
if m == nil {
return nil
}

if utf8.RuneCountInString(m.GetStorageConfigName()) > 30 {
return OutputValidationError{
field: "StorageConfigName",
reason: "value length must be at most 30 runes",
}
}

if utf8.RuneCountInString(m.GetAddr()) > 300 {
return OutputValidationError{
field: "Addr",
reason: "value length must be at most 300 runes",
}
}

if utf8.RuneCountInString(m.GetPath()) > 300 {
return OutputValidationError{
field: "Path",
reason: "value length must be at most 300 runes",
}
}

return nil
}

// OutputValidationError is the validation error returned by Output.Validate if
// the designated constraints aren't met.
type OutputValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e OutputValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e OutputValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e OutputValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e OutputValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e OutputValidationError) ErrorName() string { return "OutputValidationError" }

// Error satisfies the builtin error interface
func (e OutputValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sOutput.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = OutputValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = OutputValidationError{}

// Validate checks the field values on Task with the rules defined in the proto
// definition for this message. If any rules are violated, an error is returned.
func (m *Task) Validate() error {
if m == nil {
return nil
}

if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 30 {
return TaskValidationError{
field: "Name",
reason: "value length must be between 1 and 30 runes, inclusive",
}
}

if l := utf8.RuneCountInString(m.GetCommand()); l < 0 || l > 300 {
return TaskValidationError{
field: "Command",
reason: "value length must be between 0 and 300 runes, inclusive",
}
}

for idx, item := range m.GetParameters() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TaskValidationError{
field: fmt.Sprintf("Parameters[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

for idx, item := range m.GetResources() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TaskValidationError{
field: fmt.Sprintf("Resources[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

if m.GetTaskNumber() < 1 {
return TaskValidationError{
field: "TaskNumber",
reason: "value must be greater than or equal to 1",
}
}

if m.GetMinFailedTaskCount() < 1 {
return TaskValidationError{
field: "MinFailedTaskCount",
reason: "value must be greater than or equal to 1",
}
}

if m.GetMinSucceededTaskCount() < 1 {
return TaskValidationError{
field: "MinSucceededTaskCount",
reason: "value must be greater than or equal to 1",
}
}

// no validation rules for IsMainRole

return nil
}

// TaskValidationError is the validation error returned by Task.Validate if the
// designated constraints aren't met.
type TaskValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TaskValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TaskValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TaskValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TaskValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TaskValidationError) ErrorName() string { return "TaskValidationError" }

// Error satisfies the builtin error interface
func (e TaskValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTask.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TaskValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TaskValidationError{}

// Validate checks the field values on Parameter with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Parameter) Validate() error {
if m == nil {
return nil
}

// no validation rules for Key

// no validation rules for Value

return nil
}

// ParameterValidationError is the validation error returned by
// Parameter.Validate if the designated constraints aren't met.
type ParameterValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e ParameterValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e ParameterValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e ParameterValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e ParameterValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e ParameterValidationError) ErrorName() string { return "ParameterValidationError" }

// Error satisfies the builtin error interface
func (e ParameterValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sParameter.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = ParameterValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = ParameterValidationError{}

// Validate checks the field values on Resource with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Resource) Validate() error {
if m == nil {
return nil
}

// no validation rules for Name

// no validation rules for Size

return nil
}

// ResourceValidationError is the validation error returned by
// Resource.Validate if the designated constraints aren't met.
type ResourceValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e ResourceValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e ResourceValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e ResourceValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e ResourceValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e ResourceValidationError) ErrorName() string { return "ResourceValidationError" }

// Error satisfies the builtin error interface
func (e ResourceValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sResource.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = ResourceValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = ResourceValidationError{}

// Validate checks the field values on TrainJobReply with the rules defined in
// the proto definition for this message. If any rules are violated, an error
// is returned.
func (m *TrainJobReply) Validate() error {
if m == nil {
return nil
}

// no validation rules for JobId

return nil
}

// TrainJobReplyValidationError is the validation error returned by
// TrainJobReply.Validate if the designated constraints aren't met.
type TrainJobReplyValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobReplyValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobReplyValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobReplyValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobReplyValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobReplyValidationError) ErrorName() string { return "TrainJobReplyValidationError" }

// Error satisfies the builtin error interface
func (e TrainJobReplyValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobReply.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobReplyValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobReplyValidationError{}

// Validate checks the field values on StopJobRequest with the rules defined in
// the proto definition for this message. If any rules are violated, an error
// is returned.
func (m *StopJobRequest) Validate() error {
if m == nil {
return nil
}

if utf8.RuneCountInString(m.GetId()) < 1 {
return StopJobRequestValidationError{
field: "Id",
reason: "value length must be at least 1 runes",
}
}

return nil
}

// StopJobRequestValidationError is the validation error returned by
// StopJobRequest.Validate if the designated constraints aren't met.
type StopJobRequestValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e StopJobRequestValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e StopJobRequestValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e StopJobRequestValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e StopJobRequestValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e StopJobRequestValidationError) ErrorName() string { return "StopJobRequestValidationError" }

// Error satisfies the builtin error interface
func (e StopJobRequestValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sStopJobRequest.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = StopJobRequestValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = StopJobRequestValidationError{}

// Validate checks the field values on StopJobReply with the rules defined in
// the proto definition for this message. If any rules are violated, an error
// is returned.
func (m *StopJobReply) Validate() error {
if m == nil {
return nil
}

// no validation rules for StoppedAt

return nil
}

// StopJobReplyValidationError is the validation error returned by
// StopJobReply.Validate if the designated constraints aren't met.
type StopJobReplyValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e StopJobReplyValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e StopJobReplyValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e StopJobReplyValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e StopJobReplyValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e StopJobReplyValidationError) ErrorName() string { return "StopJobReplyValidationError" }

// Error satisfies the builtin error interface
func (e StopJobReplyValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sStopJobReply.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = StopJobReplyValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = StopJobReplyValidationError{}

// Validate checks the field values on TrainJobListRequest with the rules
// defined in the proto definition for this message. If any rules are
// violated, an error is returned.
func (m *TrainJobListRequest) Validate() error {
if m == nil {
return nil
}

if m.GetPageIndex() < 1 {
return TrainJobListRequestValidationError{
field: "PageIndex",
reason: "value must be greater than or equal to 1",
}
}

if val := m.GetPageSize(); val < 1 || val >= 100 {
return TrainJobListRequestValidationError{
field: "PageSize",
reason: "value must be inside range [1, 100)",
}
}

// no validation rules for SortBy

if _, ok := _TrainJobListRequest_OrderBy_InLookup[m.GetOrderBy()]; !ok {
return TrainJobListRequestValidationError{
field: "OrderBy",
reason: "value must be in list [ asc desc]",
}
}

// no validation rules for CreatedAtGte

// no validation rules for CreatedAtLt

// no validation rules for Status

// no validation rules for SearchKey

return nil
}

// TrainJobListRequestValidationError is the validation error returned by
// TrainJobListRequest.Validate if the designated constraints aren't met.
type TrainJobListRequestValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobListRequestValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobListRequestValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobListRequestValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobListRequestValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobListRequestValidationError) ErrorName() string {
return "TrainJobListRequestValidationError"
}

// Error satisfies the builtin error interface
func (e TrainJobListRequestValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobListRequest.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobListRequestValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobListRequestValidationError{}

var _TrainJobListRequest_OrderBy_InLookup = map[string]struct{}{
"": {},
"asc": {},
"desc": {},
}

// Validate checks the field values on TrainJobListReply with the rules defined
// in the proto definition for this message. If any rules are violated, an
// error is returned.
func (m *TrainJobListReply) Validate() error {
if m == nil {
return nil
}

// no validation rules for TotalSize

for idx, item := range m.GetTrainJobs() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobListReplyValidationError{
field: fmt.Sprintf("TrainJobs[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

return nil
}

// TrainJobListReplyValidationError is the validation error returned by
// TrainJobListReply.Validate if the designated constraints aren't met.
type TrainJobListReplyValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobListReplyValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobListReplyValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobListReplyValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobListReplyValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobListReplyValidationError) ErrorName() string {
return "TrainJobListReplyValidationError"
}

// Error satisfies the builtin error interface
func (e TrainJobListReplyValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobListReply.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobListReplyValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobListReplyValidationError{}

// Validate checks the field values on TrainJob with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *TrainJob) Validate() error {
if m == nil {
return nil
}

// no validation rules for Id

// no validation rules for Name

// no validation rules for Desc

for idx, item := range m.GetDatasets() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobValidationError{
field: fmt.Sprintf("Datasets[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

if v, ok := interface{}(m.GetImage()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobValidationError{
field: "Image",
reason: "embedded message failed validation",
cause: err,
}
}
}

for idx, item := range m.GetTasks() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobValidationError{
field: fmt.Sprintf("Tasks[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

// no validation rules for CreatedAt

// no validation rules for UpdatedAt

// no validation rules for Status

// no validation rules for CompletedAt

// no validation rules for RunSec

// no validation rules for StartedAt

return nil
}

// TrainJobValidationError is the validation error returned by
// TrainJob.Validate if the designated constraints aren't met.
type TrainJobValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobValidationError) ErrorName() string { return "TrainJobValidationError" }

// Error satisfies the builtin error interface
func (e TrainJobValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJob.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobValidationError{}

// Validate checks the field values on TrainJobInfoRequest with the rules
// defined in the proto definition for this message. If any rules are
// violated, an error is returned.
func (m *TrainJobInfoRequest) Validate() error {
if m == nil {
return nil
}

if utf8.RuneCountInString(m.GetId()) < 1 {
return TrainJobInfoRequestValidationError{
field: "Id",
reason: "value length must be at least 1 runes",
}
}

return nil
}

// TrainJobInfoRequestValidationError is the validation error returned by
// TrainJobInfoRequest.Validate if the designated constraints aren't met.
type TrainJobInfoRequestValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobInfoRequestValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobInfoRequestValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobInfoRequestValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobInfoRequestValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobInfoRequestValidationError) ErrorName() string {
return "TrainJobInfoRequestValidationError"
}

// Error satisfies the builtin error interface
func (e TrainJobInfoRequestValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobInfoRequest.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobInfoRequestValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobInfoRequestValidationError{}

// Validate checks the field values on TrainJobInfoReply with the rules defined
// in the proto definition for this message. If any rules are violated, an
// error is returned.
func (m *TrainJobInfoReply) Validate() error {
if m == nil {
return nil
}

if v, ok := interface{}(m.GetTrainJob()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return TrainJobInfoReplyValidationError{
field: "TrainJob",
reason: "embedded message failed validation",
cause: err,
}
}
}

return nil
}

// TrainJobInfoReplyValidationError is the validation error returned by
// TrainJobInfoReply.Validate if the designated constraints aren't met.
type TrainJobInfoReplyValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobInfoReplyValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobInfoReplyValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobInfoReplyValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobInfoReplyValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobInfoReplyValidationError) ErrorName() string {
return "TrainJobInfoReplyValidationError"
}

// Error satisfies the builtin error interface
func (e TrainJobInfoReplyValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobInfoReply.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobInfoReplyValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobInfoReplyValidationError{}

// Validate checks the field values on TrainJobStasticsRequest with the rules
// defined in the proto definition for this message. If any rules are
// violated, an error is returned.
func (m *TrainJobStasticsRequest) Validate() error {
if m == nil {
return nil
}

// no validation rules for CreatedAtGte

// no validation rules for CreatedAtLt

return nil
}

// TrainJobStasticsRequestValidationError is the validation error returned by
// TrainJobStasticsRequest.Validate if the designated constraints aren't met.
type TrainJobStasticsRequestValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobStasticsRequestValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobStasticsRequestValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobStasticsRequestValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobStasticsRequestValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobStasticsRequestValidationError) ErrorName() string {
return "TrainJobStasticsRequestValidationError"
}

// Error satisfies the builtin error interface
func (e TrainJobStasticsRequestValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobStasticsRequest.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobStasticsRequestValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobStasticsRequestValidationError{}

// Validate checks the field values on TrainJobStasticsReply with the rules
// defined in the proto definition for this message. If any rules are
// violated, an error is returned.
func (m *TrainJobStasticsReply) Validate() error {
if m == nil {
return nil
}

// no validation rules for TotalSize

// no validation rules for SucceededSize

// no validation rules for FailedSize

// no validation rules for StoppedSize

// no validation rules for RunningSize

// no validation rules for WaitingSize

return nil
}

// TrainJobStasticsReplyValidationError is the validation error returned by
// TrainJobStasticsReply.Validate if the designated constraints aren't met.
type TrainJobStasticsReplyValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e TrainJobStasticsReplyValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e TrainJobStasticsReplyValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e TrainJobStasticsReplyValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e TrainJobStasticsReplyValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e TrainJobStasticsReplyValidationError) ErrorName() string {
return "TrainJobStasticsReplyValidationError"
}

// Error satisfies the builtin error interface
func (e TrainJobStasticsReplyValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sTrainJobStasticsReply.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = TrainJobStasticsReplyValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = TrainJobStasticsReplyValidationError{}

// Validate checks the field values on Node with the rules defined in the proto
// definition for this message. If any rules are violated, an error is returned.
func (m *Node) Validate() error {
if m == nil {
return nil
}

// no validation rules for NodeName

// no validation rules for Ip

// no validation rules for Status

// no validation rules for Capacity

// no validation rules for Allocated

return nil
}

// NodeValidationError is the validation error returned by Node.Validate if the
// designated constraints aren't met.
type NodeValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e NodeValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e NodeValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e NodeValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e NodeValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e NodeValidationError) ErrorName() string { return "NodeValidationError" }

// Error satisfies the builtin error interface
func (e NodeValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sNode.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = NodeValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = NodeValidationError{}

// Validate checks the field values on PlatformResourcesReply with the rules
// defined in the proto definition for this message. If any rules are
// violated, an error is returned.
func (m *PlatformResourcesReply) Validate() error {
if m == nil {
return nil
}

for idx, item := range m.GetResources() {
_, _ = idx, item

if v, ok := interface{}(item).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return PlatformResourcesReplyValidationError{
field: fmt.Sprintf("Resources[%v]", idx),
reason: "embedded message failed validation",
cause: err,
}
}
}

}

return nil
}

// PlatformResourcesReplyValidationError is the validation error returned by
// PlatformResourcesReply.Validate if the designated constraints aren't met.
type PlatformResourcesReplyValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e PlatformResourcesReplyValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e PlatformResourcesReplyValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e PlatformResourcesReplyValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e PlatformResourcesReplyValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e PlatformResourcesReplyValidationError) ErrorName() string {
return "PlatformResourcesReplyValidationError"
}

// Error satisfies the builtin error interface
func (e PlatformResourcesReplyValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sPlatformResourcesReply.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = PlatformResourcesReplyValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = PlatformResourcesReplyValidationError{}

+ 0
- 638
server/platform-server/api/v1/trainJob.swagger.json View File

@@ -1,638 +0,0 @@
{
"swagger": "2.0",
"info": {
"title": "server/platform-server/api/v1/trainJob.proto",
"version": "version not set"
},
"tags": [
{
"name": "TrainJobService"
}
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
"/v1/overall/trainjobStastics": {
"get": {
"summary": "获取训练任务统计信息",
"operationId": "TrainJobService_TrainJobStastics",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/v1TrainJobStasticsReply"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "createdAtGte",
"description": "大于某个时间创建,非必填.",
"in": "query",
"required": false,
"type": "string",
"format": "int64"
},
{
"name": "createdAtLt",
"description": "小于某个时间创建,非必填.",
"in": "query",
"required": false,
"type": "string",
"format": "int64"
}
],
"tags": [
"TrainJobService"
]
}
},
"/v1/platform/resource": {
"get": {
"summary": "获取集群资源信息",
"operationId": "TrainJobService_PlatformResources",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/v1PlatformResourcesReply"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"tags": [
"TrainJobService"
]
}
},
"/v1/platform/trainjob": {
"get": {
"summary": "获取训练任务列表",
"operationId": "TrainJobService_TrainJobList",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/v1TrainJobListReply"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "pageIndex",
"description": "页码,从1开始,必填.",
"in": "query",
"required": false,
"type": "string",
"format": "int64"
},
{
"name": "pageSize",
"description": "页大小,最小1条,最大100条,必填.",
"in": "query",
"required": false,
"type": "string",
"format": "int64"
},
{
"name": "sortBy",
"description": "分组依据,非必填.",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "orderBy",
"description": "升序、降序,非必填.",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "createdAtGte",
"description": "大于某个时间创建,非必填.",
"in": "query",
"required": false,
"type": "string",
"format": "int64"
},
{
"name": "createdAtLt",
"description": "小于某个时间创建,非必填.",
"in": "query",
"required": false,
"type": "string",
"format": "int64"
},
{
"name": "status",
"description": "状态查询,非必填.",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "searchKey",
"description": "模糊查找字段,可用于name等模糊查找,非必填.",
"in": "query",
"required": false,
"type": "string"
}
],
"tags": [
"TrainJobService"
]
},
"post": {
"summary": "创建训练任务",
"operationId": "TrainJobService_TrainJob",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/v1TrainJobReply"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/v1TrainJobRequest"
}
}
],
"tags": [
"TrainJobService"
]
}
},
"/v1/platform/trainjob/{id}": {
"get": {
"summary": "获取训练任务详情",
"operationId": "TrainJobService_GetJobInfo",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/v1TrainJobInfoReply"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "id",
"description": "任务ID",
"in": "path",
"required": true,
"type": "string"
}
],
"tags": [
"TrainJobService"
]
}
},
"/v1/platform/trainjob/{id}/stop": {
"post": {
"summary": "停止训练任务",
"operationId": "TrainJobService_StopJob",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/v1StopJobReply"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "id",
"description": "任务ID",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"type": "object"
}
}
],
"tags": [
"TrainJobService"
]
}
}
},
"definitions": {
"protobufAny": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"additionalProperties": {}
},
"rpcStatus": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"message": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"$ref": "#/definitions/protobufAny"
}
}
}
},
"v1Dataset": {
"type": "object",
"properties": {
"storageConfigName": {
"type": "string",
"title": "存储配置名称,必填"
},
"addr": {
"type": "string",
"title": "数据集子目录"
},
"name": {
"type": "string",
"title": "数据集名称,必填"
},
"path": {
"type": "string",
"title": "数据集容器内路径"
}
}
},
"v1Image": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"version": {
"type": "string"
}
}
},
"v1Node": {
"type": "object",
"properties": {
"nodeName": {
"type": "string"
},
"ip": {
"type": "string"
},
"status": {
"type": "string"
},
"capacity": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"allocated": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
},
"v1Output": {
"type": "object",
"properties": {
"storageConfigName": {
"type": "string",
"title": "存储配置名称,必填"
},
"addr": {
"type": "string",
"title": "存储子目录"
},
"path": {
"type": "string",
"title": "容器内输出路径"
}
}
},
"v1Parameter": {
"type": "object",
"properties": {
"key": {
"type": "string",
"title": "命令参数key,非必填"
},
"value": {
"type": "string",
"title": "命令参数value,非必填"
}
}
},
"v1PlatformResourcesReply": {
"type": "object",
"properties": {
"resources": {
"type": "array",
"items": {
"$ref": "#/definitions/v1Node"
}
}
}
},
"v1Resource": {
"type": "object",
"properties": {
"name": {
"type": "string",
"title": "命令参数key,必填"
},
"size": {
"type": "string",
"title": "命令参数value,必填"
}
}
},
"v1StopJobReply": {
"type": "object",
"properties": {
"stoppedAt": {
"type": "string",
"format": "int64",
"title": "停止时间"
}
}
},
"v1Task": {
"type": "object",
"properties": {
"name": {
"type": "string",
"title": "子任务名称,非必填,校验规则\"^[0-9a-zA-Z_]*$\",最大长度30个字符"
},
"command": {
"type": "string",
"title": "子任务执行命令"
},
"parameters": {
"type": "array",
"items": {
"$ref": "#/definitions/v1Parameter"
},
"title": "command执行命令参数,key-value,数组"
},
"resources": {
"type": "array",
"items": {
"$ref": "#/definitions/v1Resource"
},
"title": "资源"
},
"taskNumber": {
"type": "string",
"format": "int64",
"title": "副本个数,非必填"
},
"minFailedTaskCount": {
"type": "string",
"format": "int64",
"title": "子任务最小失败数,非必填"
},
"minSucceededTaskCount": {
"type": "string",
"format": "int64",
"title": "子任务最小成功数,非必填"
},
"isMainRole": {
"type": "boolean",
"title": "是否主任务,非必填"
}
}
},
"v1TrainJob": {
"type": "object",
"properties": {
"id": {
"type": "string",
"title": "任务ID"
},
"name": {
"type": "string",
"title": "job名称"
},
"desc": {
"type": "string",
"title": "job描述"
},
"datasets": {
"type": "array",
"items": {
"$ref": "#/definitions/v1Dataset"
},
"title": "数据集"
},
"image": {
"$ref": "#/definitions/v1Image",
"title": "镜像"
},
"tasks": {
"type": "array",
"items": {
"$ref": "#/definitions/v1Task"
},
"title": "子任务配置信息"
},
"createdAt": {
"type": "string",
"format": "int64",
"title": "创建时间"
},
"updatedAt": {
"type": "string",
"format": "int64",
"title": "更新时间"
},
"status": {
"type": "string",
"title": "任务状态"
},
"completedAt": {
"type": "string",
"format": "int64",
"title": "job完成时间"
},
"runSec": {
"type": "string",
"format": "int64",
"title": "运行时"
},
"startedAt": {
"type": "string",
"format": "int64",
"title": "启动时间"
}
}
},
"v1TrainJobInfoReply": {
"type": "object",
"properties": {
"trainJob": {
"$ref": "#/definitions/v1TrainJob",
"title": "训练任务"
}
}
},
"v1TrainJobListReply": {
"type": "object",
"properties": {
"totalSize": {
"type": "string",
"format": "int64",
"title": "查询结果总数"
},
"trainJobs": {
"type": "array",
"items": {
"$ref": "#/definitions/v1TrainJob"
},
"title": "任务"
}
}
},
"v1TrainJobReply": {
"type": "object",
"properties": {
"jobId": {
"type": "string",
"title": "训练任务ID,必填"
}
}
},
"v1TrainJobRequest": {
"type": "object",
"properties": {
"name": {
"type": "string",
"title": "训练任务名称,必填,长度1-30"
},
"desc": {
"type": "string",
"title": "训练任务描述,非必填"
},
"image": {
"$ref": "#/definitions/v1Image",
"title": "镜像信息"
},
"output": {
"$ref": "#/definitions/v1Output",
"title": "输出路径信息"
},
"datasets": {
"type": "array",
"items": {
"$ref": "#/definitions/v1Dataset"
},
"title": "数据集信息"
},
"tasks": {
"type": "array",
"items": {
"$ref": "#/definitions/v1Task"
},
"title": "子任务信息"
}
}
},
"v1TrainJobStasticsReply": {
"type": "object",
"properties": {
"totalSize": {
"type": "string",
"format": "int64",
"title": "任务数量"
},
"succeededSize": {
"type": "string",
"format": "int64",
"title": "成功数量"
},
"failedSize": {
"type": "string",
"format": "int64",
"title": "失败数量"
},
"stoppedSize": {
"type": "string",
"format": "int64",
"title": "停止数量"
},
"runningSize": {
"type": "string",
"format": "int64",
"title": "正在运行数量"
},
"waitingSize": {
"type": "string",
"format": "int64",
"title": "等待数量"
}
}
}
}
}

+ 0
- 294
server/platform-server/api/v1/trainJob_grpc.pb.go View File

@@ -1,294 +0,0 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.

package v1

import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
emptypb "google.golang.org/protobuf/types/known/emptypb"
)

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7

// TrainJobServiceClient is the client API for TrainJobService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type TrainJobServiceClient interface {
// 创建训练任务
TrainJob(ctx context.Context, in *TrainJobRequest, opts ...grpc.CallOption) (*TrainJobReply, error)
//停止训练任务
StopJob(ctx context.Context, in *StopJobRequest, opts ...grpc.CallOption) (*StopJobReply, error)
// 获取训练任务详情
GetJobInfo(ctx context.Context, in *TrainJobInfoRequest, opts ...grpc.CallOption) (*TrainJobInfoReply, error)
//获取训练任务列表
TrainJobList(ctx context.Context, in *TrainJobListRequest, opts ...grpc.CallOption) (*TrainJobListReply, error)
//获取训练任务统计信息
TrainJobStastics(ctx context.Context, in *TrainJobStasticsRequest, opts ...grpc.CallOption) (*TrainJobStasticsReply, error)
//获取集群资源信息
PlatformResources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*PlatformResourcesReply, error)
}

type trainJobServiceClient struct {
cc grpc.ClientConnInterface
}

func NewTrainJobServiceClient(cc grpc.ClientConnInterface) TrainJobServiceClient {
return &trainJobServiceClient{cc}
}

func (c *trainJobServiceClient) TrainJob(ctx context.Context, in *TrainJobRequest, opts ...grpc.CallOption) (*TrainJobReply, error) {
out := new(TrainJobReply)
err := c.cc.Invoke(ctx, "/platformserver.api.v1.TrainJobService/TrainJob", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}

func (c *trainJobServiceClient) StopJob(ctx context.Context, in *StopJobRequest, opts ...grpc.CallOption) (*StopJobReply, error) {
out := new(StopJobReply)
err := c.cc.Invoke(ctx, "/platformserver.api.v1.TrainJobService/StopJob", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}

func (c *trainJobServiceClient) GetJobInfo(ctx context.Context, in *TrainJobInfoRequest, opts ...grpc.CallOption) (*TrainJobInfoReply, error) {
out := new(TrainJobInfoReply)
err := c.cc.Invoke(ctx, "/platformserver.api.v1.TrainJobService/GetJobInfo", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}

func (c *trainJobServiceClient) TrainJobList(ctx context.Context, in *TrainJobListRequest, opts ...grpc.CallOption) (*TrainJobListReply, error) {
out := new(TrainJobListReply)
err := c.cc.Invoke(ctx, "/platformserver.api.v1.TrainJobService/TrainJobList", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}

func (c *trainJobServiceClient) TrainJobStastics(ctx context.Context, in *TrainJobStasticsRequest, opts ...grpc.CallOption) (*TrainJobStasticsReply, error) {
out := new(TrainJobStasticsReply)
err := c.cc.Invoke(ctx, "/platformserver.api.v1.TrainJobService/TrainJobStastics", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}

func (c *trainJobServiceClient) PlatformResources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*PlatformResourcesReply, error) {
out := new(PlatformResourcesReply)
err := c.cc.Invoke(ctx, "/platformserver.api.v1.TrainJobService/PlatformResources", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}

// TrainJobServiceServer is the server API for TrainJobService service.
// All implementations must embed UnimplementedTrainJobServiceServer
// for forward compatibility
type TrainJobServiceServer interface {
// 创建训练任务
TrainJob(context.Context, *TrainJobRequest) (*TrainJobReply, error)
//停止训练任务
StopJob(context.Context, *StopJobRequest) (*StopJobReply, error)
// 获取训练任务详情
GetJobInfo(context.Context, *TrainJobInfoRequest) (*TrainJobInfoReply, error)
//获取训练任务列表
TrainJobList(context.Context, *TrainJobListRequest) (*TrainJobListReply, error)
//获取训练任务统计信息
TrainJobStastics(context.Context, *TrainJobStasticsRequest) (*TrainJobStasticsReply, error)
//获取集群资源信息
PlatformResources(context.Context, *emptypb.Empty) (*PlatformResourcesReply, error)
mustEmbedUnimplementedTrainJobServiceServer()
}

// UnimplementedTrainJobServiceServer must be embedded to have forward compatible implementations.
type UnimplementedTrainJobServiceServer struct {
}

func (UnimplementedTrainJobServiceServer) TrainJob(context.Context, *TrainJobRequest) (*TrainJobReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method TrainJob not implemented")
}
func (UnimplementedTrainJobServiceServer) StopJob(context.Context, *StopJobRequest) (*StopJobReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method StopJob not implemented")
}
func (UnimplementedTrainJobServiceServer) GetJobInfo(context.Context, *TrainJobInfoRequest) (*TrainJobInfoReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetJobInfo not implemented")
}
func (UnimplementedTrainJobServiceServer) TrainJobList(context.Context, *TrainJobListRequest) (*TrainJobListReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method TrainJobList not implemented")
}
func (UnimplementedTrainJobServiceServer) TrainJobStastics(context.Context, *TrainJobStasticsRequest) (*TrainJobStasticsReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method TrainJobStastics not implemented")
}
func (UnimplementedTrainJobServiceServer) PlatformResources(context.Context, *emptypb.Empty) (*PlatformResourcesReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method PlatformResources not implemented")
}
func (UnimplementedTrainJobServiceServer) mustEmbedUnimplementedTrainJobServiceServer() {}

// UnsafeTrainJobServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to TrainJobServiceServer will
// result in compilation errors.
type UnsafeTrainJobServiceServer interface {
mustEmbedUnimplementedTrainJobServiceServer()
}

func RegisterTrainJobServiceServer(s grpc.ServiceRegistrar, srv TrainJobServiceServer) {
s.RegisterService(&TrainJobService_ServiceDesc, srv)
}

func _TrainJobService_TrainJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TrainJobRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TrainJobServiceServer).TrainJob(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/platformserver.api.v1.TrainJobService/TrainJob",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TrainJobServiceServer).TrainJob(ctx, req.(*TrainJobRequest))
}
return interceptor(ctx, in, info, handler)
}

func _TrainJobService_StopJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StopJobRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TrainJobServiceServer).StopJob(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/platformserver.api.v1.TrainJobService/StopJob",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TrainJobServiceServer).StopJob(ctx, req.(*StopJobRequest))
}
return interceptor(ctx, in, info, handler)
}

func _TrainJobService_GetJobInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TrainJobInfoRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TrainJobServiceServer).GetJobInfo(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/platformserver.api.v1.TrainJobService/GetJobInfo",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TrainJobServiceServer).GetJobInfo(ctx, req.(*TrainJobInfoRequest))
}
return interceptor(ctx, in, info, handler)
}

func _TrainJobService_TrainJobList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TrainJobListRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TrainJobServiceServer).TrainJobList(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/platformserver.api.v1.TrainJobService/TrainJobList",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TrainJobServiceServer).TrainJobList(ctx, req.(*TrainJobListRequest))
}
return interceptor(ctx, in, info, handler)
}

func _TrainJobService_TrainJobStastics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TrainJobStasticsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TrainJobServiceServer).TrainJobStastics(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/platformserver.api.v1.TrainJobService/TrainJobStastics",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TrainJobServiceServer).TrainJobStastics(ctx, req.(*TrainJobStasticsRequest))
}
return interceptor(ctx, in, info, handler)
}

func _TrainJobService_PlatformResources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(emptypb.Empty)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TrainJobServiceServer).PlatformResources(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/platformserver.api.v1.TrainJobService/PlatformResources",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TrainJobServiceServer).PlatformResources(ctx, req.(*emptypb.Empty))
}
return interceptor(ctx, in, info, handler)
}

// TrainJobService_ServiceDesc is the grpc.ServiceDesc for TrainJobService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var TrainJobService_ServiceDesc = grpc.ServiceDesc{
ServiceName: "platformserver.api.v1.TrainJobService",
HandlerType: (*TrainJobServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "TrainJob",
Handler: _TrainJobService_TrainJob_Handler,
},
{
MethodName: "StopJob",
Handler: _TrainJobService_StopJob_Handler,
},
{
MethodName: "GetJobInfo",
Handler: _TrainJobService_GetJobInfo_Handler,
},
{
MethodName: "TrainJobList",
Handler: _TrainJobService_TrainJobList_Handler,
},
{
MethodName: "TrainJobStastics",
Handler: _TrainJobService_TrainJobStastics_Handler,
},
{
MethodName: "PlatformResources",
Handler: _TrainJobService_PlatformResources_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "server/platform-server/api/v1/trainJob.proto",
}

+ 0
- 199
server/platform-server/api/v1/trainJob_http.pb.go View File

@@ -1,199 +0,0 @@
// Code generated by protoc-gen-go-http. DO NOT EDIT.

package v1

import (
context "context"
http1 "github.com/go-kratos/kratos/v2/transport/http"
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
mux "github.com/gorilla/mux"
emptypb "google.golang.org/protobuf/types/known/emptypb"
http "net/http"
)

// This is a compile-time assertion to ensure that this generated file
// is compatible with the kratos package it is being compiled against.
var _ = new(http.Request)
var _ = new(context.Context)
var _ = binding.MapProto
var _ = mux.NewRouter

const _ = http1.SupportPackageIsVersion1

type TrainJobServiceHandler interface {
GetJobInfo(context.Context, *TrainJobInfoRequest) (*TrainJobInfoReply, error)

PlatformResources(context.Context, *emptypb.Empty) (*PlatformResourcesReply, error)

StopJob(context.Context, *StopJobRequest) (*StopJobReply, error)

TrainJob(context.Context, *TrainJobRequest) (*TrainJobReply, error)

TrainJobList(context.Context, *TrainJobListRequest) (*TrainJobListReply, error)

TrainJobStastics(context.Context, *TrainJobStasticsRequest) (*TrainJobStasticsReply, error)
}

func NewTrainJobServiceHandler(srv TrainJobServiceHandler, opts ...http1.HandleOption) http.Handler {
h := http1.DefaultHandleOptions()
for _, o := range opts {
o(&h)
}
r := mux.NewRouter()

r.HandleFunc("/v1/platform/trainjob", func(w http.ResponseWriter, r *http.Request) {
var in TrainJobRequest
if err := h.Decode(r, &in); err != nil {
h.Error(w, r, err)
return
}

next := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.TrainJob(ctx, req.(*TrainJobRequest))
}
if h.Middleware != nil {
next = h.Middleware(next)
}
out, err := next(r.Context(), &in)
if err != nil {
h.Error(w, r, err)
return
}
reply := out.(*TrainJobReply)
if err := h.Encode(w, r, reply); err != nil {
h.Error(w, r, err)
}
}).Methods("POST")

r.HandleFunc("/v1/platform/trainjob/{id}/stop", func(w http.ResponseWriter, r *http.Request) {
var in StopJobRequest
if err := h.Decode(r, &in); err != nil {
h.Error(w, r, err)
return
}

if err := binding.MapProto(&in, mux.Vars(r)); err != nil {
h.Error(w, r, err)
return
}

next := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.StopJob(ctx, req.(*StopJobRequest))
}
if h.Middleware != nil {
next = h.Middleware(next)
}
out, err := next(r.Context(), &in)
if err != nil {
h.Error(w, r, err)
return
}
reply := out.(*StopJobReply)
if err := h.Encode(w, r, reply); err != nil {
h.Error(w, r, err)
}
}).Methods("POST")

r.HandleFunc("/v1/platform/trainjob/{id}", func(w http.ResponseWriter, r *http.Request) {
var in TrainJobInfoRequest
if err := h.Decode(r, &in); err != nil {
h.Error(w, r, err)
return
}

if err := binding.MapProto(&in, mux.Vars(r)); err != nil {
h.Error(w, r, err)
return
}

next := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.GetJobInfo(ctx, req.(*TrainJobInfoRequest))
}
if h.Middleware != nil {
next = h.Middleware(next)
}
out, err := next(r.Context(), &in)
if err != nil {
h.Error(w, r, err)
return
}
reply := out.(*TrainJobInfoReply)
if err := h.Encode(w, r, reply); err != nil {
h.Error(w, r, err)
}
}).Methods("GET")

r.HandleFunc("/v1/platform/trainjob", func(w http.ResponseWriter, r *http.Request) {
var in TrainJobListRequest
if err := h.Decode(r, &in); err != nil {
h.Error(w, r, err)
return
}

next := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.TrainJobList(ctx, req.(*TrainJobListRequest))
}
if h.Middleware != nil {
next = h.Middleware(next)
}
out, err := next(r.Context(), &in)
if err != nil {
h.Error(w, r, err)
return
}
reply := out.(*TrainJobListReply)
if err := h.Encode(w, r, reply); err != nil {
h.Error(w, r, err)
}
}).Methods("GET")

r.HandleFunc("/v1/overall/trainjobStastics", func(w http.ResponseWriter, r *http.Request) {
var in TrainJobStasticsRequest
if err := h.Decode(r, &in); err != nil {
h.Error(w, r, err)
return
}

next := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.TrainJobStastics(ctx, req.(*TrainJobStasticsRequest))
}
if h.Middleware != nil {
next = h.Middleware(next)
}
out, err := next(r.Context(), &in)
if err != nil {
h.Error(w, r, err)
return
}
reply := out.(*TrainJobStasticsReply)
if err := h.Encode(w, r, reply); err != nil {
h.Error(w, r, err)
}
}).Methods("GET")

r.HandleFunc("/v1/platform/resource", func(w http.ResponseWriter, r *http.Request) {
var in emptypb.Empty
if err := h.Decode(r, &in); err != nil {
h.Error(w, r, err)
return
}

next := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.PlatformResources(ctx, req.(*emptypb.Empty))
}
if h.Middleware != nil {
next = h.Middleware(next)
}
out, err := next(r.Context(), &in)
if err != nil {
h.Error(w, r, err)
return
}
reply := out.(*PlatformResourcesReply)
if err := h.Encode(w, r, reply); err != nil {
h.Error(w, r, err)
}
}).Methods("GET")

return r
}

+ 0
- 674
server/platform-server/internal/conf/conf.pb.go View File

@@ -1,674 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
// protoc v3.15.8
// source: server/platform-server/internal/conf/conf.proto

package conf

import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
durationpb "google.golang.org/protobuf/types/known/durationpb"
reflect "reflect"
sync "sync"
)

const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type Bootstrap struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

App *App `protobuf:"bytes,1,opt,name=app,proto3" json:"app"`
Server *Server `protobuf:"bytes,2,opt,name=server,proto3" json:"server"`
Data *Data `protobuf:"bytes,3,opt,name=data,proto3" json:"data"`
Service *Service `protobuf:"bytes,4,opt,name=service,proto3" json:"service"`
}

func (x *Bootstrap) Reset() {
*x = Bootstrap{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Bootstrap) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Bootstrap) ProtoMessage() {}

func (x *Bootstrap) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Bootstrap.ProtoReflect.Descriptor instead.
func (*Bootstrap) Descriptor() ([]byte, []int) {
return file_server_platform_server_internal_conf_conf_proto_rawDescGZIP(), []int{0}
}

func (x *Bootstrap) GetApp() *App {
if x != nil {
return x.App
}
return nil
}

func (x *Bootstrap) GetServer() *Server {
if x != nil {
return x.Server
}
return nil
}

func (x *Bootstrap) GetData() *Data {
if x != nil {
return x.Data
}
return nil
}

func (x *Bootstrap) GetService() *Service {
if x != nil {
return x.Service
}
return nil
}

type App struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"`
Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version"`
IsDev bool `protobuf:"varint,3,opt,name=isDev,proto3" json:"isDev"`
LogLevel string `protobuf:"bytes,4,opt,name=logLevel,proto3" json:"logLevel"`
}

func (x *App) Reset() {
*x = App{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *App) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*App) ProtoMessage() {}

func (x *App) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use App.ProtoReflect.Descriptor instead.
func (*App) Descriptor() ([]byte, []int) {
return file_server_platform_server_internal_conf_conf_proto_rawDescGZIP(), []int{1}
}

func (x *App) GetName() string {
if x != nil {
return x.Name
}
return ""
}

func (x *App) GetVersion() string {
if x != nil {
return x.Version
}
return ""
}

func (x *App) GetIsDev() bool {
if x != nil {
return x.IsDev
}
return false
}

func (x *App) GetLogLevel() string {
if x != nil {
return x.LogLevel
}
return ""
}

type Server struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Http *Server_HTTP `protobuf:"bytes,1,opt,name=http,proto3" json:"http"`
}

func (x *Server) Reset() {
*x = Server{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Server) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Server) ProtoMessage() {}

func (x *Server) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Server.ProtoReflect.Descriptor instead.
func (*Server) Descriptor() ([]byte, []int) {
return file_server_platform_server_internal_conf_conf_proto_rawDescGZIP(), []int{2}
}

func (x *Server) GetHttp() *Server_HTTP {
if x != nil {
return x.Http
}
return nil
}

type Data struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

BaseServerAddr string `protobuf:"bytes,1,opt,name=baseServerAddr,proto3" json:"baseServerAddr"`
Redis *Data_Redis `protobuf:"bytes,2,opt,name=redis,proto3" json:"redis"`
BaseServerRequestTimeout string `protobuf:"bytes,3,opt,name=baseServerRequestTimeout,proto3" json:"baseServerRequestTimeout"`
}

func (x *Data) Reset() {
*x = Data{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Data) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Data) ProtoMessage() {}

func (x *Data) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Data.ProtoReflect.Descriptor instead.
func (*Data) Descriptor() ([]byte, []int) {
return file_server_platform_server_internal_conf_conf_proto_rawDescGZIP(), []int{3}
}

func (x *Data) GetBaseServerAddr() string {
if x != nil {
return x.BaseServerAddr
}
return ""
}

func (x *Data) GetRedis() *Data_Redis {
if x != nil {
return x.Redis
}
return nil
}

func (x *Data) GetBaseServerRequestTimeout() string {
if x != nil {
return x.BaseServerRequestTimeout
}
return ""
}

type Service struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

TokenExpirationSec int64 `protobuf:"varint,1,opt,name=tokenExpirationSec,proto3" json:"tokenExpirationSec"`
}

func (x *Service) Reset() {
*x = Service{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Service) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Service) ProtoMessage() {}

func (x *Service) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Service.ProtoReflect.Descriptor instead.
func (*Service) Descriptor() ([]byte, []int) {
return file_server_platform_server_internal_conf_conf_proto_rawDescGZIP(), []int{4}
}

func (x *Service) GetTokenExpirationSec() int64 {
if x != nil {
return x.TokenExpirationSec
}
return 0
}

type Server_HTTP struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr"`
Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout"`
JwtSecrect string `protobuf:"bytes,4,opt,name=jwtSecrect,proto3" json:"jwtSecrect"`
}

func (x *Server_HTTP) Reset() {
*x = Server_HTTP{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Server_HTTP) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Server_HTTP) ProtoMessage() {}

func (x *Server_HTTP) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Server_HTTP.ProtoReflect.Descriptor instead.
func (*Server_HTTP) Descriptor() ([]byte, []int) {
return file_server_platform_server_internal_conf_conf_proto_rawDescGZIP(), []int{2, 0}
}

func (x *Server_HTTP) GetNetwork() string {
if x != nil {
return x.Network
}
return ""
}

func (x *Server_HTTP) GetAddr() string {
if x != nil {
return x.Addr
}
return ""
}

func (x *Server_HTTP) GetTimeout() *durationpb.Duration {
if x != nil {
return x.Timeout
}
return nil
}

func (x *Server_HTTP) GetJwtSecrect() string {
if x != nil {
return x.JwtSecrect
}
return ""
}

type Data_Redis struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr"`
Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username"`
Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password"`
}

func (x *Data_Redis) Reset() {
*x = Data_Redis{}
if protoimpl.UnsafeEnabled {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}

func (x *Data_Redis) String() string {
return protoimpl.X.MessageStringOf(x)
}

func (*Data_Redis) ProtoMessage() {}

func (x *Data_Redis) ProtoReflect() protoreflect.Message {
mi := &file_server_platform_server_internal_conf_conf_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}

// Deprecated: Use Data_Redis.ProtoReflect.Descriptor instead.
func (*Data_Redis) Descriptor() ([]byte, []int) {
return file_server_platform_server_internal_conf_conf_proto_rawDescGZIP(), []int{3, 0}
}

func (x *Data_Redis) GetAddr() string {
if x != nil {
return x.Addr
}
return ""
}

func (x *Data_Redis) GetUsername() string {
if x != nil {
return x.Username
}
return ""
}

func (x *Data_Redis) GetPassword() string {
if x != nil {
return x.Password
}
return ""
}

var File_server_platform_server_internal_conf_conf_proto protoreflect.FileDescriptor

var file_server_platform_server_internal_conf_conf_proto_rawDesc = []byte{
0x0a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
0x6d, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x12, 0x1c, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x1a,
0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
0xf7, 0x01, 0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x12, 0x33, 0x0a,
0x03, 0x61, 0x70, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x6c, 0x61,
0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x74, 0x65,
0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x03, 0x61,
0x70, 0x70, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72,
0x76, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e,
0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
0x12, 0x36, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x44, 0x61,
0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76,
0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x03, 0x41, 0x70, 0x70,
0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14,
0x0a, 0x05, 0x69, 0x73, 0x44, 0x65, 0x76, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69,
0x73, 0x44, 0x65, 0x76, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,
0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,
0x22, 0xd3, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x04, 0x68,
0x74, 0x74, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72,
0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
0x48, 0x54, 0x54, 0x50, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x89, 0x01, 0x0a, 0x04, 0x48,
0x54, 0x54, 0x50, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a,
0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64,
0x72, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74,
0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6a, 0x77, 0x74, 0x53, 0x65, 0x63,
0x72, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6a, 0x77, 0x74, 0x53,
0x65, 0x63, 0x72, 0x65, 0x63, 0x74, 0x22, 0xff, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12,
0x26, 0x0a, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64,
0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72,
0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x3e, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
0x6d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73,
0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x62, 0x61, 0x73, 0x65, 0x53,
0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65,
0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x62, 0x61, 0x73, 0x65, 0x53,
0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65,
0x6f, 0x75, 0x74, 0x1a, 0x53, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x12, 0x12, 0x0a, 0x04,
0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72,
0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08,
0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x39, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76,
0x69, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45, 0x78, 0x70, 0x69,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
0x12, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x53, 0x65, 0x63, 0x42, 0x14, 0x5a, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f,
0x63, 0x6f, 0x6e, 0x66, 0x3b, 0x63, 0x6f, 0x6e, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x33,
}

var (
file_server_platform_server_internal_conf_conf_proto_rawDescOnce sync.Once
file_server_platform_server_internal_conf_conf_proto_rawDescData = file_server_platform_server_internal_conf_conf_proto_rawDesc
)

func file_server_platform_server_internal_conf_conf_proto_rawDescGZIP() []byte {
file_server_platform_server_internal_conf_conf_proto_rawDescOnce.Do(func() {
file_server_platform_server_internal_conf_conf_proto_rawDescData = protoimpl.X.CompressGZIP(file_server_platform_server_internal_conf_conf_proto_rawDescData)
})
return file_server_platform_server_internal_conf_conf_proto_rawDescData
}

var file_server_platform_server_internal_conf_conf_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_server_platform_server_internal_conf_conf_proto_goTypes = []interface{}{
(*Bootstrap)(nil), // 0: platformserver.internal.conf.Bootstrap
(*App)(nil), // 1: platformserver.internal.conf.App
(*Server)(nil), // 2: platformserver.internal.conf.Server
(*Data)(nil), // 3: platformserver.internal.conf.Data
(*Service)(nil), // 4: platformserver.internal.conf.Service
(*Server_HTTP)(nil), // 5: platformserver.internal.conf.Server.HTTP
(*Data_Redis)(nil), // 6: platformserver.internal.conf.Data.Redis
(*durationpb.Duration)(nil), // 7: google.protobuf.Duration
}
var file_server_platform_server_internal_conf_conf_proto_depIdxs = []int32{
1, // 0: platformserver.internal.conf.Bootstrap.app:type_name -> platformserver.internal.conf.App
2, // 1: platformserver.internal.conf.Bootstrap.server:type_name -> platformserver.internal.conf.Server
3, // 2: platformserver.internal.conf.Bootstrap.data:type_name -> platformserver.internal.conf.Data
4, // 3: platformserver.internal.conf.Bootstrap.service:type_name -> platformserver.internal.conf.Service
5, // 4: platformserver.internal.conf.Server.http:type_name -> platformserver.internal.conf.Server.HTTP
6, // 5: platformserver.internal.conf.Data.redis:type_name -> platformserver.internal.conf.Data.Redis
7, // 6: platformserver.internal.conf.Server.HTTP.timeout:type_name -> google.protobuf.Duration
7, // [7:7] is the sub-list for method output_type
7, // [7:7] is the sub-list for method input_type
7, // [7:7] is the sub-list for extension type_name
7, // [7:7] is the sub-list for extension extendee
0, // [0:7] is the sub-list for field type_name
}

func init() { file_server_platform_server_internal_conf_conf_proto_init() }
func file_server_platform_server_internal_conf_conf_proto_init() {
if File_server_platform_server_internal_conf_conf_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_server_platform_server_internal_conf_conf_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Bootstrap); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_internal_conf_conf_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*App); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_internal_conf_conf_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Server); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_internal_conf_conf_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Data); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_internal_conf_conf_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Service); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_internal_conf_conf_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Server_HTTP); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_server_platform_server_internal_conf_conf_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Data_Redis); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_server_platform_server_internal_conf_conf_proto_rawDesc,
NumEnums: 0,
NumMessages: 7,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_server_platform_server_internal_conf_conf_proto_goTypes,
DependencyIndexes: file_server_platform_server_internal_conf_conf_proto_depIdxs,
MessageInfos: file_server_platform_server_internal_conf_conf_proto_msgTypes,
}.Build()
File_server_platform_server_internal_conf_conf_proto = out.File
file_server_platform_server_internal_conf_conf_proto_rawDesc = nil
file_server_platform_server_internal_conf_conf_proto_goTypes = nil
file_server_platform_server_internal_conf_conf_proto_depIdxs = nil
}

+ 0
- 579
server/platform-server/internal/conf/conf.pb.validate.go View File

@@ -1,579 +0,0 @@
// Code generated by protoc-gen-validate. DO NOT EDIT.
// source: server/platform-server/internal/conf/conf.proto

package conf

import (
"bytes"
"errors"
"fmt"
"net"
"net/mail"
"net/url"
"regexp"
"strings"
"time"
"unicode/utf8"

"github.com/golang/protobuf/ptypes"
)

// ensure the imports are used
var (
_ = bytes.MinRead
_ = errors.New("")
_ = fmt.Print
_ = utf8.UTFMax
_ = (*regexp.Regexp)(nil)
_ = (*strings.Reader)(nil)
_ = net.IPv4len
_ = time.Duration(0)
_ = (*url.URL)(nil)
_ = (*mail.Address)(nil)
_ = ptypes.DynamicAny{}
)

// Validate checks the field values on Bootstrap with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Bootstrap) Validate() error {
if m == nil {
return nil
}

if v, ok := interface{}(m.GetApp()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return BootstrapValidationError{
field: "App",
reason: "embedded message failed validation",
cause: err,
}
}
}

if v, ok := interface{}(m.GetServer()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return BootstrapValidationError{
field: "Server",
reason: "embedded message failed validation",
cause: err,
}
}
}

if v, ok := interface{}(m.GetData()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return BootstrapValidationError{
field: "Data",
reason: "embedded message failed validation",
cause: err,
}
}
}

if v, ok := interface{}(m.GetService()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return BootstrapValidationError{
field: "Service",
reason: "embedded message failed validation",
cause: err,
}
}
}

return nil
}

// BootstrapValidationError is the validation error returned by
// Bootstrap.Validate if the designated constraints aren't met.
type BootstrapValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e BootstrapValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e BootstrapValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e BootstrapValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e BootstrapValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e BootstrapValidationError) ErrorName() string { return "BootstrapValidationError" }

// Error satisfies the builtin error interface
func (e BootstrapValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sBootstrap.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = BootstrapValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = BootstrapValidationError{}

// Validate checks the field values on App with the rules defined in the proto
// definition for this message. If any rules are violated, an error is returned.
func (m *App) Validate() error {
if m == nil {
return nil
}

// no validation rules for Name

// no validation rules for Version

// no validation rules for IsDev

// no validation rules for LogLevel

return nil
}

// AppValidationError is the validation error returned by App.Validate if the
// designated constraints aren't met.
type AppValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e AppValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e AppValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e AppValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e AppValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e AppValidationError) ErrorName() string { return "AppValidationError" }

// Error satisfies the builtin error interface
func (e AppValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sApp.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = AppValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = AppValidationError{}

// Validate checks the field values on Server with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Server) Validate() error {
if m == nil {
return nil
}

if v, ok := interface{}(m.GetHttp()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return ServerValidationError{
field: "Http",
reason: "embedded message failed validation",
cause: err,
}
}
}

return nil
}

// ServerValidationError is the validation error returned by Server.Validate if
// the designated constraints aren't met.
type ServerValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e ServerValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e ServerValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e ServerValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e ServerValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e ServerValidationError) ErrorName() string { return "ServerValidationError" }

// Error satisfies the builtin error interface
func (e ServerValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sServer.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = ServerValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = ServerValidationError{}

// Validate checks the field values on Data with the rules defined in the proto
// definition for this message. If any rules are violated, an error is returned.
func (m *Data) Validate() error {
if m == nil {
return nil
}

// no validation rules for BaseServerAddr

if v, ok := interface{}(m.GetRedis()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return DataValidationError{
field: "Redis",
reason: "embedded message failed validation",
cause: err,
}
}
}

// no validation rules for BaseServerRequestTimeout

return nil
}

// DataValidationError is the validation error returned by Data.Validate if the
// designated constraints aren't met.
type DataValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e DataValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e DataValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e DataValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e DataValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e DataValidationError) ErrorName() string { return "DataValidationError" }

// Error satisfies the builtin error interface
func (e DataValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sData.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = DataValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = DataValidationError{}

// Validate checks the field values on Service with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Service) Validate() error {
if m == nil {
return nil
}

// no validation rules for TokenExpirationSec

return nil
}

// ServiceValidationError is the validation error returned by Service.Validate
// if the designated constraints aren't met.
type ServiceValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e ServiceValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e ServiceValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e ServiceValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e ServiceValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e ServiceValidationError) ErrorName() string { return "ServiceValidationError" }

// Error satisfies the builtin error interface
func (e ServiceValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sService.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = ServiceValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = ServiceValidationError{}

// Validate checks the field values on Server_HTTP with the rules defined in
// the proto definition for this message. If any rules are violated, an error
// is returned.
func (m *Server_HTTP) Validate() error {
if m == nil {
return nil
}

// no validation rules for Network

// no validation rules for Addr

if v, ok := interface{}(m.GetTimeout()).(interface{ Validate() error }); ok {
if err := v.Validate(); err != nil {
return Server_HTTPValidationError{
field: "Timeout",
reason: "embedded message failed validation",
cause: err,
}
}
}

// no validation rules for JwtSecrect

return nil
}

// Server_HTTPValidationError is the validation error returned by
// Server_HTTP.Validate if the designated constraints aren't met.
type Server_HTTPValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e Server_HTTPValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e Server_HTTPValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e Server_HTTPValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e Server_HTTPValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e Server_HTTPValidationError) ErrorName() string { return "Server_HTTPValidationError" }

// Error satisfies the builtin error interface
func (e Server_HTTPValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sServer_HTTP.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = Server_HTTPValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = Server_HTTPValidationError{}

// Validate checks the field values on Data_Redis with the rules defined in the
// proto definition for this message. If any rules are violated, an error is returned.
func (m *Data_Redis) Validate() error {
if m == nil {
return nil
}

// no validation rules for Addr

// no validation rules for Username

// no validation rules for Password

return nil
}

// Data_RedisValidationError is the validation error returned by
// Data_Redis.Validate if the designated constraints aren't met.
type Data_RedisValidationError struct {
field string
reason string
cause error
key bool
}

// Field function returns field value.
func (e Data_RedisValidationError) Field() string { return e.field }

// Reason function returns reason value.
func (e Data_RedisValidationError) Reason() string { return e.reason }

// Cause function returns cause value.
func (e Data_RedisValidationError) Cause() error { return e.cause }

// Key function returns key value.
func (e Data_RedisValidationError) Key() bool { return e.key }

// ErrorName returns error name.
func (e Data_RedisValidationError) ErrorName() string { return "Data_RedisValidationError" }

// Error satisfies the builtin error interface
func (e Data_RedisValidationError) Error() string {
cause := ""
if e.cause != nil {
cause = fmt.Sprintf(" | caused by: %v", e.cause)
}

key := ""
if e.key {
key = "key for "
}

return fmt.Sprintf(
"invalid %sData_Redis.%s: %s%s",
key,
e.field,
e.reason,
cause)
}

var _ error = Data_RedisValidationError{}

var _ interface {
Field() string
Reason() string
Key() bool
Cause() error
ErrorName() string
} = Data_RedisValidationError{}

+ 0
- 35
third-party/cambricon-k8s-device-plugin/.drone.yml View File

@@ -1,35 +0,0 @@
kind: pipeline
name: pipeline-octopus-cambricon-k8s-device-plugin
platform:
os: linux
arch: amd64
steps:

- name: containerize
image: docker:18.09.7
volumes:
# - name: dockerlib
# path: /var/lib/docker
- name: dockersock
path: /var/run/docker.sock
- name: drone
path: /etc/drone
commands:
- export DRONE_DOCKER_LOCAL_FILE="./device-plugin/Dockerfile"
- . /etc/drone/env.sh
- . /etc/drone/docker_build.sh

trigger:
event:
- tag

volumes:
- name: dockerlib
host:
path: /var/lib/docker
- name: dockersock
host:
path: /var/run/docker.sock
- name: drone
host:
path: /etc/drone

+ 0
- 7
third-party/cambricon-k8s-device-plugin/.github/issue_template.md View File

@@ -1,7 +0,0 @@
_The template below is mostly useful for bug reports and support questions. Feel free to remove anything which doesn't apply to you and add more information where it makes sense._

### 1. Issue or feature description

### 2. Steps to reproduce the issue

### 3. Information to [attach](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests/) (optional if deemed irrelevant)

+ 0
- 50
third-party/cambricon-k8s-device-plugin/.github/workflows/ci.yaml View File

@@ -1,50 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

name: Cambricon Device Plugin CI
on:
pull_request:
branches:
- master
jobs:
lint:
name: Lint
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: golangci/golangci-lint-action@v2
with:
version: v1.29
working-directory: device-plugin
args: -v

build:
name: Build
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v1
with:
go-version: "1.13.1"
- run: make -C device-plugin build

test:
name: Test
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v1
with:
go-version: "1.13.1"
- run: make -C device-plugin test

+ 0
- 41
third-party/cambricon-k8s-device-plugin/.gitlab-ci.yml View File

@@ -1,41 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

image: 10.110.210.252:5001/cambricon/buildpack:20200424
variables:
GOPROXY: http://10.110.210.252:8080

.only-mr-refs: &only-mr-refs
refs:
- merge_requests
- master

stages:
- lint
- build
- test

include:
- local: device-plugin/.gitlab-ci.yml

run-shellcheck-lint:
stage: lint
image: 10.110.210.252:5001/cambricon/shellcheck-alpine:v0.7.0
script:
- find . -name '*.sh' -exec shellcheck {} +
only:
changes:
- .gitlab-ci.yml
- "**/*.sh"
<<: *only-mr-refs

+ 0
- 25
third-party/cambricon-k8s-device-plugin/.golangci.yml View File

@@ -1,25 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

linters:
enable:
- govet
- gofmt
- goimports
- golint
disable-all: true
issues:
exclude-use-default: false
exclude:
- (comment on exported (method|function|type|const)|should have( a package)? comment|comment should be of the form)

+ 0
- 201
third-party/cambricon-k8s-device-plugin/LICENSE View File

@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

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.

+ 0
- 7
third-party/cambricon-k8s-device-plugin/README.md View File

@@ -1,7 +0,0 @@
# Cambricon K8s Device Plugin

See [device-plugin](device-plugin) directory.

## License

[Apache-2.0](LICENSE)

+ 0
- 5
third-party/cambricon-k8s-device-plugin/device-plugin/.gitignore View File

@@ -1,5 +0,0 @@
libcndev.so
k8s-device-plugin
mock_test
image
*.tar*

+ 0
- 50
third-party/cambricon-k8s-device-plugin/device-plugin/.gitlab-ci.yml View File

@@ -1,50 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

.run-device-plugin-mr:
only:
changes:
- .gitlab-ci.yml
- .golangci.yml
- device-plugin/**/*
refs:
- merge_requests

run-device-plugin-lint:
extends: .run-device-plugin-mr
stage: lint
script:
- make -C device-plugin lint

run-device-plugin-build:
extends: .run-device-plugin-mr
stage: build
script:
- make -C device-plugin build

run-device-plugin-test:
extends: .run-device-plugin-mr
stage: test
script:
- make -C device-plugin test

run-device-plugin-integration:
extends: .run-device-plugin-mr
variables:
APT_PROXY: http://10.110.210.252:3142
stage: test
tags:
- shell47
script:
- make -C device-plugin integration-test

+ 0
- 14
third-party/cambricon-k8s-device-plugin/device-plugin/CHANGELOG.md View File

@@ -1,14 +0,0 @@
# Changelog

## v1.0.0

+ Implement basic function.

## v1.1.0

+ Implement SR-IOV and env-share features.

## v1.1.1

+ Fix SR-IOV vf device name same as env-share fake device name.
+ Support building image on arm64 machines.

+ 0
- 31
third-party/cambricon-k8s-device-plugin/device-plugin/Dockerfile View File

@@ -1,31 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

ARG BUILDPLATFORM=linux/amd64
FROM --platform=$BUILDPLATFORM golang:1.13 as build
ARG APT_PROXY
ARG GOPROXY=https://goproxy.cn
ARG TARGETPLATFORM
RUN set -ex && export http_proxy=$APT_PROXY && \
apt-get update && \
apt-get install -y build-essential gcc-aarch64-linux-gnu ca-certificates make
WORKDIR /work/
COPY ./device-plugin .
RUN make build

FROM ubuntu:18.04
ARG TARGETPLATFORM=linux/amd64
COPY --from=build /work/k8s-device-plugin /usr/bin/
COPY ./device-plugin/libs/$TARGETPLATFORM/libcndev.so /usr/lib
CMD ["/usr/bin/k8s-device-plugin"]

+ 0
- 58
third-party/cambricon-k8s-device-plugin/device-plugin/Makefile View File

@@ -1,58 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

TARGETPLATFORM ?= linux/amd64
export GOOS := $(word 1, $(subst /, ,$(TARGETPLATFORM)))
export GOARCH := $(word 2, $(subst /, ,$(TARGETPLATFORM)))
export CGO_ENABLED := 1
ifeq ($(GOARCH), arm64)
export CC=aarch64-linux-gnu-gcc
endif

lint:
golangci-lint run -v

build:
go build -trimpath -ldflags="-s -w" -o k8s-device-plugin .

test: go-test mock-test

go-test: pkg/cndev/mock/libcndev.so
LD_LIBRARY_PATH=$(CURDIR)/pkg/cndev/mock \
MOCK_JSON=$(CURDIR)/test/mockmlu270.json \
go test -v ./...

integration-test: pkg/cndev/mock/libcndev.so
./test/device-plugin-integration-test.sh

LIBCNDEV_MOCK_DEPS := $(wildcard pkg/cndev/mock/*.h pkg/cndev/mock/*.c pkg/cndev/include/*)
pkg/cndev/mock/libcndev.so: $(LIBCNDEV_MOCK_DEPS)
$(CC) -fPIC -shared pkg/cndev/mock/cJSON.c pkg/cndev/mock/cndev.c -lm -o $@

pkg/cndev/mock/mock_test: pkg/cndev/mock/main.c pkg/cndev/mock/libcndev.so
$(CC) pkg/cndev/mock/main.c \
-Wl,-rpath='$$ORIGIN' -Lpkg/cndev/mock -lcndev \
-o pkg/cndev/mock/mock_test

mock-test: pkg/cndev/mock/mock_test
MOCK_JSON=$(CURDIR)/test/mockmlu270.json ./pkg/cndev/mock/mock_test

addlicense:
# install with `go get github.com/google/addlicense`
addlicense -c 'Cambricon, Inc.' -l apache -v .

clean:
rm -f pkg/cndev/mock/libcndev.so
rm -f pkg/cndev/mock/mock_test
rm -f k8s-device-plugin

+ 0
- 120
third-party/cambricon-k8s-device-plugin/device-plugin/README.md View File

@@ -1,120 +0,0 @@
# Cambricon Device Plugin for Kubernetes

## 说明
无官方docker镜像,原项目地址https://github.com/Cambricon/cambricon-k8s-device-plugin,修改了编译脚本

## About Cambricon Device Plugin

The Cambricon device plugin for Kubernetes is a Daemonset which allows you to automatically:

- Report the quantity of MLU on each nodes of your cluster.
- Monitor the health status of MLUs.
- Be capable to run containers with MLU enabled.

This repository contains Cambricon's official implementation of the Kubernetes device plugin.

## Prerequisites

The prerequisites for running the Cambricon device plugin:

- MLU100, MLU270, x5k, MLU220 devices
- MLU100 driver > 3.5; MLU270 driver >2.2.0; MLU220 driver > 4.1.1
- libcndev.so >= V1.8.0
- Kubernetes >= v1.11.2

## Quick Start

### Preparing your MLU Nodes

It assumes that the Cambricon drivers and neuware are installed on your MLU Nodes.

### Download and build

```shell
git clone https://github.com/Cambricon/cambricon-k8s-device-plugin.git
cd cambricon-k8s-device-plugin/device-plugin
```

Set the following environment variables if you need.

| env | description |
| --------- | ----------------------------------------------------------------------------- |
| APT_PROXY | apt proxy server |
| GOPROXY | golang proxy server |
| ARCH | target platform architecture, amd64 or arm64, amd64 by default |
| LIBCNDEV | absolute path of the libcndev.so binary, neuware installation path by default |

If you want to cross build, make sure docker version >= 19.03.

For amd64:

```shell
./build_image.sh
```

For arm64:

```shell
export ARCH=arm64
./build_image.sh
```

Please make sure Cambricon neuware is installed in your compiling environment.
It uses **libcndev.so** binary on your compiling machine and generates docker image in folder `./image`.

### Enabling MLU Support in Kubernetes

1. Push the docker image to the docker repo of your cluster or load the docker image on all your MLU nodes by:

```shell
docker load -i image/cambricon-k8s-device-plugin-amd64.tar
```

2. Enable MLU support in your cluster by deploying the daemonset in [examples](examples) folder:

Set the mode arg in the yaml file to change mode

```yaml
args:
- -mode
- default # switch mode here
env:
# change this if env-share mode or sriov mode is enabled.
- name: VIRTUALIZATION_NUM
value: "0"
```

supported features:

- default: default mode
- sriov: supports SR-IOV. Set `VIRTUALIZATION_NUM` as number of VFs on host.
- env-share: a whole card can be allocated into multiple containers. A container should use only one card in this mode.
Set `VIRTUALIZATION_NUM` as maximum number of containers one MLU can be allocated into.

```shell
kubectl create -f cambricon-device-plugin-daemonset.yml
```

(Optional) If you do not want the daemonset way of deployment, edit the static pod template in examples folder and
put the file into your configured static pod folder (`/etc/kubernetes/manifests` by default).

### Running MLU Jobs

Cambricon MLUs can now be consumed via container level resource requirements using the resource name `cambricon.com/mlu`:

```yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
restartPolicy: OnFailure
containers:
- image: ubuntu:16.04
name: pod1-ctr
command: ["sleep"]
args: ["100000"]
resources:
limits:
cambricon.com/mlu: 1
```

+ 0
- 93
third-party/cambricon-k8s-device-plugin/device-plugin/build_image.sh View File

@@ -1,93 +0,0 @@
#!/bin/bash
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

curpath=$(dirname "$0")
cd "$curpath" || exit 1

: "${TAG:=v1.1.1}"
: "${ARCH:=amd64}"
: "${LIBCNDEV:=/usr/local/neuware/lib64/libcndev.so}"

echo "Build environ (Can be overridden):"
echo "TAG = $TAG"
echo "ARCH = $ARCH"
echo "LIBCNDEV = $LIBCNDEV"
echo "APT_PROXY = $APT_PROXY"
echo "GOPROXY = $GOPROXY"

case $(uname -m) in
x86_64)
build_arch=amd64
;;
aarch64*)
build_arch=arm64
;;
armv8*)
build_arch=arm64
esac

rm -rf "$curpath/image"
mkdir -p "$curpath/image"

# Cambricon neuware installation path
if [[ ! -f "$LIBCNDEV" ]]; then
echo "Can't find libcndev.so at $LIBCNDEV."
echo "Please install Cambricon neuware, or set LIBCNDEV environ to path of libcndev.so"
exit 1
fi

case $ARCH in
amd64)
file_arch=x86-64
;;
arm64)
file_arch=aarch64
;;
*)
echo "Unknown arch $ARCH"
exit 1
esac

if ! file "$LIBCNDEV" --dereference | grep -q "$file_arch"; then
echo "$LIBCNDEV is not for $ARCH"
exit 1
fi

cp "$LIBCNDEV" "$curpath/libs/linux/$ARCH/"

echo "Building Cambricon device plugin docker image."

# Legacy build for docker 18.06.
# Remove this when docker is upgraded to 19.03 in all environ.
[[ "$ARCH" == "$build_arch" ]] && docker build -t "cambricon-k8s-device-plugin:$TAG" \
--build-arg "GOPROXY=$GOPROXY" --build-arg "APT_PROXY=$APT_PROXY" \
--build-arg "BUILDPLATFORM=linux/$ARCH" \
--build-arg "TARGETPLATFORM=linux/$ARCH" .

[[ "$ARCH" == "$build_arch" ]] && docker save -o "image/cambricon-k8s-device-plugin-$ARCH.tar" \
"cambricon-k8s-device-plugin:$TAG"

if [[ "$ARCH" != "$build_arch" && "$(docker version -f '{{ge .Client.Version "19.03"}}')" != "true" ]]; then
echo "Needs docker 19.03 and above"
exit 1
fi

[[ "$ARCH" != "$build_arch" ]] && DOCKER_CLI_EXPERIMENTAL=enabled docker buildx build \
--platform="linux/$ARCH" -t "cambricon-k8s-device-plugin:$TAG" \
--build-arg "GOPROXY=$GOPROXY" --build-arg "APT_PROXY=$APT_PROXY" \
--output type=docker,dest="./image/cambricon-k8s-device-plugin-$ARCH.tar" .

echo "Image is saved at ./image/cambricon-k8s-device-plugin-$ARCH.tar"
rm -f "$curpath/libs/linux/$ARCH/libcndev.so"

+ 0
- 198
third-party/cambricon-k8s-device-plugin/device-plugin/cambricon.go View File

@@ -1,198 +0,0 @@
// Copyright 2020 Cambricon, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 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.

package main

import (
"fmt"
"log"
"os"
"path/filepath"
"strconv"
"time"

"github.com/cambricon/cambricon-k8s-device-plugin/device-plugin/pkg/cndev"
"golang.org/x/net/context"
pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
)

const (
mlu100MonitorDeviceName = "/dev/cnmon_dev"
mlu100CodecDeviceName = "/dev/cncodec_dev"
mlu100DeviceName = "/dev/cambricon_c10Dev"

mluMonitorDeviceName = "/dev/cambricon_ctl"
mluMsgqDeviceName = "/dev/cambr-msgq"
mluRPCDeviceName = "/dev/cambr-rpc"
mluCmsgDeviceName = "/dev/cmsg_ctrl"
mluDeviceName = "/dev/cambricon_dev"
mluCommuDeviceName = "/dev/commu"

VirtualizationNum = "VIRTUALIZATION_NUM"
)

type deviceList struct {
hasCnmonDev bool
hasCodecDev bool
hasC10Dev bool

hasCtrlDev bool
hasMsgqDev bool
hasRPCDev bool
hasCmsgDev bool
hasCommuDev bool
}

func newDeviceList() *deviceList {
return &deviceList{
hasCnmonDev: hostDeviceExistsWithPrefix(mlu100MonitorDeviceName),
hasCodecDev: hostDeviceExistsWithPrefix(mlu100CodecDeviceName),
hasC10Dev: hostDeviceExistsWithPrefix(mlu100DeviceName),
hasCtrlDev: hostDeviceExistsWithPrefix(mluMonitorDeviceName),
hasMsgqDev: hostDeviceExistsWithPrefix(mluMsgqDeviceName),
hasRPCDev: hostDeviceExistsWithPrefix(mluRPCDeviceName),
hasCmsgDev: hostDeviceExistsWithPrefix(mluCmsgDeviceName),
hasCommuDev: hostDeviceExistsWithPrefix(mluCommuDeviceName),
}
}

func hostDeviceExistsWithPrefix(prefix string) bool {
matches, err := filepath.Glob(prefix + "*")
if err != nil {
log.Printf("failed to know if host device with prefix exists, err: %v \n", err)
return false
}
return len(matches) > 0
}

func check(err error) {
if err != nil {
log.Panicln("Fatal:", err)
}
}

func generateFakeDevs(origin *cndev.Device, num int, sriovEnabled bool) ([]*pluginapi.Device, []*cndev.Device) {
var devs []*pluginapi.Device
var devsInfo []*cndev.Device
var uuid string
path := origin.Path
for i := 0; i < num; i++ {
if sriovEnabled {
path = fmt.Sprintf("%svf%d", origin.Path, i+1)
uuid = fmt.Sprintf("%s--fake--%d", origin.UUID, i+1)
} else {
uuid = fmt.Sprintf("%s-_-%d", origin.UUID, i+1)
}
devsInfo = append(devsInfo, &cndev.Device{
Slot: origin.Slot,
UUID: uuid,
Path: path,
})
devs = append(devs, &pluginapi.Device{
ID: uuid,
Health: pluginapi.Healthy,
})
}
return devs, devsInfo
}

func getDevices(feature int) ([]*pluginapi.Device, []*cndev.Device) {
var devs []*pluginapi.Device
var devsInfo []*cndev.Device

num, err := cndev.GetDeviceCount()
check(err)

fakeNum := 0
if feature == sriovShare || feature == envShare {
fakeNum, err = getVirtualizationNum()
check(err)
}

for i := uint(0); i < num; i++ {
d, err := cndev.NewDeviceLite(i, feature == sriovShare)
check(err)
switch feature {
case envShare:
devices, infos := generateFakeDevs(d, fakeNum, false)
devs = append(devs, devices...)
devsInfo = append(devsInfo, infos...)
case sriovShare:
err = d.EnableSriov(fakeNum)
check(err)
devices, infos := generateFakeDevs(d, fakeNum, true)
devs = append(devs, devices...)
devsInfo = append(devsInfo, infos...)
default:
devsInfo = append(devsInfo, d)
devs = append(devs, &pluginapi.Device{
ID: d.UUID,
Health: pluginapi.Healthy,
})
}
}
return devs, devsInfo
}

func deviceExists(devs []*pluginapi.Device, id string) bool {
for _, d := range devs {
if d.ID == id {
return true
}
}
return false
}

func watchUnhealthy(ctx context.Context, devs []*pluginapi.Device, devsInfo []*cndev.Device, unhealthy chan<- *pluginapi.Device) {
healthCheck := true
for {
select {
case <-ctx.Done():
return
default:
}
if healthCheck {
for _, dm := range devsInfo {
ret, err := dm.GetGeviceHealthState(1)
if err != nil {
healthCheck = false
log.Printf("Failed to get Device %s healthy status, stop the healthy check", dm.UUID)
}
if ret == 0 {
for _, d := range devs {
if d.ID == dm.UUID {
log.Printf("Unhealthy device :%s\n", d.ID)
unhealthy <- d
break
}
}
}
}
}
//Sleep 1 second between two health checks
time.Sleep(time.Second)
}
}

func getVirtualizationNum() (int, error) {
s := os.Getenv(VirtualizationNum)
num, err := strconv.Atoi(s)
if err != nil {
return 0, err
}
if num < 1 {
return 0, fmt.Errorf("num %d should be larger than 0", num)
}
return num, nil
}

+ 0
- 98
third-party/cambricon-k8s-device-plugin/device-plugin/cambricon_test.go View File

@@ -1,98 +0,0 @@
// Copyright 2020 Cambricon, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 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.

package main

import (
"fmt"
"log"
"os"
"testing"

"github.com/cambricon/cambricon-k8s-device-plugin/device-plugin/pkg/cndev"
"github.com/stretchr/testify/assert"
)

func TestMain(m *testing.M) {
err := cndev.Init()
if err != nil {
log.Fatal(err)
}
ret := m.Run()
if ret != 0 {
os.Exit(ret)
}
err = cndev.Release()
if err != nil {
log.Fatal(err)
}
}

func TestGetDevices(t *testing.T) {

devs, devsInfo := getDevices(0)
assert.Equal(t, 8, len(devs))
assert.Equal(t, fmt.Sprintf("MLU-%x", 2701114), devs[3].ID)
assert.Equal(t, 8, len(devsInfo))
assert.Equal(t, fmt.Sprintf("MLU-%x", 2701114), devsInfo[3].UUID)
assert.Equal(t, uint(3), devsInfo[3].Slot)
assert.Equal(t, "/dev/cambricon_dev3", devsInfo[3].Path)

err := os.Setenv(VirtualizationNum, "2")
assert.NoError(t, err)
devs, devsInfo = getDevices(envShare)
assert.Equal(t, 16, len(devs))
assert.Equal(t, fmt.Sprintf("MLU-%x-_-2", 2701112), devs[3].ID)
assert.Equal(t, 16, len(devsInfo))
assert.Equal(t, fmt.Sprintf("MLU-%x-_-2", 2701112), devsInfo[3].UUID)
assert.Equal(t, uint(1), devsInfo[3].Slot)
assert.Equal(t, "/dev/cambricon_dev1", devsInfo[3].Path)
err = os.Unsetenv(VirtualizationNum)
assert.NoError(t, err)
}

func TestGenerateFakeDevs(t *testing.T) {
d := &cndev.Device{
Slot: 1,
UUID: fmt.Sprintf("MLU-%x", 2701112),
Path: "/dev/cambricon_dev1",
}
devs, devsInfo := generateFakeDevs(d, 4, true)
assert.Equal(t, 4, len(devs))
assert.Equal(t, fmt.Sprintf("MLU-%x--fake--4", 2701112), devs[3].ID)
assert.Equal(t, 4, len(devsInfo))
assert.Equal(t, fmt.Sprintf("MLU-%x--fake--4", 2701112), devsInfo[3].UUID)
assert.Equal(t, "/dev/cambricon_dev1vf4", devsInfo[3].Path)
assert.Equal(t, uint(1), devsInfo[3].Slot)
devs, devsInfo = generateFakeDevs(d, 2, false)
assert.Equal(t, 2, len(devs))
assert.Equal(t, fmt.Sprintf("MLU-%x-_-2", 2701112), devs[1].ID)
assert.Equal(t, 2, len(devsInfo))
assert.Equal(t, fmt.Sprintf("MLU-%x-_-2", 2701112), devsInfo[1].UUID)
assert.Equal(t, "/dev/cambricon_dev1", devsInfo[1].Path)
assert.Equal(t, uint(1), devsInfo[1].Slot)
}

func TestHostDeviceExistsWithPrefix(t *testing.T) {
filename := "/tmp/cambricon_dev0"
prefix := "/tmp/cambricon_dev"
_, err := os.Create(filename)
assert.NoError(t, err)
res := hostDeviceExistsWithPrefix(prefix)
assert.Equal(t, res, true)
err = os.Remove(filename)
assert.NoError(t, err)
res = hostDeviceExistsWithPrefix(prefix)
assert.Equal(t, res, false)
}

+ 0
- 34
third-party/cambricon-k8s-device-plugin/device-plugin/create_release_package.sh View File

@@ -1,34 +0,0 @@
#!/bin/bash
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

set -e

usage() {
echo "Usage:"
echo "$0 TAG"
exit 0
}

tag=$1
[[ $tag == "" ]] && usage

rm -rf image
mkdir -p image
TAG=$tag ./build_image.sh
sed "s|v[0-9]\.[0-9].[0-9]|$tag|g" examples/cambricon-device-plugin-daemonset.yaml > image/cambricon-device-plugin-daemonset.yaml
sed "s|v[0-9]\.[0-9].[0-9]|$tag|g" examples/cambricon-device-plugin-static-pod.yaml > image/cambricon-device-plugin-static-pod.yaml
cp examples/pod.yaml image/

tar -zcvf cambricon_k8s_device_plugin_packages_"$tag".tar.gz image

+ 0
- 48
third-party/cambricon-k8s-device-plugin/device-plugin/examples/cambricon-device-plugin-static-pod.yaml View File

@@ -1,48 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

apiVersion: v1
kind: Pod
metadata:
name: cambricon-device-plugin-static-pod
namespace: kube-system
spec:
containers:
- image: cambricon-k8s-device-plugin:v1.1.1
name: cambricon-device-plugin-ctr
command:
- /usr/bin/k8s-device-plugin
args:
- -mode
- default # switch mode here
env:
# change this if env-share mode or sriov mode is enabled.
- name: VIRTUALIZATION_NUM
value: "0"
securityContext:
privileged: true
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
# mount sys if sriov mode is enabled
- name: sys
mountPath: /sys
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
# mount sys if sriov mode is enabled
- name: sys
hostPath:
path: /sys

+ 0
- 38
third-party/cambricon-k8s-device-plugin/device-plugin/examples/deployment.yaml View File

@@ -1,38 +0,0 @@
# Copyright 2020 Cambricon, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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.

apiVersion: apps/v1
kind: Deployment
metadata:
name: binpack-n1
labels:
app: binpack-n1
spec:
replicas: 1
selector: # define how the deployment finds the pods it mangages
matchLabels:
app: binpack-1
template: # define the pods specifications
metadata:
labels:
app: binpack-1
spec:
containers:
- name: binpack-1
image: ubuntu:18.04
command: ["sleep"]
args: ["100000"]
resources:
limits:
cambricon.com/mlu: 1

+ 0
- 11
third-party/cambricon-k8s-device-plugin/device-plugin/go.mod View File

@@ -1,11 +0,0 @@
module github.com/cambricon/cambricon-k8s-device-plugin/device-plugin

go 1.13

require (
github.com/fsnotify/fsnotify v1.4.9
github.com/stretchr/testify v1.4.0
golang.org/x/net v0.0.0-20200822124328-c89045814202
google.golang.org/grpc v1.31.1
k8s.io/kubelet v0.19.0
)

+ 0
- 373
third-party/cambricon-k8s-device-plugin/device-plugin/go.sum View File

@@ -1,373 +0,0 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw=
k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU=
k8s.io/component-base v0.19.0/go.mod h1:dKsY8BxkA+9dZIAh2aWJLL/UdASFDNtGYTCItL4LM7Y=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
k8s.io/kubelet v0.19.0 h1:1x+ZC2o7rRKy+bMen5u3PpBdterOck7i4EpZUM3zDfE=
k8s.io/kubelet v0.19.0/go.mod h1:cGds22piF/LnFzfAaIT+efvOYBHVYdunqka6NVuNw9g=
k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=

+ 0
- 135
third-party/cambricon-k8s-device-plugin/device-plugin/main.go View File

@@ -1,135 +0,0 @@
// Copyright 2020 Cambricon, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 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.

package main

import (
"flag"
"log"
"os"
"os/signal"
"syscall"

"github.com/cambricon/cambricon-k8s-device-plugin/device-plugin/pkg/cndev"
"github.com/fsnotify/fsnotify"
pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
)

const (
sriovShare int = iota + 1
envShare
)

var mode = flag.String("mode", "default",
`default: default version; mode number 0.
sriov: MLU is divided into VFs by SR-IOV on host machine; mode number 1.
env-share: A whole MLU can be allocated to multiple containers; A container can only use one MLU. mode number 2.
`)

func main() {

flag.Parse()

log.Println("Loading CNDEV")
if err := cndev.Init(); err != nil {
log.Printf("Failed to initialize CNDEV: %s.", err)

select {}
}
defer func() { log.Println("Shutdown of CNDEV returned:", cndev.Release()) }()

log.Println("Fetching devices.")
n, err := cndev.GetDeviceCount()
check(err)
if n == 0 {
log.Println("No devices found. Waiting indefinitely.")
select {}
}

log.Println("Starting FS watcher.")
watcher, err := startFSWatcher(pluginapi.DevicePluginPath)
if err != nil {
log.Println("Failed to created FS watcher.")
os.Exit(1)
}
defer watcher.Close()

log.Println("Starting OS watcher.")
sigs := startOSWatcher(syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)

restart := true
var devicePlugin *CambriconDevicePlugin

L:
for {
if restart {
if devicePlugin != nil {
devicePlugin.Stop()
}

devicePlugin = NewCambriconDevicePlugin()
if err := devicePlugin.Serve(); err != nil {
log.Println("Could not contact Kubelet, retrying. Did you enable the device plugin feature gate?")
} else {
restart = false
}
}

select {
case event := <-watcher.Events:
if event.Name == pluginapi.KubeletSocket && event.Op&fsnotify.Create == fsnotify.Create {
log.Printf("inotify: %s created, restarting.", pluginapi.KubeletSocket)
restart = true
}

case err := <-watcher.Errors:
log.Printf("inotify: %s", err)

case s := <-sigs:
switch s {
case syscall.SIGHUP:
log.Println("Received SIGHUP, restarting.")
restart = true
default:
log.Printf("Received signal \"%v\", shutting down.", s)
devicePlugin.Stop()
break L
}
}
}
}

func startFSWatcher(files ...string) (*fsnotify.Watcher, error) {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return nil, err
}

for _, f := range files {
err = watcher.Add(f)
if err != nil {
watcher.Close()
return nil, err
}
}

return watcher, nil
}

func startOSWatcher(sigs ...os.Signal) chan os.Signal {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, sigs...)

return sigChan
}

+ 0
- 112
third-party/cambricon-k8s-device-plugin/device-plugin/pkg/cndev/bindings.go View File

@@ -1,112 +0,0 @@
// Copyright 2020 Cambricon, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 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.

package cndev

// #cgo LDFLAGS: -ldl
// #include "include/cndev.h"
// #include "cndev_dl.h"
import "C"

import (
"errors"
"fmt"
"time"
)

func errorString(ret C.cndevRet_t) error {
if ret == C.CNDEV_SUCCESS {
return nil
}
err := C.GoString(C.cndevGetErrorString(ret))
return fmt.Errorf("cndev: %v", err)
}

func Init() error {
r := C.cndevInit_dl()
if r == C.CNDEV_ERROR_UNINITIALIZED {
return errors.New("could not load CNDEV library")
}
return errorString(r)
}

func Release() error {
r := C.cndevRelease_dl()
return errorString(r)
}

func GetDeviceCount() (uint, error) {
var cardInfos C.cndevCardInfo_t
cardInfos.version = C.int(1)
r := C.cndevGetDeviceCount(&cardInfos)
return uint(cardInfos.Number), errorString(r)
}

func getDeviceUUID(idx uint) (string, error) {
var cardSN C.cndevCardSN_t
cardSN.version = C.int(3)
r := C.cndevGetCardSN(&cardSN, C.int(idx))
err := errorString(r)
if err != nil {
return "", err
}
sn := fmt.Sprintf("%x", int(cardSN.sn))
uuid := "MLU-" + sn
return uuid, nil
}

func getDevicePath(idx uint) (string, error) {
var cardName C.cndevCardName_t
var path string
cardName.version = C.int(3)
r := C.cndevGetCardName(&cardName, C.int(idx))
err := errorString(r)
if err != nil {
return "", err
}
cardType := cardName.id
if cardType == C.MLU100 {
path = fmt.Sprintf("/dev/cambricon_c10Dev%d", idx)
} else {
path = fmt.Sprintf("/dev/cambricon_dev%d", idx)
}
return path, nil
}

func getDeviceHealthState(idx uint, delayTime int) (int, error) {
var ret C.cndevRet_t
var cardHealthState C.cndevCardHealthState_t
var healthCode int
cardHealthState.version = C.int(3)
// sleep for some seconds
time.Sleep(time.Duration(delayTime) * time.Second)
ret = C.cndevGetCardHealthState(&cardHealthState, C.int(idx))
healthCode = int(cardHealthState.health)
return healthCode, errorString(ret)
}

func getDevicePCIeInfo(idx uint) (*pcie, error) {
var pcieInfo C.cndevPCIeInfo_t
pcieInfo.version = C.int(3)
r := C.cndevGetPCIeInfo(&pcieInfo, C.int(idx))
if err := errorString(r); err != nil {
return nil, err
}
return &pcie{
domain: int(pcieInfo.domain),
bus: int(pcieInfo.bus),
device: int(pcieInfo.device),
function: int(pcieInfo.function),
}, nil
}

+ 0
- 72
third-party/cambricon-k8s-device-plugin/device-plugin/pkg/cndev/bindings_test.go View File

@@ -1,72 +0,0 @@
// Copyright 2020 Cambricon, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 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.

package cndev

import (
"fmt"
"log"
"os"
"testing"

"github.com/stretchr/testify/assert"
)

func TestMain(m *testing.M) {
err := Init()
if err != nil {
log.Fatal(err)
}
ret := m.Run()
if ret != 0 {
os.Exit(ret)
}
err = Release()
if err != nil {
log.Fatal(err)
}
}

func TestGetDeviceCount(t *testing.T) {
count, err := GetDeviceCount()
assert.NoError(t, err)
assert.Equal(t, uint(8), count)
}

func TestGetDeviceUUID(t *testing.T) {
uuid, err := getDeviceUUID(uint(0))
assert.NoError(t, err)
assert.Equal(t, fmt.Sprintf("MLU-%x", 2701111), uuid)
}

func TestGetDevicePath(t *testing.T) {
path, err := getDevicePath(uint(1))
assert.NoError(t, err)
assert.Equal(t, "/dev/cambricon_dev1", path)
}

func TestGetDeviceHealthState(t *testing.T) {
health, err := getDeviceHealthState(uint(0), 1)
assert.NoError(t, err)
assert.Equal(t, 1, health)
}

func TestGetDevicePCIeInfo(t *testing.T) {
pcie, err := getDevicePCIeInfo(uint(0))
assert.NoError(t, err)
assert.Equal(t, 0, pcie.domain)
assert.Equal(t, 12, pcie.bus)
assert.Equal(t, 13, pcie.device)
assert.Equal(t, 1, pcie.function)
}

+ 0
- 155
third-party/cambricon-k8s-device-plugin/device-plugin/pkg/cndev/cndev.go View File

@@ -1,155 +0,0 @@
// Copyright 2020 Cambricon, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 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.

package cndev

import (
"bytes"
"errors"
"fmt"
"io/ioutil"
"log"
"os/exec"
"strconv"
"strings"
"time"
)

type pcie struct {
domain int
bus int
device int
function int
}

type Device struct {
Slot uint
UUID string
Path string
pcie *pcie
}

func NewDeviceLite(idx uint, pcieAware bool) (*Device, error) {
var pcie *pcie

uuid, err := getDeviceUUID(idx)
if err != nil {
return nil, err
}
path, err := getDevicePath(idx)
if err != nil {
return nil, err
}

if pcieAware {
pcie, err = getDevicePCIeInfo(idx)
if err != nil {
return nil, err
}
}

return &Device{
Slot: idx,
UUID: uuid,
Path: path,
pcie: pcie,
}, nil
}

func (d *Device) GetGeviceHealthState(delayTime int) (int, error) {
return getDeviceHealthState(d.Slot, delayTime)
}

func (d *Device) GetPCIeID() (string, error) {
if d.pcie == nil {
return "", errors.New("device has no PCIe info")
}
domain := strconv.FormatInt(int64(d.pcie.domain), 16)
domain = strings.Repeat("0", 4-len([]byte(domain))) + domain
bus := strconv.FormatInt(int64(d.pcie.bus), 16)
if d.pcie.bus < 16 {
bus = "0" + bus
}
device := strconv.FormatInt(int64(d.pcie.device), 16)
if d.pcie.device < 16 {
device = "0" + device
}
function := strconv.FormatInt(int64(d.pcie.function), 16)
return domain + ":" + bus + ":" + device + "." + function, nil
}

func (d *Device) EnableSriov(num int) error {
err := d.ValidateSriovNum(num)
if err != nil {
return err
}
id, err := d.GetPCIeID()
if err != nil {
return err
}
path := "/sys/bus/pci/devices/" + id + "/sriov_numvfs"
vf, err := getNumFromFile(path)
if err != nil {
return err
}
if vf == 0 {
return enableSriov(id, num)
}
if vf != num {
return fmt.Errorf("sriov enabled. vf number %d different from set %d", vf, num)
}
log.Println("sriov already enabled, pass")
return nil
}

func (d *Device) ValidateSriovNum(num int) error {
id, err := d.GetPCIeID()
if err != nil {
return err
}
path := "/sys/bus/pci/devices/" + id + "/sriov_totalvfs"
max, err := getNumFromFile(path)
if err != nil {
return err
}
if num < 1 || num > max {
return fmt.Errorf("invalid sriov number %d, maximum: %d, minimum: 1", num, max)
}
return nil
}

func getNumFromFile(path string) (int, error) {
output, err := ioutil.ReadFile(path)
if err != nil {
return 0, err
}
output = bytes.Trim(output, "\n")
num, err := strconv.ParseInt(string(output), 10, 64)
return int(num), err
}

func enableSriov(id string, num int) error {
path := "/sys/bus/pci/devices/" + id + "/sriov_numvfs"
command := "echo " + strconv.Itoa(num) + " > " + path
err := exec.Command("bash", "-c", command).Run()
if err != nil {
return err
}
time.Sleep(time.Second)
newNum, err := getNumFromFile(path)
if err != nil || newNum != num {
return fmt.Errorf("the number of VFs is still not correct after enabling vf again. new: %d, err: %v", newNum, err)
}
return nil
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save