diff --git a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java index d2336f3cd58e..ede42a33cead 100644 --- a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java +++ b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java @@ -59,6 +59,7 @@ import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.backup.dao.BackupRepositoryDao; import org.apache.cloudstack.cluster.ClusterDrsAlgorithm; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.ConfigKey; @@ -158,6 +159,8 @@ public class MetricsServiceImpl extends MutualExclusiveIdsManagerBase implements @Inject private ImageStoreDao imageStoreDao; @Inject + BackupRepositoryDao backupRepositoryDao; + @Inject private VMInstanceDao vmInstanceDao; @Inject private DomainRouterDao domainRouterDao; @@ -557,6 +560,7 @@ public InfrastructureResponse listInfrastructure() { response.setHosts(hostCountAndCpuSockets.first()); response.setStoragePools(storagePoolDao.countAll()); response.setImageStores(imageStoreDao.countAllImageStores()); + response.setBackupRepositories(backupRepositoryDao.countAll()); response.setObjectStores(objectStoreDao.countAllObjectStores()); response.setSystemvms(vmInstanceDao.countByTypes(VirtualMachine.Type.ConsoleProxy, VirtualMachine.Type.SecondaryStorageVm)); response.setRouters(domainRouterDao.countAllByRole(VirtualRouter.Role.VIRTUAL_ROUTER)); diff --git a/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java b/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java index cb1faf237b7d..6fda3ff59534 100644 --- a/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java +++ b/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java @@ -47,6 +47,10 @@ public class InfrastructureResponse extends BaseResponse { @Param(description = "Number of images stores") private Integer imageStores; + @SerializedName("backuprepositories") + @Param(description = "Number of backup repositories", since = "4.22.0") + private Integer backupRepositories; + @SerializedName("objectstores") @Param(description = "Number of object stores") private Integer objectStores; @@ -103,6 +107,10 @@ public void setImageStores(final Integer imageStores) { this.imageStores = imageStores; } + public void setBackupRepositories(Integer backupRepositories) { + this.backupRepositories = backupRepositories; + } + public void setSystemvms(final Integer systemvms) { this.systemvms = systemvms; } diff --git a/ui/src/config/section/config.js b/ui/src/config/section/config.js index e69f6d1e6c41..6a22585a6ed1 100644 --- a/ui/src/config/section/config.js +++ b/ui/src/config/section/config.js @@ -133,52 +133,6 @@ export default { } ] }, - { - name: 'backuprepository', - title: 'label.backup.repository', - icon: 'inbox-outlined', - docHelp: 'adminguide/backup_and_recovery.html', - permission: ['listBackupRepositories'], - searchFilters: ['zoneid'], - columns: ['name', 'provider', 'type', 'address', 'zonename'], - details: ['name', 'type', 'address', 'provider', 'zonename', 'crosszoneinstancecreation'], - actions: [ - { - api: 'addBackupRepository', - icon: 'plus-outlined', - label: 'label.backup.repository.add', - listView: true, - args: [ - 'name', 'provider', 'address', 'type', 'mountopts', 'zoneid', 'crosszoneinstancecreation' - ], - mapping: { - type: { - options: ['nfs', 'cifs', 'ceph'] - }, - provider: { - value: (record) => { return 'nas' } - } - } - }, - { - api: 'updateBackupRepository', - icon: 'edit-outlined', - label: 'label.backup.repository.edit', - message: 'message.action.edit.backup.repository', - args: ['name', 'address', 'mountopts', 'crosszoneinstancecreation'], - dataView: true, - popup: true - }, - { - api: 'deleteBackupRepository', - icon: 'delete-outlined', - label: 'label.backup.repository.remove', - message: 'message.action.delete.backup.repository', - dataView: true, - popup: true - } - ] - }, { name: 'hypervisorcapability', title: 'label.hypervisor.capabilities', diff --git a/ui/src/config/section/infra.js b/ui/src/config/section/infra.js index ae074002834d..dc365b74c930 100644 --- a/ui/src/config/section/infra.js +++ b/ui/src/config/section/infra.js @@ -23,6 +23,7 @@ import clusters from '@/config/section/infra/clusters' import hosts from '@/config/section/infra/hosts' import primaryStorages from '@/config/section/infra/primaryStorages' import secondaryStorages from '@/config/section/infra/secondaryStorages' +import backupRepositories from '@/config/section/infra/backupRepositories' import objectStorages from '@/config/section/infra/objectStorages' import systemVms from '@/config/section/infra/systemVms' import routers from '@/config/section/infra/routers' @@ -50,6 +51,7 @@ export default { hosts, primaryStorages, secondaryStorages, + backupRepositories, objectStorages, systemVms, routers, diff --git a/ui/src/config/section/infra/backupRepositories.js b/ui/src/config/section/infra/backupRepositories.js new file mode 100644 index 000000000000..aa1aa5eab4fe --- /dev/null +++ b/ui/src/config/section/infra/backupRepositories.js @@ -0,0 +1,63 @@ +// 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. + +export default { + name: 'backuprepository', + title: 'label.backup.repository', + icon: 'inbox-outlined', + docHelp: 'adminguide/nas_plugin.html', + permission: ['listBackupRepositories'], + searchFilters: ['zoneid'], + columns: ['name', 'provider', 'type', 'address', 'zonename'], + details: ['name', 'type', 'address', 'provider', 'zonename', 'crosszoneinstancecreation'], + actions: [ + { + api: 'addBackupRepository', + icon: 'plus-outlined', + label: 'label.backup.repository.add', + listView: true, + args: [ + 'name', 'provider', 'address', 'type', 'mountopts', 'zoneid', 'crosszoneinstancecreation' + ], + mapping: { + type: { + options: ['nfs', 'cifs', 'ceph'] + }, + provider: { + value: (record) => { return 'nas' } + } + } + }, + { + api: 'updateBackupRepository', + icon: 'edit-outlined', + label: 'label.backup.repository.edit', + message: 'message.action.edit.backup.repository', + args: ['name', 'address', 'mountopts', 'crosszoneinstancecreation'], + dataView: true, + popup: true + }, + { + api: 'deleteBackupRepository', + icon: 'delete-outlined', + label: 'label.backup.repository.remove', + message: 'message.action.delete.backup.repository', + dataView: true, + popup: true + } + ] +} diff --git a/ui/src/views/infra/InfraSummary.vue b/ui/src/views/infra/InfraSummary.vue index dc8559adb11b..9d4c06abd120 100644 --- a/ui/src/views/infra/InfraSummary.vue +++ b/ui/src/views/infra/InfraSummary.vue @@ -156,7 +156,7 @@ v-if="routes[section]">
- +

{{ $t(routes[section].title) }}

{{ stats[section] }}

@@ -187,7 +187,7 @@ export default { return { loading: true, routes: {}, - sections: ['zones', 'pods', 'clusters', 'hosts', 'storagepools', 'imagestores', 'objectstores', 'systemvms', 'routers', 'cpusockets', 'managementservers', 'alerts', 'ilbvms', 'metrics'], + sections: ['zones', 'pods', 'clusters', 'hosts', 'storagepools', 'imagestores', 'backuprepositories', 'objectstores', 'systemvms', 'routers', 'cpusockets', 'managementservers', 'alerts', 'ilbvms', 'metrics'], sslFormVisible: false, stats: {}, intermediateCertificates: [], @@ -216,10 +216,11 @@ export default { fetchData () { this.routes = {} for (const section of this.sections) { - if (router.resolve('/' + section.substring(0, section.length - 1)).matched[0].redirect === '/exception/404') { + const route = section === 'backuprepositories' ? 'backuprepository' : section.substring(0, section.length - 1) + if (router.resolve('/' + route).matched[0].redirect === '/exception/404') { continue } - const node = router.resolve({ name: section.substring(0, section.length - 1) }) + const node = router.resolve({ name: route }) this.routes[section] = { title: node.meta.title, icon: node.meta.icon