Skip to content

Commit b81a26e

Browse files
ice201508jiuling
andauthored
feature space allow to set min replica (#1404)
* Draft MR * Main feature space allow to set min replica --------- Co-authored-by: jiuling <jl.lei@opencsg.com>
1 parent f0e3e0b commit b81a26e

File tree

3 files changed

+93
-2
lines changed

3 files changed

+93
-2
lines changed

frontend/src/components/application_spaces/ApplicationSpaceSettings.vue

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,47 @@
301301
</div>
302302
</div>
303303

304+
<el-divider />
305+
306+
<!-- min replica -->
307+
<div class="flex xl:flex-col gap-8">
308+
<div class="w-[380px] sm:w-full flex flex-col">
309+
<div class="text-sm text-gray-700 leading-5 font-medium">
310+
{{ $t('endpoints.settings.minReplica') }}
311+
</div>
312+
</div>
313+
<div class="flex flex-col gap-1.5">
314+
<p class="text-gray-700 text-sm">
315+
{{ $t('endpoints.settings.currentMinReplica') }}
316+
</p>
317+
<el-select
318+
v-model="theMinReplica"
319+
:placeholder="$t('all.select')"
320+
size="large"
321+
class="!w-[512px] sm:!w-full"
322+
:disabled="!isSpaceStopped"
323+
>
324+
<el-option
325+
:key="0"
326+
:label="0"
327+
:value="0"
328+
/>
329+
<el-option
330+
:key="1"
331+
:label="1"
332+
:value="1"
333+
/>
334+
</el-select>
335+
<CsgButton
336+
v-if="hasMinReplicaChanged"
337+
@click="updateMinReplica"
338+
class="btn btn-secondary-gray btn-sm w-fit"
339+
:name="$t('all.update')"
340+
:disabled="!isSpaceStopped"
341+
/>
342+
</div>
343+
</div>
344+
304345
<!-- docker space variables -->
305346
<el-divider v-if="theVariables && Object.keys(theVariables).length > 0"/>
306347
<div v-if="theVariables && Object.keys(theVariables).length > 0">
@@ -541,7 +582,8 @@
541582
cloudResource: String,
542583
coverImage: String,
543584
variables: Object,
544-
tags: { type: Object, default: () => ({}) }
585+
tags: { type: Object, default: () => ({}) },
586+
minReplica: Number
545587
},
546588
547589
components: { ApplicationSpaceEnvEditor },
@@ -555,11 +597,13 @@
555597
theVariables: this.variables || {},
556598
theClusterId: this.clusterId || '',
557599
theCloudResource: this.cloudResource != null ? String(this.cloudResource) : '',
600+
theMinReplica: this.minReplica != null ? this.minReplica : 0,
558601
originalApplicationSpaceNickname: this.applicationSpaceNickname || '',
559602
originalApplicationSpaceDesc: this.applicationSpaceDesc || '',
560603
originalVariables: JSON.stringify(this.variables || {}),
561604
originalClusterId: this.clusterId || '',
562605
originalCloudResource: this.cloudResource != null ? String(this.cloudResource) : '',
606+
originalMinReplica: this.minReplica != null ? this.minReplica : 0,
563607
options: [
564608
{ value: 'Private', label: this.$t('all.private') },
565609
{ value: 'Public', label: this.$t('all.public') }
@@ -656,6 +700,9 @@
656700
const originalTagIds = this.originalTags.map(tag => tag.uid).sort()
657701
const currentTagIds = this.selectedTags.map(tag => tag.uid).sort()
658702
return JSON.stringify(originalTagIds) !== JSON.stringify(currentTagIds)
703+
},
704+
hasMinReplicaChanged() {
705+
return this.theMinReplica !== this.originalMinReplica
659706
}
660707
},
661708
@@ -1103,6 +1150,11 @@
11031150
this.updateApplicationSpace(payload,this.$t('application_spaces.edit.spaceVariables'))
11041151
},
11051152
1153+
updateMinReplica() {
1154+
const payload = { min_replica: this.theMinReplica }
1155+
this.updateApplicationSpace(payload, this.$t('endpoints.settings.minReplica'))
1156+
},
1157+
11061158
async updateApplicationSpace(payload,field) {
11071159
const applicationSpaceUpdateEndpoint = `/spaces/${this.path}`
11081160
const options = {
@@ -1168,6 +1220,17 @@
11681220
}
11691221
},
11701222
immediate: true
1223+
},
1224+
minReplica: {
1225+
handler(newVal) {
1226+
if (newVal != null) {
1227+
this.theMinReplica = newVal
1228+
if (this.originalMinReplica === (this.minReplica != null ? this.minReplica : 0)) {
1229+
this.originalMinReplica = newVal
1230+
}
1231+
}
1232+
},
1233+
immediate: true
11711234
}
11721235
}
11731236
}

frontend/src/components/application_spaces/NewApplicationSpace.vue

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,31 @@
142142
/>
143143
</el-form-item>
144144

145+
<!-- min replica -->
146+
<el-form-item
147+
class="w-full"
148+
:label="$t('endpoints.settings.minReplica')"
149+
prop="min_replica"
150+
>
151+
<el-select
152+
v-model="dataForm.min_replica"
153+
:placeholder="$t('all.select')"
154+
size="large"
155+
style="width: 100%"
156+
>
157+
<el-option
158+
:key="0"
159+
:label="0"
160+
:value="0"
161+
/>
162+
<el-option
163+
:key="1"
164+
:label="1"
165+
:value="1"
166+
/>
167+
</el-select>
168+
</el-form-item>
169+
145170
<!-- Cover image upload feature temporarily disabled
146171
<el-form-item
147172
class="w-full !mb-0"
@@ -474,7 +499,8 @@
474499
visibility: 'public',
475500
sdk: 'gradio',
476501
dockerTemplate: '',
477-
driver_version: '11.8.0'
502+
driver_version: '11.8.0',
503+
min_replica: 0
478504
})
479505
const loading = ref(false)
480506
@@ -695,6 +721,7 @@
695721
if (shouldShowDriverVersion.value) {
696722
params.driver_version = dataForm.value.driver_version
697723
}
724+
params.min_replica = dataForm.value.min_replica
698725
699726
const options = {
700727
headers: { 'Content-Type': 'application/json' },

frontend/src/components/shared/RepoTabs.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@
250250
:cloudResource="repoDetail.sku || repoDetail.hardware"
251251
:coverImage="repoDetail.coverImageUrl"
252252
@showSpaceLogs="showSpaceLogs"
253+
:minReplica="repoDetail.minReplica"
253254
:sdk="sdk"
254255
:tag-list="tagList"
255256
:tags="tags"

0 commit comments

Comments
 (0)