mirror of https://github.com/apache/cloudstack.git
186 lines
5.0 KiB
Vue
186 lines
5.0 KiB
Vue
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you 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.
|
|
|
|
<template>
|
|
<div>
|
|
<a-card class="breadcrumb-card">
|
|
<a-row>
|
|
<a-col :span="24" style="padding-left: 12px">
|
|
<breadcrumb>
|
|
<a-tooltip placement="bottom" slot="end">
|
|
<template slot="title">{{ $t('label.refresh') }}</template>
|
|
<a-button
|
|
style="margin-top: 4px"
|
|
:loading="loading"
|
|
shape="round"
|
|
size="small"
|
|
icon="reload"
|
|
@click="fetchData()"
|
|
>{{ $t('label.refresh') }}</a-button>
|
|
</a-tooltip>
|
|
</breadcrumb>
|
|
</a-col>
|
|
</a-row>
|
|
</a-card>
|
|
|
|
<div class="row-element">
|
|
<list-view
|
|
:columns="columns"
|
|
:items="items"
|
|
:loading="loading"
|
|
@refresh="this.fetchData" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { api } from '@/api'
|
|
import { genericCompare } from '@/utils/sort.js'
|
|
import Breadcrumb from '@/components/widgets/Breadcrumb'
|
|
import ListView from '@/components/view/ListView.vue'
|
|
|
|
export default {
|
|
name: 'CpuSockets',
|
|
components: {
|
|
ListView,
|
|
Breadcrumb
|
|
},
|
|
provide: function () {
|
|
return {
|
|
parentFetchData: this.fetchData,
|
|
parentToggleLoading: () => { this.loading = !this.loading }
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
loading: false,
|
|
items: [],
|
|
data: {},
|
|
columns: []
|
|
}
|
|
},
|
|
created () {
|
|
this.fetchData()
|
|
},
|
|
watch: {
|
|
'$i18n.locale' (to, from) {
|
|
if (to !== from) {
|
|
this.fetchData()
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
pushData (hypervisor) {
|
|
if (['BareMetal', 'LXC'].includes(hypervisor)) {
|
|
this.data[hypervisor].cpusockets = 'N/A'
|
|
}
|
|
if (hypervisor === 'Hyperv') {
|
|
this.data[hypervisor].name = 'Hyper-V'
|
|
}
|
|
this.items.push(this.data[hypervisor])
|
|
},
|
|
callListHostsWithPage (hypervisor, currentPage) {
|
|
this.loading = true
|
|
const pageSize = 100
|
|
api('listHosts', {
|
|
type: 'routing',
|
|
details: 'min',
|
|
hypervisor: hypervisor,
|
|
page: currentPage,
|
|
pagesize: pageSize
|
|
}).then(json => {
|
|
if (json.listhostsresponse.count === undefined) {
|
|
this.pushData(hypervisor)
|
|
return
|
|
}
|
|
|
|
this.data[hypervisor].hosts = json.listhostsresponse.count
|
|
this.data[hypervisor].currentHosts += json.listhostsresponse.host.length
|
|
|
|
for (const host of json.listhostsresponse.host) {
|
|
if (host.cpusockets !== undefined && isNaN(host.cpusockets) === false) {
|
|
this.data[hypervisor].cpusockets += host.cpusockets
|
|
}
|
|
}
|
|
|
|
if (this.data[hypervisor].currentHosts < this.data[hypervisor].hosts) {
|
|
this.callListHostsWithPage(hypervisor, currentPage + 1)
|
|
} else {
|
|
this.pushData(hypervisor)
|
|
}
|
|
}).finally(() => {
|
|
this.loading = false
|
|
})
|
|
},
|
|
fetchData () {
|
|
this.columns = []
|
|
this.columns.push({
|
|
dataIndex: 'name',
|
|
title: this.$t('label.hypervisor'),
|
|
sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
|
|
})
|
|
|
|
this.columns.push({
|
|
dataIndex: 'hosts',
|
|
title: this.$t('label.hosts'),
|
|
sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
|
|
})
|
|
this.columns.push({
|
|
dataIndex: 'cpusockets',
|
|
title: this.$t('label.cpu.sockets'),
|
|
sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
|
|
})
|
|
|
|
this.items = []
|
|
this.data = {}
|
|
const hypervisors = ['BareMetal', 'Hyperv', 'KVM', 'LXC', 'Ovm3', 'Simulator', 'VMware', 'XenServer']
|
|
for (const hypervisor of hypervisors) {
|
|
this.data[hypervisor] = {
|
|
name: hypervisor,
|
|
hosts: 0,
|
|
cpusockets: 0,
|
|
currentHosts: 0
|
|
}
|
|
this.callListHostsWithPage(hypervisor, 1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.breadcrumb-card {
|
|
margin-left: -24px;
|
|
margin-right: -24px;
|
|
margin-top: -18px;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.row-element {
|
|
margin-top: 10px;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.ant-breadcrumb {
|
|
vertical-align: text-bottom;
|
|
}
|
|
|
|
.ant-breadcrumb .anticon {
|
|
margin-left: 8px;
|
|
}
|
|
</style>
|