| // 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> | |
| <a-list | |
| size="small" | |
| :loading="loading" | |
| :dataSource="usageList" > | |
| <template #renderItem="{ item }"> | |
| <a-list-item class="list-item" v-if="!($route.meta.name === 'project' && item === 'project')"> | |
| <div class="list-item__container"> | |
| <strong> | |
| {{ $t('label.' + item + 'limit') }} | |
| </strong> | |
| ({{ resource[item + 'available'] === '-1' ? $t('label.unlimited') : resource[item + 'available'] }} {{ $t('label.available') }}) | |
| <div class="list-item__vals"> | |
| <div class="list-item__data"> | |
| {{ $t('label.used') }} / {{ $t('label.limit') }} : {{ resource[item + 'total'] }} / {{ resource[item + 'limit'] === '-1' ? $t('label.unlimited') : resource[item + 'limit'] }} | |
| </div> | |
| <a-progress | |
| status="normal" | |
| :percent="parseFloat(getPercentUsed(resource[item + 'total'], resource[item + 'limit']))" | |
| :format="p => resource[item + 'limit'] !== '-1' && resource[item + 'limit'] !== 'Unlimited' ? p.toFixed(2) + '%' : ''" /> | |
| </div> | |
| <a-collapse | |
| v-if="taggedUsage[item]" | |
| class="list-item__collapse" | |
| @change="handleCollapseChange(item)"> | |
| <a-collapse-panel key="1" :header="collpaseActive[item] ? $t('label.tagged.limits') : $t('label.tagged.limits') + ' - ' + this.tagData[item].tagsasstring"> | |
| <a-list | |
| size="small" | |
| :loading="loading" | |
| :dataSource="taggedUsage[item]" > | |
| <template #renderItem="{ item }"> | |
| <a-list-item class="sub-list-item"> | |
| <div class="sub-list-item__container"> | |
| <strong> | |
| {{ '#' + item.tag }} | |
| </strong> | |
| ({{ item.available === '-1' ? $t('label.unlimited') : item.available }} {{ $t('label.available') }}) | |
| <div class="sub-list-item__vals"> | |
| <div class="sub-list-item__data"> | |
| {{ $t('label.used') }} / {{ $t('label.limit') }} : {{ item.total }} / {{ item.limit === '-1' ? $t('label.unlimited') : item.limit }} | |
| </div> | |
| <a-progress | |
| status="normal" | |
| :percent="parseFloat(getPercentUsed(item.total, item.limit))" | |
| :format="p => item.limit !== '-1' && item.limit !== 'Unlimited' ? p.toFixed(2) + '%' : ''" /> | |
| </div> | |
| </div> | |
| </a-list-item> | |
| </template> | |
| </a-list> | |
| </a-collapse-panel> | |
| </a-collapse> | |
| </div> | |
| </a-list-item> | |
| </template> | |
| </a-list> | |
| </template> | |
| <script> | |
| import _ from 'lodash' | |
| export default { | |
| name: 'ResourceCountUsageTab', | |
| props: { | |
| resource: { | |
| type: Object, | |
| required: true | |
| }, | |
| loading: { | |
| type: Boolean, | |
| default: false | |
| } | |
| }, | |
| data () { | |
| return { | |
| usageList: [ | |
| 'vm', 'cpu', 'memory', 'gpu', 'primarystorage', 'volume', 'ip', 'network', | |
| 'vpc', 'secondarystorage', 'snapshot', 'template', 'project', 'backup', 'backupstorage', 'bucket', 'objectstorage' | |
| ], | |
| taggedUsage: {}, | |
| tagData: {}, | |
| collpaseActive: {} | |
| } | |
| }, | |
| created () { | |
| this.updateTaggedUsage() | |
| }, | |
| watch: { | |
| resource: { | |
| handler () { | |
| this.updateTaggedUsage() | |
| } | |
| } | |
| }, | |
| computed: { | |
| resourceTypeToNameMap () { | |
| return { | |
| 0: 'vm', | |
| 8: 'cpu', | |
| 9: 'memory', | |
| 16: 'gpu', | |
| 2: 'volume', | |
| 10: 'primarystorage' | |
| } | |
| } | |
| }, | |
| methods: { | |
| getPercentUsed (total, limit) { | |
| return (limit === 'Unlimited') ? 0 : (total / limit) * 100 | |
| }, | |
| addTaggedUsageToList (taggedResource) { | |
| var type = this.resourceTypeToNameMap['' + taggedResource.resourcetype] | |
| if (!type) { | |
| return | |
| } | |
| var typeResourceList = [] | |
| if (this.taggedUsage[type]) { | |
| typeResourceList = this.taggedUsage[type] | |
| } | |
| if (taggedResource.limit === -1) { | |
| taggedResource.limit = '-1' | |
| } | |
| if (taggedResource.available === -1) { | |
| taggedResource.available = '-1' | |
| } | |
| if (['primarystorage'].includes(type)) { | |
| taggedResource.limit = taggedResource.limit === '-1' ? '-1' : this.$bytesToGiB(taggedResource.limit) | |
| taggedResource.total = this.$bytesToGiB(taggedResource.total) | |
| taggedResource.available = taggedResource.available === '-1' ? '-1' : this.$bytesToGiB(taggedResource.available) | |
| } | |
| typeResourceList.push(taggedResource) | |
| typeResourceList = typeResourceList.sort((a, b) => a.tag.localeCompare(b.tag)) | |
| this.taggedUsage[type] = typeResourceList | |
| }, | |
| updateTaggedUsage () { | |
| this.taggedUsage = {} | |
| this.tagData = {} | |
| if (!this.resource || !this.resource.taggedresources) { | |
| return | |
| } | |
| for (var taggedResource of this.resource.taggedresources) { | |
| this.addTaggedUsageToList(taggedResource) | |
| } | |
| for (var i in this.taggedUsage) { | |
| var tags = _.map(this.taggedUsage[i], 'tag') | |
| var tagsAsString = '#' + tags.join(', #') | |
| this.tagData[i] = { | |
| tags: tags, | |
| tagsasstring: tagsAsString | |
| } | |
| } | |
| }, | |
| handleCollapseChange (type) { | |
| if (this.collpaseActive[type]) { | |
| this.collpaseActive[type] = null | |
| return | |
| } | |
| this.collpaseActive[type] = true | |
| } | |
| } | |
| } | |
| </script> | |
| <style scoped lang="scss"> | |
| .list-item { | |
| &__container { | |
| max-width: 90%; | |
| width: 100%; | |
| @media (min-width: 760px) { | |
| max-width: 95%; | |
| } | |
| } | |
| &__collapse { | |
| margin-top: 10px; | |
| margin-bottom: 10px; | |
| } | |
| &__title { | |
| font-weight: bold; | |
| } | |
| &__data { | |
| margin-right: 20px; | |
| white-space: nowrap; | |
| } | |
| &__vals { | |
| margin-top: 10px; | |
| @media (min-width: 760px) { | |
| display: flex; | |
| } | |
| } | |
| } | |
| .sub-list-item { | |
| &__container { | |
| max-width: 90%; | |
| width: 100%; | |
| @media (min-width: 760px) { | |
| max-width: 95%; | |
| } | |
| } | |
| &__title { | |
| font-weight: bold; | |
| } | |
| &__data { | |
| margin-right: 20px; | |
| white-space: nowrap; | |
| } | |
| &__vals { | |
| margin-top: 10px; | |
| @media (min-width: 760px) { | |
| display: flex; | |
| } | |
| } | |
| } | |
| </style> |