Skip to content

Commit dbdaa92

Browse files
add deploying cluster and routing into clusters table
1 parent bf91a24 commit dbdaa92

File tree

8 files changed

+149
-20
lines changed

8 files changed

+149
-20
lines changed

frontend/kubecloud-v2/App.vue

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,18 @@
88
<app-footer />
99
</v-app>
1010
</template>
11+
12+
<!-- <script setup lang="ts">
13+
const api = useApi()
14+
15+
useAsyncState(
16+
() => api.notifications.notificationsGet(),
17+
null,
18+
{
19+
immediate: $meta.client,
20+
onSuccess(data) {
21+
console.log(data)
22+
},
23+
},
24+
)
25+
</script> -->

frontend/kubecloud-v2/components/deploy-cluster/define/DefineVMNodeForm.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
<v-row>
4747
<v-col cols="4" class="pb-0">
4848
<v-text-field
49-
v-model="$props.node.cpu"
49+
v-model.number="$props.node.cpu"
5050
:rules="[
5151
(v) => !!v || 'CPU is required',
5252
(v) => v > 0 || 'CPU must be greater than 0',
@@ -58,7 +58,7 @@
5858

5959
<v-col cols="4" class="pb-0">
6060
<v-text-field
61-
v-model="$props.node.memory"
61+
v-model.number="$props.node.memory"
6262
:rules="[
6363
(v) => !!v || 'RAM is required',
6464
(v) => v > 0 || 'RAM must be greater than 0',
@@ -70,7 +70,7 @@
7070

7171
<v-col cols="4" class="pb-0">
7272
<v-text-field
73-
v-model="$props.node.disk"
73+
v-model.number="$props.node.disk"
7474
:rules="[
7575
(v) => !!v || 'Disk size is required',
7676
(v) => v > 0 || 'Disk size must be greater than 0',

frontend/kubecloud-v2/components/deploy-cluster/define/DefineVMsForm.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<DefineVMsClusterName v-model="$props.modelValue.name" />
55
</v-col>
66

7-
<v-col cols="6">
7+
<v-col cols="12" md="6">
88
<DefineVMsNodes
99
icon="mdi-server"
1010
node-type="Master"
@@ -15,7 +15,7 @@
1515
/>
1616
</v-col>
1717

18-
<v-col cols="6">
18+
<v-col cols="12" md="6">
1919
<DefineVMsNodes
2020
icon="mdi-console"
2121
node-type="Worker"

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<template>
22
<v-row>
3-
{{ $props.modelValue.region }}
43
<v-col cols="12">
54
<PlaceVMsHead
65
v-model="$props.modelValue"

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
CPU: {{ modelValue.cpu }} vCores
2323
</v-chip>
2424
<v-chip size="small" prepend-icon="mdi-memory" color="success" class="font-weight-bold">
25-
RAM: {{ modelValue.memory }} GB
25+
RAM: {{ modelValue.memory }} GiB
2626
</v-chip>
2727
<v-chip size="small" prepend-icon="mdi-server" color="secondary" class="font-weight-bold">
28-
Disk Size: {{ modelValue.disk }} GB
28+
Disk Size: {{ modelValue.disk }} GiB
2929
</v-chip>
3030
</div>
3131
</div>
@@ -38,6 +38,10 @@
3838

3939
<v-table class="border-t border-0 border-dashed" :class="{ 'table-hidden-overflow': !!loadingNode }" :style="{ maxHeight: '400px' }">
4040
<tbody>
41+
<tr v-if="filteredNodes.length === 0" class="text-caption text-accent text-center">
42+
<VListItem title="No available nodes for the requested configuration" />
43+
</tr>
44+
4145
<tr
4246
v-for="(node, index) in filteredNodes"
4347
:key="node.nodeId"
@@ -71,17 +75,21 @@ const { loadingNode, setLoadingNode } = inject(NodePickCtxKey)!
7175
const activeNode = computed(() => props.nodes.filter(n => n.nodeId === props.modelValue.node?.id)[0])
7276
const filteredNodes = computed(() => {
7377
return props.nodes.filter((n) => {
74-
if (props.pickedNodes.includes(n.nodeId!) || props.modelValue.useFullNodeCapabilities) {
78+
const { useFullNodeCapabilities, cpu, memory, disk } = props.modelValue
79+
80+
if (props.pickedNodes.includes(n.nodeId!)) {
7581
return true
7682
}
7783
78-
const cpu = n.total_resources!.cru!
79-
const ram = n.total_resources!.mru! - n.used_resources!.mru!
80-
const ssd = n.total_resources!.sru! - n.used_resources!.sru!
84+
const cru = n.total_resources!.cru!
85+
const ram = (n.total_resources!.mru! * 0.98 - n.used_resources!.mru!) / 1024 ** 3
86+
const ssd = (n.total_resources!.sru! * 0.97 - n.used_resources!.sru!) / 1024 ** 3
87+
88+
if (useFullNodeCapabilities) {
89+
return cru >= 0 && ram >= 0 && ssd >= 0
90+
}
8191
82-
return cpu >= props.modelValue.cpu
83-
&& ram >= (props.modelValue.memory / 1024 ** 3)
84-
&& ssd >= (props.modelValue.disk / 1024 ** 3)
92+
return cru >= cpu && ram >= memory && ssd >= disk
8593
})
8694
})
8795

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,28 @@ function sortNodes(nodes: HandlersNodesWithDiscount[]): HandlersNodesWithDiscoun
9595
})
9696
}
9797
98+
/* const { state: deployments } = useAsyncState(async () => {
99+
const { data } = await api.deployments.deploymentsGet()
100+
return data.data?.deployments ?? []
101+
}, [], { immediate: $meta.client }) */
102+
98103
const { state: _nodes } = useAsyncState(async () => {
99104
const { data } = await api.nodes.listNodes()
105+
const deployments = await api.deployments
106+
.deploymentsGet()
107+
.then(v => v.data.data?.deployments ?? [])
108+
.then(v => v.map(d => d.cluster?.nodes ?? []).flat(1))
109+
.then(v => v.map(n => n.node_id))
110+
100111
const nodes = (data as ListRentableNodes200Response).data?.nodes ?? []
101-
return sortNodes(nodes)
112+
// console.log({
113+
// deployments,
114+
// nodes,
115+
// })
116+
117+
const x = sortNodes(nodes.filter(n => !deployments.includes(n.nodeId!)))
118+
119+
return x
102120
}, [], { immediate: $meta.client, resetOnExecute: false })
103121
104122
function onReserveNode(nodeId: number): void {
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<template>
2+
<v-card>
3+
<h3 class="text-h6 font-weight-bold mb-6">
4+
Cluster Configuration
5+
</h3>
6+
7+
<v-text-field
8+
:model-value="cluster.name"
9+
variant="outlined"
10+
label="Cluster Name"
11+
readonly
12+
/>
13+
14+
<div class="border border-dashed rounded-lg pa-6 position-relative">
15+
<h4
16+
class="text-body-2 font-weight-bold position-absolute bg-surface px-2"
17+
:style="{ top: 0, left: '16px', transform: 'translateY(-50%)' }"
18+
>
19+
Node Assignment
20+
</h4>
21+
22+
<v-row>
23+
<v-col v-for="node in [...cluster.masters, ...cluster.workers]" :key="node.id" cols="6">
24+
<v-card rounded="lg" flat :style="{ padding: '16px !important' }">
25+
<div class="d-flex align-center ga-2">
26+
<h4 class="text-body-1 font-weight-bold" v-text="node.name" />
27+
<v-chip
28+
:text="node.type"
29+
size="small"
30+
rounded="lg"
31+
color="primary"
32+
class="text-capitalize font-weight-bold text-caption"
33+
/>
34+
</div>
35+
36+
<v-chip
37+
v-if="node.useFullNodeCapabilities"
38+
color="success"
39+
size="small"
40+
prepend-icon="mdi-check-decagram"
41+
class="font-weight-bold mt-2"
42+
>
43+
Use Full Node Capabilities
44+
</v-chip>
45+
46+
<div v-else class="d-flex align-center flex-wrap ga-2 mt-2">
47+
<v-chip size="small" prepend-icon="mdi-cpu-64-bit" color="primary" class="font-weight-bold">
48+
CPU: {{ node.cpu }} vCores
49+
</v-chip>
50+
<v-chip size="small" prepend-icon="mdi-memory" color="success" class="font-weight-bold">
51+
RAM: {{ node.memory }} GiB
52+
</v-chip>
53+
<v-chip size="small" prepend-icon="mdi-server" color="secondary" class="font-weight-bold">
54+
Disk Size: {{ node.disk }} GiB
55+
</v-chip>
56+
</div>
57+
58+
<div cols="12" class="pb-0 d-flex align-start ga-3">
59+
<label class="text-body-2 text-no-wrap mt-2">
60+
SSH Keys:
61+
</label>
62+
63+
<v-chip-group :model-value="node.sshKeys" multiple selected-class="text-primary">
64+
<v-chip
65+
v-for="(key, index) in sshKeys"
66+
:key="key.id"
67+
filter
68+
:value="index"
69+
class="rounded"
70+
size="small"
71+
>
72+
{{ key.name }}
73+
</v-chip>
74+
</v-chip-group>
75+
</div>
76+
</v-card>
77+
</v-col>
78+
</v-row>
79+
</div>
80+
</v-card>
81+
</template>
82+
83+
<script setup lang="ts">
84+
import type { ModelsSSHKey } from "~/generated/api"
85+
86+
defineProps<{ sshKeys: ModelsSSHKey[], cluster: ClusterForm }>()
87+
</script>

frontend/kubecloud-v2/pages/dashboard/clusters/deploy.vue

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
</v-stepper-window-item>
6565

6666
<v-stepper-window-item eager :value="3">
67-
{{ cluster }}
67+
<ReviewDeployment :ssh-keys="sshKeys" :cluster="cluster" />
6868
</v-stepper-window-item>
6969
</v-stepper-window>
7070

@@ -170,20 +170,20 @@ async function toNodeInput(clusterNode: ClusterNode): Promise<HandlersNodeInput>
170170
env_vars: {
171171
SSH_KEY,
172172
K3S_TOKEN: cluster.value.token,
173+
USE_FULL_NODE_CAPABILITIES: clusterNode.useFullNodeCapabilities ? "1" : "0",
173174
},
174175
}
175176
176177
if (clusterNode.useFullNodeCapabilities) {
177178
const { nodeId, total_resources, used_resources } = clusterNode.node!.raw
178179
179-
input.cpu = total_resources!.cru!
180-
input.memory = Math.floor(((total_resources!.mru! - used_resources!.mru!) * 0.99) / 1024 ** 3) * 1024
181-
182180
const pools = await api.nodes.getNodeStoragePool(nodeId!.toString()).then(v => v.data.data?.pools ?? [])
183181
if (pools.length === 0) {
184182
throw new Error("No storage pool found")
185183
}
186184
185+
input.cpu = total_resources!.cru!
186+
input.memory = Math.floor((total_resources!.mru! * 0.99 - used_resources!.mru!) / 1024 ** 2)
187187
input.data_disks = pools.map((pool, i) => {
188188
const size = Math.floor(pool.free! * 0.985 / 1024 ** 3)
189189
return size * 1024 - (i === 0 ? root_size : 0)
@@ -193,6 +193,7 @@ async function toNodeInput(clusterNode: ClusterNode): Promise<HandlersNodeInput>
193193
return input
194194
}
195195
196+
const router = useRouter()
196197
const { execute: deployCluster, isLoading: deploying } = useAsyncState(async () => {
197198
const { name, masters, workers } = cluster.value
198199
const nodes = await Promise.all(masters.concat(workers).map(toNodeInput))
@@ -201,5 +202,6 @@ const { execute: deployCluster, isLoading: deploying } = useAsyncState(async ()
201202
token: cluster.value.token,
202203
nodes,
203204
})
205+
router.push("/dashboard/clusters")
204206
}, null, { immediate: false })
205207
</script>

0 commit comments

Comments
 (0)