diff --git a/api/src/main/java/org/apache/cloudstack/alert/AlertService.java b/api/src/main/java/org/apache/cloudstack/alert/AlertService.java index 50e48526d26c..1250284b5c27 100644 --- a/api/src/main/java/org/apache/cloudstack/alert/AlertService.java +++ b/api/src/main/java/org/apache/cloudstack/alert/AlertService.java @@ -91,6 +91,10 @@ private static AlertType getAlertType(short type) { return null; } + public static Set getAlertTypes() { + return defaultAlertTypes; + } + @Override public String toString() { return String.valueOf(this.getType()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRoleCmd.java index c03e6112ea7b..ed17a876b248 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRoleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRoleCmd.java @@ -20,6 +20,7 @@ import org.apache.cloudstack.acl.ProjectRole; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -70,4 +71,13 @@ public long getEntityOwnerId() { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return getProjectId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRolePermissionCmd.java index 9b6c2e633fc0..d39c2312aa91 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRolePermissionCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRolePermissionCmd.java @@ -22,6 +22,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.Parameter; @@ -96,4 +97,14 @@ private void setupResponse(final ProjectRolePermission rolePermission, final Pro response.setObjectName("projectrolepermission"); setResponseObject(response); } + + @Override + public Long getApiResourceId() { + return getProjectId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRoleCmd.java index 4bb460c63f71..9f8d82489584 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRoleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRoleCmd.java @@ -21,6 +21,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -79,4 +80,14 @@ public void execute() { public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } + + @Override + public Long getApiResourceId() { + return getProjectId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRolePermissionCmd.java index 8b83253c869b..ac68278535e2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRolePermissionCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRolePermissionCmd.java @@ -21,6 +21,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -80,4 +81,14 @@ public void execute() { public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } + + @Override + public Long getApiResourceId() { + return getProjectId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRoleCmd.java index 202daa3d49cc..3bc8b3d61868 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRoleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRoleCmd.java @@ -21,6 +21,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -76,4 +77,14 @@ public void execute() { public long getEntityOwnerId() { return 0; } + + @Override + public Long getApiResourceId() { + return getProjectId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRolePermissionCmd.java index d27235e5aaee..dd59310c66ae 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRolePermissionCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRolePermissionCmd.java @@ -26,6 +26,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -154,4 +155,14 @@ private boolean updateProjectRolePermissionOrder(ProjectRole projectRole) { public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } + + @Override + public Long getApiResourceId() { + return getProjectId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java index dad6506729a3..e2c31d6cf072 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java @@ -26,6 +26,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -102,4 +103,14 @@ public String getEventType() { public String getEventDescription() { return "change out-of-band management password for host: " + getHostId(); } + + @Override + public Long getApiResourceId() { + return getHostId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java index 699e28551852..157d3c627db5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java @@ -26,6 +26,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -112,4 +113,14 @@ protected void putOptionIfIsNotEmpty(ImmutableMap.Builder result = AlertService.AlertType.getAlertTypes(); + ListResponse response = new ListResponse<>(); + List typeResponseList = new ArrayList<>(); + for (AlertService.AlertType alertType : result) { + AlertTypeResponse alertResponse = new AlertTypeResponse(alertType.getType(), alertType.getName()); + alertResponse.setObjectName("alerttype"); + typeResponseList.add(alertResponse); + } + response.setResponses(typeResponseList, result.size()); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } +} diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java index 2c0ea6bc4ae5..e83c6b4009d3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java @@ -138,4 +138,10 @@ public long getEntityOwnerId() { public ApiCommandResourceType getApiResourceType() { return ApiCommandResourceType.VmSnapshot; } + + @Override + public Long getApiResourceId() { + return getEntityId(); + } + } diff --git a/api/src/main/java/org/apache/cloudstack/api/response/AlertTypeResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/AlertTypeResponse.java new file mode 100644 index 000000000000..3f91cde01788 --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/api/response/AlertTypeResponse.java @@ -0,0 +1,55 @@ +// 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. +package org.apache.cloudstack.api.response; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +public class AlertTypeResponse extends BaseResponse { + + @SerializedName("alerttypeid") + @Param(description = "alert type") + private short alertType; + + @SerializedName(ApiConstants.NAME) + @Param(description = "description of alert type") + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public short getUsageType() { + return alertType; + } + + public void setUsageType(short alertType) { + this.alertType = alertType; + } + + public AlertTypeResponse(short alertType, String name) { + this.alertType = alertType; + this.name = name; + setObjectName("alerttype"); + } +} diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index f794736a4d56..2318ce2899b2 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -187,6 +187,7 @@ import org.apache.cloudstack.api.command.admin.resource.ArchiveAlertsCmd; import org.apache.cloudstack.api.command.admin.resource.CleanVMReservationsCmd; import org.apache.cloudstack.api.command.admin.resource.DeleteAlertsCmd; +import org.apache.cloudstack.api.command.admin.resource.ListAlertTypesCmd; import org.apache.cloudstack.api.command.admin.resource.ListAlertsCmd; import org.apache.cloudstack.api.command.admin.resource.ListCapacityCmd; import org.apache.cloudstack.api.command.admin.resource.StartRollingMaintenanceCmd; @@ -3458,6 +3459,7 @@ public List> getCommands() { cmdList.add(RemoveRegionCmd.class); cmdList.add(UpdateRegionCmd.class); cmdList.add(ListAlertsCmd.class); + cmdList.add(ListAlertTypesCmd.class); cmdList.add(ListCapacityCmd.class); cmdList.add(UpdatePodManagementNetworkIpRangeCmd.class); cmdList.add(UploadCustomCertificateCmd.class); diff --git a/ui/src/components/view/SearchView.vue b/ui/src/components/view/SearchView.vue index 8e5e00887659..70acc8faed91 100644 --- a/ui/src/components/view/SearchView.vue +++ b/ui/src/components/view/SearchView.vue @@ -186,7 +186,8 @@ export default { inputKey: null, inputValue: null, fieldValues: {}, - isFiltered: false + isFiltered: false, + alertTypes: [] } }, created () { @@ -346,6 +347,7 @@ export default { }, async fetchDynamicFieldData (arrayField, searchKeyword) { const promises = [] + let typeIndex = -1 let zoneIndex = -1 let domainIndex = -1 let imageStoreIndex = -1 @@ -354,6 +356,14 @@ export default { let clusterIndex = -1 let groupIndex = -1 + if (arrayField.includes('type')) { + if (this.$route.path === '/alert') { + typeIndex = this.fields.findIndex(item => item.name === 'type') + this.fields[typeIndex].loading = true + promises.push(await this.fetchAlertTypes()) + } + } + if (arrayField.includes('zoneid')) { zoneIndex = this.fields.findIndex(item => item.name === 'zoneid') this.fields[zoneIndex].loading = true @@ -397,6 +407,12 @@ export default { } Promise.all(promises).then(response => { + if (typeIndex > -1) { + const types = response.filter(item => item.type === 'type') + if (types && types.length > 0) { + this.fields[typeIndex].opts = this.sortArray(types[0].data) + } + } if (zoneIndex > -1) { const zones = response.filter(item => item.type === 'zoneid') if (zones && zones.length > 0) { @@ -440,6 +456,9 @@ export default { } } }).finally(() => { + if (typeIndex > -1) { + this.fields[typeIndex].loading = false + } if (zoneIndex > -1) { this.fields[zoneIndex].loading = false } @@ -584,6 +603,29 @@ export default { }) }) }, + fetchAlertTypes () { + if (this.alertTypes.length > 0) { + return new Promise((resolve, reject) => { + resolve({ + type: 'type', + data: this.alertTypes + }) + }) + } else { + return new Promise((resolve, reject) => { + api('listAlertTypes').then(json => { + const alerttypes = json.listalerttypesresponse.alerttype.map(a => { return { id: a.alerttypeid, name: a.name } }) + this.alertTypes = alerttypes + resolve({ + type: 'type', + data: alerttypes + }) + }).catch(error => { + reject(error.response.headers['x-description']) + }) + }) + } + }, fetchGuestNetworkTypes () { const types = [] if (this.apiName.indexOf('listNetworks') > -1) { diff --git a/ui/src/config/section/compute.js b/ui/src/config/section/compute.js index f189b48d56fe..0e04dc19045f 100644 --- a/ui/src/config/section/compute.js +++ b/ui/src/config/section/compute.js @@ -483,6 +483,12 @@ export default { name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) }, + { + name: 'events', + resourceType: 'VmSnapshot', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) @@ -985,6 +991,18 @@ export default { title: 'label.instances', param: 'affinitygroupid' }], + tabs: [ + { + name: 'details', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, + { + name: 'events', + resourceType: 'AffinityGroup', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + } + ], actions: [ { api: 'createAffinityGroup', diff --git a/ui/src/config/section/infra.js b/ui/src/config/section/infra.js index 0b3b1e7ae4f7..5b3b38a68e57 100644 --- a/ui/src/config/section/infra.js +++ b/ui/src/config/section/infra.js @@ -79,6 +79,7 @@ export default { permission: ['listAlerts'], columns: ['name', 'description', 'type', 'sent'], details: ['name', 'id', 'type', 'sent', 'description'], + searchFilters: ['type'], actions: [ { api: 'archiveAlerts', diff --git a/ui/src/config/section/infra/hosts.js b/ui/src/config/section/infra/hosts.js index 803e6160de3d..d92f4af21e6e 100644 --- a/ui/src/config/section/infra/hosts.js +++ b/ui/src/config/section/infra/hosts.js @@ -44,6 +44,11 @@ export default { tabs: [{ name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, { + name: 'events', + resourceType: 'Host', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/infra/ilbvms.js b/ui/src/config/section/infra/ilbvms.js index fa20d6990e9e..5ab9b3edfc03 100644 --- a/ui/src/config/section/infra/ilbvms.js +++ b/ui/src/config/section/infra/ilbvms.js @@ -16,6 +16,8 @@ // under the License. import { shallowRef, defineAsyncComponent } from 'vue' +import store from '@/store' + export default { name: 'ilbvm', title: 'label.internal.lb', @@ -25,6 +27,15 @@ export default { params: { projectid: '-1' }, columns: ['name', 'state', 'publicip', 'guestnetworkname', 'vpcname', 'version', 'softwareversion', 'hostname', 'account', 'zonename', 'requiresupgrade'], details: ['name', 'id', 'version', 'softwareversion', 'requiresupgrade', 'guestnetworkname', 'vpcname', 'publicip', 'guestipaddress', 'linklocalip', 'serviceofferingname', 'networkdomain', 'isredundantrouter', 'redundantstate', 'hostname', 'account', 'zonename', 'created', 'hostcontrolstate'], + tabs: [{ + name: 'details', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, { + name: 'events', + resourceType: 'InternalLbVm', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }], actions: [ { api: 'startInternalLoadBalancerVM', diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js index e1a0e69b57ea..a6cd1e89e8cb 100644 --- a/ui/src/config/section/network.js +++ b/ui/src/config/section/network.js @@ -1046,6 +1046,11 @@ export default { name: 'loadbalancerinstance', component: shallowRef(defineAsyncComponent(() => import('@/views/network/InternalLBAssignedVmTab.vue'))), show: () => true + }, { + name: 'events', + resourceType: 'LoadBalancerRule', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }], actions: [ { @@ -1162,6 +1167,12 @@ export default { name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) }, + { + name: 'events', + resourceType: 'VpnCustomerGateway', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/offering.js b/ui/src/config/section/offering.js index 27e7d32073ae..768e982c0963 100644 --- a/ui/src/config/section/offering.js +++ b/ui/src/config/section/offering.js @@ -55,6 +55,12 @@ export default { name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) }, + { + name: 'events', + resourceType: 'ServiceOffering', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))), @@ -110,6 +116,24 @@ export default { params: { issystem: 'true', isrecursive: 'true' }, columns: ['name', 'systemvmtype', 'cpunumber', 'cpuspeed', 'memory', 'storagetype', 'order'], details: ['name', 'id', 'displaytext', 'systemvmtype', 'provisioningtype', 'storagetype', 'iscustomized', 'limitcpuuse', 'cpunumber', 'cpuspeed', 'memory', 'storagetags', 'hosttags', 'tags', 'domain', 'zone', 'created', 'dynamicscalingenabled', 'diskofferingstrictness'], + resourceType: 'ServiceOffering', + tabs: [ + { + name: 'details', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, + { + name: 'events', + resourceType: 'ServiceOffering', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, + { + name: 'comments', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))), + show: (record, route, user) => { return ['Admin', 'DomainAdmin'].includes(user.roletype) } + } + ], actions: [{ api: 'createServiceOffering', icon: 'plus-outlined', @@ -168,6 +192,12 @@ export default { name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) }, + { + name: 'events', + resourceType: 'DiskOffering', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))), @@ -227,6 +257,18 @@ export default { title: 'label.instances', param: 'backupofferingid' }], + tabs: [ + { + name: 'details', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, + { + name: 'events', + resourceType: 'BackupOffering', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + } + ], actions: [{ api: 'importBackupOffering', icon: 'plus-outlined', @@ -269,6 +311,12 @@ export default { name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) }, + { + name: 'events', + resourceType: 'NetworkOffering', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))), @@ -361,6 +409,18 @@ export default { title: 'label.vpc', param: 'vpcofferingid' }], + tabs: [ + { + name: 'details', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, + { + name: 'events', + resourceType: 'VpcOffering', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + } + ], actions: [{ api: 'createVPCOffering', icon: 'plus-outlined', diff --git a/ui/src/config/section/role.js b/ui/src/config/section/role.js index d903ea0fae8c..3823d633b186 100644 --- a/ui/src/config/section/role.js +++ b/ui/src/config/section/role.js @@ -16,6 +16,8 @@ // under the License. import { shallowRef, defineAsyncComponent } from 'vue' +import store from '@/store' + export default { name: 'role', title: 'label.roles', @@ -30,6 +32,11 @@ export default { }, { name: 'rules', component: shallowRef(defineAsyncComponent(() => import('@/views/iam/RolePermissionTab.vue'))) + }, { + name: 'events', + resourceType: 'Role', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }], actions: [ { diff --git a/ui/src/config/section/user.js b/ui/src/config/section/user.js index eef9ea3f939b..d4f4d700db72 100644 --- a/ui/src/config/section/user.js +++ b/ui/src/config/section/user.js @@ -25,7 +25,7 @@ export default { docHelp: 'adminguide/accounts.html#users', hidden: true, permission: ['listUsers'], - columns: ['username', 'state', 'firstname', 'lastname', 'email', 'account'], + columns: ['username', 'state', 'firstname', 'lastname', 'email', 'account', 'domain'], details: ['username', 'id', 'firstname', 'lastname', 'email', 'usersource', 'timezone', 'rolename', 'roletype', 'is2faenabled', 'account', 'domain', 'created'], tabs: [ { diff --git a/ui/src/views/network/PublicIpResource.vue b/ui/src/views/network/PublicIpResource.vue index fdbd96a761a0..18bc003b4991 100644 --- a/ui/src/views/network/PublicIpResource.vue +++ b/ui/src/views/network/PublicIpResource.vue @@ -66,10 +66,22 @@ export default { tabs: [{ name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, + { + name: 'events', + resourceType: 'IpAddress', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in this.$store.getters.apis } }], defaultTabs: [{ name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, + { + name: 'events', + resourceType: 'IpAddress', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in this.$store.getters.apis } }], activeTab: '' }