Francesco Torchia c3f2665912
[porting 1262] Fix vm rows reactivity
Signed-off-by: Francesco Torchia <francesco.torchia@suse.com>
2025-01-09 12:06:35 +01:00

129 lines
2.9 KiB
Vue

<script>
import { STATE, AGE, NAME } from '@shell/config/table-headers';
import SortableTable from '@shell/components/SortableTable';
import Loading from '@shell/components/Loading';
import { allHash } from '@shell/utils/promise';
import { HOSTNAME } from '@shell/config/labels-annotations';
import HarvesterVmState from '../../formatters/HarvesterVmState';
import { HCI } from '../../types';
export default {
name: 'InstanceNode',
components: {
SortableTable,
Loading,
HarvesterVmState,
},
props: {
node: {
type: Object,
required: true,
},
},
async fetch() {
await allHash({
vms: this.$store.dispatch('harvester/findAll', { type: HCI.VM }),
vmis: this.$store.dispatch('harvester/findAll', { type: HCI.VMI }),
allClusterNetwork: this.$store.dispatch('harvester/findAll', { type: HCI.CLUSTER_NETWORK }),
});
},
computed: {
allClusterNetwork() {
return this.$store.getters['harvester/all'](HCI.CLUSTER_NETWORK);
},
rows() {
const vms = this.$store.getters['harvester/all'](HCI.VM);
return vms.filter((vm) => vm.vmi?.status?.nodeName === this.node?.metadata?.labels?.[HOSTNAME]);
},
headers() {
return [
STATE,
NAME,
{
name: 'vmCPU',
labelKey: 'tableHeaders.cpu',
search: false,
sort: ['spec.template.spec.domain.cpu.cores'],
value: 'spec.template.spec.domain.cpu.cores',
width: 120
},
{
name: 'vmRAM',
labelKey: 'glance.memory',
search: false,
sort: ['memorySort'],
value: 'spec.template.spec.domain.resources.limits.memory',
width: 120
},
{
name: 'ip',
label: 'IP Address',
labelKey: 'harvester.tableHeaders.vm.ipAddress',
value: 'id',
formatter: 'HarvesterIpAddress'
},
{
...AGE,
sort: 'metadata.creationTimestamp:desc',
}
];
},
},
};
</script>
<template>
<Loading v-if="$fetchState.pending" />
<div
v-else
id="host-instances"
class="row"
>
<div class="col span-12">
<SortableTable
v-bind="$attrs"
:headers="headers"
default-sort-by="age"
:rows="rows"
key-field="_key"
>
<template
#cell:state="scope"
class="state-col"
>
<div class="state">
<HarvesterVmState
class="vmstate"
:row="scope.row"
:all-cluster-network="allClusterNetwork"
/>
</div>
</template>
</Sortabletable>
</div>
</div>
</template>
<style lang="scss" scoped>
#host-instances {
:deep() thead th {
vertical-align: middle;
}
:deep() .state {
display: flex;
.vmstate {
margin-right: 6px;
}
}
}
</style>