Skip to content

Commit 9bc4ac9

Browse files
updated node valid states
1 parent 90f33fc commit 9bc4ac9

File tree

4 files changed

+41
-32
lines changed

4 files changed

+41
-32
lines changed

frontend/kubecloud-v2/components/deploy-cluster/place/PlaceVMsNode.vue

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
<v-expand-transition>
3434
<div v-if="activeNode">
35-
<NodeListItem active :node="activeNode!" />
35+
<NodeListItem :active="modelValue.node?.valid" :deactive="!modelValue.node?.valid" :node="activeNode!" />
3636
</div>
3737
</v-expand-transition>
3838

@@ -44,7 +44,7 @@
4444
>
4545
<VDivider v-if="index !== 0" />
4646
<NodeListItem
47-
:active="modelValue.nodeId === node.nodeId"
47+
:disabled="pickedNodes.includes(node.nodeId!)"
4848
:node="node"
4949
@reserve="$emit('reserve', node.nodeId!)"
5050
@pick="getNodeStoragePool(undefined, $event)"
@@ -58,28 +58,28 @@
5858
<script setup lang="ts">
5959
import type { HandlersNodesWithDiscount } from "~/generated/api"
6060
61-
const props = defineProps<{ modelValue: ClusterNode, allNodes: HandlersNodesWithDiscount[], nodes: HandlersNodesWithDiscount[] }>()
61+
const props = defineProps<{ modelValue: ClusterNode, pickedNodes: number[], nodes: HandlersNodesWithDiscount[] }>()
6262
const emit = defineEmits<{
6363
(e: "reserve", nodeId: number): void
64-
(e: "pick", nodeId: number | null): void
64+
(e: "pick", node: null | { id: number, valid: boolean }): void
6565
}>()
6666
6767
const { loadingNode, setLoadingNode } = inject(NodePickCtxKey)!
6868
69-
const activeNode = computed(() => props.allNodes.filter(n => n.nodeId === props.modelValue.nodeId)[0])
69+
const activeNode = computed(() => props.nodes.filter(n => n.nodeId === props.modelValue.node?.id)[0])
7070
7171
const api = useApi()
7272
const { execute: getNodeStoragePool } = useAsyncState(async (node: HandlersNodesWithDiscount) => {
7373
setLoadingNode(node.nodeId!)
74-
emit("pick", null)
75-
/* const { data } = */await api.nodes.getNodeStoragePool(node.nodeId!.toString())
76-
return node.nodeId!
77-
}, null, {
78-
immediate: false,
79-
onSuccess(nodeId) {
74+
try {
75+
/* const { data } = */ await api.nodes.getNodeStoragePool(node.nodeId!.toString())
76+
emit("pick", { id: node.nodeId!, valid: true })
77+
}
78+
catch {
79+
emit("pick", { id: node.nodeId!, valid: false })
80+
}
81+
finally {
8082
setLoadingNode(undefined)
81-
emit("pick", nodeId!)
82-
},
83-
onError() { setLoadingNode(undefined) },
84-
})
83+
}
84+
}, null, { immediate: false })
8585
</script>

frontend/kubecloud-v2/components/deploy-cluster/place/PlaceVMsNodes.vue

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,45 @@
1616
mandatory
1717
@update:model-value="nodeTab = ($event.split('|') as ['masters' | 'workers', number])"
1818
>
19-
<DefineNodeTab #="{ text, value, active }">
19+
<DefineNodeTab #="{ text, value, active, deactive }">
2020
<v-tab
2121
:value="value"
2222
:text="text"
23-
:style="{ borderRadius: '0 4px 4px 0 !important', backgroundColor: active ? 'rgba(var(--v-theme-success), 0.12)' : nodeTab.join('|') === value ? 'rgba(var(--v-theme-primary), 0.12)' : undefined }"
24-
:class="{ 'text-success': active }"
23+
:style="{ borderRadius: '0 !important', backgroundColor: deactive ? 'rgba(var(--v-theme-error), 0.12)' : active ? 'rgba(var(--v-theme-success), 0.12)' : nodeTab.join('|') === value ? 'rgba(var(--v-theme-primary), 0.12)' : undefined }"
24+
:class="{ 'text-success': active, 'text-error': deactive }"
2525
/>
2626
</DefineNodeTab>
2727

2828
<ReuseNodeTab
2929
v-for="(node, index) in cluster.masters"
3030
:key="node.id"
31-
:text="`${node.name} (${node.type})`"
31+
:text="`${node.name} (${node.type})${node.node ? ` [${node.node.id}]` : ''}`"
3232
:value="`masters|${index}`"
3333
:loading="loadingNode && nodeTab.join('|') === `masters|${index}`"
3434
:disabled="loadingNode && nodeTab.join('|') !== `masters|${index}`"
35-
:active="!!node.nodeId"
35+
:active="!!node.node && node.node.valid"
36+
:deactive="!!node.node && !node.node.valid"
3637
/>
3738

3839
<ReuseNodeTab
3940
v-for="(node, index) in cluster.workers"
4041
:key="node.id"
41-
:text="`${node.name} (${node.type})`"
42+
:text="`${node.name} (${node.type})${node.node ? ` [${node.node.id}]` : ''}`"
4243
:value="`workers|${index}`"
4344
:loading="loadingNode && nodeTab.join('|') === `workers|${index}`"
4445
:disabled="loadingNode && nodeTab.join('|') !== `workers|${index}`"
45-
:active="!!node.nodeId"
46+
:active="!!node.node && node.node.valid"
47+
:deactive="!!node.node && !node.node.valid"
4648
/>
4749
</v-tabs>
4850

4951
<div v-if="cluster[nodeTab[0]][nodeTab[1]]" class="flex-grow-1">
5052
<PlaceVMsNode
5153
v-model="cluster[nodeTab[0]][nodeTab[1]]!"
52-
:all-nodes="_nodes"
54+
:picked-nodes="pickedNodes"
5355
:nodes="nodes"
5456
@reserve="onReserveNode"
55-
@pick="$props.cluster[nodeTab[0]][nodeTab[1]]!.nodeId = $event"
57+
@pick="$props.cluster[nodeTab[0]][nodeTab[1]]!.node = $event"
5658
/>
5759
</div>
5860
</div>
@@ -65,7 +67,7 @@ import type { HandlersNodesWithDiscount, ListRentableNodes200Response } from "~/
6567
const props = defineProps<{ cluster: ClusterForm }>()
6668
6769
const [DefineNodeTab, ReuseNodeTab] = createReusableTemplate({
68-
props: { text: String, value: String, active: Boolean },
70+
props: { text: String, value: String, active: Boolean, deactive: Boolean },
6971
})
7072
7173
const { loadingNode } = inject(NodePickCtxKey)!
@@ -101,11 +103,15 @@ function onReserveNode(nodeId: number): void {
101103
_nodes.value = _nodes.value.map(n => n.nodeId === nodeId ? { ...n, rented: true } : n)
102104
}
103105
106+
const pickedNodes = computed(() => {
107+
return props.cluster.masters.concat(props.cluster.workers).map(n => n.node?.id).filter(v => !!v) as number[]
108+
})
104109
const nodes = computed(() => {
105-
const pickedNodes = props.cluster.masters.concat(props.cluster.workers).map(n => n.nodeId)
110+
// const pickedNodes = props.cluster.masters.concat(props.cluster.workers).map(n => n.nodeId)
106111
return _nodes.value.filter((n) => {
107112
const regionFilter = !props.cluster.region || n.location?.region === props.cluster.region
108-
return regionFilter && !pickedNodes.includes(n.nodeId!)
113+
// return regionFilter && !pickedNodes.includes(n.nodeId!)
114+
return regionFilter
109115
})
110116
})
111117
</script>

frontend/kubecloud-v2/components/nodes/NodeListItem.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<template>
22
<v-card
33
:loading="loadingNode === node.nodeId"
4-
:disabled="!!loadingNode && loadingNode !== node.nodeId"
5-
:class="{ 'opacity-50': !!loadingNode && loadingNode !== node.nodeId }"
4+
:disabled="disabled || (!!loadingNode && loadingNode !== node.nodeId)"
5+
:class="{ 'opacity-50': disabled || (!!loadingNode && loadingNode !== node.nodeId) }"
66
flat
77
rounded="0"
88
:style="{ padding: '16px !important', border: 'none !important' }"
@@ -123,7 +123,7 @@ import type { HandlersNodesWithDiscount } from "~/generated/api"
123123
import humanizeDuration from "humanize-duration"
124124
import prettyBytes from "pretty-bytes"
125125
126-
const props = defineProps<{ node: HandlersNodesWithDiscount, active?: boolean, deactive?: boolean }>()
126+
const props = defineProps<{ node: HandlersNodesWithDiscount, disabled?: boolean, active?: boolean, deactive?: boolean }>()
127127
const emit = defineEmits<{ (e: "reserve", nodeId: number): void, (e: "pick", node: HandlersNodesWithDiscount): void }>()
128128
129129
const { loadingNode } = inject(NodePickCtxKey)!

frontend/kubecloud-v2/utils/deploy.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ export interface ClusterNode {
1515
cpu: number
1616
memory: number
1717
disk: number
18-
nodeId: number | null
18+
node: null | {
19+
id: number
20+
valid: boolean
21+
}
1922
sshKeys: number[]
2023
}
2124

@@ -28,7 +31,7 @@ export function createClusterNode(opts: Partial<ClusterNode> = {}): ClusterNode
2831
cpu: 2,
2932
memory: 4,
3033
disk: 25,
31-
nodeId: null,
34+
node: null,
3235
sshKeys: [0],
3336
...opts,
3437
}

0 commit comments

Comments
 (0)